1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; ======================================================================
3 ;;;; File: test-init.lisp
4 ;;;; Authors: Marcus Pearce <m.t.pearce@city.ac.uk>, Kevin Rosenberg
5 ;;;; Created: 30/03/2004
7 ;;;; ======================================================================
9 ;;;; Description ==========================================================
10 ;;;; ======================================================================
12 ;;;; Initialisation utilities for running regression tests on CLSQL.
14 ;;;; ======================================================================
16 ;;; This test suite looks for a configuration file named ".clsql-test.config"
17 ;;; located in the users home directory.
19 ;;; This file contains a single a-list that specifies the connection
20 ;;; specs for each database type to be tested. For example, to test all
21 ;;; platforms, a sample "test.config" may look like:
23 ;;; ((:mysql ("localhost" "a-mysql-db" "user1" "secret"))
24 ;;; (:aodbc ("my-dsn" "a-user" "pass"))
25 ;;; (:postgresql ("localhost" "another-db" "user2" "dont-tell"))
26 ;;; (:postgresql-socket ("pg-server" "a-db-name" "user" "secret-password"))
27 ;;; (:sqlite ("path-to-sqlite-db")))
29 (in-package #:clsql-tests)
31 (defvar *rt-connection*)
38 (defvar *test-database-type* nil)
39 (defvar *test-database-user* nil)
42 ((extraterrestrial :initform nil :initarg :extraterrestrial)))
44 (def-view-class person (thing)
45 ((height :db-kind :base :accessor height :type float :nulls-ok t
47 (married :db-kind :base :accessor married :type boolean :nulls-ok t
49 (birthday :nulls-ok t :type clsql-base:wall-time :initarg :birthday)
50 (hobby :db-kind :virtual :initarg :hobby :initform nil)))
52 (def-view-class employee (person)
55 :db-constraints :not-null
61 :db-constraints :not-null
74 :accessor employee-email
81 :accessor employee-company
83 :db-info (:join-class company
85 :foreign-key companyid
91 :accessor employee-manager
93 :db-info (:join-class employee
97 (:base-table employee))
99 (def-view-class company ()
102 :db-constraints :not-null
107 :db-constraints :not-null
118 :db-info (:join-class employee
119 :home-key presidentid
123 :reader company-employees
125 :db-info (:join-class employee
126 :home-key (companyid groupid)
127 :foreign-key (companyid groupid)
129 (:base-table company))
131 (defparameter company1 (make-instance 'company
134 :name "Widgets Inc."))
136 (defparameter employee1 (make-instance 'employee
140 :height (1+ (random 1.00))
141 :birthday (clsql-base:get-time)
142 :first-name "Vladamir"
144 :email "lenin@soviet.org"))
146 (defparameter employee2 (make-instance 'employee
149 :height (1+ (random 1.00))
151 :birthday (clsql-base:get-time)
154 :email "stalin@soviet.org"))
156 (defparameter employee3 (make-instance 'employee
159 :height (1+ (random 1.00))
161 :birthday (clsql-base:get-time)
164 :email "trotsky@soviet.org"))
166 (defparameter employee4 (make-instance 'employee
169 :height (1+ (random 1.00))
171 :birthday (clsql-base:get-time)
173 :last-name "Kruschev"
174 :email "kruschev@soviet.org"))
176 (defparameter employee5 (make-instance 'employee
180 :height (1+ (random 1.00))
181 :birthday (clsql-base:get-time)
183 :last-name "Brezhnev"
184 :email "brezhnev@soviet.org"))
186 (defparameter employee6 (make-instance 'employee
190 :height (1+ (random 1.00))
191 :birthday (clsql-base:get-time)
193 :last-name "Andropov"
194 :email "andropov@soviet.org"))
196 (defparameter employee7 (make-instance 'employee
199 :height (1+ (random 1.00))
201 :birthday (clsql-base:get-time)
202 :first-name "Konstantin"
203 :last-name "Chernenko"
204 :email "chernenko@soviet.org"))
206 (defparameter employee8 (make-instance 'employee
209 :height (1+ (random 1.00))
211 :birthday (clsql-base:get-time)
212 :first-name "Mikhail"
213 :last-name "Gorbachev"
214 :email "gorbachev@soviet.org"))
216 (defparameter employee9 (make-instance 'employee
220 :height (1+ (random 1.00))
221 :birthday (clsql-base:get-time)
224 :email "yeltsin@soviet.org"))
226 (defparameter employee10 (make-instance 'employee
230 :height (1+ (random 1.00))
231 :birthday (clsql-base:get-time)
232 :first-name "Vladamir"
234 :email "putin@soviet.org"))
236 (defun test-connect-to-database (database-type spec)
237 (setf *test-database-type* database-type)
238 (when (>= (length spec) 3)
239 (setq *test-database-user* (third spec)))
241 ;; Connect to the database
243 :database-type database-type
247 (defmacro with-ignore-errors (&rest forms)
250 (lambda (x) (list 'ignore-errors x))
253 (defun test-initialise-database ()
254 ;; Delete the instance records
256 (clsql:delete-instance-records company1)
257 (clsql:delete-instance-records employee1)
258 (clsql:delete-instance-records employee2)
259 (clsql:delete-instance-records employee3)
260 (clsql:delete-instance-records employee4)
261 (clsql:delete-instance-records employee5)
262 (clsql:delete-instance-records employee6)
263 (clsql:delete-instance-records employee7)
264 (clsql:delete-instance-records employee8)
265 (clsql:delete-instance-records employee9)
266 (clsql:delete-instance-records employee10)
267 ;; Drop the required tables if they exist
268 (clsql:drop-view-from-class 'employee)
269 (clsql:drop-view-from-class 'company))
270 ;; Create the tables for our view classes
271 (clsql:create-view-from-class 'employee)
272 (clsql:create-view-from-class 'company)
273 ;; Lenin manages everyone
274 (clsql:add-to-relation employee2 'manager employee1)
275 (clsql:add-to-relation employee3 'manager employee1)
276 (clsql:add-to-relation employee4 'manager employee1)
277 (clsql:add-to-relation employee5 'manager employee1)
278 (clsql:add-to-relation employee6 'manager employee1)
279 (clsql:add-to-relation employee7 'manager employee1)
280 (clsql:add-to-relation employee8 'manager employee1)
281 (clsql:add-to-relation employee9 'manager employee1)
282 (clsql:add-to-relation employee10 'manager employee1)
283 ;; Everyone works for Widgets Inc.
284 (clsql:add-to-relation company1 'employees employee1)
285 (clsql:add-to-relation company1 'employees employee2)
286 (clsql:add-to-relation company1 'employees employee3)
287 (clsql:add-to-relation company1 'employees employee4)
288 (clsql:add-to-relation company1 'employees employee5)
289 (clsql:add-to-relation company1 'employees employee6)
290 (clsql:add-to-relation company1 'employees employee7)
291 (clsql:add-to-relation company1 'employees employee8)
292 (clsql:add-to-relation company1 'employees employee9)
293 (clsql:add-to-relation company1 'employees employee10)
294 ;; Lenin is president of Widgets Inc.
295 (clsql:add-to-relation company1 'president employee1)
296 ;; store these instances
297 (clsql:update-records-from-instance employee1)
298 (clsql:update-records-from-instance employee2)
299 (clsql:update-records-from-instance employee3)
300 (clsql:update-records-from-instance employee4)
301 (clsql:update-records-from-instance employee5)
302 (clsql:update-records-from-instance employee6)
303 (clsql:update-records-from-instance employee7)
304 (clsql:update-records-from-instance employee8)
305 (clsql:update-records-from-instance employee9)
306 (clsql:update-records-from-instance employee10)
307 (clsql:update-records-from-instance company1))
310 (let ((specs (read-specs)))
312 (warn "Not running tests because test configuration file is missing")
313 (return-from run-tests :skipped))
314 (dolist (db-type +all-db-types+)
315 (let ((spec (db-type-spec db-type specs)))
319 *******************************************************************
320 *** Running CLSQL tests with ~A backend.
321 *******************************************************************
323 (db-type-ensure-system db-type)
324 (regression-test:rem-all-tests)
325 (ignore-errors (destroy-database spec :database-type db-type))
326 (ignore-errors (create-database spec :database-type db-type))
327 (dolist (test (append *rt-connection* *rt-fddl* *rt-fdml*
328 *rt-ooddl* *rt-oodml* *rt-syntax*))
330 (test-connect-to-database db-type spec)
331 (test-initialise-database)
332 (rtest:do-tests))))))