* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * @link http://www.temando.com/ */ class CarrierTest extends \PHPUnit\Framework\TestCase { /** * Delegate provisioning of test data to separate class * @return RateRequest[][] */ public function getRateRequest() { return RateRequestProvider::getRateRequest(); } /** * Delegate provisioning of test data to separate class * @return RateRequest|OrderResponseType[][] */ public function getRateRequestWithShippingExperience() { return RateRequestProvider::getRateRequestWithShippingExperience(); } /** * @test */ public function carrierHasTrackingCapabilities() { /** @var Carrier $carrier */ $carrier = Bootstrap::getObjectManager()->create(Carrier::class); $this->assertTrue($carrier->isTrackingAvailable()); } /** * @test */ public function carrierMethodsAreLoaded() { /** @var Experience $productionExperience */ $productionExperience = Bootstrap::getObjectManager()->create(Experience::class, ['data' => [ Experience::EXPERIENCE_ID => '123', Experience::NAME => 'PROD', Experience::STATUS => Experience::STATUS_PRODUCTION, ]]); /** @var Experience $draftExperience */ $draftExperience = Bootstrap::getObjectManager()->create(Experience::class, ['data' => [ Experience::EXPERIENCE_ID => '456', Experience::NAME => 'DRAFT', Experience::STATUS => Experience::STATUS_DRAFT, ]]); /** @var Experience $disabledExperience */ $disabledExperience = Bootstrap::getObjectManager()->create(Experience::class, ['data' => [ Experience::EXPERIENCE_ID => '789', Experience::NAME => 'DISABLED', Experience::STATUS => Experience::STATUS_DISABLED, ]]); $experiences = [ $productionExperience->getExperienceId() => $productionExperience, $draftExperience->getExperienceId() => $draftExperience, $disabledExperience->getExperienceId() => $disabledExperience ]; $experienceRepository = $this->getMockBuilder(ExperienceRepository::class) ->setMethods(['getExperiences']) ->disableOriginalConstructor() ->getMock(); $experienceRepository ->expects($this->once()) ->method('getExperiences') ->willReturn($experiences); /** @var Carrier $carrier */ $carrier = Bootstrap::getObjectManager()->create(Carrier::class, [ 'experienceRepository' => $experienceRepository, ]); $allowedMethods = $carrier->getAllowedMethods(); $this->assertInternalType('array', $allowedMethods); $this->assertNotEmpty($allowedMethods); $this->assertCount(2, $allowedMethods); $this->assertArrayHasKey($productionExperience->getExperienceId(), $allowedMethods); $this->assertArrayHasKey($draftExperience->getExperienceId(), $allowedMethods); $this->assertArrayNotHasKey($disabledExperience->getExperienceId(), $allowedMethods); } /** * @test * @dataProvider getRateRequest * @magentoConfigFixture default_store general/store_information/name Foo Store * * @param RateRequest $rateRequest */ public function collectRatesRepositoryError(RateRequest $rateRequest) { $loggerMock = $this->getMockBuilder(Logger::class) ->setMethods(['log']) ->disableOriginalConstructor() ->getMock(); $loggerMock ->expects($this->once()) ->method('log') ->with($this->equalTo(LogLevel::WARNING)); $experienceRepository = $this->getMockBuilder(ExperienceRepository::class) ->setMethods(['getExperiencesForOrder']) ->disableOriginalConstructor() ->getMock(); $experienceRepository ->expects($this->once()) ->method('getExperiencesForOrder') ->willThrowException(new CouldNotSaveException(__('Foo'))); /** @var Carrier $carrier */ $carrier = Bootstrap::getObjectManager()->create(Carrier::class, [ 'logger' => $loggerMock, 'experienceRepository' => $experienceRepository, ]); // replace quote by mock /** @var Item $item */ foreach ($rateRequest->getAllItems() as $item) { $product = Bootstrap::getObjectManager()->create(Product::class); $quoteData = $item->getQuote()->getData(); /** @var Quote|\PHPUnit_Framework_MockObject_MockObject $quote */ $quote = $this->getMockBuilder(Quote::class) ->setMethods(['getShippingAddress', 'getBillingAddress']) ->disableOriginalConstructor() ->getMock(); $quote ->expects($this->any()) ->method('getShippingAddress') ->willReturn($quoteData['shipping_address']); $quote ->expects($this->any()) ->method('getBillingAddress') ->willReturn($quoteData['billing_address']); $quote->setData($quoteData); $item->setQuote($quote); $item->setData('product', $product); } $ratesResult = $carrier->collectRates($rateRequest); $this->assertTrue($ratesResult->getError()); $rates = $ratesResult; foreach ($rates as $rate) { $this->assertInstanceOf(Error::class, $rate); } } /** * @test * @dataProvider getRateRequestWithShippingExperience * @magentoConfigFixture default_store general/store_information/name Foo Store * * @param RateRequest $rateRequest * @param QualificationResponseType $qualificationResponseType */ public function collectRatesSuccess(RateRequest $rateRequest, QualificationResponseType $qualificationResponseType) { $loggerMock = $this->getMockBuilder(Logger::class) ->setMethods(['log']) ->disableOriginalConstructor() ->getMock(); $loggerMock ->expects($this->never()) ->method('log') ->with($this->equalTo(LogLevel::WARNING)); $experienceRepository = $this->getMockBuilder(ExperienceRepository::class) ->setMethods(['getExperiencesForOrder']) ->disableOriginalConstructor() ->getMock(); $experienceRepository ->expects($this->once()) ->method('getExperiencesForOrder') ->willReturn($qualificationResponseType); /** @var Carrier $carrier */ $carrier = Bootstrap::getObjectManager()->create(Carrier::class, [ 'logger' => $loggerMock, 'experienceRepository' => $experienceRepository, ]); // replace quote by mock /** @var Item $item */ foreach ($rateRequest->getAllItems() as $item) { $product = Bootstrap::getObjectManager()->create(Product::class); $quoteData = $item->getQuote()->getData(); /** @var Quote|\PHPUnit_Framework_MockObject_MockObject $quote */ $quote = $this->getMockBuilder(Quote::class) ->setMethods(['getShippingAddress', 'getBillingAddress']) ->disableOriginalConstructor() ->getMock(); $quote ->expects($this->any()) ->method('getShippingAddress') ->willReturn($quoteData['shipping_address']); $quote ->expects($this->any()) ->method('getBillingAddress') ->willReturn($quoteData['billing_address']); $quote->setData($quoteData); $item->setQuote($quote); $item->setData('product', $product); } $rates = $carrier->collectRates($rateRequest)->getAllRates(); $this->assertNotEmpty($rates); foreach ($rates as $rate) { $this->assertEquals(Carrier::CODE, $rate->getData('carrier')); } } }