Skip to content

Commit

Permalink
Add recommendations endpoint call
Browse files Browse the repository at this point in the history
  • Loading branch information
foglcz committed Nov 27, 2017
1 parent fe1e75d commit 386023b
Show file tree
Hide file tree
Showing 5 changed files with 204 additions and 2 deletions.
49 changes: 49 additions & 0 deletions src/RequestBuilder/RecommendationsRequestBuilder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php declare(strict_types=1);

namespace Lmc\Matej\RequestBuilder;

use Fig\Http\Message\RequestMethodInterface;
use Lmc\Matej\Model\Command\Interaction;
use Lmc\Matej\Model\Command\UserMerge;
use Lmc\Matej\Model\Command\UserRecommendation;
use Lmc\Matej\Model\Request;

class RecommendationsRequestBuilder extends AbstractRequestBuilder
{
protected const ENDPOINT_PATH = '/recommendations';

/** @var Interaction|null */
private $interactionCommand;
/** @var UserMerge|null */
private $userMergeCommand;
/** @var UserRecommendation */
private $userRecommendationCommand;

public function __construct(UserRecommendation $userRecommendationCommand)
{
$this->userRecommendationCommand = $userRecommendationCommand;
}

public function addUserMerge(UserMerge $merge): self
{
$this->userMergeCommand = $merge;

return $this;
}

public function addInteraction(Interaction $interaction): self
{
$this->interactionCommand = $interaction;

return $this;
}

public function build(): Request
{
return new Request(
self::ENDPOINT_PATH,
RequestMethodInterface::METHOD_POST,
[$this->interactionCommand, $this->userMergeCommand, $this->userRecommendationCommand]
);
}
}
9 changes: 9 additions & 0 deletions src/RequestBuilder/RequestBuilderFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Lmc\Matej\Http\RequestManager;
use Lmc\Matej\Model\Command\Sorting;
use Lmc\Matej\Model\Command\UserRecommendation;

/**
* Factory to create concrete RequestBuilder which helps you to create request for each Matej API
Expand Down Expand Up @@ -55,6 +56,14 @@ public function sorting(Sorting $sorting): SortingRequestBuilder
return $this->createConfiguredBuilder(SortingRequestBuilder::class, $sorting);
}

/**
* @return RecommendationsRequestBuilder
*/
public function recommendations(UserRecommendation $recommendation): RecommendationsRequestBuilder
{
return $this->createConfiguredBuilder(RecommendationsRequestBuilder::class, $recommendation);
}

// TODO: builders for other endpoints

/**
Expand Down
69 changes: 69 additions & 0 deletions tests/IntegrationTests/RecommendationsRequestBuilderTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php declare(strict_types=1);

namespace Lmc\Matej\IntegrationTests;

use Lmc\Matej\Model\Command\Interaction;
use Lmc\Matej\Model\Command\UserMerge;
use Lmc\Matej\Model\Command\UserRecommendation;
use Lmc\Matej\RequestBuilder\RecommendationsRequestBuilder;

/**
* @covers ItemPropertiesSetupRequestBuilder
* @covers EventsRequestBuilder
*/
class RecommendationsRequestBuilderTest extends IntegrationTestCase
{
/** @test */
public function shouldExecuteRecommendationRequestOnly(): void
{
$response = $this->createRecommendationRequestBuilder()
->send();

$this->assertResponseCommandStatuses($response, 'SKIPPED', 'SKIPPED', 'OK');
}

/** @test */
public function shouldExecuteRecommendationRequestWithInteraction(): void
{
$response = $this->createRecommendationRequestBuilder()
->addInteraction(Interaction::bookmark('integration-test-php-client-user-id-A', 'itemA'))
->send();

$this->assertResponseCommandStatuses($response, 'OK', 'SKIPPED', 'OK');
}

/** @test */
public function shouldExecuteRecommendationRequestWithUserMerge(): void
{
$response = $this->createRecommendationRequestBuilder()
->addUserMerge(UserMerge::mergeInto('integration-test-php-client-user-id-A', 'integration-test-php-client-user-id-B'))
->send();

$this->assertResponseCommandStatuses($response, 'SKIPPED', 'OK', 'OK');
}

/** @test */
public function shouldExecuteRecommendationRequestWithUserMergeAndInteraction(): void
{
$response = $this->createRecommendationRequestBuilder()
->addUserMerge(UserMerge::mergeInto('integration-test-php-client-user-id-A', 'integration-test-php-client-user-id-B'))
->addInteraction(Interaction::bookmark('integration-test-php-client-user-id-A', 'itemA'))
->send();

$this->assertResponseCommandStatuses($response, 'OK', 'OK', 'OK');
}

private function createRecommendationRequestBuilder(): RecommendationsRequestBuilder
{
return $this->createMatejInstance()
->request()
->recommendations(UserRecommendation::create(
'integration-test-php-client-user-id-A',
5,
'integration-test-scenario',
0.50,
3600
))
;
}
}
71 changes: 71 additions & 0 deletions tests/RequestBuilder/RecommendationsRequestBuilderTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php declare(strict_types=1);

namespace Lmc\Matej\RequestBuilder;

use Fig\Http\Message\RequestMethodInterface;
use Lmc\Matej\Exception\LogicException;
use Lmc\Matej\Http\RequestManager;
use Lmc\Matej\Model\Command\Interaction;
use Lmc\Matej\Model\Command\Sorting;
use Lmc\Matej\Model\Command\UserMerge;
use Lmc\Matej\Model\Command\UserRecommendation;
use Lmc\Matej\Model\Request;
use Lmc\Matej\Model\Response;
use PHPUnit\Framework\TestCase;

/**
* @covers \Lmc\Matej\RequestBuilder\RecommendationsRequestBuilder
* @covers \Lmc\Matej\RequestBuilder\AbstractRequestBuilder
*/
class RecommendationsRequestBuilderTest extends TestCase
{
/** @test */
public function shouldBuildRequestWithCommands(): void
{
$recommendationsCommand = UserRecommendation::create('userId1', 5, 'test-scenario', 0.5, 3600);
$builder = new RecommendationsRequestBuilder($recommendationsCommand);

$interactionCommand = Interaction::detailView('userId1', 'itemId1');
$builder->addInteraction($interactionCommand);

$userMergeCommand = UserMerge::mergeFromSourceToTargetUser('sourceId1', 'targetId1');
$builder->addUserMerge($userMergeCommand);

$request = $builder->build();

$this->assertInstanceOf(Request::class, $request);
$this->assertSame(RequestMethodInterface::METHOD_POST, $request->getMethod());
$this->assertSame('/recommendations', $request->getPath());

$requestData = $request->getData();
$this->assertCount(3, $requestData);
$this->assertSame($interactionCommand, $requestData[0]);
$this->assertSame($userMergeCommand, $requestData[1]);
$this->assertSame($recommendationsCommand, $requestData[2]);
}

/** @test */
public function shouldThrowExceptionWhenSendingCommandsWithoutRequestManager(): void
{
$recommendationsCommand = UserRecommendation::create('userId1', 5, 'test-scenario', 0.5, 3600);
$builder = new RecommendationsRequestBuilder($recommendationsCommand);

$this->expectException(LogicException::class);
$this->expectExceptionMessage('Instance of RequestManager must be set to request builder');
$builder->send();
}

/** @test */
public function shouldSendRequestViaRequestManager(): void
{
$requestManagerMock = $this->createMock(RequestManager::class);
$requestManagerMock->expects($this->once())
->method('sendRequest')
->with($this->isInstanceOf(Request::class))
->willReturn(new Response(0, 0, 0, 0));

$builder = new SortingRequestBuilder(Sorting::create('userId1', ['itemId1', 'itemId2']));
$builder->setRequestManager($requestManagerMock);
$builder->send();
}
}
8 changes: 6 additions & 2 deletions tests/RequestBuilder/RequestBuilderFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Lmc\Matej\Model\Command\ItemProperty;
use Lmc\Matej\Model\Command\ItemPropertySetup;
use Lmc\Matej\Model\Command\Sorting;
use Lmc\Matej\Model\Command\UserRecommendation;
use Lmc\Matej\Model\Request;
use Lmc\Matej\Model\Response;
use PHPUnit\Framework\TestCase;
Expand Down Expand Up @@ -59,14 +60,17 @@ public function provideBuilderMethods(): array
$builder->addItemProperty(ItemProperty::create('item-id', []));
};

$sortingInit = function (SortingRequestBuilder $builder): void {
$voidInit = function ($builder): void {
};

$userRecommendation = UserRecommendation::create('user-id', 1, 'test-scenario', 0.5, 3600);

return [
['setupItemProperties', ItemPropertiesSetupRequestBuilder::class, $itemPropertiesSetupInit],
['deleteItemProperties', ItemPropertiesSetupRequestBuilder::class, $itemPropertiesSetupInit],
['events', EventsRequestBuilder::class, $eventInit],
['sorting', SortingRequestBuilder::class, $sortingInit, Sorting::create('user-a', ['item-a', 'item-b', 'item-c'])],
['sorting', SortingRequestBuilder::class, $voidInit, Sorting::create('user-a', ['item-a', 'item-b', 'item-c'])],
['recommendations', RecommendationsRequestBuilder::class, $voidInit, $userRecommendation],
];
}
}

0 comments on commit 386023b

Please sign in to comment.