1 module shark.test;
2 
3 unittest {
4 
5 	import std.exception : assertThrown;
6 
7 	import shark.clause;
8 	import shark.database;
9 	import shark.entity;
10 	import shark.sql;
11 
12 	import shark.impl.mysql;
13 	import shark.impl.postgresql;
14 
15 	static class Test : Entity {
16 
17 		override string tableName() {
18 			return "test";
19 		}
20 
21 	}
22 
23 	static class Test0 : Test {
24 
25 		@PrimaryKey
26 		@AutoIncrement
27 		Integer testId;
28 
29 		@Name("string")
30 		@Length(10)
31 		String test;
32 
33 	}
34 
35 	static class Test1 : Test0 {
36 
37 		@NotNull
38 		Integer a;
39 
40 		@Unique
41 		Short b;
42 
43 	}
44 
45 	// table with all the types
46 	static class Test2 : Test {
47 
48 		Bool a;
49 
50 		//Byte b;
51 
52 		Short c;
53 
54 		Integer d;
55 
56 		Long e;
57 
58 		Float f;
59 
60 		Double g;
61 
62 		Char h;
63 
64 		@Length(80)
65 		String i;
66 
67 		@Length(80)
68 		Binary l;
69 
70 		Clob m;
71 
72 		Blob n;
73 
74 		Date o;
75 
76 		DateTime p;
77 
78 		Time q;
79 
80 	}
81 
82 	// table with composite primary key
83 	static class Test3 : Test {
84 
85 		@PrimaryKey
86 		Integer id1;
87 
88 		@PrimaryKey
89 		String id2;
90 
91 		uint value;
92 
93 	}
94 
95 	static class Test4 : Test {
96 
97 		string str;
98 
99 	}
100 
101 	Database[] databases;
102 
103 	Database mysql = new MysqlDatabase("localhost");
104 	mysql.connect("test", "root", "root");
105 	//databases ~= mysql;
106 
107 	Database maria = new MysqlDatabase("localhost", 3307);
108 	maria.connect("test", "root", "root");
109 	//databases ~= maria;
110 
111 	Database postgres = new PostgresqlDatabase("localhost");
112 	postgres.connect("test", "postgres", "root");
113 	databases ~= postgres;
114 
115 	foreach(database ; databases) {
116 
117 		database.dropIfExists("test");
118 
119 		database.init!Test0(); // create
120 		database.init!Test1(); // alter
121 
122 		assert(database.select!Test1().length == 0);
123 
124 		Test1 test1 = new Test1();
125 		test1.test = "test";
126 		test1.a = 55;
127 		test1.b = -1;
128 		database.insert(test1);
129 		assert(test1.testId == 1);
130 
131 		test1.testId = null;
132 		assertThrown!DatabaseException(database.insert(test1)); // `b` is unique
133 
134 		test1.a = null;
135 		assertThrown!DatabaseException(database.insert(test1)); // `a` cannot be null
136 
137 		test1.a = 44;
138 		test1.b = 1;
139 		database.insert(test1, false);
140 
141 		test1.a = 33;
142 		test1.b = 6;
143 		database.insert(test1);
144 
145 		assert(database.select!Test1().length == 3);
146 
147 		test1 = new Test1();
148 		test1.test = "test";
149 		test1 = database.selectOne!(["string"], Test1)(Database.Select(Clause.Where(var("string").equals("test"))));
150 		assert(test1.test == "test");
151 
152 		Test1[] test1s = database.select!Test1(Database.Select(Clause.Order("a")));
153 		assert(test1s[0].a == 33);
154 		assert(test1s[1].a == 44);
155 		assert(test1s[2].a == 55);
156 
157 		test1s = database.select!Test1(Database.Select(Clause.Where(var("a").lessThan(40) & var("b").notEquals(0))));
158 		assert(test1s.length == 1);
159 		assert(test1s[0].a == 33);
160 
161 		database.drop("test");
162 		database.init!Test2();
163 
164 		Test2 test2 = new Test2();
165 		test2.a = true;
166 		//test2.b = 12;
167 		test2.c = 13;
168 		test2.d = -14;
169 		test2.e = null;
170 		test2.f = .55f;
171 		test2.g = 7.34823e+10;
172 		test2.h = ';';
173 		test2.i = "test";
174 		test2.l = [0, 1, 2, 55];
175 		test2.m = "___________________";
176 		test2.n = [0, 0, 0, 0, 0, 0, 0];
177 		test2.o = Date(2018, 12, 31);
178 		test2.p = DateTime(2019, 1, 1, 0, 27, 43);
179 		test2.q = Time(0, 36, 12);
180 		database.insert(test2);
181 
182 		Test2[] test2s = database.select!Test2();
183 		assert(test2s.length == 1);
184 		test2 = test2s[0];
185 		assert(test2.a == true);
186 		//assert(test2.b == 12);
187 		assert(test2.c == 13);
188 		assert(test2.d == -14);
189 		assert(test2.e.isNull);
190 		assert(test2.f == .55f);
191 		assert(test2.g == 7.34823e+10);
192 		assert(test2.h == ';');
193 		assert(test2.i == "test");
194 		assert(test2.l == [0, 1, 2, 55]);
195 		assert(test2.m == "___________________");
196 		assert(test2.n == [0, 0, 0, 0, 0, 0, 0]);
197 		assert(test2.o == Date(2018, 12, 31));
198 		assert(test2.p == DateTime(2019, 1, 1, 0, 27, 43));
199 		assert(test2.q == Time(0, 36, 12));
200 
201 		database.drop("test");
202 		database.init!Test3();
203 
204 		Test3 test3 = new Test3();
205 		test3.id1 = 1;
206 		test3.id2 = "test";
207 		test3.value = int.max;
208 		database.insert(test3);
209 
210 		test3.value = 12;
211 		database.update!"value"(test3);
212 
213 		test3 = database.selectId!Test3(test3);
214 		assert(test3.id1 == 1);
215 		assert(test3.id2 == "test");
216 		assert(test3.value == 12);
217 
218 		database.del(test3);
219 		assert(database.select!Test3().length == 0);
220 
221 		database.drop("test");
222 		database.init!Test4();
223 
224 		Test4 test4 = new Test4();
225 		test4.str = "'";
226 		database.insert(test4);
227 		test4.str = "');drop table test;--";
228 		database.insert(test4);
229 
230 		database.close();
231 
232 	}
233 
234 }