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));
}