Skip to content

Commit d634eec

Browse files
committed
Add tests for SQL codegen
1 parent 6fb4a4b commit d634eec

File tree

2 files changed

+292
-0
lines changed

2 files changed

+292
-0
lines changed

phpunit.xml

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<phpunit bootstrap="vendor/autoload.php" colors="true">
3+
<source>
4+
<include>
5+
<directory suffix=".php">src/</directory>
6+
</include>
7+
</source>
38
<testsuites>
49
<testsuite name="tests">
510
<directory>test/tests/</directory>

test/tests/SQLTest.php

+287
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,287 @@
1+
<?php
2+
3+
namespace Aternos\Model\Test\Tests;
4+
5+
use Aternos\Model\Query\DeleteQuery;
6+
use Aternos\Model\Query\Generator\SQL;
7+
use Aternos\Model\Query\Limit;
8+
use Aternos\Model\Query\SelectField;
9+
use Aternos\Model\Query\SelectQuery;
10+
use Aternos\Model\Query\UpdateQuery;
11+
use Aternos\Model\Query\WhereCondition;
12+
use Aternos\Model\Query\WhereGroup;
13+
use Aternos\Model\Test\Src\TestModel;
14+
use PHPUnit\Framework\TestCase;
15+
16+
class SQLTest extends TestCase
17+
{
18+
protected SQL $sql;
19+
20+
protected function setUp(): void
21+
{
22+
$this->sql = new SQL("addslashes");
23+
}
24+
25+
public function testSelect()
26+
{
27+
$query = new SelectQuery();
28+
$query->modelClassName = TestModel::class;
29+
30+
$this->assertEquals("SELECT * FROM `test`", $this->sql->generate($query));
31+
}
32+
33+
public function testSelectWhereCondition()
34+
{
35+
$query = new SelectQuery(
36+
new WhereCondition('text', 'value'),
37+
);
38+
$query->modelClassName = TestModel::class;
39+
40+
$this->assertEquals("SELECT * FROM `test` WHERE (`text` = 'value')", $this->sql->generate($query));
41+
}
42+
43+
public function testSelectWhereConditionNumber()
44+
{
45+
$query = new SelectQuery(
46+
new WhereCondition('number', 1),
47+
);
48+
$query->modelClassName = TestModel::class;
49+
50+
$this->assertEquals("SELECT * FROM `test` WHERE (`number` = 1)", $this->sql->generate($query));
51+
}
52+
53+
public function testSelectWhereConditionFloat()
54+
{
55+
$query = new SelectQuery(
56+
new WhereCondition('number', 1.5),
57+
);
58+
$query->modelClassName = TestModel::class;
59+
60+
$this->assertEquals("SELECT * FROM `test` WHERE (`number` = 1.5)", $this->sql->generate($query));
61+
}
62+
63+
public function testSelectWhereConditionOperator()
64+
{
65+
$query = new SelectQuery(
66+
new WhereCondition('text', 'value', '!='),
67+
);
68+
$query->modelClassName = TestModel::class;
69+
70+
$this->assertEquals("SELECT * FROM `test` WHERE (`text` != 'value')", $this->sql->generate($query));
71+
}
72+
73+
public function testSelectWhereConditionNull()
74+
{
75+
$query = new SelectQuery(
76+
new WhereCondition('text', null),
77+
);
78+
$query->modelClassName = TestModel::class;
79+
80+
$this->assertEquals("SELECT * FROM `test` WHERE (`text` IS NULL)", $this->sql->generate($query));
81+
}
82+
83+
public function testSelectWhereConditionNotNull()
84+
{
85+
$query = new SelectQuery(
86+
new WhereCondition('text', null, '!='),
87+
);
88+
$query->modelClassName = TestModel::class;
89+
90+
$this->assertEquals("SELECT * FROM `test` WHERE (`text` IS NOT NULL)", $this->sql->generate($query));
91+
}
92+
93+
public function testSelectWhereConditionIN()
94+
{
95+
$query = new SelectQuery(
96+
new WhereCondition('number', [1.5, 5, "a", ["b", "c", "d"]], 'IN'),
97+
);
98+
$query->modelClassName = TestModel::class;
99+
100+
$this->assertEquals("SELECT * FROM `test` WHERE (`number` IN (1.5, 5, 'a', ('b', 'c', 'd')))", $this->sql->generate($query));
101+
}
102+
103+
public function testSelectWhereArray()
104+
{
105+
$query = new SelectQuery([
106+
'number' => 1,
107+
'text' => 'value',
108+
]);
109+
$query->modelClassName = TestModel::class;
110+
111+
$this->assertEquals("SELECT * FROM `test` WHERE (`number` = 1 AND `text` = 'value')", $this->sql->generate($query));
112+
}
113+
114+
public function testSelectWhereArrayOperator()
115+
{
116+
$query = new SelectQuery([
117+
['number', 0.5],
118+
['number', '<', 1],
119+
'text' => 'value',
120+
]);
121+
$query->modelClassName = TestModel::class;
122+
123+
$this->assertEquals("SELECT * FROM `test` WHERE (`number` = 0.5 AND `number` < 1 AND `text` = 'value')", $this->sql->generate($query));
124+
}
125+
126+
public function testSelectWhereGroup()
127+
{
128+
$query = new SelectQuery(
129+
new WhereGroup([
130+
new WhereCondition('number', 1, '<'),
131+
new WhereCondition('number', 0, '>'),
132+
]),
133+
);
134+
$query->modelClassName = TestModel::class;
135+
136+
$this->assertEquals("SELECT * FROM `test` WHERE (`number` < 1 AND `number` > 0)", $this->sql->generate($query));
137+
}
138+
139+
public function testSelectWhereGroupOR()
140+
{
141+
$query = new SelectQuery(
142+
new WhereGroup([
143+
new WhereCondition('number', 1, '>'),
144+
new WhereCondition('number', 0, '<'),
145+
], WhereGroup::OR),
146+
);
147+
$query->modelClassName = TestModel::class;
148+
149+
$this->assertEquals("SELECT * FROM `test` WHERE (`number` > 1 OR `number` < 0)", $this->sql->generate($query));
150+
}
151+
152+
public function testSelectSingleField()
153+
{
154+
$query = new SelectQuery(fields: ['text']);
155+
$query->modelClassName = TestModel::class;
156+
157+
$this->assertEquals("SELECT `text` FROM `test`", $this->sql->generate($query));
158+
}
159+
160+
public function testSelectSelectFields()
161+
{
162+
$query = new SelectQuery(fields: ['text', 'number']);
163+
$query->modelClassName = TestModel::class;
164+
165+
$this->assertEquals("SELECT `text`, `number` FROM `test`", $this->sql->generate($query));
166+
}
167+
168+
public function testSelectOrder()
169+
{
170+
$query = new SelectQuery(order: [
171+
'number' => 'ASC',
172+
'text' => 'DESC',
173+
]);
174+
$query->modelClassName = TestModel::class;
175+
176+
$this->assertEquals("SELECT * FROM `test` ORDER BY `number` ASC, `text` DESC", $this->sql->generate($query));
177+
}
178+
179+
public function testSelectCount()
180+
{
181+
$query = new SelectQuery(fields: [
182+
(new SelectField('number'))->setFunction(SelectField::COUNT),
183+
]);
184+
$query->modelClassName = TestModel::class;
185+
186+
$this->assertEquals("SELECT COUNT(`number`) FROM `test`", $this->sql->generate($query));
187+
}
188+
189+
public function testSelectCountStar()
190+
{
191+
$query = new SelectQuery(fields: [
192+
(new SelectField('*'))->setFunction(SelectField::COUNT),
193+
]);
194+
$query->modelClassName = TestModel::class;
195+
196+
$this->assertEquals("SELECT COUNT(*) FROM `test`", $this->sql->generate($query));
197+
}
198+
199+
public function testSelectSum()
200+
{
201+
$query = new SelectQuery(fields: [
202+
(new SelectField('number'))->setFunction(SelectField::SUM),
203+
]);
204+
$query->modelClassName = TestModel::class;
205+
206+
$this->assertEquals("SELECT SUM(`number`) FROM `test`", $this->sql->generate($query));
207+
}
208+
209+
public function testSelectSumAs()
210+
{
211+
$query = new SelectQuery(fields: [
212+
(new SelectField('number'))->setFunction(SelectField::SUM)->setAlias('sum'),
213+
]);
214+
$query->modelClassName = TestModel::class;
215+
216+
$this->assertEquals("SELECT SUM(`number`) AS `sum` FROM `test`", $this->sql->generate($query));
217+
}
218+
219+
public function testSelectAVG()
220+
{
221+
$query = new SelectQuery(fields: [
222+
(new SelectField('number'))->setFunction(SelectField::AVERAGE),
223+
]);
224+
$query->modelClassName = TestModel::class;
225+
226+
$this->assertEquals("SELECT AVG(`number`) FROM `test`", $this->sql->generate($query));
227+
}
228+
229+
public function testSelectLimitNumber()
230+
{
231+
$query = new SelectQuery(limit:100);
232+
$query->modelClassName = TestModel::class;
233+
234+
$this->assertEquals("SELECT * FROM `test` LIMIT 0, 100", $this->sql->generate($query));
235+
}
236+
237+
public function testSelectLimitArray()
238+
{
239+
$query = new SelectQuery(limit:[5, 100]);
240+
$query->modelClassName = TestModel::class;
241+
242+
$this->assertEquals("SELECT * FROM `test` LIMIT 5, 100", $this->sql->generate($query));
243+
}
244+
245+
public function testSelectLimit()
246+
{
247+
$query = new SelectQuery(limit:new Limit(100, 5));
248+
$query->modelClassName = TestModel::class;
249+
250+
$this->assertEquals("SELECT * FROM `test` LIMIT 5, 100", $this->sql->generate($query));
251+
}
252+
253+
public function testSelectGroup()
254+
{
255+
$query = new SelectQuery(group:['number', 'text']);
256+
$query->modelClassName = TestModel::class;
257+
258+
$this->assertEquals("SELECT * FROM `test` GROUP BY `number`, `text`", $this->sql->generate($query));
259+
}
260+
261+
public function testDelete()
262+
{
263+
$query = new DeleteQuery();
264+
$query->modelClassName = TestModel::class;
265+
266+
/** @noinspection SqlWithoutWhere */
267+
$this->assertEquals("DELETE FROM `test`", $this->sql->generate($query));
268+
}
269+
270+
public function testDeleteLimit()
271+
{
272+
$query = new DeleteQuery(limit: 100);
273+
$query->modelClassName = TestModel::class;
274+
275+
/** @noinspection SqlWithoutWhere */
276+
$this->assertEquals("DELETE FROM `test` LIMIT 100", $this->sql->generate($query));
277+
}
278+
279+
public function testUpdate()
280+
{
281+
$query = new UpdateQuery(['text' => 'value']);
282+
$query->modelClassName = TestModel::class;
283+
284+
/** @noinspection SqlWithoutWhere */
285+
$this->assertEquals("UPDATE `test` SET `text` = 'value'", $this->sql->generate($query));
286+
}
287+
}

0 commit comments

Comments
 (0)