diff --git a/core/modules/views/tests/src/Kernel/Plugin/FieldOrLanguageJoinTest.php b/core/modules/views/tests/src/Kernel/Plugin/FieldOrLanguageJoinTest.php index e69de29..3069189 100644 --- a/core/modules/views/tests/src/Kernel/Plugin/FieldOrLanguageJoinTest.php +++ b/core/modules/views/tests/src/Kernel/Plugin/FieldOrLanguageJoinTest.php @@ -0,0 +1,224 @@ +manager = $this->container->get('plugin.manager.views.join'); + } + + /** + * Tests that no functionality provided by the base join plugin is broken. + */ + public function testBase() { + // Setup a simple join and test the result sql. + $view = Views::getView('test_view'); + $view->initDisplay(); + $view->initQuery(); + + // First define a simple join without an extra condition. + // Set the various options on the join object. + $configuration = [ + 'left_table' => 'views_test_data', + 'left_field' => 'uid', + 'table' => 'users_field_data', + 'field' => 'uid', + 'adjusted' => TRUE, + ]; + $join = $this->manager->createInstance($this->pluginId, $configuration); + $this->assertTrue($join instanceof FieldOrLanguageJoin); + $this->assertNull($join->extra); + $this->assertTrue($join->adjusted); + + // Build the actual join values and read them back from the dbtng query + // object. + $query = \Drupal::database()->select('views_test_data'); + $table = ['alias' => 'users_field_data']; + $join->buildJoin($query, $table, $view->query); + + $tables = $query->getTables(); + $join_info = $tables[$table['alias']]; + $this->assertSame($join_info['join type'], 'LEFT'); + $this->assertSame($join_info['table'], $configuration['table']); + $this->assertSame($join_info['alias'], 'users_field_data'); + $this->assertSame($join_info['condition'], 'views_test_data.uid = users_field_data.uid'); + + // Set a different alias and make sure table info is as expected. + $join = $this->manager->createInstance($this->pluginId, $configuration); + $table = ['alias' => 'users1']; + $join->buildJoin($query, $table, $view->query); + + $tables = $query->getTables(); + $join_info = $tables[$table['alias']]; + $this->assertSame($join_info['alias'], 'users1'); + + // Set a different join type (INNER) and make sure it is used. + $configuration['type'] = 'INNER'; + $join = $this->manager->createInstance($this->pluginId, $configuration); + $table = ['alias' => 'users2']; + $join->buildJoin($query, $table, $view->query); + + $tables = $query->getTables(); + $join_info = $tables[$table['alias']]; + $this->assertSame($join_info['join type'], 'INNER'); + + // Setup addition conditions and make sure it is used. + $random_name_1 = $this->randomMachineName(); + $random_name_2 = $this->randomMachineName(); + $configuration['extra'] = [ + [ + 'field' => 'name', + 'value' => $random_name_1 + ], + [ + 'field' => 'name', + 'value' => $random_name_2, + 'operator' => '<>' + ], + ]; + $join = $this->manager->createInstance($this->pluginId, $configuration); + $table = ['alias' => 'users3']; + $join->buildJoin($query, $table, $view->query); + + $tables = $query->getTables(); + $join_info = $tables[$table['alias']]; + $this->assertContains('views_test_data.uid = users3.uid', $join_info['condition']); + $this->assertContains('users3.name = :views_join_condition_0', $join_info['condition']); + $this->assertContains('users3.name <> :views_join_condition_1', $join_info['condition']); + $this->assertSame(array_values($join_info['arguments']), [$random_name_1, $random_name_2]); + + // Test that 'IN' conditions are properly built. + $random_name_1 = $this->randomMachineName(); + $random_name_2 = $this->randomMachineName(); + $random_name_3 = $this->randomMachineName(); + $random_name_4 = $this->randomMachineName(); + $configuration['extra'] = [ + [ + 'field' => 'name', + 'value' => $random_name_1 + ], + [ + 'field' => 'name', + 'value' => [$random_name_2, $random_name_3, $random_name_4], + ], + ]; + $join = $this->manager->createInstance($this->pluginId, $configuration); + $table = ['alias' => 'users4']; + $join->buildJoin($query, $table, $view->query); + + $tables = $query->getTables(); + $join_info = $tables[$table['alias']]; + $this->assertContains('views_test_data.uid = users4.uid', $join_info['condition']); + $this->assertContains('users4.name = :views_join_condition_2', $join_info['condition']); + $this->assertContains('users4.name IN ( :views_join_condition_3[] )', $join_info['condition']); + $this->assertSame($join_info['arguments'][':views_join_condition_3[]'], [$random_name_2, $random_name_3, $random_name_4]); + } + + /** + * Tests the adding of conditions by the join plugin. + */ + public function testLanguageBundleConditions() { + // Setup a simple join and test the result sql. + $view = Views::getView('test_view'); + $view->initDisplay(); + $view->initQuery(); + + // Set the various options on the join object including a single langcode + // condition. + $configuration = [ + 'table' => 'node__field_tags', + 'left_table' => 'node', + 'left_field' => 'nid', + 'field' => 'entity_id', + 'extra' => [ + [ + 'field' => 'deleted', + 'value' => 0, + 'numeric' => TRUE, + ], + [ + 'left_field' => 'langcode', + 'field' => 'langcode', + ], + ], + ]; + + + // Build the actual join values and read them back from the query object. + $query = \Drupal::database()->select('node'); + + $join = $this->manager->createInstance('field_or_language_join', $configuration); + $this->assertInstanceOf(FieldOrLanguageJoin::class, $join, 'The correct join class got loaded.'); + $table = ['alias' => 'node__field_tags1']; + $join->buildJoin($query, $table, $view->query); + + $tables = $query->getTables(); + $join_info = $tables[$table['alias']]; + $this->assertContains('AND (node__field_tags1.langcode = .langcode)', $join_info['condition']); + + // Replace the language condition with a bundle condition. + $configuration['extra'][1] = [ + 'value' => ['page'], + 'field' => 'bundle', + ]; + $join = $this->manager->createInstance('field_or_language_join', $configuration); + $table = ['alias' => 'node__field_tags2']; + $join->buildJoin($query, $table, $view->query); + + $tables = $query->getTables(); + $join_info = $tables[$table['alias']]; + $this->assertContains('AND (node__field_tags2.bundle = :views_join_condition_3)', $join_info['condition']); + + // Now re-add a language condition to make sure the bundle and language + // conditions are combined with an OR. + $configuration['extra'][] = [ + 'left_field' => 'langcode', + 'field' => 'langcode', + ]; + $join = $this->manager->createInstance('field_or_language_join', $configuration); + $table = ['alias' => 'node__field_tags3']; + $join->buildJoin($query, $table, $view->query); + + $tables = $query->getTables(); + $join_info = $tables[$table['alias']]; + $this->assertContains('AND (node__field_tags3.bundle = :views_join_condition_5 OR node__field_tags3.langcode = .langcode)', $join_info['condition']); + } + +}