/**
  * Asserts that a config entity can be imported without changing it.
  *
  * @param \Drupal\Core\Config\Entity\ConfigEntityInterface $entity
  *   The config entity to test importing.
  */
 public function assertConfigEntityImport(ConfigEntityInterface $entity)
 {
     // Save original config information.
     $entity_uuid = $entity->uuid();
     $entity_type_id = $entity->getEntityTypeId();
     $original_data = $entity->toArray();
     // Copy everything to sync.
     $this->copyConfig(\Drupal::service('config.storage'), \Drupal::service('config.storage.sync'));
     // Delete the configuration from active. Don't worry about side effects of
     // deleting config like fields cleaning up field storages. The coming import
     // should recreate everything as necessary.
     $entity->delete();
     $this->configImporter()->reset()->import();
     $imported_entity = \Drupal::entityManager()->loadEntityByUuid($entity_type_id, $entity_uuid);
     $this->assertIdentical($original_data, $imported_entity->toArray());
 }
 /**
  * Tests a tracker with a dependency that gets removed.
  *
  * @param bool $remove_dependency
  *   Whether to remove the dependency from the tracker when the object
  *   depended on is deleted.
  *
  * @dataProvider dependencyTestDataProvider
  */
 public function testTrackerDependency($remove_dependency)
 {
     // Set the tracker for the index and save it. The tracker configuration
     // contains the dependencies it will return – in our case, we use the test
     // server.
     $dependency_key = $this->dependency->getConfigDependencyKey();
     $dependency_name = $this->dependency->getConfigDependencyName();
     $tracker = \Drupal::getContainer()->get('plugin.manager.search_api.tracker')->createInstance('search_api_test_dependencies', array($dependency_key => array($dependency_name)));
     $this->index->setTracker($tracker);
     $this->index->save();
     // Check the dependencies were calculated correctly.
     $dependencies = $this->index->getDependencies();
     $this->assertContains($dependency_name, $dependencies[$dependency_key], 'Tracker dependency correctly inserted');
     // Set our magic state key to let the test plugin know whether the
     // dependency should be removed or not. See
     // \Drupal\search_api_test_dependencies\Plugin\search_api\tracker\TestTracker::onDependencyRemoval().
     $key = 'search_api_test_dependencies.tracker.remove';
     \Drupal::state()->set($key, $remove_dependency);
     // If the index resets the tracker, it needs to know the ID of the default
     // tracker.
     if (!$remove_dependency) {
         \Drupal::configFactory()->getEditable('search_api.settings')->set('default_tracker', 'default')->save();
     }
     // Delete the tracker's dependency.
     $this->dependency->delete();
     // Reload the index and check it's still there.
     $this->reloadIndex();
     $this->assertInstanceOf('Drupal\\search_api\\IndexInterface', $this->index, 'Index not removed');
     // Make sure the dependency has been removed, one way or the other.
     $dependencies = $this->index->getDependencies();
     $dependencies += array($dependency_key => array());
     $this->assertNotContains($dependency_name, $dependencies[$dependency_key], 'Tracker dependency removed from index');
     // Depending on whether the plugin should have removed the dependency or
     // not, make sure the right action was taken.
     $tracker_instance = $this->index->getTrackerInstance();
     $tracker_id = $tracker_instance->getPluginId();
     $tracker_config = $tracker_instance->getConfiguration();
     if ($remove_dependency) {
         $this->assertEquals('search_api_test_dependencies', $tracker_id, 'Tracker not reset');
         $this->assertEmpty($tracker_config, 'Tracker settings adapted');
     } else {
         $this->assertEquals('default', $tracker_id, 'Tracker was reset');
         $this->assertEmpty($tracker_config, 'Tracker settings were cleared');
     }
 }