sampleRepositoryMock = $this->getMockBuilder(SampleRepositoryInterface::class) ->getMockForAbstractClass(); $this->sampleMock = $this->getMockBuilder(SampleInterface::class) ->getMock(); $this->productExtensionMock = $this->getProductExtensionMock(); $this->productExtensionMock//->expects($this->once()) ->method('getDownloadableProductSamples') ->willReturn([$this->sampleMock]); $this->entityMock = $this->getMockBuilder(ProductInterface::class) ->addMethods(['getStoreId']) ->getMockForAbstractClass(); $this->model = new UpdateHandler( $this->sampleRepositoryMock ); } /** * Update samples for downloadable product. * * @return void */ public function testExecute(): void { $entitySku = 'sku'; $entityStoreId = 0; $sampleToDeleteId = 22; $this->sampleMock->expects($this->exactly(3)) ->method('getId') ->willReturn(1); /** @var SampleInterface|MockObject $sampleToDeleteMock */ $sampleToDeleteMock = $this->getMockBuilder(SampleInterface::class) ->getMock(); $sampleToDeleteMock->expects($this->exactly(2)) ->method('getId') ->willReturn($sampleToDeleteId); $this->entityMock->expects($this->once()) ->method('getTypeId') ->willReturn(Type::TYPE_DOWNLOADABLE); $this->entityMock->expects($this->once()) ->method('getExtensionAttributes') ->willReturn($this->productExtensionMock); $this->entityMock->expects($this->exactly(2)) ->method('getSku') ->willReturn($entitySku); $this->entityMock->expects($this->once()) ->method('getStoreId') ->willReturn($entityStoreId); $this->sampleRepositoryMock->expects($this->once()) ->method('getList') ->with($entitySku) ->willReturn([$this->sampleMock, $sampleToDeleteMock]); $this->sampleRepositoryMock->expects($this->once()) ->method('save') ->with($entitySku, $this->sampleMock, !$entityStoreId); $this->sampleRepositoryMock->expects($this->once()) ->method('delete') ->with($sampleToDeleteId); $this->assertEquals($this->entityMock, $this->model->execute($this->entityMock)); } /** * Update samples for non downloadable product. * * @return void */ public function testExecuteNonDownloadable(): void { $this->entityMock->expects($this->once()) ->method('getTypeId') ->willReturn(Type::TYPE_DOWNLOADABLE . 'some'); $this->entityMock->expects($this->once()) ->method('getExtensionAttributes') ->willReturn($this->productExtensionMock); $this->entityMock->expects($this->never()) ->method('getSku'); $this->entityMock->expects($this->never()) ->method('getStoreId'); $this->sampleRepositoryMock->expects($this->never()) ->method('getList'); $this->sampleRepositoryMock->expects($this->never()) ->method('save'); $this->sampleRepositoryMock->expects($this->never()) ->method('delete'); $this->assertEquals($this->entityMock, $this->model->execute($this->entityMock)); } /** * Build product extension mock. * * @return MockObject */ private function getProductExtensionMock(): MockObject { $mockBuilder = $this->getMockBuilder(ProductExtensionInterface::class) ->disableOriginalConstructor(); try { $mockBuilder->addMethods(['getDownloadableProductSamples']); } catch (RuntimeException $e) { // Product extension already generated. } return $mockBuilder->getMockForAbstractClass(); } }