Version 1
[yaffs-website] / web / core / tests / Drupal / KernelTests / Core / Database / UpdateComplexTest.php
diff --git a/web/core/tests/Drupal/KernelTests/Core/Database/UpdateComplexTest.php b/web/core/tests/Drupal/KernelTests/Core/Database/UpdateComplexTest.php
new file mode 100644 (file)
index 0000000..3920826
--- /dev/null
@@ -0,0 +1,143 @@
+<?php
+
+namespace Drupal\KernelTests\Core\Database;
+
+/**
+ * Tests the Update query builder, complex queries.
+ *
+ * @group Database
+ */
+class UpdateComplexTest extends DatabaseTestBase {
+
+  /**
+   * Tests updates with OR conditionals.
+   */
+  public function testOrConditionUpdate() {
+    $update = db_update('test')
+      ->fields(['job' => 'Musician'])
+      ->condition(db_or()
+        ->condition('name', 'John')
+        ->condition('name', 'Paul')
+      );
+    $num_updated = $update->execute();
+    $this->assertIdentical($num_updated, 2, 'Updated 2 records.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', [':job' => 'Musician'])->fetchField();
+    $this->assertIdentical($num_matches, '2', 'Updated fields successfully.');
+  }
+
+  /**
+   * Tests WHERE IN clauses.
+   */
+  public function testInConditionUpdate() {
+    $num_updated = db_update('test')
+      ->fields(['job' => 'Musician'])
+      ->condition('name', ['John', 'Paul'], 'IN')
+      ->execute();
+    $this->assertIdentical($num_updated, 2, 'Updated 2 records.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', [':job' => 'Musician'])->fetchField();
+    $this->assertIdentical($num_matches, '2', 'Updated fields successfully.');
+  }
+
+  /**
+   * Tests WHERE NOT IN clauses.
+   */
+  public function testNotInConditionUpdate() {
+    // The o is lowercase in the 'NoT IN' operator, to make sure the operators
+    // work in mixed case.
+    $num_updated = db_update('test')
+      ->fields(['job' => 'Musician'])
+      ->condition('name', ['John', 'Paul', 'George'], 'NoT IN')
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', [':job' => 'Musician'])->fetchField();
+    $this->assertIdentical($num_matches, '1', 'Updated fields successfully.');
+  }
+
+  /**
+   * Tests BETWEEN conditional clauses.
+   */
+  public function testBetweenConditionUpdate() {
+    $num_updated = db_update('test')
+      ->fields(['job' => 'Musician'])
+      ->condition('age', [25, 26], 'BETWEEN')
+      ->execute();
+    $this->assertIdentical($num_updated, 2, 'Updated 2 records.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', [':job' => 'Musician'])->fetchField();
+    $this->assertIdentical($num_matches, '2', 'Updated fields successfully.');
+  }
+
+  /**
+   * Tests LIKE conditionals.
+   */
+  public function testLikeConditionUpdate() {
+    $num_updated = db_update('test')
+      ->fields(['job' => 'Musician'])
+      ->condition('name', '%ge%', 'LIKE')
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', [':job' => 'Musician'])->fetchField();
+    $this->assertIdentical($num_matches, '1', 'Updated fields successfully.');
+  }
+
+  /**
+   * Tests UPDATE with expression values.
+   */
+  public function testUpdateExpression() {
+    $before_age = db_query('SELECT age FROM {test} WHERE name = :name', [':name' => 'Ringo'])->fetchField();
+    $num_updated = db_update('test')
+      ->condition('name', 'Ringo')
+      ->fields(['job' => 'Musician'])
+      ->expression('age', 'age + :age', [':age' => 4])
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', [':job' => 'Musician'])->fetchField();
+    $this->assertIdentical($num_matches, '1', 'Updated fields successfully.');
+
+    $person = db_query('SELECT * FROM {test} WHERE name = :name', [':name' => 'Ringo'])->fetch();
+    $this->assertEqual($person->name, 'Ringo', 'Name set correctly.');
+    $this->assertEqual($person->age, $before_age + 4, 'Age set correctly.');
+    $this->assertEqual($person->job, 'Musician', 'Job set correctly.');
+  }
+
+  /**
+   * Tests UPDATE with only expression values.
+   */
+  public function testUpdateOnlyExpression() {
+    $before_age = db_query('SELECT age FROM {test} WHERE name = :name', [':name' => 'Ringo'])->fetchField();
+    $num_updated = db_update('test')
+      ->condition('name', 'Ringo')
+      ->expression('age', 'age + :age', [':age' => 4])
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $after_age = db_query('SELECT age FROM {test} WHERE name = :name', [':name' => 'Ringo'])->fetchField();
+    $this->assertEqual($before_age + 4, $after_age, 'Age updated correctly');
+  }
+
+  /**
+   * Test UPDATE with a subselect value.
+   */
+  public function testSubSelectUpdate() {
+    $subselect = db_select('test_task', 't');
+    $subselect->addExpression('MAX(priority) + :increment', 'max_priority', [':increment' => 30]);
+    // Clone this to make sure we are running a different query when
+    // asserting.
+    $select = clone $subselect;
+    $query = db_update('test')
+      ->expression('age', $subselect)
+      ->condition('name', 'Ringo');
+    // Save the number of rows that updated for assertion later.
+    $num_updated = $query->execute();
+    $after_age = db_query('SELECT age FROM {test} WHERE name = :name', [':name' => 'Ringo'])->fetchField();
+    $expected_age = $select->execute()->fetchField();
+    $this->assertEqual($after_age, $expected_age);
+    $this->assertEqual(1, $num_updated, t('Expected 1 row to be updated in subselect update query.'));
+  }
+
+}