Passed
Pull Request — master (#483)
by
unknown
02:44
created

WithStatementTest::testBuildWrongWithKeyword()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpMyAdmin\SqlParser\Tests\Parser;
6
7
use PhpMyAdmin\SqlParser\Components\WithKeyword;
8
use PhpMyAdmin\SqlParser\Lexer;
9
use PhpMyAdmin\SqlParser\Parser;
10
use PhpMyAdmin\SqlParser\Tests\TestCase;
11
12
class WithStatementTest extends TestCase
13
{
14
    /**
15
     * @dataProvider parseWith
16
     */
17
    public function testParse(string $test): void
18
    {
19
        $this->runParserTest($test);
20
    }
21
22
    /**
23
     * @return string[][]
24
     */
25
    public static function parseWith(): array
26
    {
27
        return [
28
            ['parser/parseWithStatement'],
29
            ['parser/parseWithStatement1'],
30
            ['parser/parseWithStatement2'],
31
            ['parser/parseWithStatement3'],
32
            ['parser/parseWithStatement4'],
33
            ['parser/parseWithStatement5'],
34
            ['parser/parseWithStatement6'],
35
            ['parser/parseWithStatement7'],
36
            ['parser/parseWithStatementErr'],
37
            ['parser/parseWithStatementErr1'],
38
            ['parser/parseWithStatementErr2'],
39
            ['parser/parseWithStatementErr3'],
40
            ['parser/parseWithStatementErr4'],
41
            ['parser/parseWithStatementErr5'],
42
            ['parser/parseWithStatementErr6'],
43
            ['parser/parseWithStatementErr7'],
44
            ['parser/parseWithStatementErr8'],
45
        ];
46
    }
47
48
    public function testWith(): void
49
    {
50
        $sql = <<<'SQL'
51
WITH categories(identifier, name, parent_id) AS (
52
    SELECT c.identifier, c.name, c.parent_id FROM category c WHERE c.identifier = 'a'
53
    UNION ALL
54
    SELECT c.identifier, c.name, c.parent_id FROM categories, category c WHERE c.identifier = categories.parent_id
55
), foo AS ( SELECT * FROM test )
56
SELECT * FROM categories
57
SQL;
58
59
        $lexer = new Lexer($sql);
60
61
        $lexerErrors = $this->getErrorsAsArray($lexer);
62
        $this->assertCount(0, $lexerErrors);
63
        $parser = new Parser($lexer->list);
64
        $parserErrors = $this->getErrorsAsArray($parser);
65
        $this->assertCount(0, $parserErrors);
66
        $this->assertCount(1, $parser->statements);
67
68
        // phpcs:disable Generic.Files.LineLength.TooLong
69
        $expected = <<<'SQL'
70
WITH categories(identifier, name, parent_id) AS (SELECT c.identifier, c.name, c.parent_id FROM category AS `c` WHERE c.identifier = 'a' UNION ALL SELECT c.identifier, c.name, c.parent_id FROM categories, category AS `c` WHERE c.identifier = categories.parent_id), foo AS (SELECT * FROM test) SELECT * FROM categories
71
SQL;
72
        // phpcs:enable
73
        $this->assertEquals($expected, $parser->statements[0]->build());
74
    }
75
76
    public function testWithHasErrors(): void
77
    {
78
        $sql = <<<'SQL'
79
WITH categories(identifier, name, parent_id) AS (
80
    SOMETHING * FROM foo
81
)
82
SELECT * FROM categories
83
SQL;
84
85
        $lexer = new Lexer($sql);
86
87
        $lexerErrors = $this->getErrorsAsArray($lexer);
88
        $this->assertCount(0, $lexerErrors);
89
        $parser = new Parser($lexer->list);
90
        $parserErrors = $this->getErrorsAsArray($parser);
91
        $this->assertCount(4, $parserErrors);
92
    }
93
94
    public function testWithEmbedParenthesis(): void
95
    {
96
        $sql = <<<'SQL'
97
WITH categories AS (
98
    SELECT * FROM (SELECT * FROM foo)
99
)
100
SELECT * FROM categories
101
SQL;
102
103
        $lexer = new Lexer($sql);
104
        $lexerErrors = $this->getErrorsAsArray($lexer);
105
        $this->assertCount(0, $lexerErrors);
106
        $parser = new Parser($lexer->list);
107
        $parserErrors = $this->getErrorsAsArray($parser);
108
        $this->assertCount(0, $parserErrors);
109
110
        // phpcs:disable Generic.Files.LineLength.TooLong
111
        $expected = <<<'SQL'
112
WITH categories AS (SELECT * FROM (SELECT * FROM foo)) SELECT * FROM categories
113
SQL;
114
        // phpcs:enable
115
        $this->assertEquals($expected, $parser->statements[0]->build());
116
    }
117
118
    public function testWithHasUnclosedParenthesis(): void
119
    {
120
        $sql = <<<'SQL'
121
WITH categories(identifier, name, parent_id) AS (
122
    SELECT * FROM (SELECT * FROM foo
123
)
124
SELECT * FROM categories
125
SQL;
126
127
        $lexer = new Lexer($sql);
128
129
        $lexerErrors = $this->getErrorsAsArray($lexer);
130
        $this->assertCount(0, $lexerErrors);
131
        $parser = new Parser($lexer->list);
132
        $parserErrors = $this->getErrorsAsArray($parser);
133
        $this->assertEquals($parserErrors[0][0], 'A closing bracket was expected.');
134
    }
135
136
    public function testBuildBadWithKeyword(): void
137
    {
138
        $this->expectExceptionMessage('No statement inside WITH');
139
        WithKeyword::build(new WithKeyword('test'));
140
    }
141
}
142