r9253: Add *db-auto-sync* special var for controlling creation/updating of db records...
[clsql.git] / tests / test-init.lisp
index eef4f888c44009906ae2c074951702cf83c3dfe9..99c3a47c5abbd215a1f472ba7700d2d3c22fd097 100644 (file)
@@ -38,7 +38,7 @@
            :initarg :height)
    (married :db-kind :base :accessor married :type boolean
             :initarg :married)
-   (birthday :type clsql-base:wall-time :initarg :birthday)
+   (birthday :type clsql:wall-time :initarg :birthday)
    (hobby :db-kind :virtual :initarg :hobby :initform nil)))
   
 (def-view-class employee (person)
@@ -65,7 +65,8 @@
     :type (string 100)
     :initarg :email)
    (companyid
-    :type integer)
+    :type integer
+    :initarg :companyid)
    (company
     :accessor employee-company
     :db-kind :join
                          :foreign-key companyid
                          :set nil))
    (managerid
-    :type integer)
+    :type integer
+    :initarg :managerid)
    (manager
     :accessor employee-manager
     :db-kind :join
     :db-info (:join-class employee
                          :home-key managerid
                          :foreign-key emplid
-                         :set nil)))
+                         :set nil))
+   (addresses
+    :accessor employee-addresses
+    :db-kind :join
+    :db-info (:join-class employee-address
+                         :home-key emplid
+                         :foreign-key emplid
+                         :target-slot address
+                         :set t)))
   (:base-table employee))
 
 (def-view-class company ()
     :type (string 100)
     :initarg :name)
    (presidentid
-    :type integer)
+    :type integer
+    :initarg :presidentid)
    (president
     :reader president
     :db-kind :join
   (:base-table company))
 
 
+(def-view-class address ()
+  ((addressid
+    :db-kind :key
+    :db-constraints :not-null
+    :type integer
+    :initarg :addressid)
+   (street-number
+    :type integer
+    :initarg :street-number)
+   (street-name
+    :type (string 30)
+    :void-value ""
+    :initarg :street-name)
+   (city
+    :column "city_field"
+    :void-value "no city"
+    :type (string 30)
+    :initarg :city)
+   (postal-code
+    :column "zip"
+    :type integer
+    :void-value 0
+    :initarg :postal-code)))
+
+;; many employees can reside at many addressess
+(def-view-class employee-address ()
+  ((emplid :type integer
+          :initarg :emplid)
+   (addressid :type integer
+             :initarg :addressid)
+   (address :db-kind :join
+           :db-info (:join-class address
+                                 :home-key addressid
+                                 :foreign-key addressid
+                                 :retrieval :immediate))))
 
 (defun test-connect-to-database (db-type spec)
   (when (db-backend-has-create/destroy-db? db-type)
   (truncate-database :database *default-database*)
   
   (setf *test-database-underlying-type*
-       (clsql-sys:database-underlying-type *default-database*))
+       (clsql:database-underlying-type *default-database*))
   
   *default-database*)
 
 (defparameter employee8 nil)
 (defparameter employee9 nil)
 (defparameter employee10 nil)
+(defparameter address1 nil)
+(defparameter address2 nil)
+(defparameter employee-address1 nil)
+(defparameter employee-address2 nil)
+(defparameter employee-address3 nil)
+(defparameter employee-address4 nil)
+(defparameter employee-address5 nil)
 
 (defun test-initialise-database ()
   (test-basic-initialize)
             :ignore
           :warn)))
     (clsql:create-view-from-class 'employee)
-    (clsql:create-view-from-class 'company))
+    (clsql:create-view-from-class 'company)
+    (clsql:create-view-from-class 'address)
+    (clsql:create-view-from-class 'employee-address))
 
-  (setf company1 (make-instance 'company
-                  :companyid 1
-                  :groupid 1
-                  :name "Widgets Inc.")
-       employee1 (make-instance 'employee
-                   :emplid 1
-                   :groupid 1
-                   :married t 
-                   :height (1+ (random 1.00))
-                   :birthday (clsql-base:get-time)
-                   :first-name "Vladamir"
-                   :last-name "Lenin"
-                   :email "lenin@soviet.org")
-       employee2 (make-instance 'employee
-                   :emplid 2
-                   :groupid 1
-                   :height (1+ (random 1.00))
-                   :married t 
-                   :birthday (clsql-base:get-time)
-                   :first-name "Josef"
-                   :last-name "Stalin"
-                   :email "stalin@soviet.org")
-       employee3 (make-instance 'employee
-                   :emplid 3
-                   :groupid 1
-                   :height (1+ (random 1.00))
-                   :married t 
-                   :birthday (clsql-base:get-time)
-                   :first-name "Leon"
-                   :last-name "Trotsky"
-                   :email "trotsky@soviet.org")
-       employee4 (make-instance 'employee
-                   :emplid 4
-                   :groupid 1
-                   :height (1+ (random 1.00))
-                   :married nil
-                   :birthday (clsql-base:get-time)
-                   :first-name "Nikita"
-                   :last-name "Kruschev"
-                   :email "kruschev@soviet.org")
-       
-       employee5 (make-instance 'employee
-                   :emplid 5
-                   :groupid 1
-                   :married nil
-                   :height (1+ (random 1.00))
-                   :birthday (clsql-base:get-time)
-                   :first-name "Leonid"
-                   :last-name "Brezhnev"
-                   :email "brezhnev@soviet.org")
-
-       employee6 (make-instance 'employee
-                   :emplid 6
-                   :groupid 1
-                   :married nil
-                   :height (1+ (random 1.00))
-                   :birthday (clsql-base:get-time)
-                   :first-name "Yuri"
-                   :last-name "Andropov"
-                   :email "andropov@soviet.org")
-       employee7 (make-instance 'employee
-                   :emplid 7
-                   :groupid 1
-                   :height (1+ (random 1.00))
-                   :married nil
-                   :birthday (clsql-base:get-time)
-                   :first-name "Konstantin"
-                   :last-name "Chernenko"
-                   :email "chernenko@soviet.org")
-       employee8 (make-instance 'employee
-                   :emplid 8
-                   :groupid 1
-                   :height (1+ (random 1.00))
-                   :married nil
-                   :birthday (clsql-base:get-time)
-                   :first-name "Mikhail"
-                   :last-name "Gorbachev"
-                   :email "gorbachev@soviet.org")
-       employee9 (make-instance 'employee
-                   :emplid 9
-                   :groupid 1 
-                   :married nil
-                   :height (1+ (random 1.00))
-                   :birthday (clsql-base:get-time)
-                   :first-name "Boris"
-                   :last-name "Yeltsin"
-                   :email "yeltsin@soviet.org")
-       employee10 (make-instance 'employee
-                    :emplid 10
-                    :groupid 1
-                    :married nil
-                    :height (1+ (random 1.00))
-                    :birthday (clsql-base:get-time)
-                    :first-name "Vladamir"
-                    :last-name "Putin"
-                    :email "putin@soviet.org"))
-  
+  (let ((*db-auto-sync* t))
+    (setf company1 (make-instance 'company
+                                 :presidentid 1
+                                 :companyid 1
+                                 :groupid 1
+                                 :name "Widgets Inc.")
+         employee1 (make-instance 'employee
+                                  :emplid 1
+                                  :groupid 1
+                                  :married t 
+                                  :height (1+ (random 1.00))
+                                  :birthday (clsql:get-time)
+                                  :first-name "Vladamir"
+                                  :last-name "Lenin"
+                                  :email "lenin@soviet.org"
+                                  :companyid 1)
+         employee2 (make-instance 'employee
+                                  :emplid 2
+                                  :groupid 1
+                                  :height (1+ (random 1.00))
+                                  :married t 
+                                  :birthday (clsql:get-time)
+                                  :first-name "Josef"
+                                  :last-name "Stalin"
+                                  :email "stalin@soviet.org"
+                                  :managerid 1
+                                  :companyid 1)
+         employee3 (make-instance 'employee
+                                  :emplid 3
+                                  :groupid 1
+                                  :height (1+ (random 1.00))
+                                  :married t 
+                                  :birthday (clsql:get-time)
+                                  :first-name "Leon"
+                                  :last-name "Trotsky"
+                                  :email "trotsky@soviet.org"
+                                  :managerid 1
+                                  :companyid 1)
+         employee4 (make-instance 'employee
+                                  :emplid 4
+                                  :groupid 1
+                                  :height (1+ (random 1.00))
+                                  :married nil
+                                  :birthday (clsql:get-time)
+                                  :first-name "Nikita"
+                                  :last-name "Kruschev"
+                                  :email "kruschev@soviet.org"
+                                  :managerid 1
+                                  :companyid 1)
+         employee5 (make-instance 'employee
+                                  :emplid 5
+                                  :groupid 1
+                                  :married nil
+                                  :height (1+ (random 1.00))
+                                  :birthday (clsql:get-time)
+                                  :first-name "Leonid"
+                                  :last-name "Brezhnev"
+                                  :email "brezhnev@soviet.org"
+                                  :managerid 1
+                                  :companyid 1)
+         employee6 (make-instance 'employee
+                                  :emplid 6
+                                  :groupid 1
+                                  :married nil
+                                  :height (1+ (random 1.00))
+                                  :birthday (clsql:get-time)
+                                  :first-name "Yuri"
+                                  :last-name "Andropov"
+                                  :email "andropov@soviet.org"
+                                  :managerid 1
+                                  :companyid 1)
+         employee7 (make-instance 'employee
+                                  :emplid 7
+                                  :groupid 1
+                                  :height (1+ (random 1.00))
+                                  :married nil
+                                  :birthday (clsql:get-time)
+                                  :first-name "Konstantin"
+                                  :last-name "Chernenko"
+                                  :email "chernenko@soviet.org"
+                                  :managerid 1
+                                  :companyid 1)
+         employee8 (make-instance 'employee
+                                  :emplid 8
+                                  :groupid 1
+                                  :height (1+ (random 1.00))
+                                  :married nil
+                                  :birthday (clsql:get-time)
+                                  :first-name "Mikhail"
+                                  :last-name "Gorbachev"
+                                  :email "gorbachev@soviet.org"
+                                  :managerid 1
+                                  :companyid 1)
+         employee9 (make-instance 'employee
+                                  :emplid 9
+                                  :groupid 1 
+                                  :married nil
+                                  :height (1+ (random 1.00))
+                                  :birthday (clsql:get-time)
+                                  :first-name "Boris"
+                                  :last-name "Yeltsin"
+                                  :email "yeltsin@soviet.org"
+                                  :managerid 1
+                                  :companyid 1)
+         employee10 (make-instance 'employee
+                                   :emplid 10
+                                   :groupid 1
+                                   :married nil
+                                   :height (1+ (random 1.00))
+                                   :birthday (clsql:get-time)
+                                   :first-name "Vladamir"
+                                   :last-name "Putin"
+                                   :email "putin@soviet.org"
+                                   :managerid 1
+                                   :companyid 1)
+         address1 (make-instance 'address
+                                 :addressid 1
+                                 :street-number 10
+                                 :street-name "Park Place"
+                                 :city "Leningrad"
+                                 :postal-code 123)
+         address2 (make-instance 'address
+                                 :addressid 2)
+         employee-address1 (make-instance 'employee-address
+                                          :emplid 1
+                                          :addressid 1)
+         employee-address2 (make-instance 'employee-address
+                                          :emplid 2
+                                          :addressid 2)
+         employee-address3 (make-instance 'employee-address
+                                          :emplid 3
+                                          :addressid 1)
+         employee-address4 (make-instance 'employee-address
+                                          :emplid 1
+                                          :addressid 2)
+         employee-address5 (make-instance 'employee-address
+                                          :emplid 3
+                                          :addressid 2)
+         ))
+    
   ;; sleep to ensure birthdays are no longer at current time
-  (sleep 2) 
-
+  (sleep 1) 
+  
+  #||
   ;; Lenin manages everyone
   (clsql:add-to-relation employee2 'manager employee1)
   (clsql:add-to-relation employee3 'manager employee1)
   (clsql:add-to-relation company1 'employees employee10)
   ;; Lenin is president of Widgets Inc.
   (clsql:add-to-relation company1 'president employee1)
-  ;; store these instances 
+  ||#
+  
+  ;; store these instances
+  #||
   (clsql:update-records-from-instance employee1)
   (clsql:update-records-from-instance employee2)
   (clsql:update-records-from-instance employee3)
   (clsql:update-records-from-instance employee8)
   (clsql:update-records-from-instance employee9)
   (clsql:update-records-from-instance employee10)
-  (clsql:update-records-from-instance company1))
+  (clsql:update-records-from-instance company1)
+  (clsql:update-records-from-instance address1)
+  (clsql:update-records-from-instance address2)
+  ||#
+  )
 
 (defvar *error-count* 0)
 (defvar *error-list* nil)
 
-(defun run-tests-append-report-file (report-file)
-  (let* ((report-path (etypecase report-file
+(defun run-function-append-report-file (function report-file)
+    (let* ((report-path (etypecase report-file
                        (pathname report-file)
                        (string (parse-namestring report-file))))
         (sexp-report-path (make-pathname :defaults report-path
                                          :type "sexp")))
-  (with-open-file (rs report-path :direction :output
-                     :if-exists :append
+      (with-open-file (rs report-path :direction :output
+                         :if-exists :append
                      :if-does-not-exist :create)
-    (with-open-file (srs sexp-report-path :direction :output
-                        :if-exists :append
-                        :if-does-not-exist :create)
-      (run-tests :report-stream rs :sexp-report-stream srs)))))
-    
+       (with-open-file (srs sexp-report-path :direction :output
+                            :if-exists :append
+                            :if-does-not-exist :create)
+         (funcall function :report-stream rs :sexp-report-stream srs)))))
+
+(defun run-tests-append-report-file (report-file)
+  (run-function-append-report-file 'run-tests report-file))
+
+
 (defun run-tests (&key (report-stream *standard-output*) (sexp-report-stream nil))
   (let ((specs (read-specs))
        (*report-stream* report-stream)
     (when (db-type-spec db-type specs)
       (clsql:initialize-database-type :database-type db-type))))
 
-(defun do-tests-for-backend (db-type spec)
-  (test-connect-to-database db-type spec)
-
-  (unwind-protect
-      (multiple-value-bind (test-forms skip-tests)
-         (compute-tests-for-backend db-type *test-database-underlying-type*)
-       
-       (format *report-stream* 
-               "~&
+(defun write-report-banner (report-type db-type stream)
+  (format stream
+         "~&
 ******************************************************************************
-***     CLSQL Test Suite begun at ~A
+***     CLSQL ~A begun at ~A
 ***     ~A
 ***     ~A on ~A
 ***     Database ~A backend~A.
 ******************************************************************************
-" 
-               (clsql-base:format-time 
-                nil 
-                (clsql-base:utime->time (get-universal-time)))
-               (lisp-implementation-type)
-               (lisp-implementation-version)
-               (machine-type)
-               db-type
-               (if (not (eq db-type *test-database-underlying-type*))
-                   (format nil " with underlying type ~A" 
-                           *test-database-underlying-type*)
-                 "")
-               )
-       
+"
+         report-type
+         (clsql:format-time 
+          nil 
+          (clsql:utime->time (get-universal-time)))
+         (lisp-implementation-type)
+         (lisp-implementation-version)
+         (machine-type)
+         db-type
+         (if (not (eq db-type *test-database-underlying-type*))
+             (format nil " with underlying type ~A" 
+                     *test-database-underlying-type*)
+             "")
+         ))
+
+(defun do-tests-for-backend (db-type spec)
+  (test-connect-to-database db-type spec)
+  
+  (unwind-protect
+       (multiple-value-bind (test-forms skip-tests)
+         (compute-tests-for-backend db-type *test-database-underlying-type*)
+        
+        (write-report-banner "Test Suite" db-type *report-stream*)
+        
        (test-initialise-database)
        
        (regression-test:rem-all-tests)
 
 
 (defun compute-tests-for-backend (db-type db-underlying-type)
+  (declare (ignorable db-type))
   (let ((test-forms '())
        (skip-tests '()))
     (dolist (test-form (append (test-basic-forms)
           (push test-form test-forms)))))
     (values (nreverse test-forms) (nreverse skip-tests))))
 
+
+(defun rl ()
+  "Rapid load for interactive testing."
+  (when *default-database*
+      (disconnect :database *default-database*))
+  (test-connect-to-database :postgresql (car (postgresql-spec (read-specs))))
+  (test-initialise-database))