Chris@0: installConfig(['filter']); Chris@0: $this->installEntitySchema('taxonomy_term'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Deleting terms should also remove related vocabulary. Chris@0: * Deleting an invalid term should silently fail. Chris@0: */ Chris@0: public function testTermDelete() { Chris@0: $vocabulary = $this->createVocabulary(); Chris@0: $valid_term = $this->createTerm($vocabulary); Chris@0: // Delete a valid term. Chris@0: $valid_term->delete(); Chris@0: $terms = entity_load_multiple_by_properties('taxonomy_term', ['vid' => $vocabulary->id()]); Chris@0: $this->assertTrue(empty($terms), 'Vocabulary is empty after deletion'); Chris@0: Chris@0: // Delete an invalid term. Should not throw any notices. Chris@0: entity_delete_multiple('taxonomy_term', [42]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Deleting a parent of a term with multiple parents does not delete the term. Chris@0: */ Chris@0: public function testMultipleParentDelete() { Chris@0: $vocabulary = $this->createVocabulary(); Chris@0: $parent_term1 = $this->createTerm($vocabulary); Chris@0: $parent_term2 = $this->createTerm($vocabulary); Chris@0: $child_term = $this->createTerm($vocabulary); Chris@0: $child_term->parent = [$parent_term1->id(), $parent_term2->id()]; Chris@0: $child_term->save(); Chris@0: $child_term_id = $child_term->id(); Chris@0: Chris@0: $parent_term1->delete(); Chris@0: $term_storage = $this->container->get('entity.manager')->getStorage('taxonomy_term'); Chris@0: $term_storage->resetCache([$child_term_id]); Chris@0: $child_term = Term::load($child_term_id); Chris@0: $this->assertTrue(!empty($child_term), 'Child term is not deleted if only one of its parents is removed.'); Chris@0: Chris@0: $parent_term2->delete(); Chris@0: $term_storage->resetCache([$child_term_id]); Chris@0: $child_term = Term::load($child_term_id); Chris@0: $this->assertTrue(empty($child_term), 'Child term is deleted if all of its parents are removed.'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Test a taxonomy with terms that have multiple parents of different depths. Chris@0: */ Chris@0: public function testTaxonomyVocabularyTree() { Chris@0: // Create a new vocabulary with 6 terms. Chris@0: $vocabulary = $this->createVocabulary(); Chris@0: $term = []; Chris@0: for ($i = 0; $i < 6; $i++) { Chris@0: $term[$i] = $this->createTerm($vocabulary); Chris@0: } Chris@0: Chris@0: // Get the taxonomy storage. Chris@0: $taxonomy_storage = $this->container->get('entity.manager')->getStorage('taxonomy_term'); Chris@0: Chris@0: // Set the weight on $term[1] so it appears before $term[5] when fetching Chris@0: // the parents for $term[2], in order to test for a regression on Chris@0: // \Drupal\taxonomy\TermStorageInterface::loadAllParents(). Chris@0: $term[1]->weight = -1; Chris@0: $term[1]->save(); Chris@0: Chris@0: // $term[2] is a child of 1 and 5. Chris@0: $term[2]->parent = [$term[1]->id(), $term[5]->id()]; Chris@0: $term[2]->save(); Chris@0: // $term[3] is a child of 2. Chris@0: $term[3]->parent = [$term[2]->id()]; Chris@0: $term[3]->save(); Chris@0: // $term[5] is a child of 4. Chris@0: $term[5]->parent = [$term[4]->id()]; Chris@0: $term[5]->save(); Chris@0: Chris@0: /** Chris@0: * Expected tree: Chris@0: * term[0] | depth: 0 Chris@0: * term[1] | depth: 0 Chris@0: * -- term[2] | depth: 1 Chris@0: * ---- term[3] | depth: 2 Chris@0: * term[4] | depth: 0 Chris@0: * -- term[5] | depth: 1 Chris@0: * ---- term[2] | depth: 2 Chris@0: * ------ term[3] | depth: 3 Chris@0: */ Chris@0: // Count $term[1] parents with $max_depth = 1. Chris@0: $tree = $taxonomy_storage->loadTree($vocabulary->id(), $term[1]->id(), 1); Chris@0: $this->assertEqual(1, count($tree), 'We have one parent with depth 1.'); Chris@0: Chris@0: // Count all vocabulary tree elements. Chris@0: $tree = $taxonomy_storage->loadTree($vocabulary->id()); Chris@0: $this->assertEqual(8, count($tree), 'We have all vocabulary tree elements.'); Chris@0: Chris@0: // Count elements in every tree depth. Chris@0: foreach ($tree as $element) { Chris@0: if (!isset($depth_count[$element->depth])) { Chris@0: $depth_count[$element->depth] = 0; Chris@0: } Chris@0: $depth_count[$element->depth]++; Chris@0: } Chris@0: $this->assertEqual(3, $depth_count[0], 'Three elements in taxonomy tree depth 0.'); Chris@0: $this->assertEqual(2, $depth_count[1], 'Two elements in taxonomy tree depth 1.'); Chris@0: $this->assertEqual(2, $depth_count[2], 'Two elements in taxonomy tree depth 2.'); Chris@0: $this->assertEqual(1, $depth_count[3], 'One element in taxonomy tree depth 3.'); Chris@0: Chris@0: /** @var \Drupal\taxonomy\TermStorageInterface $storage */ Chris@0: $storage = \Drupal::entityManager()->getStorage('taxonomy_term'); Chris@0: // Count parents of $term[2]. Chris@0: $parents = $storage->loadParents($term[2]->id()); Chris@0: $this->assertEqual(2, count($parents), 'The term has two parents.'); Chris@0: Chris@0: // Count parents of $term[3]. Chris@0: $parents = $storage->loadParents($term[3]->id()); Chris@0: $this->assertEqual(1, count($parents), 'The term has one parent.'); Chris@0: Chris@0: // Identify all ancestors of $term[2]. Chris@0: $ancestors = $storage->loadAllParents($term[2]->id()); Chris@0: $this->assertEqual(4, count($ancestors), 'The term has four ancestors including the term itself.'); Chris@0: Chris@0: // Identify all ancestors of $term[3]. Chris@0: $ancestors = $storage->loadAllParents($term[3]->id()); Chris@0: $this->assertEqual(5, count($ancestors), 'The term has five ancestors including the term itself.'); Chris@0: } Chris@0: Chris@0: }