r8821: integrate usql support
[clsql.git] / usql-tests / test-fddl.lisp
1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; ======================================================================
3 ;;;; File:    test-fddl.lisp
4 ;;;; Author:  Marcus Pearce <m.t.pearce@city.ac.uk>
5 ;;;; Created: 30/03/2004
6 ;;;; Updated: <04/04/2004 11:53:29 marcusp>
7 ;;;; ======================================================================
8 ;;;;
9 ;;;; Description ==========================================================
10 ;;;; ======================================================================
11 ;;;;
12 ;;;; Tests for the CLSQL-USQL Functional Data Definition Language
13 ;;;; (FDDL).
14 ;;;; 
15 ;;;; ======================================================================
16
17 (in-package :clsql-usql-tests)
18
19 #.(usql:locally-enable-sql-reader-syntax)
20
21 ;; list current tables 
22 (deftest :fddl/table/1
23     (apply #'values 
24            (sort (mapcar #'string-downcase
25                          (usql:list-tables :owner *test-database-user*))
26                  #'string>))
27   "usql_object_v" "employee" "company")
28
29 ;; create a table, test for its existence, drop it and test again 
30 (deftest :fddl/table/2
31     (progn (usql:create-table  [foo]
32                                '(([id] integer)
33                                  ([height] float)
34                                  ([name] (string 24))
35                                  ([comments] longchar)))
36            (values
37             (usql:table-exists-p [foo] :owner *test-database-user*)
38             (progn
39               (usql:drop-table [foo] :if-does-not-exist :ignore)
40               (usql:table-exists-p [foo] :owner *test-database-user*))))
41   t nil)
42
43 ;; create a table, list its attributes and drop it 
44 (deftest :fddl/table/3
45     (apply #'values 
46            (progn (usql:create-table  [foo]
47                                       '(([id] integer)
48                                         ([height] float)
49                                         ([name] (char 255))
50                                         ([comments] longchar)))
51                   (prog1
52                       (sort (mapcar #'string-downcase
53                                     (usql:list-attributes [foo]))
54                             #'string<)
55                     (usql:drop-table [foo] :if-does-not-exist :ignore))))
56   "comments" "height" "id" "name")
57
58 (deftest :fddl/attributes/1
59     (apply #'values
60            (sort 
61             (mapcar #'string-downcase
62                     (usql:list-attributes [employee]
63                                           :owner *test-database-user*))
64             #'string<))
65   "birthday" "companyid" "email" "emplid" "first_name" "groupid" "height"
66   "last_name" "managerid" "married")
67
68 (deftest :fddl/attributes/2
69     (apply #'values 
70            (sort 
71             (mapcar #'(lambda (a) (string-downcase (car a)))
72                     (usql:list-attribute-types [employee]
73                                                :owner *test-database-user*))
74             #'string<))
75   "birthday" "companyid" "email" "emplid" "first_name" "groupid" "height"
76   "last_name" "managerid" "married")
77
78 ;; create a view, test for existence, drop it and test again 
79 (deftest :fddl/view/1
80     (progn (usql:create-view [lenins-group]
81                              ;;not in sqlite 
82                              ;;:column-list '([forename] [surname] [email])
83                              :as [select [first-name] [last-name] [email]
84                                          :from [employee]
85                                          :where [= [managerid] 1]])
86            (values  
87             (usql:view-exists-p [lenins-group] :owner *test-database-user*)
88             (progn
89               (usql:drop-view [lenins-group] :if-does-not-exist :ignore)
90               (usql:view-exists-p [lenins-group] :owner *test-database-user*))))
91   t nil)
92
93 ;; create a view, list its attributes and drop it 
94 (deftest :fddl/view/2
95     (progn (usql:create-view [lenins-group]
96                              ;;not in sqlite 
97                              ;;:column-list '([forename] [surname] [email])
98                               :as [select [first-name] [last-name] [email]
99                                           :from [employee]
100                                           :where [= [managerid] 1]])
101            (prog1
102                (sort (mapcar #'string-downcase
103                              (usql:list-attributes [lenins-group]))
104                      #'string<)
105              (usql:drop-view [lenins-group] :if-does-not-exist :ignore)))
106   ("email" "first_name" "last_name"))
107
108 ;; create a view, select stuff from it and drop it 
109 (deftest :fddl/view/3
110     (progn (usql:create-view [lenins-group]
111                               :as [select [first-name] [last-name] [email]
112                                           :from [employee]
113                                           :where [= [managerid] 1]])
114            (let ((result 
115                   (list 
116                    ;; Shouldn't exist 
117                    (usql:select [first-name] [last-name] [email]
118                                 :from [lenins-group]
119                                 :where [= [last-name] "Lenin"])
120                    ;; Should exist 
121                    (car (usql:select [first-name] [last-name] [email]
122                                      :from [lenins-group]
123                                      :where [= [last-name] "Stalin"])))))
124              (usql:drop-view [lenins-group] :if-does-not-exist :ignore)
125              (apply #'values result)))
126   nil ("Josef" "Stalin" "stalin@soviet.org"))
127
128 ;; not in sqlite 
129 (deftest :fddl/view/4
130     (if (eql *test-database-type* :sqlite)
131         (values nil '(("Josef" "Stalin" "stalin@soviet.org")))
132         (progn (usql:create-view [lenins-group]
133                                  :column-list '([forename] [surname] [email])
134                                  :as [select [first-name] [last-name] [email]
135                                              :from [employee]
136                                              :where [= [managerid] 1]])
137                (let ((result 
138                       (list
139                        ;; Shouldn't exist 
140                        (usql:select [forename] [surname] [email]
141                                     :from [lenins-group]
142                                     :where [= [surname] "Lenin"])
143                        ;; Should exist 
144                        (car (usql:select [forename] [surname] [email]
145                                          :from [lenins-group]
146                                          :where [= [surname] "Stalin"])))))
147                  (usql:drop-view [lenins-group] :if-does-not-exist :ignore)
148                  (apply #'values result))))
149   nil ("Josef" "Stalin" "stalin@soviet.org"))
150
151 ;; create an index, test for existence, drop it and test again 
152 (deftest :fddl/index/1
153     (progn (usql:create-index [bar] :on [employee] :attributes
154                               '([first-name] [last-name] [email]) :unique t)
155            (values
156             (usql:index-exists-p [bar] :owner *test-database-user*)
157             (progn
158               (case *test-database-type*
159                 (:mysql 
160                  (usql:drop-index [bar] :on [employee]
161                                   :if-does-not-exist :ignore))
162                 (t 
163                  (usql:drop-index [bar]:if-does-not-exist :ignore)))
164               (usql:view-exists-p [bar] :owner *test-database-user*))))
165   t nil)
166
167 ;; create indexes with names as strings, symbols and in square brackets 
168 (deftest :fddl/index/2
169     (let ((names '("foo" foo [foo]))
170           (result '()))
171       (dolist (name names)
172         (usql:create-index name :on [employee] :attributes '([emplid]))
173         (push (usql:index-exists-p name :owner *test-database-user*) result)
174         (case *test-database-type*
175           (:mysql 
176            (usql:drop-index name :on [employee] :if-does-not-exist :ignore))
177           (t (usql:drop-index name :if-does-not-exist :ignore))))
178       (apply #'values result))
179   t t t)
180
181 ;; create an sequence, test for existence, drop it and test again 
182 (deftest :fddl/sequence/1
183     (progn (usql:create-sequence [foo])
184            (values
185             (usql:sequence-exists-p [foo] :owner *test-database-user*)
186             (progn
187               (usql:drop-sequence [foo] :if-does-not-exist :ignore)
188               (usql:sequence-exists-p [foo] :owner *test-database-user*))))
189   t nil)
190
191 ;; create and increment a sequence
192 (deftest :fddl/sequence/2
193     (let ((val1 nil))
194       (usql:create-sequence [foo])
195       (setf val1 (usql:sequence-next [foo]))
196       (prog1
197           (< val1 (usql:sequence-next [foo]))
198         (usql:drop-sequence [foo] :if-does-not-exist :ignore)))
199   t)
200
201 ;; explicitly set the value of a sequence
202 (deftest :fddl/sequence/3
203     (progn
204       (usql:create-sequence [foo])
205       (usql:set-sequence-position [foo] 5)
206       (prog1
207           (usql:sequence-next [foo])
208         (usql:drop-sequence [foo] :if-does-not-exist :ignore)))
209   6)
210
211 #.(usql:restore-sql-reader-syntax-state)