Completed
Push — master ( ef5eaa...6d70d2 )
by Lars
03:21 queued 30s
created

QueryBuilderTest::testRawJoinAndRawWhereWithParameters()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 18

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 22
rs 9.2
cc 1
eloc 18
nc 1
nop 0
1
<?php
2
3
use idiorm\orm\ORM;
4
5
class QueryBuilderTest extends PHPUnit_Framework_TestCase
6
{
7
8
  public function setUp()
9
  {
10
    // Enable logging
11
    ORM::configure('logging', true);
12
13
    // Set up the dummy database connection
14
    $db = new MockPDO('sqlite::memory:');
15
    ORM::set_db($db);
16
  }
17
18
  public function tearDown()
19
  {
20
    ORM::reset_config();
21
    ORM::reset_db();
22
  }
23
24
  public function testFindMany()
25
  {
26
    ORM::for_table('widget')->find_many();
27
    $expected = "SELECT * FROM `widget`";
28
    $this->assertEquals($expected, ORM::get_last_query());
29
  }
30
31
  public function testFindOne()
32
  {
33
    ORM::for_table('widget')->find_one();
34
    $expected = "SELECT * FROM `widget` LIMIT 1";
35
    $this->assertEquals($expected, ORM::get_last_query());
36
  }
37
38
  public function testFindOneWithPrimaryKeyFilter()
39
  {
40
    ORM::for_table('widget')->find_one(5);
41
    $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
42
    $this->assertEquals($expected, ORM::get_last_query());
43
  }
44
45
  public function testWhereIdIs()
46
  {
47
    ORM::for_table('widget')->where_id_is(5)->find_one();
48
    $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
49
    $this->assertEquals($expected, ORM::get_last_query());
50
  }
51
52
  public function testWhereIdIn()
53
  {
54
    ORM::for_table('widget')->where_id_in(array(4, 5))->find_many();
55
    $expected = "SELECT * FROM `widget` WHERE `id` IN ('4', '5')";
56
    $this->assertEquals($expected, ORM::get_last_query());
57
  }
58
59
  public function testSingleWhereClause()
60
  {
61
    ORM::for_table('widget')->where('name', 'Fred')->find_one();
62
    $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' LIMIT 1";
63
    $this->assertEquals($expected, ORM::get_last_query());
64
  }
65
66
  public function testMultipleWhereClauses()
67
  {
68
    ORM::for_table('widget')->where('name', 'Fred')->where('age', 10)->find_one();
69
    $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND `age` = '10' LIMIT 1";
70
    $this->assertEquals($expected, ORM::get_last_query());
71
  }
72
73
  public function testWhereNotEqual()
74
  {
75
    ORM::for_table('widget')->where_not_equal('name', 'Fred')->find_many();
76
    $expected = "SELECT * FROM `widget` WHERE `name` != 'Fred'";
77
    $this->assertEquals($expected, ORM::get_last_query());
78
  }
79
80
  public function testWhereLike()
81
  {
82
    ORM::for_table('widget')->where_like('name', '%Fred%')->find_one();
83
    $expected = "SELECT * FROM `widget` WHERE `name` LIKE '%Fred%' LIMIT 1";
84
    $this->assertEquals($expected, ORM::get_last_query());
85
  }
86
87
  public function testWhereNotLike()
88
  {
89
    ORM::for_table('widget')->where_not_like('name', '%Fred%')->find_one();
90
    $expected = "SELECT * FROM `widget` WHERE `name` NOT LIKE '%Fred%' LIMIT 1";
91
    $this->assertEquals($expected, ORM::get_last_query());
92
  }
93
94
  public function testWhereIn()
95
  {
96
    ORM::for_table('widget')->where_in('name', array('Fred', 'Joe'))->find_many();
97
    $expected = "SELECT * FROM `widget` WHERE `name` IN ('Fred', 'Joe')";
98
    $this->assertEquals($expected, ORM::get_last_query());
99
  }
100
101
  public function testWhereNotIn()
102
  {
103
    ORM::for_table('widget')->where_not_in('name', array('Fred', 'Joe'))->find_many();
104
    $expected = "SELECT * FROM `widget` WHERE `name` NOT IN ('Fred', 'Joe')";
105
    $this->assertEquals($expected, ORM::get_last_query());
106
  }
107
108
  public function testWhereAnyIs()
109
  {
110
    ORM::for_table('widget')->where_any_is(
111
        array(
112
            array('name' => 'Joe', 'age' => 10),
113
            array('name' => 'Fred', 'age' => 20),
114
        )
115
    )->find_many();
116
    $expected = "SELECT * FROM `widget` WHERE (( `name` = 'Joe' AND `age` = '10' ) OR ( `name` = 'Fred' AND `age` = '20' ))";
117
    $this->assertEquals($expected, ORM::get_last_query());
118
  }
119
120
  public function testWhereAnyIsOverrideOneColumn()
121
  {
122
    ORM::for_table('widget')->where_any_is(
123
        array(
124
            array('name' => 'Joe', 'age' => 10),
125
            array('name' => 'Fred', 'age' => 20),
126
        ), array('age' => '>')
127
    )->find_many();
128
    $expected = "SELECT * FROM `widget` WHERE (( `name` = 'Joe' AND `age` > '10' ) OR ( `name` = 'Fred' AND `age` > '20' ))";
129
    $this->assertEquals($expected, ORM::get_last_query());
130
  }
131
132
  public function testWhereAnyIsOverrideAllOperators()
133
  {
134
    ORM::for_table('widget')->where_any_is(
135
        array(
136
            array('score' => '5', 'age' => 10),
137
            array('score' => '8', 'age' => 15),
138
            array('score' => '15', 'age' => 20),
139
        ), '>'
140
    )->find_many();
141
    $expected = "SELECT * FROM `widget` WHERE (( `score` > '5' AND `age` > '10' ) OR ( `score` > '8' AND `age` > '15' ) OR ( `score` > '15' AND `age` > '20' ))";
142
    $this->assertEquals($expected, ORM::get_last_query());
143
  }
144
145
  public function testLimit()
146
  {
147
    ORM::for_table('widget')->limit(5)->find_many();
148
    $expected = "SELECT * FROM `widget` LIMIT 5";
149
    $this->assertEquals($expected, ORM::get_last_query());
150
  }
151
152
  public function testLimitAndOffset()
153
  {
154
    ORM::for_table('widget')->limit(5)->offset(5)->find_many();
155
    $expected = "SELECT * FROM `widget` LIMIT 5 OFFSET 5";
156
    $this->assertEquals($expected, ORM::get_last_query());
157
  }
158
159
  public function testOrderByDesc()
160
  {
161
    ORM::for_table('widget')->order_by_desc('name')->find_one();
162
    $expected = "SELECT * FROM `widget` ORDER BY `name` DESC LIMIT 1";
163
    $this->assertEquals($expected, ORM::get_last_query());
164
  }
165
166
  public function testOrderByAsc()
167
  {
168
    ORM::for_table('widget')->order_by_asc('name')->find_one();
169
    $expected = "SELECT * FROM `widget` ORDER BY `name` ASC LIMIT 1";
170
    $this->assertEquals($expected, ORM::get_last_query());
171
  }
172
173
  public function testOrderByExpression()
174
  {
175
    ORM::for_table('widget')->order_by_expr('SOUNDEX(`name`)')->find_one();
176
    $expected = "SELECT * FROM `widget` ORDER BY SOUNDEX(`name`) LIMIT 1";
177
    $this->assertEquals($expected, ORM::get_last_query());
178
  }
179
180
  public function testMultipleOrderBy()
181
  {
182
    ORM::for_table('widget')->order_by_asc('name')->order_by_desc('age')->find_one();
183
    $expected = "SELECT * FROM `widget` ORDER BY `name` ASC, `age` DESC LIMIT 1";
184
    $this->assertEquals($expected, ORM::get_last_query());
185
  }
186
187
  public function testGroupBy()
188
  {
189
    ORM::for_table('widget')->group_by('name')->find_many();
190
    $expected = "SELECT * FROM `widget` GROUP BY `name`";
191
    $this->assertEquals($expected, ORM::get_last_query());
192
  }
193
194
  public function testMultipleGroupBy()
195
  {
196
    ORM::for_table('widget')->group_by('name')->group_by('age')->find_many();
197
    $expected = "SELECT * FROM `widget` GROUP BY `name`, `age`";
198
    $this->assertEquals($expected, ORM::get_last_query());
199
  }
200
201
  public function testGroupByExpression()
202
  {
203
    ORM::for_table('widget')->group_by_expr("FROM_UNIXTIME(`time`, '%Y-%m')")->find_many();
204
    $expected = "SELECT * FROM `widget` GROUP BY FROM_UNIXTIME(`time`, '%Y-%m')";
205
    $this->assertEquals($expected, ORM::get_last_query());
206
  }
207
208
  public function testHaving()
209
  {
210
    ORM::for_table('widget')->group_by('name')->having('name', 'Fred')->find_one();
211
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' LIMIT 1";
212
    $this->assertEquals($expected, ORM::get_last_query());
213
  }
214
215
  public function testMultipleHaving()
216
  {
217
    ORM::for_table('widget')->group_by('name')->having('name', 'Fred')->having('age', 10)->find_one();
218
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND `age` = '10' LIMIT 1";
219
    $this->assertEquals($expected, ORM::get_last_query());
220
  }
221
222
  public function testHavingNotEqual()
223
  {
224
    ORM::for_table('widget')->group_by('name')->having_not_equal('name', 'Fred')->find_many();
225
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` != 'Fred'";
226
    $this->assertEquals($expected, ORM::get_last_query());
227
  }
228
229
  public function testHavingLike()
230
  {
231
    ORM::for_table('widget')->group_by('name')->having_like('name', '%Fred%')->find_one();
232
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` LIKE '%Fred%' LIMIT 1";
233
    $this->assertEquals($expected, ORM::get_last_query());
234
  }
235
236
  public function testHavingNotLike()
237
  {
238
    ORM::for_table('widget')->group_by('name')->having_not_like('name', '%Fred%')->find_one();
239
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT LIKE '%Fred%' LIMIT 1";
240
    $this->assertEquals($expected, ORM::get_last_query());
241
  }
242
243
  public function testHavingIn()
244
  {
245
    ORM::for_table('widget')->group_by('name')->having_in('name', array('Fred', 'Joe'))->find_many();
246
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IN ('Fred', 'Joe')";
247
    $this->assertEquals($expected, ORM::get_last_query());
248
  }
249
250
  public function testHavingNotIn()
251
  {
252
    ORM::for_table('widget')->group_by('name')->having_not_in('name', array('Fred', 'Joe'))->find_many();
253
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT IN ('Fred', 'Joe')";
254
    $this->assertEquals($expected, ORM::get_last_query());
255
  }
256
257
  public function testHavingLessThan()
258
  {
259
    ORM::for_table('widget')->group_by('name')->having_lt('age', 10)->having_gt('age', 5)->find_many();
260
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` < '10' AND `age` > '5'";
261
    $this->assertEquals($expected, ORM::get_last_query());
262
  }
263
264
  public function testHavingLessThanOrEqualAndGreaterThanOrEqual()
265
  {
266
    ORM::for_table('widget')->group_by('name')->having_lte('age', 10)->having_gte('age', 5)->find_many();
267
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` <= '10' AND `age` >= '5'";
268
    $this->assertEquals($expected, ORM::get_last_query());
269
  }
270
271
  public function testHavingNull()
272
  {
273
    ORM::for_table('widget')->group_by('name')->having_null('name')->find_many();
274
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NULL";
275
    $this->assertEquals($expected, ORM::get_last_query());
276
  }
277
278
  public function testHavingNotNull()
279
  {
280
    ORM::for_table('widget')->group_by('name')->having_not_null('name')->find_many();
281
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NOT NULL";
282
    $this->assertEquals($expected, ORM::get_last_query());
283
  }
284
285
  public function testRawHaving()
286
  {
287
    ORM::for_table('widget')->group_by('name')->having_raw(
288
        '`name` = ? AND (`age` = ? OR `age` = ?)', array(
289
        'Fred',
290
        5,
291
        10,
292
    )
293
    )->find_many();
294
    $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
295
    $this->assertEquals($expected, ORM::get_last_query());
296
  }
297
298
  public function testComplexQuery()
299
  {
300
    ORM::for_table('widget')->where('name', 'Fred')->limit(5)->offset(5)->order_by_asc('name')->find_many();
301
    $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' ORDER BY `name` ASC LIMIT 5 OFFSET 5";
302
    $this->assertEquals($expected, ORM::get_last_query());
303
  }
304
305
  public function testWhereLessThanAndGreaterThan()
306
  {
307
    ORM::for_table('widget')->where_lt('age', 10)->where_gt('age', 5)->find_many();
308
    $expected = "SELECT * FROM `widget` WHERE `age` < '10' AND `age` > '5'";
309
    $this->assertEquals($expected, ORM::get_last_query());
310
  }
311
312
  public function testWhereLessThanAndEqualAndGreaterThanAndEqual()
313
  {
314
    ORM::for_table('widget')->where_lte('age', 10)->where_gte('age', 5)->find_many();
315
    $expected = "SELECT * FROM `widget` WHERE `age` <= '10' AND `age` >= '5'";
316
    $this->assertEquals($expected, ORM::get_last_query());
317
  }
318
319
  public function testWhereNull()
320
  {
321
    ORM::for_table('widget')->where_null('name')->find_many();
322
    $expected = "SELECT * FROM `widget` WHERE `name` IS NULL";
323
    $this->assertEquals($expected, ORM::get_last_query());
324
  }
325
326
  public function testWhereNotNull()
327
  {
328
    ORM::for_table('widget')->where_not_null('name')->find_many();
329
    $expected = "SELECT * FROM `widget` WHERE `name` IS NOT NULL";
330
    $this->assertEquals($expected, ORM::get_last_query());
331
  }
332
333
  public function testRawWhereClause()
334
  {
335
    ORM::for_table('widget')->where_raw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->find_many();
336
    $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
337
    $this->assertEquals($expected, ORM::get_last_query());
338
  }
339
340
  public function testRawWhereClauseWithPercentSign()
341
  {
342
    ORM::for_table('widget')->where_raw('STRFTIME("%Y", "now") = ?', array(2012))->find_many();
343
    $expected = "SELECT * FROM `widget` WHERE STRFTIME(\"%Y\", \"now\") = '2012'";
344
    $this->assertEquals($expected, ORM::get_last_query());
345
  }
346
347
  public function testRawWhereClauseWithNoParameters()
348
  {
349
    ORM::for_table('widget')->where_raw('`name` = "Fred"')->find_many();
350
    $expected = "SELECT * FROM `widget` WHERE `name` = \"Fred\"";
351
    $this->assertEquals($expected, ORM::get_last_query());
352
  }
353
354
  public function testRawWhereClauseInMethodChain()
355
  {
356
    ORM::for_table('widget')
357
       ->where('age', 18)
358
       ->where_raw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))
359
       ->where('size', 'large')
360
       ->find_many();
361
    $expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND `size` = 'large'";
362
    $this->assertEquals($expected, ORM::get_last_query());
363
  }
364
365
  public function testRawQuery()
366
  {
367
    ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w')->find_many();
368
    $expected = "SELECT `w`.* FROM `widget` w";
369
    $this->assertEquals($expected, ORM::get_last_query());
370
  }
371
372
  public function testRawQueryWithParameters()
373
  {
374
    ORM::for_table('widget')
375
       ->raw_query('SELECT `w`.* FROM `widget` w WHERE `name` = ? AND `age` = ?', array('Fred', 5))
376
       ->find_many();
377
    $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
378
    $this->assertEquals($expected, ORM::get_last_query());
379
  }
380
381
  public function testSimpleResultColumn()
382
  {
383
    ORM::for_table('widget')->select('name')->find_many();
384
    $expected = "SELECT `name` FROM `widget`";
385
    $this->assertEquals($expected, ORM::get_last_query());
386
  }
387
388
  public function testMultipleSimpleResultColumns()
389
  {
390
    ORM::for_table('widget')->select('name')->select('age')->find_many();
391
    $expected = "SELECT `name`, `age` FROM `widget`";
392
    $this->assertEquals($expected, ORM::get_last_query());
393
  }
394
395
  public function testSpecifyTableNameAndColumnInResultColumns()
396
  {
397
    ORM::for_table('widget')->select('widget.name')->find_many();
398
    $expected = "SELECT `widget`.`name` FROM `widget`";
399
    $this->assertEquals($expected, ORM::get_last_query());
400
  }
401
402
  public function testMainTableAlias()
403
  {
404
    ORM::for_table('widget')->table_alias('w')->find_many();
405
    $expected = "SELECT * FROM `widget` `w`";
406
    $this->assertEquals($expected, ORM::get_last_query());
407
  }
408
409
  public function testAliasesInResultColumns()
410
  {
411
    ORM::for_table('widget')->select('widget.name', 'widget_name')->find_many();
412
    $expected = "SELECT `widget`.`name` AS `widget_name` FROM `widget`";
413
    $this->assertEquals($expected, ORM::get_last_query());
414
  }
415
416
  public function testAliasesInSelectManyResults()
417
  {
418
    ORM::for_table('widget')->select_many(array('widget_name' => 'widget.name'), 'widget_handle')->find_many();
419
    $expected = "SELECT `widget`.`name` AS `widget_name`, `widget_handle` FROM `widget`";
420
    $this->assertEquals($expected, ORM::get_last_query());
421
  }
422
423
  public function testLiteralExpressionInResultColumn()
424
  {
425
    ORM::for_table('widget')->select_expr('COUNT(*)', 'count')->find_many();
426
    $expected = "SELECT COUNT(*) AS `count` FROM `widget`";
427
    $this->assertEquals($expected, ORM::get_last_query());
428
  }
429
430
  public function testLiteralExpressionInSelectManyResultColumns()
431
  {
432
    ORM::for_table('widget')->select_many_expr(array('count' => 'COUNT(*)'), 'SUM(widget_order)')->find_many();
433
    $expected = "SELECT COUNT(*) AS `count`, SUM(widget_order) FROM `widget`";
434
    $this->assertEquals($expected, ORM::get_last_query());
435
  }
436
437
  public function testSimpleJoin()
438
  {
439
    ORM::for_table('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
440
    $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
441
    $this->assertEquals($expected, ORM::get_last_query());
442
  }
443
444
  public function testSimpleJoinWithWhereIdIsMethod()
445
  {
446
    ORM::for_table('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_one(5);
447
    $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` WHERE `widget`.`id` = '5' LIMIT 1";
448
    $this->assertEquals($expected, ORM::get_last_query());
449
  }
450
451
  public function testInnerJoin()
452
  {
453
    ORM::for_table('widget')
454
       ->inner_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))
455
       ->find_many();
456
    $expected = "SELECT * FROM `widget` INNER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
457
    $this->assertEquals($expected, ORM::get_last_query());
458
  }
459
460
  public function testLeftOuterJoin()
461
  {
462
    ORM::for_table('widget')
463
       ->left_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))
464
       ->find_many();
465
    $expected = "SELECT * FROM `widget` LEFT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
466
    $this->assertEquals($expected, ORM::get_last_query());
467
  }
468
469
  public function testRightOuterJoin()
470
  {
471
    ORM::for_table('widget')
472
       ->right_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))
473
       ->find_many();
474
    $expected = "SELECT * FROM `widget` RIGHT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
475
    $this->assertEquals($expected, ORM::get_last_query());
476
  }
477
478
  public function testFullOuterJoin()
479
  {
480
    ORM::for_table('widget')
481
       ->full_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))
482
       ->find_many();
483
    $expected = "SELECT * FROM `widget` FULL OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
484
    $this->assertEquals($expected, ORM::get_last_query());
485
  }
486
487
  public function testMultipleJoinSources()
488
  {
489
    ORM::for_table('widget')
490
       ->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))
491
       ->join('widget_nozzle', array('widget_nozzle.widget_id', '=', 'widget.id'))
492
       ->find_many();
493
    $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` JOIN `widget_nozzle` ON `widget_nozzle`.`widget_id` = `widget`.`id`";
494
    $this->assertEquals($expected, ORM::get_last_query());
495
  }
496
497
  public function testJoinWithAliases()
498
  {
499
    ORM::for_table('widget')->join('widget_handle', array('wh.widget_id', '=', 'widget.id'), 'wh')->find_many();
500
    $expected = "SELECT * FROM `widget` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `widget`.`id`";
501
    $this->assertEquals($expected, ORM::get_last_query());
502
  }
503
504
  public function testJoinWithAliasesAndWhere()
505
  {
506
    ORM::for_table('widget')
507
       ->table_alias('w')
508
       ->join('widget_handle', array('wh.widget_id', '=', 'w.id'), 'wh')
509
       ->where_equal('id', 1)
510
       ->find_many();
511
    $expected = "SELECT * FROM `widget` `w` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `w`.`id` WHERE `w`.`id` = '1'";
512
    $this->assertEquals($expected, ORM::get_last_query());
513
  }
514
515
  public function testJoinWithStringConstraint()
516
  {
517
    ORM::for_table('widget')->join('widget_handle', "widget_handle.widget_id = widget.id")->find_many();
518
    $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON widget_handle.widget_id = widget.id";
519
    $this->assertEquals($expected, ORM::get_last_query());
520
  }
521
522
  public function testRawJoin()
523
  {
524
    ORM::for_table('widget')->raw_join(
525
        'INNER JOIN ( SELECT * FROM `widget_handle` )', array(
526
        'widget_handle.widget_id',
527
        '=',
528
        'widget.id',
529
    ), 'widget_handle'
530
    )->find_many();
531
    $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` ) `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
532
    $this->assertEquals($expected, ORM::get_last_query());
533
  }
534
535
  public function testRawJoinWithParameters()
536
  {
537
    ORM::for_table('widget')
538
       ->raw_join(
539
           'INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array(
540
           'widget_handle.widget_id',
541
           '=',
542
           'widget.id',
543
       ), 'widget_handle', array('%button%', 2)
544
       )
545
       ->find_many();
546
    $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
547
    $this->assertEquals($expected, ORM::get_last_query());
548
  }
549
550
  public function testRawJoinAndRawWhereWithParameters()
551
  {
552
    ORM::for_table('widget')
553
       ->raw_join(
554
           'INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array(
555
           'widget_handle.widget_id',
556
           '=',
557
           'widget.id',
558
       ), 'widget_handle', array('%button%', 2)
559
       )
560
       ->raw_join(
561
           'INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE ?)', array(
562
           'person.id',
563
           '=',
564
           'widget.person_id',
565
       ), 'person', array('%Fred%')
566
       )
567
       ->where_raw('`id` > ? AND `id` < ?', array(5, 10))
568
       ->find_many();
569
    $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE '%Fred%') `person` ON `person`.`id` = `widget`.`person_id` WHERE `id` > '5' AND `id` < '10'";
570
    $this->assertEquals($expected, ORM::get_last_query());
571
  }
572
573
  public function testSelectWithDistinct()
574
  {
575
    ORM::for_table('widget')->distinct()->select('name')->find_many();
576
    $expected = "SELECT DISTINCT `name` FROM `widget`";
577
    $this->assertEquals($expected, ORM::get_last_query());
578
  }
579
580
  public function testInsertData()
581
  {
582
    $widget = ORM::for_table('widget')->create();
583
    $widget->name = "Fred";
584
    $widget->age = 10;
585
    $widget->save();
586
    $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
587
    $this->assertEquals($expected, ORM::get_last_query());
588
  }
589
590
  public function testInsertDataContainingAnExpression()
591
  {
592
    $widget = ORM::for_table('widget')->create();
593
    $widget->name = "Fred";
594
    $widget->age = 10;
595
    $widget->set_expr('added', 'NOW()');
596
    $widget->save();
597
    $expected = "INSERT INTO `widget` (`name`, `age`, `added`) VALUES ('Fred', '10', NOW())";
598
    $this->assertEquals($expected, ORM::get_last_query());
599
  }
600
601
  public function testInsertDataUsingArrayAccess()
602
  {
603
    $widget = ORM::for_table('widget')->create();
604
    $widget['name'] = "Fred";
605
    $widget['age'] = 10;
606
    $widget->save();
607
    $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
608
    $this->assertEquals($expected, ORM::get_last_query());
609
  }
610
611
  public function testUpdateData()
612
  {
613
    $widget = ORM::for_table('widget')->find_one(1);
614
    $widget->name = "Fred";
615
    $widget->age = 10;
616
    $widget->save();
617
    $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
618
    $this->assertEquals($expected, ORM::get_last_query());
619
  }
620
621
  public function testUpdateDataContainingAnExpression()
622
  {
623
    $widget = ORM::for_table('widget')->find_one(1);
624
    $widget->name = "Fred";
625
    $widget->age = 10;
626
    $widget->set_expr('added', 'NOW()');
627
    $widget->save();
628
    $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW() WHERE `id` = '1'";
629
    $this->assertEquals($expected, ORM::get_last_query());
630
  }
631
632
  public function testUpdateMultipleFields()
633
  {
634
    $widget = ORM::for_table('widget')->find_one(1);
635
    $widget->set(array("name" => "Fred", "age" => 10));
636
    $widget->save();
637
    $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
638
    $this->assertEquals($expected, ORM::get_last_query());
639
  }
640
641
  public function testUpdateMultipleFieldsContainingAnExpression()
642
  {
643
    $widget = ORM::for_table('widget')->find_one(1);
644
    $widget->set(array("name" => "Fred", "age" => 10));
645
    $widget->set_expr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
646
    $widget->save();
647
    $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = GeomFromText('POINT(1.2347 2.3436)') WHERE `id` = '1'";
648
    $this->assertEquals($expected, ORM::get_last_query());
649
  }
650
651
  public function testUpdateMultipleFieldsContainingAnExpressionAndOverridePreviouslySetExpression()
652
  {
653
    $widget = ORM::for_table('widget')->find_one(1);
654
    $widget->set(array("name" => "Fred", "age" => 10));
655
    $widget->set_expr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
656
    $widget->lat_long = 'unknown';
657
    $widget->save();
658
    $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = 'unknown' WHERE `id` = '1'";
659
    $this->assertEquals($expected, ORM::get_last_query());
660
  }
661
662
  public function testDeleteData()
663
  {
664
    $widget = ORM::for_table('widget')->find_one(1);
665
    $widget->delete();
666
    $expected = "DELETE FROM `widget` WHERE `id` = '1'";
667
    $this->assertEquals($expected, ORM::get_last_query());
668
  }
669
670
  public function testDeleteMany()
671
  {
672
    ORM::for_table('widget')->where_equal('age', 10)->delete_many();
673
    $expected = "DELETE FROM `widget` WHERE `age` = '10'";
674
    $this->assertEquals($expected, ORM::get_last_query());
675
  }
676
677
  public function testCount()
678
  {
679
    ORM::for_table('widget')->count();
680
    $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
681
    $this->assertEquals($expected, ORM::get_last_query());
682
  }
683
684
  public function testIgnoreSelectAndCount()
685
  {
686
    ORM::for_table('widget')->select('test')->count();
687
    $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
688
    $this->assertEquals($expected, ORM::get_last_query());
689
  }
690
691
  public function testMax()
692
  {
693
    ORM::for_table('person')->max('height');
694
    $expected = "SELECT MAX(`height`) AS `max` FROM `person` LIMIT 1";
695
    $this->assertEquals($expected, ORM::get_last_query());
696
  }
697
698
  public function testMin()
699
  {
700
    ORM::for_table('person')->min('height');
701
    $expected = "SELECT MIN(`height`) AS `min` FROM `person` LIMIT 1";
702
    $this->assertEquals($expected, ORM::get_last_query());
703
  }
704
705
  public function testAvg()
706
  {
707
    ORM::for_table('person')->avg('height');
708
    $expected = "SELECT AVG(`height`) AS `avg` FROM `person` LIMIT 1";
709
    $this->assertEquals($expected, ORM::get_last_query());
710
  }
711
712
  public function testSum()
713
  {
714
    ORM::for_table('person')->sum('height');
715
    $expected = "SELECT SUM(`height`) AS `sum` FROM `person` LIMIT 1";
716
    $this->assertEquals($expected, ORM::get_last_query());
717
  }
718
719
  public function test_quote_identifier_part()
720
  {
721
    $widget = ORM::for_table('widget')->find_one(1);
722
    $widget->set('added', '2013-01-04');
723
    $widget->save();
724
    $expected = "UPDATE `widget` SET `added` = '2013-01-04' WHERE `id` = '1'";
725
    $this->assertEquals($expected, ORM::get_last_query());
726
  }
727
728
  public function test_quote_multiple_identifiers_part()
729
  {
730
    $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
731
    $expected = "`id1`, `id2`";
732
    $this->assertEquals($expected, $record->_quote_identifier($record->_get_id_column_name()));
733
  }
734
735
  /**
736
   * Compound primary key tests
737
   */
738
  public function testFindOneWithCompoundPrimaryKey()
739
  {
740
    $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'));
741
    $record->findOne(array('id1' => 10, 'name' => 'Joe', 'id2' => 20));
742
    $expected = "SELECT * FROM `widget` WHERE `id1` = '10' AND `id2` = '20' LIMIT 1";
743
    $this->assertEquals($expected, ORM::get_last_query());
744
  }
745
746
  public function testInsertWithCompoundPrimaryKey()
747
  {
748
    $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
749
    $record->set('id1', 10);
750
    $record->set('id2', 20);
751
    $record->set('name', 'Joe');
752
    $record->save();
753
    $expected = "INSERT INTO `widget` (`id1`, `id2`, `name`) VALUES ('10', '20', 'Joe')";
754
    $this->assertEquals($expected, ORM::get_last_query());
755
  }
756
757
  public function testUpdateWithCompoundPrimaryKey()
758
  {
759
    $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
760
    $record->set('id1', 10);
761
    $record->set('id2', 20);
762
    $record->set('name', 'Joe');
763
    $record->save();
764
    $record->set('name', 'John');
765
    $record->save();
766
    $expected = "UPDATE `widget` SET `name` = 'John' WHERE `id1` = '10' AND `id2` = '20'";
767
    $this->assertEquals($expected, ORM::get_last_query());
768
  }
769
770
  public function testDeleteWithCompoundPrimaryKey()
771
  {
772
    $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
773
    $record->set('id1', 10);
774
    $record->set('id2', 20);
775
    $record->set('name', 'Joe');
776
    $record->save();
777
    $record->delete();
778
    $expected = "DELETE FROM `widget` WHERE `id1` = '10' AND `id2` = '20'";
779
    $this->assertEquals($expected, ORM::get_last_query());
780
  }
781
782
  public function testWhereIdInWithCompoundPrimaryKey()
783
  {
784
    $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'));
785
    $record->where_id_in(
786
        array(
787
            array('id1' => 10, 'name' => 'Joe', 'id2' => 20),
788
            array('id1' => 20, 'name' => 'Joe', 'id2' => 30),
789
        )
790
    )->find_many();
791
    $expected = "SELECT * FROM `widget` WHERE (( `id1` = '10' AND `id2` = '20' ) OR ( `id1` = '20' AND `id2` = '30' ))";
792
    $this->assertEquals($expected, ORM::get_last_query());
793
  }
794
795
  /**
796
   * Regression tests
797
   */
798
  public function testIssue12IncorrectQuotingOfColumnWildcard()
799
  {
800
    ORM::for_table('widget')->select('widget.*')->find_one();
801
    $expected = "SELECT `widget`.* FROM `widget` LIMIT 1";
802
    $this->assertEquals($expected, ORM::get_last_query());
803
  }
804
805
  public function testIssue57LogQueryRaisesWarningWhenPercentSymbolSupplied()
806
  {
807
    ORM::for_table('widget')->where_raw('username LIKE "ben%"')->find_many();
808
    $expected = 'SELECT * FROM `widget` WHERE username LIKE "ben%"';
809
    $this->assertEquals($expected, ORM::get_last_query());
810
  }
811
812
  public function testIssue57LogQueryRaisesWarningWhenQuestionMarkSupplied()
813
  {
814
    ORM::for_table('widget')->where_raw('comments LIKE "has been released?%"')->find_many();
815
    $expected = 'SELECT * FROM `widget` WHERE comments LIKE "has been released?%"';
816
    $this->assertEquals($expected, ORM::get_last_query());
817
  }
818
819
  public function testIssue74EscapingQuoteMarksIn_quote_identifier_part()
820
  {
821
    $widget = ORM::for_table('widget')->find_one(1);
822
    $widget->set('ad`ded', '2013-01-04');
823
    $widget->save();
824
    $expected = "UPDATE `widget` SET `ad``ded` = '2013-01-04' WHERE `id` = '1'";
825
    $this->assertEquals($expected, ORM::get_last_query());
826
  }
827
828
  public function testIssue90UsingSetExprAloneDoesTriggerQueryGeneration()
829
  {
830
    $widget = ORM::for_table('widget')->find_one(1);
831
    $widget->set_expr('added', 'NOW()');
832
    $widget->save();
833
    $expected = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'";
834
    $this->assertEquals($expected, ORM::get_last_query());
835
  }
836
837
  public function testIssue176LimitDoesntWorkFirstTime()
838
  {
839
    ORM::reset_config();
840
    ORM::reset_db();
841
842
    ORM::configure('logging', true);
843
    ORM::configure('connection_string', 'sqlite::memory:');
844
845
    ORM::for_table('sqlite_master')->limit(1)->find_array();
846
    $expected = "SELECT * FROM `sqlite_master` LIMIT 1";
847
    $this->assertEquals($expected, ORM::get_last_query());
848
  }
849
}
850
851