-
Notifications
You must be signed in to change notification settings - Fork 59
Expand file tree
/
Copy pathWP_MySQL_Naive_Query_Stream_Tests.php
More file actions
110 lines (83 loc) · 4.22 KB
/
WP_MySQL_Naive_Query_Stream_Tests.php
File metadata and controls
110 lines (83 loc) · 4.22 KB
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
<?php
use PHPUnit\Framework\TestCase;
class WP_MySQL_Naive_Query_Stream_Tests extends TestCase {
public function test_next_query_returns_a_single_delimited_query(): void {
$stream = new WP_MySQL_Naive_Query_Stream();
$stream->append_sql( 'SELECT id FROM users;' );
$this->assertTrue( $stream->next_query() );
$this->assertSame( 'SELECT id FROM users;', $stream->get_query() );
}
public function test_next_query_returns_false_if_the_input_is_incomplete(): void {
$stream = new WP_MySQL_Naive_Query_Stream();
$stream->append_sql( 'SELECT id FROM users' );
$this->assertFalse( $stream->next_query() );
}
public function test_next_query_returns_true_if_the_input_is_complete_but_undelimited(): void {
$stream = new WP_MySQL_Naive_Query_Stream();
$stream->append_sql( 'SELECT id FROM users' );
$stream->mark_input_complete();
$this->assertTrue( $stream->next_query() );
$this->assertSame( 'SELECT id FROM users', $stream->get_query() );
}
public function test_next_query_parses_multiple_queries_with_even_appends(): void {
$stream = new WP_MySQL_Naive_Query_Stream();
$stream->append_sql( 'SELECT id FROM users; SELECT name FROM users2;' );
$this->assertTrue( $stream->next_query() );
$this->assertSame( 'SELECT id FROM users;', $stream->get_query() );
$this->assertTrue( $stream->next_query() );
$this->assertSame( ' SELECT name FROM users2;', $stream->get_query() );
$this->assertFalse( $stream->next_query() );
$stream->append_sql( 'SELECT name FROM users3;' );
$this->assertTrue( $stream->next_query() );
$this->assertSame( 'SELECT name FROM users3;', $stream->get_query() );
$this->assertFalse( $stream->next_query() );
}
public function test_next_query_parses_multiple_queries_with_uneven_appends(): void {
$stream = new WP_MySQL_Naive_Query_Stream();
$stream->append_sql( 'SELECT id FROM ' );
$this->assertFalse( $stream->next_query() );
$stream->append_sql( 'users; SELECT name ' );
$this->assertTrue( $stream->next_query() );
$this->assertSame( 'SELECT id FROM users;', $stream->get_query() );
$this->assertFalse( $stream->next_query() );
$stream->append_sql( ', id FROM users2; INSERT' );
$this->assertTrue( $stream->next_query() );
$this->assertSame( ' SELECT name , id FROM users2;', $stream->get_query() );
$this->assertFalse( $stream->next_query() );
$stream->append_sql( ' INTO users3 VALUES (1, 2)' );
$stream->mark_input_complete();
$this->assertTrue( $stream->next_query() );
$this->assertSame( ' INSERT INTO users3 VALUES (1, 2)', $stream->get_query() );
}
public function test_next_query_parses_queries_with_trailing_block_comments_included(): void {
$stream = new WP_MySQL_Naive_Query_Stream();
$stream->append_sql( 'SELECT id FROM users /* foo */' );
$stream->mark_input_complete();
$this->assertTrue( $stream->next_query() );
$this->assertSame( 'SELECT id FROM users /* foo */', $stream->get_query() );
$this->assertFalse( $stream->next_query() );
}
public function test_next_query_parses_queries_with_trailing_block_comments_excluded(): void {
$stream = new WP_MySQL_Naive_Query_Stream();
$stream->append_sql( 'SELECT id FROM users; /* foo */' );
$stream->mark_input_complete();
$this->assertTrue( $stream->next_query() );
$this->assertSame( 'SELECT id FROM users;', $stream->get_query() );
$this->assertFalse( $stream->next_query() );
$this->assertEquals(WP_MySQL_Naive_Query_Stream::STATE_FINISHED, $stream->get_state());
}
public function test_treats_too_large_input_as_a_syntax_error(): void {
$five_megabytes = str_repeat( 'lorem ', 1024 * 1024 );
$stream = new WP_MySQL_Naive_Query_Stream();
$stream->append_sql( $five_megabytes );
$this->assertFalse( $stream->next_query() );
$this->assertEquals(WP_MySQL_Naive_Query_Stream::STATE_SYNTAX_ERROR, $stream->get_state());
}
public function test_next_query_returns_false_if_the_input_has_a_syntax_error(): void {
$this->markTestSkipped('This test is expected to fail because the naive query stream doesn\'t understand what a valid query is. It\'s just a heuristic that works for most cases.');
$stream = new WP_MySQL_Naive_Query_Stream();
$stream->append_sql( 'SELECT id FROM users WHERE id = ihj' );
$stream->mark_input_complete();
$this->assertFalse( $stream->next_query() );
}
}