public function testProductCategoriesSynchronization() { $provider = $this->getBaseProvider(); $repository = $this->getMockBuilder('Doctrine\\ORM\\EntityRepository')->disableOriginalConstructor()->getMock(); $em = $this->getMockBuilder('Doctrine\\ORM\\EntityManager')->disableOriginalConstructor()->getMock(); $em->expects($this->any())->method('getRepository')->will($this->returnValue($repository)); $registry = $this->getMock('Doctrine\\Common\\Persistence\\ManagerRegistry'); $registry->expects($this->any())->method('getManagerForClass')->will($this->returnValue($em)); $productCategoryManager = new ProductCategoryManager('Sonata\\Tests\\Component\\Product\\ProductCategory', $registry); $provider->setProductCategoryManager($productCategoryManager); // create product $product = new Product(); // create category1 (main) and add to product $category1 = new Category(); $category1->setId(1); $productCategory1 = new ProductCategory(); $productCategory1->setId(1); $productCategory1->setMain(true); $productCategory1->setCategory($category1); $product->addProductCategory($productCategory1); // create product variation without sync categories $variation = $provider->createVariation($product, false); $this->assertEquals(0, count($variation->getProductCategories())); // synchronise 1 category $provider->synchronizeVariationsCategories($product); $this->assertEquals(1, count($variation->getProductCategories())); // create category2 and add to product $category2 = new Category(); $category2->setId(2); $productCategory2 = new ProductCategory(); $productCategory2->setId(2); $productCategory2->setCategory($category2); $product->addProductCategory($productCategory2); // variation still have 1 category (no sync yet) $this->assertEquals(1, count($variation->getProductCategories())); // synchronize 2 categories $provider->synchronizeVariationsCategories($product); $this->assertEquals(2, count($variation->getProductCategories())); // remove category1 from product $product->removeProductCategory($productCategory1); // variation still have 2 categories $this->assertEquals(2, count($variation->getProductCategories())); $provider->synchronizeVariationsCategories($product); // $this->assertEquals(1, count($variation->getProductCategories())); // $this->assertFalse($variation->getProductCategories()->contains($productCategory1)); // $this->assertTrue($variation->getProductCategories()->contains($productCategory2)); }