3 namespace Drupal\KernelTests\Core\Database;
6 * Tests the hook_query_alter capabilities of the Select builder.
9 * @see database_test_query_alter()
11 class AlterTest extends DatabaseTestBase {
14 * Tests that we can do basic alters.
16 public function testSimpleAlter() {
17 $query = db_select('test');
18 $query->addField('test', 'name');
19 $query->addField('test', 'age', 'age');
20 $query->addTag('database_test_alter_add_range');
22 $result = $query->execute()->fetchAll();
24 $this->assertEqual(count($result), 2, 'Returned the correct number of rows.');
28 * Tests that we can alter the joins on a query.
30 public function testAlterWithJoin() {
31 $query = db_select('test_task');
32 $tid_field = $query->addField('test_task', 'tid');
33 $task_field = $query->addField('test_task', 'task');
34 $query->orderBy($task_field);
35 $query->addTag('database_test_alter_add_join');
37 $result = $query->execute();
39 $records = $result->fetchAll();
41 $this->assertEqual(count($records), 2, 'Returned the correct number of rows.');
43 $this->assertEqual($records[0]->name, 'George', 'Correct data retrieved.');
44 $this->assertEqual($records[0]->$tid_field, 4, 'Correct data retrieved.');
45 $this->assertEqual($records[0]->$task_field, 'sing', 'Correct data retrieved.');
46 $this->assertEqual($records[1]->name, 'George', 'Correct data retrieved.');
47 $this->assertEqual($records[1]->$tid_field, 5, 'Correct data retrieved.');
48 $this->assertEqual($records[1]->$task_field, 'sleep', 'Correct data retrieved.');
52 * Tests that we can alter a query's conditionals.
54 public function testAlterChangeConditional() {
55 $query = db_select('test_task');
56 $tid_field = $query->addField('test_task', 'tid');
57 $pid_field = $query->addField('test_task', 'pid');
58 $task_field = $query->addField('test_task', 'task');
59 $people_alias = $query->join('test', 'people', "test_task.pid = people.id");
60 $name_field = $query->addField($people_alias, 'name', 'name');
61 $query->condition('test_task.tid', '1');
62 $query->orderBy($tid_field);
63 $query->addTag('database_test_alter_change_conditional');
65 $result = $query->execute();
67 $records = $result->fetchAll();
69 $this->assertEqual(count($records), 1, 'Returned the correct number of rows.');
70 $this->assertEqual($records[0]->$name_field, 'John', 'Correct data retrieved.');
71 $this->assertEqual($records[0]->$tid_field, 2, 'Correct data retrieved.');
72 $this->assertEqual($records[0]->$pid_field, 1, 'Correct data retrieved.');
73 $this->assertEqual($records[0]->$task_field, 'sleep', 'Correct data retrieved.');
77 * Tests that we can alter the fields of a query.
79 public function testAlterChangeFields() {
80 $query = db_select('test');
81 $name_field = $query->addField('test', 'name');
82 $age_field = $query->addField('test', 'age', 'age');
83 $query->orderBy('name');
84 $query->addTag('database_test_alter_change_fields');
86 $record = $query->execute()->fetch();
87 $this->assertEqual($record->$name_field, 'George', 'Correct data retrieved.');
88 $this->assertFalse(isset($record->$age_field), 'Age field not found, as intended.');
92 * Tests that we can alter expressions in the query.
94 public function testAlterExpression() {
95 $query = db_select('test');
96 $name_field = $query->addField('test', 'name');
97 $age_field = $query->addExpression("age*2", 'double_age');
98 $query->condition('age', 27);
99 $query->addTag('database_test_alter_change_expressions');
100 $result = $query->execute();
102 // Ensure that we got the right record.
103 $record = $result->fetch();
105 $this->assertEqual($record->$name_field, 'George', 'Fetched name is correct.');
106 $this->assertEqual($record->$age_field, 27 * 3, 'Fetched age expression is correct.');
110 * Tests that we can remove a range() value from a query.
112 * This also tests hook_query_TAG_alter().
114 public function testAlterRemoveRange() {
115 $query = db_select('test');
116 $query->addField('test', 'name');
117 $query->addField('test', 'age', 'age');
119 $query->addTag('database_test_alter_remove_range');
121 $num_records = count($query->execute()->fetchAll());
123 $this->assertEqual($num_records, 4, 'Returned the correct number of rows.');
127 * Tests that we can do basic alters on subqueries.
129 public function testSimpleAlterSubquery() {
130 // Create a sub-query with an alter tag.
131 $subquery = db_select('test', 'p');
132 $subquery->addField('p', 'name');
133 $subquery->addField('p', 'id');
135 $subquery->condition('age', 27);
136 $subquery->addExpression("age*2", 'double_age');
137 // This query alter should change it to age * 3.
138 $subquery->addTag('database_test_alter_change_expressions');
140 // Create a main query and join to sub-query.
141 $query = db_select('test_task', 'tt');
142 $query->join($subquery, 'pq', 'pq.id = tt.pid');
143 $age_field = $query->addField('pq', 'double_age');
144 $name_field = $query->addField('pq', 'name');
146 $record = $query->execute()->fetch();
147 $this->assertEqual($record->$name_field, 'George', 'Fetched name is correct.');
148 $this->assertEqual($record->$age_field, 27 * 3, 'Fetched age expression is correct.');