Version 1
[yaffs-website] / web / core / tests / Drupal / KernelTests / Core / Database / AlterTest.php
1 <?php
2
3 namespace Drupal\KernelTests\Core\Database;
4
5 /**
6  * Tests the hook_query_alter capabilities of the Select builder.
7  *
8  * @group Database
9  * @see database_test_query_alter()
10  */
11 class AlterTest extends DatabaseTestBase {
12
13   /**
14    * Tests that we can do basic alters.
15    */
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');
21
22     $result = $query->execute()->fetchAll();
23
24     $this->assertEqual(count($result), 2, 'Returned the correct number of rows.');
25   }
26
27   /**
28    * Tests that we can alter the joins on a query.
29    */
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');
36
37     $result = $query->execute();
38
39     $records = $result->fetchAll();
40
41     $this->assertEqual(count($records), 2, 'Returned the correct number of rows.');
42
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.');
49   }
50
51   /**
52    * Tests that we can alter a query's conditionals.
53    */
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');
64
65     $result = $query->execute();
66
67     $records = $result->fetchAll();
68
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.');
74   }
75
76   /**
77    * Tests that we can alter the fields of a query.
78    */
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');
85
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.');
89   }
90
91   /**
92    * Tests that we can alter expressions in the query.
93    */
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();
101
102     // Ensure that we got the right record.
103     $record = $result->fetch();
104
105     $this->assertEqual($record->$name_field, 'George', 'Fetched name is correct.');
106     $this->assertEqual($record->$age_field, 27 * 3, 'Fetched age expression is correct.');
107   }
108
109   /**
110    * Tests that we can remove a range() value from a query.
111    *
112    * This also tests hook_query_TAG_alter().
113    */
114   public function testAlterRemoveRange() {
115     $query = db_select('test');
116     $query->addField('test', 'name');
117     $query->addField('test', 'age', 'age');
118     $query->range(0, 2);
119     $query->addTag('database_test_alter_remove_range');
120
121     $num_records = count($query->execute()->fetchAll());
122
123     $this->assertEqual($num_records, 4, 'Returned the correct number of rows.');
124   }
125
126   /**
127    * Tests that we can do basic alters on subqueries.
128    */
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');
134     // Pick out George.
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');
139
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');
145
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.');
149   }
150
151 }