Chris@0: 'sql_idmap_test', Chris@0: ]; Chris@0: Chris@0: /** Chris@0: * The source IDs. Chris@0: * Chris@0: * @var array Chris@0: */ Chris@0: protected $sourceIds = [ Chris@0: 'source_id_property' => [ Chris@0: 'type' => 'string', Chris@0: ], Chris@0: ]; Chris@0: Chris@0: /** Chris@0: * The destination IDs. Chris@0: * Chris@0: * @var array Chris@0: */ Chris@0: protected $destinationIds = [ Chris@0: 'destination_id_property' => [ Chris@0: 'type' => 'string', Chris@0: ], Chris@0: ]; Chris@0: Chris@0: /** Chris@0: * The database connection. Chris@0: * Chris@0: * @var \Drupal\Core\Database\Connection Chris@0: */ Chris@0: protected $database; Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function setUp() { Chris@0: $this->database = $this->getDatabase([]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Saves a single ID mapping row in the database. Chris@0: * Chris@0: * @param array $map Chris@0: * The row to save. Chris@0: */ Chris@0: protected function saveMap(array $map) { Chris@0: $table = 'migrate_map_sql_idmap_test'; Chris@0: Chris@0: $schema = $this->database->schema(); Chris@0: // If the table already exists, add any columns which are in the map array, Chris@0: // but don't yet exist in the table. Yay, flexibility! Chris@0: if ($schema->tableExists($table)) { Chris@0: foreach (array_keys($map) as $field) { Chris@0: if (!$schema->fieldExists($table, $field)) { Chris@0: $schema->addField($table, $field, ['type' => 'text']); Chris@0: } Chris@0: } Chris@0: } Chris@0: else { Chris@0: $schema->createTable($table, $this->createSchemaFromRow($map)); Chris@0: } Chris@0: Chris@0: $this->database->insert($table)->fields($map)->execute(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Creates a test SQL ID map plugin. Chris@0: * Chris@0: * @return \Drupal\Tests\migrate\Unit\TestSqlIdMap Chris@0: * A SQL ID map plugin test instance. Chris@0: */ Chris@0: protected function getIdMap() { Chris@0: $migration = $this->getMigration(); Chris@0: Chris@0: $plugin = $this->getMock('Drupal\migrate\Plugin\MigrateSourceInterface'); Chris@0: $plugin Chris@0: ->method('getIds') Chris@0: ->willReturn($this->sourceIds); Chris@0: $migration Chris@0: ->method('getSourcePlugin') Chris@0: ->willReturn($plugin); Chris@0: Chris@0: $plugin = $this->getMock('Drupal\migrate\Plugin\MigrateDestinationInterface'); Chris@0: $plugin Chris@0: ->method('getIds') Chris@0: ->willReturn($this->destinationIds); Chris@0: $migration Chris@0: ->method('getDestinationPlugin') Chris@0: ->willReturn($plugin); Chris@0: $event_dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface'); Chris@0: Chris@0: $id_map = new TestSqlIdMap($this->database, [], 'sql', [], $migration, $event_dispatcher); Chris@0: $migration Chris@0: ->method('getIdMap') Chris@0: ->willReturn($id_map); Chris@0: Chris@0: return $id_map; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sets defaults for SQL ID map plugin tests. Chris@0: * Chris@0: * @return array Chris@0: * An associative array with the following keys: Chris@0: * - source_row_status Chris@0: * - rollback_action Chris@0: * - hash Chris@0: */ Chris@0: protected function idMapDefaults() { Chris@0: $defaults = [ Chris@0: 'source_row_status' => MigrateIdMapInterface::STATUS_IMPORTED, Chris@0: 'rollback_action' => MigrateIdMapInterface::ROLLBACK_DELETE, Chris@0: 'hash' => '', Chris@0: ]; Chris@0: // By default, the PDO SQLite driver strongly prefers to return strings Chris@0: // from SELECT queries. Even for columns that don't store strings. Even Chris@0: // if the connection's STRINGIFY_FETCHES attribute is FALSE. This can cause Chris@0: // assertSame() calls to fail, since 0 !== '0'. Casting these values to Chris@0: // strings isn't the most elegant workaround, but it allows the assertions Chris@0: // to pass properly. Chris@0: if ($this->database->driver() == 'sqlite') { Chris@0: $defaults['source_row_status'] = (string) $defaults['source_row_status']; Chris@0: $defaults['rollback_action'] = (string) $defaults['rollback_action']; Chris@0: } Chris@0: return $defaults; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the ID mapping method. Chris@0: * Chris@0: * Create two ID mappings and update the second to verify that: Chris@0: * - saving new to empty tables work. Chris@0: * - saving new to nonempty tables work. Chris@0: * - updating work. Chris@0: */ Chris@0: public function testSaveIdMapping() { Chris@0: $source = [ Chris@0: 'source_id_property' => 'source_value', Chris@0: ]; Chris@0: $row = new Row($source, ['source_id_property' => []]); Chris@0: $id_map = $this->getIdMap(); Chris@0: $id_map->saveIdMapping($row, ['destination_id_property' => 2]); Chris@0: $expected_result = [ Chris@0: [ Chris@0: 'sourceid1' => 'source_value', Chris@16: 'source_ids_hash' => $this->getIdMap()->getSourceIdsHash($source), Chris@0: 'destid1' => 2, Chris@0: ] + $this->idMapDefaults(), Chris@0: ]; Chris@0: $this->queryResultTest($this->getIdMapContents(), $expected_result); Chris@0: $source = [ Chris@0: 'source_id_property' => 'source_value_1', Chris@0: ]; Chris@0: $row = new Row($source, ['source_id_property' => []]); Chris@0: $id_map->saveIdMapping($row, ['destination_id_property' => 3]); Chris@0: $expected_result[] = [ Chris@0: 'sourceid1' => 'source_value_1', Chris@16: 'source_ids_hash' => $this->getIdMap()->getSourceIdsHash($source), Chris@0: 'destid1' => 3, Chris@0: ] + $this->idMapDefaults(); Chris@0: $this->queryResultTest($this->getIdMapContents(), $expected_result); Chris@0: $id_map->saveIdMapping($row, ['destination_id_property' => 4]); Chris@0: $expected_result[1]['destid1'] = 4; Chris@0: $this->queryResultTest($this->getIdMapContents(), $expected_result); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the SQL ID map set message method. Chris@0: */ Chris@0: public function testSetMessage() { Chris@0: $message = $this->getMock('Drupal\migrate\MigrateMessageInterface'); Chris@0: $id_map = $this->getIdMap(); Chris@0: $id_map->setMessage($message); Chris@0: $this->assertAttributeEquals($message, 'message', $id_map); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the clear messages method. Chris@0: */ Chris@0: public function testClearMessages() { Chris@0: $message = 'Hello world.'; Chris@0: $expected_results = [0, 1, 2, 3]; Chris@0: $id_map = $this->getIdMap(); Chris@0: Chris@0: // Insert 4 message for later delete. Chris@0: foreach ($expected_results as $key => $expected_result) { Chris@0: $id_map->saveMessage(['source_id_property' => $key], $message); Chris@0: } Chris@0: Chris@0: // Truncate and check that 4 messages were deleted. Chris@14: $this->assertSame($id_map->messageCount(), 4); Chris@0: $id_map->clearMessages(); Chris@0: $count = $id_map->messageCount(); Chris@14: $this->assertSame($count, 0); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the getRowsNeedingUpdate method for rows that need an update. Chris@0: */ Chris@0: public function testGetRowsNeedingUpdate() { Chris@0: $id_map = $this->getIdMap(); Chris@0: $row_statuses = [ Chris@0: MigrateIdMapInterface::STATUS_IMPORTED, Chris@0: MigrateIdMapInterface::STATUS_NEEDS_UPDATE, Chris@0: MigrateIdMapInterface::STATUS_IGNORED, Chris@0: MigrateIdMapInterface::STATUS_FAILED, Chris@0: ]; Chris@0: // Create a mapping row for each STATUS constant. Chris@0: foreach ($row_statuses as $status) { Chris@0: $source = ['source_id_property' => 'source_value_' . $status]; Chris@0: $row = new Row($source, ['source_id_property' => []]); Chris@0: $destination = ['destination_id_property' => 'destination_value_' . $status]; Chris@0: $id_map->saveIdMapping($row, $destination, $status); Chris@0: $expected_results[] = [ Chris@0: 'sourceid1' => 'source_value_' . $status, Chris@16: 'source_ids_hash' => $this->getIdMap()->getSourceIdsHash($source), Chris@0: 'destid1' => 'destination_value_' . $status, Chris@0: 'source_row_status' => $status, Chris@0: 'rollback_action' => MigrateIdMapInterface::ROLLBACK_DELETE, Chris@0: 'hash' => '', Chris@0: ]; Chris@0: // Assert zero rows need an update. Chris@0: if ($status == MigrateIdMapInterface::STATUS_IMPORTED) { Chris@0: $rows_needing_update = $id_map->getRowsNeedingUpdate(1); Chris@0: $this->assertCount(0, $rows_needing_update); Chris@0: } Chris@0: } Chris@0: // Assert that test values exist. Chris@0: $this->queryResultTest($this->getIdMapContents(), $expected_results); Chris@0: Chris@0: // Assert a single row needs an update. Chris@0: $row_needing_update = $id_map->getRowsNeedingUpdate(1); Chris@0: $this->assertCount(1, $row_needing_update); Chris@0: Chris@0: // Assert the row matches its original source. Chris@0: $source_id = $expected_results[MigrateIdMapInterface::STATUS_NEEDS_UPDATE]['sourceid1']; Chris@0: $test_row = $id_map->getRowBySource(['source_id_property' => $source_id]); Chris@0: // $row_needing_update is an array of objects returned from the database, Chris@0: // but $test_row is an array, so the cast is necessary. Chris@0: $this->assertSame($test_row, (array) $row_needing_update[0]); Chris@0: Chris@0: // Add additional row that needs an update. Chris@0: $source = ['source_id_property' => 'source_value_multiple']; Chris@0: $row = new Row($source, ['source_id_property' => []]); Chris@0: $destination = ['destination_id_property' => 'destination_value_multiple']; Chris@0: $id_map->saveIdMapping($row, $destination, MigrateIdMapInterface::STATUS_NEEDS_UPDATE); Chris@0: Chris@0: // Assert multiple rows need an update. Chris@0: $rows_needing_update = $id_map->getRowsNeedingUpdate(2); Chris@0: $this->assertCount(2, $rows_needing_update); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the SQL ID map message count method by counting and saving messages. Chris@0: */ Chris@0: public function testMessageCount() { Chris@0: $message = 'Hello world.'; Chris@0: $expected_results = [0, 1, 2, 3]; Chris@0: $id_map = $this->getIdMap(); Chris@0: Chris@0: // Test count message multiple times starting from 0. Chris@0: foreach ($expected_results as $key => $expected_result) { Chris@0: $count = $id_map->messageCount(); Chris@14: $this->assertSame($expected_result, $count); Chris@0: $id_map->saveMessage(['source_id_property' => $key], $message); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the SQL ID map save message method. Chris@0: */ Chris@0: public function testMessageSave() { Chris@0: $message = 'Hello world.'; Chris@0: $original_values = [ Chris@0: 1 => ['message' => $message, 'level' => MigrationInterface::MESSAGE_ERROR], Chris@0: 2 => ['message' => $message, 'level' => MigrationInterface::MESSAGE_WARNING], Chris@0: 3 => ['message' => $message, 'level' => MigrationInterface::MESSAGE_NOTICE], Chris@0: 4 => ['message' => $message, 'level' => MigrationInterface::MESSAGE_INFORMATIONAL], Chris@0: ]; Chris@0: $expected_results = [ Chris@0: '7ad742edb7e866caa78ced1e4455d2e9cbd8adb2074e7c323d21b4e67732e755' => ['message' => $message, 'level' => MigrationInterface::MESSAGE_ERROR], Chris@0: '2d3ec2b0c547e819346e6ae03f881fd9f5c978ff3cbe29dfb807d40735e53703' => ['message' => $message, 'level' => MigrationInterface::MESSAGE_WARNING], Chris@0: '12a042f72cad9a2a8c7715df0c7695d762975f0687d87f5d480725dae1432a6f' => ['message' => $message, 'level' => MigrationInterface::MESSAGE_NOTICE], Chris@0: 'd9d1fd27a2447ace48f47a2e9ff649673f67b446d9381a7963c949fc083f8791' => ['message' => $message, 'level' => MigrationInterface::MESSAGE_INFORMATIONAL], Chris@0: ]; Chris@0: $id_map = $this->getIdMap(); Chris@0: Chris@0: foreach ($original_values as $key => $original_value) { Chris@0: $id_map->saveMessage(['source_id_property' => $key], $message, $original_value['level']); Chris@0: } Chris@0: Chris@0: foreach ($id_map->getMessageIterator() as $message_row) { Chris@0: $key = $message_row->source_ids_hash; Chris@0: $this->assertEquals($expected_results[$key]['message'], $message_row->message); Chris@0: $this->assertEquals($expected_results[$key]['level'], $message_row->level); Chris@0: } Chris@0: Chris@0: // Insert with default level. Chris@0: $message_default = 'Hello world default.'; Chris@0: $id_map->saveMessage(['source_id_property' => 5], $message_default); Chris@0: $messages = $id_map->getMessageIterator(['source_id_property' => 5]); Chris@0: $count = 0; Chris@0: foreach ($messages as $key => $message_row) { Chris@0: $count = 1; Chris@0: $this->assertEquals($message_default, $message_row->message); Chris@0: $this->assertEquals(MigrationInterface::MESSAGE_ERROR, $message_row->level); Chris@0: } Chris@0: $this->assertEquals($count, 1); Chris@0: Chris@0: // Retrieve messages with a specific level. Chris@0: $messages = $id_map->getMessageIterator([], MigrationInterface::MESSAGE_WARNING); Chris@0: $count = 0; Chris@0: foreach ($messages as $key => $message_row) { Chris@0: $count = 1; Chris@0: $this->assertEquals(MigrationInterface::MESSAGE_WARNING, $message_row->level); Chris@0: } Chris@0: $this->assertEquals($count, 1); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the getRowBySource method. Chris@0: */ Chris@0: public function testGetRowBySource() { Chris@0: $this->getDatabase([]); Chris@0: $row = [ Chris@0: 'sourceid1' => 'source_id_value_1', Chris@0: 'sourceid2' => 'source_id_value_2', Chris@16: 'source_ids_hash' => $this->getIdMap()->getSourceIdsHash(['source_id_property' => 'source_id_value_1']), Chris@0: 'destid1' => 'destination_id_value_1', Chris@0: ] + $this->idMapDefaults(); Chris@0: $this->saveMap($row); Chris@0: $row = [ Chris@0: 'sourceid1' => 'source_id_value_3', Chris@0: 'sourceid2' => 'source_id_value_4', Chris@16: 'source_ids_hash' => $this->getIdMap()->getSourceIdsHash(['source_id_property' => 'source_id_value_3', 'sourceid2' => 'source_id_value_4']), Chris@0: 'destid1' => 'destination_id_value_2', Chris@0: ] + $this->idMapDefaults(); Chris@0: $this->saveMap($row); Chris@0: $source_id_values = ['source_id_property' => $row['sourceid1'], 'sourceid2' => $row['sourceid2']]; Chris@0: $id_map = $this->getIdMap(); Chris@0: $result_row = $id_map->getRowBySource($source_id_values); Chris@0: $this->assertSame($row, $result_row); Chris@0: $source_id_values = ['source_id_property' => 'missing_value_1', 'sourceid2' => 'missing_value_2']; Chris@0: $result_row = $id_map->getRowBySource($source_id_values); Chris@0: $this->assertFalse($result_row); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Data provider for testLookupDestinationIdMapping(). Chris@0: * Chris@0: * Scenarios to test (for both hits and misses) are: Chris@0: * - Single-value source ID to single-value destination ID. Chris@0: * - Multi-value source ID to multi-value destination ID. Chris@0: * - Single-value source ID to multi-value destination ID. Chris@0: * - Multi-value source ID to single-value destination ID. Chris@0: * Chris@0: * @return array Chris@0: * An array of data values. Chris@0: */ Chris@0: public function lookupDestinationIdMappingDataProvider() { Chris@0: return [ Chris@0: [1, 1], Chris@0: [2, 2], Chris@0: [1, 2], Chris@0: [2, 1], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Performs destination ID test on source and destination fields. Chris@0: * Chris@0: * @param int $num_source_fields Chris@0: * Number of source fields to test. Chris@0: * @param int $num_destination_fields Chris@0: * Number of destination fields to test. Chris@0: * Chris@0: * @dataProvider lookupDestinationIdMappingDataProvider Chris@0: */ Chris@0: public function testLookupDestinationIdMapping($num_source_fields, $num_destination_fields) { Chris@0: // Adjust the migration configuration according to the number of source and Chris@0: // destination fields. Chris@0: $this->sourceIds = []; Chris@0: $this->destinationIds = []; Chris@0: $source_id_values = []; Chris@0: $nonexistent_id_values = []; Chris@0: $row = $this->idMapDefaults(); Chris@0: for ($i = 1; $i <= $num_source_fields; $i++) { Chris@0: $row["sourceid$i"] = "source_id_value_$i"; Chris@0: $source_id_values[] = "source_id_value_$i"; Chris@0: $nonexistent_id_values[] = "nonexistent_source_id_value_$i"; Chris@0: $this->sourceIds["source_id_property_$i"] = []; Chris@0: } Chris@0: $expected_result = []; Chris@0: for ($i = 1; $i <= $num_destination_fields; $i++) { Chris@0: $row["destid$i"] = "destination_id_value_$i"; Chris@0: $expected_result[] = "destination_id_value_$i"; Chris@0: $this->destinationIds["destination_id_property_$i"] = []; Chris@0: } Chris@16: $row['source_ids_hash'] = $this->getIdMap()->getSourceIdsHash($source_id_values); Chris@0: $this->saveMap($row); Chris@0: $id_map = $this->getIdMap(); Chris@0: // Test for a valid hit. Chris@0: $destination_id = $id_map->lookupDestinationId($source_id_values); Chris@0: $this->assertSame($expected_result, $destination_id); Chris@0: // Test for a miss. Chris@0: $destination_id = $id_map->lookupDestinationId($nonexistent_id_values); Chris@0: $this->assertSame(0, count($destination_id)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Setup a database with the given rows. Chris@0: * Chris@0: * @param array $source_keys Chris@0: * The source keys for the ID map table. Chris@0: * @param array $dest_keys Chris@0: * The destination keys for the ID map table. Chris@0: * @param array $rows Chris@0: * An array of source and destination value arrays for the ID map table. Chris@0: * Chris@0: * @return \Drupal\Tests\migrate\Unit\TestSqlIdMap Chris@0: * An ID map instance for testing. Chris@0: */ Chris@0: protected function setupRows($source_keys, $dest_keys, $rows) { Chris@0: $this->database = $this->getDatabase([]); Chris@0: $this->sourceIds = array_fill_keys($source_keys, []); Chris@0: $this->destinationIds = array_fill_keys($dest_keys, []); Chris@0: Chris@0: $db_keys = []; Chris@0: foreach (array_keys($source_keys) as $i) { Chris@0: $db_keys[] = 'sourceid' . ($i + 1); Chris@0: } Chris@0: foreach (array_keys($dest_keys) as $i) { Chris@0: $db_keys[] = 'destid' . ($i + 1); Chris@0: } Chris@0: foreach ($rows as $row) { Chris@0: $values = array_combine($db_keys, $row); Chris@0: $source_values = array_slice($row, 0, count($source_keys)); Chris@16: $values['source_ids_hash'] = $this->getIdMap()->getSourceIdsHash($source_values); Chris@0: $this->saveMap($values); Chris@0: } Chris@0: Chris@0: return $this->getIdMap(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests lookupDestinationIds(). Chris@0: */ Chris@0: public function testLookupDestinationIds() { Chris@0: // Simple map with one source and one destination ID. Chris@0: $id_map = $this->setupRows(['nid'], ['nid'], [ Chris@0: [1, 101], Chris@0: [2, 102], Chris@0: [3, 103], Chris@0: ]); Chris@0: Chris@0: // Lookup nothing, gives nothing. Chris@0: $this->assertEquals([], $id_map->lookupDestinationIds([])); Chris@0: // Lookup by complete non-associative list. Chris@0: $this->assertEquals([[101]], $id_map->lookupDestinationIds([1])); Chris@0: $this->assertEquals([[102]], $id_map->lookupDestinationIds([2])); Chris@0: $this->assertEquals([], $id_map->lookupDestinationIds([99])); Chris@0: // Lookup by complete associative list. Chris@0: $this->assertEquals([[101]], $id_map->lookupDestinationIds(['nid' => 1])); Chris@0: $this->assertEquals([[102]], $id_map->lookupDestinationIds(['nid' => 2])); Chris@0: $this->assertEquals([], $id_map->lookupDestinationIds(['nid' => 99])); Chris@0: Chris@0: // Map with multiple source and destination IDs. Chris@0: $id_map = $this->setupRows(['nid', 'language'], ['nid', 'langcode'], [ Chris@0: [1, 'en', 101, 'en'], Chris@0: [1, 'fr', 101, 'fr'], Chris@0: [1, 'de', 101, 'de'], Chris@0: [2, 'en', 102, 'en'], Chris@0: ]); Chris@0: Chris@0: // Lookup nothing, gives nothing. Chris@0: $this->assertEquals([], $id_map->lookupDestinationIds([])); Chris@0: // Lookup by complete non-associative list. Chris@0: $this->assertEquals([[101, 'en']], $id_map->lookupDestinationIds([1, 'en'])); Chris@0: $this->assertEquals([[101, 'fr']], $id_map->lookupDestinationIds([1, 'fr'])); Chris@0: $this->assertEquals([[102, 'en']], $id_map->lookupDestinationIds([2, 'en'])); Chris@0: $this->assertEquals([], $id_map->lookupDestinationIds([2, 'fr'])); Chris@0: $this->assertEquals([], $id_map->lookupDestinationIds([99, 'en'])); Chris@0: // Lookup by complete associative list. Chris@0: $this->assertEquals([[101, 'en']], $id_map->lookupDestinationIds(['nid' => 1, 'language' => 'en'])); Chris@0: $this->assertEquals([[101, 'fr']], $id_map->lookupDestinationIds(['nid' => 1, 'language' => 'fr'])); Chris@0: $this->assertEquals([[102, 'en']], $id_map->lookupDestinationIds(['nid' => 2, 'language' => 'en'])); Chris@0: $this->assertEquals([], $id_map->lookupDestinationIds(['nid' => 2, 'language' => 'fr'])); Chris@0: $this->assertEquals([], $id_map->lookupDestinationIds(['nid' => 99, 'language' => 'en'])); Chris@0: // Lookup by partial non-associative list. Chris@0: $this->assertEquals([[101, 'en'], [101, 'fr'], [101, 'de']], $id_map->lookupDestinationIds([1])); Chris@0: $this->assertEquals([[102, 'en']], $id_map->lookupDestinationIds([2])); Chris@0: $this->assertEquals([], $id_map->lookupDestinationIds([99])); Chris@0: // Lookup by partial associative list. Chris@0: $this->assertEquals([[101, 'en'], [101, 'fr'], [101, 'de']], $id_map->lookupDestinationIds(['nid' => 1])); Chris@0: $this->assertEquals([[102, 'en']], $id_map->lookupDestinationIds(['nid' => 2])); Chris@0: $this->assertEquals([], $id_map->lookupDestinationIds(['nid' => 99])); Chris@16: $this->assertEquals([[101, 'en'], [101, 'fr'], [101, 'de']], $id_map->lookupDestinationIds(['nid' => 1, 'language' => NULL])); Chris@16: $this->assertEquals([[102, 'en']], $id_map->lookupDestinationIds(['nid' => 2, 'language' => NULL])); Chris@0: // Out-of-order partial associative list. Chris@0: $this->assertEquals([[101, 'en'], [102, 'en']], $id_map->lookupDestinationIds(['language' => 'en'])); Chris@0: $this->assertEquals([[101, 'fr']], $id_map->lookupDestinationIds(['language' => 'fr'])); Chris@0: $this->assertEquals([], $id_map->lookupDestinationIds(['language' => 'zh'])); Chris@0: // Error conditions. Chris@0: try { Chris@0: $id_map->lookupDestinationIds([1, 2, 3]); Chris@0: $this->fail('Too many source IDs should throw'); Chris@0: } Chris@0: catch (MigrateException $e) { Chris@17: $this->assertEquals("Extra unknown items for map migrate_map_sql_idmap_test in source IDs: array (\n 0 => 3,\n)", $e->getMessage()); Chris@0: } Chris@0: try { Chris@0: $id_map->lookupDestinationIds(['nid' => 1, 'aaa' => '2']); Chris@0: $this->fail('Unknown source ID key should throw'); Chris@0: } Chris@0: catch (MigrateException $e) { Chris@17: $this->assertEquals("Extra unknown items for map migrate_map_sql_idmap_test in source IDs: array (\n 'aaa' => '2',\n)", $e->getMessage()); Chris@0: } Chris@0: Chris@0: // Verify that we are looking up by source_id_hash when all source IDs are Chris@0: // passed in. Chris@0: $id_map->getDatabase()->update($id_map->mapTableName()) Chris@0: ->condition('sourceid1', 1) Chris@0: ->condition('sourceid2', 'en') Chris@0: ->fields([TestSqlIdMap::SOURCE_IDS_HASH => uniqid()]) Chris@0: ->execute(); Chris@0: $this->assertNotEquals([[101, 'en']], $id_map->lookupDestinationIds([1, 'en'])); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the getRowByDestination method. Chris@0: */ Chris@0: public function testGetRowByDestination() { Chris@0: $row = [ Chris@0: 'sourceid1' => 'source_id_value_1', Chris@0: 'sourceid2' => 'source_id_value_2', Chris@16: 'source_ids_hash' => $this->getIdMap()->getSourceIdsHash(['source_id_property' => 'source_id_value_1']), Chris@0: 'destid1' => 'destination_id_value_1', Chris@0: ] + $this->idMapDefaults(); Chris@0: $this->saveMap($row); Chris@0: $row = [ Chris@0: 'sourceid1' => 'source_id_value_3', Chris@0: 'sourceid2' => 'source_id_value_4', Chris@16: 'source_ids_hash' => $this->getIdMap()->getSourceIdsHash(['source_id_property' => 'source_id_value_3']), Chris@0: 'destid1' => 'destination_id_value_2', Chris@0: ] + $this->idMapDefaults(); Chris@0: $this->saveMap($row); Chris@0: $dest_id_values = ['destination_id_property' => $row['destid1']]; Chris@0: $id_map = $this->getIdMap(); Chris@0: $result_row = $id_map->getRowByDestination($dest_id_values); Chris@0: $this->assertSame($row, $result_row); Chris@0: // This value does not exist. Chris@0: $dest_id_values = ['destination_id_property' => 'invalid_destination_id_property']; Chris@0: $id_map = $this->getIdMap(); Chris@0: $result_row = $id_map->getRowByDestination($dest_id_values); Chris@0: $this->assertFalse($result_row); Chris@0: } Chris@0: Chris@0: /** Chris@16: * Data provider for testLookupSourceIdMapping(). Chris@0: * Chris@0: * Scenarios to test (for both hits and misses) are: Chris@0: * - Single-value destination ID to single-value source ID. Chris@0: * - Multi-value destination ID to multi-value source ID. Chris@0: * - Single-value destination ID to multi-value source ID. Chris@0: * - Multi-value destination ID to single-value source ID. Chris@0: * Chris@0: * @return array Chris@0: * An array of data values. Chris@0: */ Chris@16: public function lookupSourceIdMappingDataProvider() { Chris@0: return [ Chris@0: [1, 1], Chris@0: [2, 2], Chris@0: [1, 2], Chris@0: [2, 1], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Performs the source ID test on source and destination fields. Chris@0: * Chris@0: * @param int $num_source_fields Chris@0: * Number of source fields to test. Chris@0: * @param int $num_destination_fields Chris@0: * Number of destination fields to test. Chris@0: * Chris@16: * @dataProvider lookupSourceIdMappingDataProvider Chris@0: */ Chris@16: public function testLookupSourceIdMapping($num_source_fields, $num_destination_fields) { Chris@0: // Adjust the migration configuration according to the number of source and Chris@0: // destination fields. Chris@0: $this->sourceIds = []; Chris@0: $this->destinationIds = []; Chris@0: $row = $this->idMapDefaults(); Chris@0: $source_ids_values = []; Chris@0: $expected_result = []; Chris@0: for ($i = 1; $i <= $num_source_fields; $i++) { Chris@0: $row["sourceid$i"] = "source_id_value_$i"; Chris@0: $source_ids_values = [$row["sourceid$i"]]; Chris@0: $expected_result["source_id_property_$i"] = "source_id_value_$i"; Chris@0: $this->sourceIds["source_id_property_$i"] = []; Chris@0: } Chris@0: $destination_id_values = []; Chris@0: $nonexistent_id_values = []; Chris@0: for ($i = 1; $i <= $num_destination_fields; $i++) { Chris@0: $row["destid$i"] = "destination_id_value_$i"; Chris@0: $destination_id_values["destination_id_property_$i"] = "destination_id_value_$i"; Chris@0: $nonexistent_id_values["destination_id_property_$i"] = "nonexistent_destination_id_value_$i"; Chris@0: $this->destinationIds["destination_id_property_$i"] = []; Chris@0: } Chris@16: $row['source_ids_hash'] = $this->getIdMap()->getSourceIdsHash($source_ids_values); Chris@0: $this->saveMap($row); Chris@0: $id_map = $this->getIdMap(); Chris@0: // Test for a valid hit. Chris@16: $source_id = $id_map->lookupSourceId($destination_id_values); Chris@0: $this->assertSame($expected_result, $source_id); Chris@0: // Test for a miss. Chris@16: $source_id = $id_map->lookupSourceId($nonexistent_id_values); Chris@0: $this->assertSame(0, count($source_id)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests currentDestination() and currentSource(). Chris@0: */ Chris@0: public function testCurrentDestinationAndSource() { Chris@0: // Simple map with one source and one destination ID. Chris@0: $id_map = $this->setupRows(['nid'], ['nid'], [ Chris@0: [1, 101], Chris@0: [2, 102], Chris@0: [3, 103], Chris@0: // Mock a failed row by setting the destination ID to NULL. Chris@0: [4, NULL], Chris@0: ]); Chris@0: Chris@0: // The rows are ordered by destination ID so the failed row should be first. Chris@0: $id_map->rewind(); Chris@0: $this->assertEquals([], $id_map->currentDestination()); Chris@0: $this->assertEquals(['nid' => 4], $id_map->currentSource()); Chris@0: $id_map->next(); Chris@0: $this->assertEquals(['nid' => 101], $id_map->currentDestination()); Chris@0: $this->assertEquals(['nid' => 1], $id_map->currentSource()); Chris@0: $id_map->next(); Chris@0: $this->assertEquals(['nid' => 102], $id_map->currentDestination()); Chris@0: $this->assertEquals(['nid' => 2], $id_map->currentSource()); Chris@0: $id_map->next(); Chris@0: $this->assertEquals(['nid' => 103], $id_map->currentDestination()); Chris@0: $this->assertEquals(['nid' => 3], $id_map->currentSource()); Chris@0: $id_map->next(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the imported count method. Chris@0: * Chris@0: * Scenarios to test for: Chris@0: * - No imports. Chris@0: * - One import. Chris@0: * - Multiple imports. Chris@0: */ Chris@0: public function testImportedCount() { Chris@0: $id_map = $this->getIdMap(); Chris@0: // Add a single failed row and assert zero imported rows. Chris@0: $source = ['source_id_property' => 'source_value_failed']; Chris@0: $row = new Row($source, ['source_id_property' => []]); Chris@0: $destination = ['destination_id_property' => 'destination_value_failed']; Chris@0: $id_map->saveIdMapping($row, $destination, MigrateIdMapInterface::STATUS_FAILED); Chris@14: $this->assertSame(0, $id_map->importedCount()); Chris@0: Chris@0: // Add an imported row and assert single count. Chris@0: $source = ['source_id_property' => 'source_value_imported']; Chris@0: $row = new Row($source, ['source_id_property' => []]); Chris@0: $destination = ['destination_id_property' => 'destination_value_imported']; Chris@0: $id_map->saveIdMapping($row, $destination, MigrateIdMapInterface::STATUS_IMPORTED); Chris@14: $this->assertSame(1, $id_map->importedCount()); Chris@0: Chris@0: // Add a row needing update and assert multiple imported rows. Chris@0: $source = ['source_id_property' => 'source_value_update']; Chris@0: $row = new Row($source, ['source_id_property' => []]); Chris@0: $destination = ['destination_id_property' => 'destination_value_update']; Chris@0: $id_map->saveIdMapping($row, $destination, MigrateIdMapInterface::STATUS_NEEDS_UPDATE); Chris@14: $this->assertSame(2, $id_map->importedCount()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the number of processed source rows. Chris@0: * Chris@0: * Scenarios to test for: Chris@0: * - No processed rows. Chris@0: * - One processed row. Chris@0: * - Multiple processed rows. Chris@0: */ Chris@0: public function testProcessedCount() { Chris@0: $id_map = $this->getIdMap(); Chris@0: // Assert zero rows have been processed before adding rows. Chris@14: $this->assertSame(0, $id_map->processedCount()); Chris@0: $row_statuses = [ Chris@0: MigrateIdMapInterface::STATUS_IMPORTED, Chris@0: MigrateIdMapInterface::STATUS_NEEDS_UPDATE, Chris@0: MigrateIdMapInterface::STATUS_IGNORED, Chris@0: MigrateIdMapInterface::STATUS_FAILED, Chris@0: ]; Chris@0: // Create a mapping row for each STATUS constant. Chris@0: foreach ($row_statuses as $status) { Chris@0: $source = ['source_id_property' => 'source_value_' . $status]; Chris@0: $row = new Row($source, ['source_id_property' => []]); Chris@0: $destination = ['destination_id_property' => 'destination_value_' . $status]; Chris@0: $id_map->saveIdMapping($row, $destination, $status); Chris@0: if ($status == MigrateIdMapInterface::STATUS_IMPORTED) { Chris@0: // Assert a single row has been processed. Chris@14: $this->assertSame(1, $id_map->processedCount()); Chris@0: } Chris@0: } Chris@0: // Assert multiple rows have been processed. Chris@14: $this->assertSame(count($row_statuses), $id_map->processedCount()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Data provider for testUpdateCount(). Chris@0: * Chris@0: * Scenarios to test for: Chris@0: * - No updates. Chris@0: * - One update. Chris@0: * - Multiple updates. Chris@0: * Chris@0: * @return array Chris@0: * An array of data values. Chris@0: */ Chris@0: public function updateCountDataProvider() { Chris@0: return [ Chris@0: [0], Chris@0: [1], Chris@0: [3], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Performs the update count test with a given number of update rows. Chris@0: * Chris@0: * @param int $num_update_rows Chris@0: * The number of update rows to test. Chris@0: * Chris@0: * @dataProvider updateCountDataProvider Chris@0: */ Chris@0: public function testUpdateCount($num_update_rows) { Chris@0: for ($i = 0; $i < 5; $i++) { Chris@0: $row = $this->idMapDefaults(); Chris@0: $row['sourceid1'] = "source_id_value_$i"; Chris@16: $row['source_ids_hash'] = $this->getIdMap()->getSourceIdsHash(['source_id_property' => $row['sourceid1']]); Chris@0: $row['destid1'] = "destination_id_value_$i"; Chris@0: $row['source_row_status'] = MigrateIdMapInterface::STATUS_IMPORTED; Chris@0: $this->saveMap($row); Chris@0: } Chris@0: for (; $i < 5 + $num_update_rows; $i++) { Chris@0: $row = $this->idMapDefaults(); Chris@0: $row['sourceid1'] = "source_id_value_$i"; Chris@16: $row['source_ids_hash'] = $this->getIdMap()->getSourceIdsHash(['source_id_property' => $row['sourceid1']]); Chris@0: $row['destid1'] = "destination_id_value_$i"; Chris@0: $row['source_row_status'] = MigrateIdMapInterface::STATUS_NEEDS_UPDATE; Chris@0: $this->saveMap($row); Chris@0: } Chris@0: $id_map = $this->getIdMap(); Chris@14: $this->assertSame($num_update_rows, $id_map->updateCount()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Data provider for testErrorCount(). Chris@0: * Chris@0: * Scenarios to test for: Chris@0: * - No errors. Chris@0: * - One error. Chris@0: * - Multiple errors. Chris@0: * Chris@0: * @return array Chris@0: * An array of data values. Chris@0: */ Chris@0: public function errorCountDataProvider() { Chris@0: return [ Chris@0: [0], Chris@0: [1], Chris@0: [3], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Performs error count test with a given number of error rows. Chris@0: * Chris@0: * @param int $num_error_rows Chris@0: * Number of error rows to test. Chris@0: * Chris@0: * @dataProvider errorCountDataProvider Chris@0: */ Chris@0: public function testErrorCount($num_error_rows) { Chris@0: for ($i = 0; $i < 5; $i++) { Chris@0: $row = $this->idMapDefaults(); Chris@0: $row['sourceid1'] = "source_id_value_$i"; Chris@16: $row['source_ids_hash'] = $this->getIdMap()->getSourceIdsHash(['source_id_property' => $row['sourceid1']]); Chris@0: $row['destid1'] = "destination_id_value_$i"; Chris@0: $row['source_row_status'] = MigrateIdMapInterface::STATUS_IMPORTED; Chris@0: $this->saveMap($row); Chris@0: } Chris@0: for (; $i < 5 + $num_error_rows; $i++) { Chris@0: $row = $this->idMapDefaults(); Chris@0: $row['sourceid1'] = "source_id_value_$i"; Chris@16: $row['source_ids_hash'] = $this->getIdMap()->getSourceIdsHash(['source_id_property' => $row['sourceid1']]); Chris@0: $row['destid1'] = "destination_id_value_$i"; Chris@0: $row['source_row_status'] = MigrateIdMapInterface::STATUS_FAILED; Chris@0: $this->saveMap($row); Chris@0: } Chris@0: Chris@14: $this->assertSame($num_error_rows, $this->getIdMap()->errorCount()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests setting a row source_row_status to STATUS_NEEDS_UPDATE. Chris@0: */ Chris@0: public function testSetUpdate() { Chris@0: $id_map = $this->getIdMap(); Chris@0: $row_statuses = [ Chris@0: MigrateIdMapInterface::STATUS_IMPORTED, Chris@0: MigrateIdMapInterface::STATUS_NEEDS_UPDATE, Chris@0: MigrateIdMapInterface::STATUS_IGNORED, Chris@0: MigrateIdMapInterface::STATUS_FAILED, Chris@0: ]; Chris@0: // Create a mapping row for each STATUS constant. Chris@0: foreach ($row_statuses as $status) { Chris@0: $source = ['source_id_property' => 'source_value_' . $status]; Chris@0: $row = new Row($source, ['source_id_property' => []]); Chris@0: $destination = ['destination_id_property' => 'destination_value_' . $status]; Chris@0: $id_map->saveIdMapping($row, $destination, $status); Chris@0: $expected_results[] = [ Chris@0: 'sourceid1' => 'source_value_' . $status, Chris@16: 'source_ids_hash' => $this->getIdMap()->getSourceIdsHash($source), Chris@0: 'destid1' => 'destination_value_' . $status, Chris@0: 'source_row_status' => $status, Chris@0: 'rollback_action' => MigrateIdMapInterface::ROLLBACK_DELETE, Chris@0: 'hash' => '', Chris@0: ]; Chris@0: } Chris@0: // Assert that test values exist. Chris@0: $this->queryResultTest($this->getIdMapContents(), $expected_results); Chris@0: // Mark each row as STATUS_NEEDS_UPDATE. Chris@0: foreach ($row_statuses as $status) { Chris@0: $id_map->setUpdate(['source_id_property' => 'source_value_' . $status]); Chris@0: } Chris@0: // Update expected results. Chris@0: foreach ($expected_results as $key => $value) { Chris@0: $expected_results[$key]['source_row_status'] = MigrateIdMapInterface::STATUS_NEEDS_UPDATE; Chris@0: } Chris@0: // Assert that updated expected values match. Chris@0: $this->queryResultTest($this->getIdMapContents(), $expected_results); Chris@0: // Assert an exception is thrown when source identifiers are not provided. Chris@0: try { Chris@0: $id_map->setUpdate([]); Chris@0: $this->assertFalse(FALSE, 'MigrateException not thrown, when source identifiers were provided to update.'); Chris@0: } Chris@0: catch (MigrateException $e) { Chris@0: $this->assertTrue(TRUE, "MigrateException thrown, when source identifiers were not provided to update."); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests prepareUpdate(). Chris@0: */ Chris@0: public function testPrepareUpdate() { Chris@0: $id_map = $this->getIdMap(); Chris@0: $row_statuses = [ Chris@0: MigrateIdMapInterface::STATUS_IMPORTED, Chris@0: MigrateIdMapInterface::STATUS_NEEDS_UPDATE, Chris@0: MigrateIdMapInterface::STATUS_IGNORED, Chris@0: MigrateIdMapInterface::STATUS_FAILED, Chris@0: ]; Chris@0: Chris@0: // Create a mapping row for each STATUS constant. Chris@0: foreach ($row_statuses as $status) { Chris@0: $source = ['source_id_property' => 'source_value_' . $status]; Chris@0: $row = new Row($source, ['source_id_property' => []]); Chris@0: $destination = ['destination_id_property' => 'destination_value_' . $status]; Chris@0: $id_map->saveIdMapping($row, $destination, $status); Chris@0: $expected_results[] = [ Chris@0: 'sourceid1' => 'source_value_' . $status, Chris@0: 'destid1' => 'destination_value_' . $status, Chris@0: 'source_row_status' => $status, Chris@0: 'rollback_action' => MigrateIdMapInterface::ROLLBACK_DELETE, Chris@0: 'hash' => '', Chris@0: ]; Chris@0: } Chris@0: Chris@0: // Assert that test values exist. Chris@0: $this->queryResultTest($this->getIdMapContents(), $expected_results); Chris@0: Chris@0: // Mark all rows as STATUS_NEEDS_UPDATE. Chris@0: $id_map->prepareUpdate(); Chris@0: Chris@0: // Update expected results. Chris@0: foreach ($expected_results as $key => $value) { Chris@0: $expected_results[$key]['source_row_status'] = MigrateIdMapInterface::STATUS_NEEDS_UPDATE; Chris@0: } Chris@0: // Assert that updated expected values match. Chris@0: $this->queryResultTest($this->getIdMapContents(), $expected_results); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the destroy method. Chris@0: * Chris@0: * Scenarios to test for: Chris@0: * - No errors. Chris@0: * - One error. Chris@0: * - Multiple errors. Chris@0: */ Chris@0: public function testDestroy() { Chris@0: $id_map = $this->getIdMap(); Chris@0: // Initialize the ID map. Chris@0: $id_map->getDatabase(); Chris@0: $map_table_name = $id_map->mapTableName(); Chris@0: $message_table_name = $id_map->messageTableName(); Chris@0: $row = new Row(['source_id_property' => 'source_value'], ['source_id_property' => []]); Chris@0: $id_map->saveIdMapping($row, ['destination_id_property' => 2]); Chris@0: $id_map->saveMessage(['source_id_property' => 'source_value'], 'A message'); Chris@0: $this->assertTrue($this->database->schema()->tableExists($map_table_name), Chris@0: "$map_table_name exists"); Chris@0: $this->assertTrue($this->database->schema()->tableExists($message_table_name), Chris@0: "$message_table_name exists"); Chris@0: $id_map->destroy(); Chris@0: $this->assertFalse($this->database->schema()->tableExists($map_table_name), Chris@0: "$map_table_name does not exist"); Chris@0: $this->assertFalse($this->database->schema()->tableExists($message_table_name), Chris@0: "$message_table_name does not exist"); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the getQualifiedMapTable method with a prefixed database. Chris@0: */ Chris@0: public function testGetQualifiedMapTablePrefix() { Chris@0: $connection_options = [ Chris@0: 'database' => ':memory:', Chris@0: 'prefix' => 'prefix', Chris@0: ]; Chris@0: $pdo = Connection::open($connection_options); Chris@0: $this->database = new Connection($pdo, $connection_options); Chris@0: $qualified_map_table = $this->getIdMap()->getQualifiedMapTableName(); Chris@0: // The SQLite driver is a special flower. It will prefix tables with Chris@0: // PREFIX.TABLE, instead of the standard PREFIXTABLE. Chris@0: // @see \Drupal\Core\Database\Driver\sqlite\Connection::__construct() Chris@0: $this->assertEquals('prefix.migrate_map_sql_idmap_test', $qualified_map_table); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests all the iterator methods in one swing. Chris@0: * Chris@0: * The iterator methods are: Chris@0: * - Sql::rewind() Chris@0: * - Sql::next() Chris@0: * - Sql::valid() Chris@0: * - Sql::key() Chris@0: * - Sql::current() Chris@0: */ Chris@0: public function testIterators() { Chris@0: for ($i = 0; $i < 3; $i++) { Chris@0: $row = $this->idMapDefaults(); Chris@0: $row['sourceid1'] = "source_id_value_$i"; Chris@16: $row['source_ids_hash'] = $this->getIdMap()->getSourceIdsHash(['source_id_property' => $row['sourceid1']]); Chris@0: $row['destid1'] = "destination_id_value_$i"; Chris@0: $row['source_row_status'] = MigrateIdMapInterface::STATUS_IMPORTED; Chris@0: $expected_results[serialize(['sourceid1' => $row['sourceid1']])] = ['destid1' => $row['destid1']]; Chris@0: $this->saveMap($row); Chris@0: } Chris@0: Chris@0: $this->assertSame(iterator_to_array($this->getIdMap()), $expected_results); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Retrieves the contents of an ID map. Chris@0: * Chris@0: * @return array Chris@0: * The contents of an ID map. Chris@0: */ Chris@0: private function getIdMapContents() { Chris@0: $result = $this->database Chris@0: ->select('migrate_map_sql_idmap_test', 't') Chris@0: ->fields('t') Chris@0: ->execute(); Chris@0: Chris@0: // The return value needs to be countable, or it will fail certain Chris@0: // assertions. iterator_to_array() will not suffice because it won't Chris@0: // respect the PDO fetch mode, if specified. Chris@0: $contents = []; Chris@0: foreach ($result as $row) { Chris@0: $contents[] = (array) $row; Chris@0: } Chris@0: return $contents; Chris@0: } Chris@0: Chris@17: /** Chris@17: * Tests the delayed creation of the "map" and "message" migrate tables. Chris@17: */ Chris@17: public function testMapTableCreation() { Chris@17: $id_map = $this->getIdMap(); Chris@17: $map_table_name = $id_map->mapTableName(); Chris@17: $message_table_name = $id_map->messageTableName(); Chris@17: Chris@17: // Check that tables names do exist. Chris@17: $this->assertEquals('migrate_map_sql_idmap_test', $map_table_name); Chris@17: $this->assertEquals('migrate_message_sql_idmap_test', $message_table_name); Chris@17: Chris@17: // Check that tables don't exist. Chris@17: $this->assertFalse($this->database->schema()->tableExists($map_table_name)); Chris@17: $this->assertFalse($this->database->schema()->tableExists($message_table_name)); Chris@17: Chris@17: $id_map->getDatabase(); Chris@17: Chris@17: // Check that tables do exist. Chris@17: $this->assertTrue($this->database->schema()->tableExists($map_table_name)); Chris@17: $this->assertTrue($this->database->schema()->tableExists($message_table_name)); Chris@17: } Chris@17: Chris@0: }