;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
;;;; ======================================================================
-;;;; File: test-fddl.lisp
-;;;; Author: Marcus Pearce <m.t.pearce@city.ac.uk>
-;;;; Created: 30/03/2004
-;;;; Updated: $Id$
-;;;; ======================================================================
-;;;;
-;;;; Description ==========================================================
-;;;; ======================================================================
+;;;; File: test-fddl.lisp
+;;;; Authors: Marcus Pearce <m.t.pearce@city.ac.uk> and Kevin Rosenberg
+;;;; Created: 30/03/2004
+;;;; Updated: $Id$
;;;;
;;;; Tests for the CLSQL Functional Data Definition Language
;;;; (FDDL).
-;;;;
+;;;;
+;;;; This file is part of CLSQL.
+;;;;
+;;;; CLSQL users are granted the rights to distribute and use this software
+;;;; as governed by the terms of the Lisp Lesser GNU Public License
+;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
;;;; ======================================================================
(in-package #:clsql-tests)
#.(clsql:locally-enable-sql-reader-syntax)
+(setq *rt-fddl*
+ '(
+
;; list current tables
(deftest :fddl/table/1
(apply #'values
(sort (mapcar #'string-downcase
(clsql:list-tables :owner *test-database-user*))
- #'string>))
- "employee" "company" "clsql_object_v")
+ #'string<))
+ "company" "employee" "type_table")
;; create a table, test for its existence, drop it and test again
(deftest :fddl/table/2
"birthday" "companyid" "email" "emplid" "first_name" "groupid" "height"
"last_name" "managerid" "married")
-;; create a view, test for existence, drop it and test again
+;; create a view, test for existence, drop it and test again
(deftest :fddl/view/1
(progn (clsql:create-view [lenins-group]
- ;;not in sqlite
- ;;:column-list '([forename] [surname] [email])
- :as [select [first-name] [last-name] [email]
- :from [employee]
- :where [= [managerid] 1]])
- (values
- (clsql:view-exists-p [lenins-group] :owner *test-database-user*)
- (progn
- (clsql:drop-view [lenins-group] :if-does-not-exist :ignore)
- (clsql:view-exists-p [lenins-group] :owner *test-database-user*))))
+ :as [select [first-name] [last-name] [email]
+ :from [employee]
+ :where [= [managerid] 1]])
+ (values
+ (clsql:view-exists-p [lenins-group] :owner *test-database-user*)
+ (progn
+ (clsql:drop-view [lenins-group] :if-does-not-exist :ignore)
+ (clsql:view-exists-p [lenins-group] :owner *test-database-user*))))
t nil)
-
-;; create a view, list its attributes and drop it
-(deftest :fddl/view/2
- (progn (clsql:create-view [lenins-group]
- ;;not in sqlite
- ;;:column-list '([forename] [surname] [email])
- :as [select [first-name] [last-name] [email]
- :from [employee]
- :where [= [managerid] 1]])
- (prog1
- (sort (mapcar #'string-downcase
- (clsql:list-attributes [lenins-group]))
- #'string<)
- (clsql:drop-view [lenins-group] :if-does-not-exist :ignore)))
- ("email" "first_name" "last_name"))
-
-;; create a view, select stuff from it and drop it
+
+ ;; create a view, list its attributes and drop it
+(when (clsql-base-sys:db-type-has-views? *test-database-underlying-type*)
+ (deftest :fddl/view/2
+ (progn (clsql:create-view [lenins-group]
+ :as [select [first-name] [last-name] [email]
+ :from [employee]
+ :where [= [managerid] 1]])
+ (prog1
+ (sort (mapcar #'string-downcase
+ (clsql:list-attributes [lenins-group]))
+ #'string<)
+ (clsql:drop-view [lenins-group] :if-does-not-exist :ignore)))
+ ("email" "first_name" "last_name")))
+
+ ;; create a view, select stuff from it and drop it
(deftest :fddl/view/3
(progn (clsql:create-view [lenins-group]
- :as [select [first-name] [last-name] [email]
- :from [employee]
- :where [= [managerid] 1]])
- (let ((result
- (list
- ;; Shouldn't exist
- (clsql:select [first-name] [last-name] [email]
- :from [lenins-group]
- :where [= [last-name] "Lenin"])
- ;; Should exist
- (car (clsql:select [first-name] [last-name] [email]
- :from [lenins-group]
- :where [= [last-name] "Stalin"])))))
- (clsql:drop-view [lenins-group] :if-does-not-exist :ignore)
- (apply #'values result)))
+ :as [select [first-name] [last-name] [email]
+ :from [employee]
+ :where [= [managerid] 1]])
+ (let ((result
+ (list
+ ;; Shouldn't exist
+ (clsql:select [first-name] [last-name] [email]
+ :from [lenins-group]
+ :where [= [last-name] "Lenin"])
+ ;; Should exist
+ (car (clsql:select [first-name] [last-name] [email]
+ :from [lenins-group]
+ :where [= [last-name] "Stalin"])))))
+ (clsql:drop-view [lenins-group] :if-does-not-exist :ignore)
+ (apply #'values result)))
nil ("Josef" "Stalin" "stalin@soviet.org"))
-
-;; not in sqlite
+
(deftest :fddl/view/4
- (if (eql *test-database-type* :sqlite)
- (values nil '(("Josef" "Stalin" "stalin@soviet.org")))
- (progn (clsql:create-view [lenins-group]
- :column-list '([forename] [surname] [email])
- :as [select [first-name] [last-name] [email]
- :from [employee]
- :where [= [managerid] 1]])
- (let ((result
- (list
- ;; Shouldn't exist
- (clsql:select [forename] [surname] [email]
- :from [lenins-group]
- :where [= [surname] "Lenin"])
- ;; Should exist
- (car (clsql:select [forename] [surname] [email]
- :from [lenins-group]
- :where [= [surname] "Stalin"])))))
- (clsql:drop-view [lenins-group] :if-does-not-exist :ignore)
- (apply #'values result))))
+ (progn (clsql:create-view [lenins-group]
+ :column-list '([forename] [surname] [email])
+ :as [select [first-name] [last-name] [email]
+ :from [employee]
+ :where [= [managerid] 1]])
+ (let ((result
+ (list
+ ;; Shouldn't exist
+ (clsql:select [forename] [surname] [email]
+ :from [lenins-group]
+ :where [= [surname] "Lenin"])
+ ;; Should exist
+ (car (clsql:select [forename] [surname] [email]
+ :from [lenins-group]
+ :where [= [surname] "Stalin"])))))
+ (clsql:drop-view [lenins-group] :if-does-not-exist :ignore)
+ (apply #'values result)))
nil ("Josef" "Stalin" "stalin@soviet.org"))
;; create an index, test for existence, drop it and test again
(values
(clsql:index-exists-p [bar] :owner *test-database-user*)
(progn
- (case *test-database-type*
- (:mysql
- (clsql:drop-index [bar] :on [employee]
- :if-does-not-exist :ignore))
- (t
- (clsql:drop-index [bar]:if-does-not-exist :ignore)))
- (clsql:view-exists-p [bar] :owner *test-database-user*))))
+ (clsql:drop-index [bar] :on [employee]
+ :if-does-not-exist :ignore)
+ (clsql:index-exists-p [bar] :owner *test-database-user*))))
t nil)
;; create indexes with names as strings, symbols and in square brackets
(dolist (name names)
(clsql:create-index name :on [employee] :attributes '([emplid]))
(push (clsql:index-exists-p name :owner *test-database-user*) result)
- (case *test-database-type*
- (:mysql
- (clsql:drop-index name :on [employee] :if-does-not-exist :ignore))
- (t (clsql:drop-index name :if-does-not-exist :ignore))))
+ (clsql:drop-index name :on [employee] :if-does-not-exist :ignore))
(apply #'values result))
t t t)
+;; test list-table-indexes
+(deftest :fddl/index/3
+ (progn
+ (clsql:create-table [i3test] '(([a] (string 10))
+ ([b] integer)))
+ (clsql:create-index [foo] :on [i3test] :attributes
+ '([b]) :unique nil)
+ (clsql:create-index [bar] :on [i3test] :attributes
+ '([a]) :unique t)
+ (values
+ (clsql:table-exists-p [i3test])
+ (clsql:index-exists-p [foo])
+ (clsql:index-exists-p [bar])
+ (sort
+ (mapcar
+ #'string-downcase
+ (clsql:list-table-indexes [i3test] :owner *test-database-user*))
+ #'string-lessp)
+ (sort (clsql:list-table-indexes [company] :owner *test-database-user*)
+ #'string-lessp)
+ (progn
+ (clsql:drop-index [bar] :on [i3test])
+ (clsql:drop-index [foo] :on [i3test])
+ (clsql:drop-table [i3test])
+ t)))
+ t t t ("bar" "foo") nil t)
+
;; create an sequence, test for existence, drop it and test again
(deftest :fddl/sequence/1
(progn (clsql:create-sequence [foo])
(clsql:drop-sequence [foo] :if-does-not-exist :ignore)))
6)
+))
+
#.(clsql:restore-sql-reader-syntax-state)