Passed
Push — main ( 8a18ed...1ea679 )
by Peter
02:40
created

SelectTest::testToStringModifiers()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 0
dl 0
loc 14
ccs 10
cts 10
cp 1
crap 1
rs 9.9666
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace QB\MySQL\Statement;
6
7
use QB\Generic\Clause\Column;
8
use QB\Generic\Clause\Table;
9
use QB\Generic\Expr\Expr;
10
use QB\Generic\Statement\SelectTest as GenericSelectTest;
11
12
class SelectTest extends GenericSelectTest
13
{
14 1
    public function testToStringModifiers()
15
    {
16 1
        $sql = $this->getSut('foo')
17 1
            ->addModifier(Select::ALL, Select::DISTINCT, Select::SQL_CALC_FOUND_ROWS)
18 1
            ->addColumns('id', 'bar_id')
19 1
            ->__toString();
20
21 1
        $parts   = [];
22 1
        $parts[] = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS id, bar_id';
23 1
        $parts[] = 'FROM foo';
24
25 1
        $expectedSql = implode(PHP_EOL, $parts);
26
27 1
        $this->assertSame($expectedSql, $sql);
28 1
    }
29
30 1
    public function testToStringWithOuterLimits()
31
    {
32 1
        $unionQuery = $this->getSut('baz')
33 1
            ->addColumns('id');
34
35 1
        $sql = (string)$this->getSut('foo')
36 1
            ->addColumns('id')
37 1
            ->addUnion($unionQuery)
38 1
            ->setOuterLimit(10);
39
40 1
        $parts   = [];
41 1
        $parts[] = '(SELECT id';
42 1
        $parts[] = 'FROM foo';
43 1
        $parts[] = 'UNION';
44 1
        $parts[] = 'SELECT id';
45 1
        $parts[] = 'FROM baz)';
46 1
        $parts[] = 'LIMIT 10';
47
48 1
        $expectedSql = implode(PHP_EOL, $parts);
49
50 1
        $this->assertSame($expectedSql, $sql);
51 1
    }
52
53 1
    public function testToStringWithOuterLock()
54
    {
55 1
        $unionQuery = $this->getSut('baz')
56 1
            ->addColumns('id');
57
58 1
        $sql = $this->getSut('foo')
59 1
            ->addColumns('id')
60 1
            ->addUnion($unionQuery)
61 1
            ->addOuterLock(Select::LOCK_FOR_UPDATE, Select::LOCK_NOWAIT)
62 1
            ->__toString();
63
64 1
        $parts   = [];
65 1
        $parts[] = '(SELECT id';
66 1
        $parts[] = 'FROM foo';
67 1
        $parts[] = 'UNION';
68 1
        $parts[] = 'SELECT id';
69 1
        $parts[] = 'FROM baz)';
70 1
        $parts[] = 'FOR UPDATE NOWAIT';
71
72 1
        $expectedSql = implode(PHP_EOL, $parts);
73
74 1
        $this->assertSame($expectedSql, $sql);
75 1
    }
76
77 1
    public function testToStringComplex()
78
    {
79 1
        $columnQuery = $this->getSut('quix')
80 1
            ->addColumns('b')
81 1
            ->addWhere(new Expr('id = ?', [7]));
82
83 1
        $columnExpr = new Expr('NOW()');
84
85 1
        $unionQuery = $this->getSut('baz')
86 1
            ->addColumns('b', 'f');
87
88 1
        $sql = $this->getSut('foo', 'bar')
89 1
            ->addModifier('DISTINCT')
90 1
            ->addColumns('COUNT(DISTINCT baz) AS baz_count', new Column($columnQuery, 'quix_b'))
91 1
            ->addColumns(new Column($columnExpr, 'now'))
92 1
            ->addColumn('bar.id', 'bar_id')
93 1
            ->addInnerJoin('quix', 'foo.id = q.foo_id', 'q')
94 1
            ->addWhere('foo.bar = "foo-bar"', new Expr('bar.foo = ?', ['bar-foo']))
95 1
            ->addGroupBy('q.foo_id', new Expr('q.bar.id'))
96 1
            ->setGroupWithRollup()
97 1
            ->addHaving('baz_count > 0')
98 1
            ->addOrderBy('baz_count', 'ASC')
99 1
            ->setLimit(10)
100 1
            ->setOffset(20)
101 1
            ->addLock(Select::LOCK_FOR_UPDATE, Select::LOCK_NOWAIT)
102 1
            ->addUnion($unionQuery)
103 1
            ->__toString();
104
105 1
        $parts   = [];
106 1
        $parts[] = 'SELECT DISTINCT COUNT(DISTINCT baz) AS baz_count, (SELECT b FROM quix WHERE id = ?) AS quix_b, NOW() AS now, bar.id AS bar_id'; // nolint
107 1
        $parts[] = 'FROM foo, bar';
108 1
        $parts[] = 'INNER JOIN quix AS q ON foo.id = q.foo_id';
109 1
        $parts[] = 'WHERE foo.bar = "foo-bar" AND bar.foo = ?';
110 1
        $parts[] = 'GROUP BY q.foo_id, q.bar.id WITH ROLLUP';
111 1
        $parts[] = 'HAVING baz_count > 0';
112 1
        $parts[] = 'ORDER BY baz_count ASC';
113 1
        $parts[] = 'LIMIT 20, 10';
114 1
        $parts[] = 'FOR UPDATE NOWAIT';
115 1
        $parts[] = 'UNION';
116 1
        $parts[] = 'SELECT b, f';
117 1
        $parts[] = 'FROM baz';
118
119 1
        $expectedSql = implode(PHP_EOL, $parts);
120
121 1
        $this->assertSame($expectedSql, $sql);
122 1
    }
123
124
    /**
125
     * @param string|Table ...$tables
126
     *
127
     * @return Select
128
     */
129 16
    protected function getSut(string|Table ...$tables): Select
130
    {
131 16
        return (new Select())->addFrom(...$tables);
132
    }
133
}
134