/
QueryExpressionTest.php
136 lines (123 loc) · 3.79 KB
/
QueryExpressionTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 3.0.6
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Test\TestCase\Database\Expression;
use Cake\Database\Expression\CaseExpression;
use Cake\Database\Expression\QueryExpression;
use Cake\Database\ValueBinder;
use Cake\TestSuite\TestCase;
/**
* Tests QueryExpression class
*/
class QueryExpressionTest extends TestCase
{
/**
* Test and() and or() calls work transparently
*
* @return void
*/
public function testAndOrCalls()
{
$expr = new QueryExpression();
$expected = '\Cake\Database\Expression\QueryExpression';
$this->assertInstanceOf($expected, $expr->and([]));
$this->assertInstanceOf($expected, $expr->or([]));
}
/**
* Test SQL generation with one element
*
* @return void
*/
public function testSqlGenerationOneClause()
{
$expr = new QueryExpression();
$binder = new ValueBinder();
$expr->add(['Users.username' => 'sally'], ['Users.username' => 'string']);
$result = $expr->sql($binder);
$this->assertEquals('Users.username = :c0', $result);
}
/**
* Test SQL generation with many elements
*
* @return void
*/
public function testSqlGenerationMultipleClauses()
{
$expr = new QueryExpression();
$binder = new ValueBinder();
$expr->add(
[
'Users.username' => 'sally',
'Users.active' => 1,
],
[
'Users.username' => 'string',
'Users.active' => 'boolean'
]
);
$result = $expr->sql($binder);
$this->assertEquals('(Users.username = :c0 AND Users.active = :c1)', $result);
}
/**
* Test that empty expressions don't emit invalid SQL.
*
* @return void
*/
public function testSqlWhenEmpty()
{
$expr = new QueryExpression();
$binder = new ValueBinder();
$result = $expr->sql($binder);
$this->assertEquals('', $result);
}
/**
* Test deep cloning of expression trees.
*
* @return void
*/
public function testDeepCloning()
{
$expr = new QueryExpression();
$expr = $expr->add(new QueryExpression('1 + 1'))
->isNull('deleted')
->like('title', 'things%');
$dupe = clone $expr;
$this->assertEquals($dupe, $expr);
$this->assertNotSame($dupe, $expr);
$originalParts = [];
$expr->iterateParts(function ($part) use (&$originalParts) {
$originalParts[] = $part;
});
$dupe->iterateParts(function ($part, $i) use ($originalParts) {
$this->assertNotSame($originalParts[$i], $part);
});
}
/**
* Tests the hasNestedExpression() function
*
* @return void
*/
public function testHasNestedExpression()
{
$expr = new QueryExpression();
$this->assertFalse($expr->hasNestedExpression());
$expr->add(['a' => 'b']);
$this->assertTrue($expr->hasNestedExpression());
$expr = new QueryExpression();
$expr->add('a = b');
$this->assertFalse($expr->hasNestedExpression());
$expr->add(new QueryExpression('1 = 1'));
$this->assertTrue($expr->hasNestedExpression());
}
}