mirror of
https://github.com/Sylius/Sylius.git
synced 2026-07-14 17:10:53 +00:00
502 lines
17 KiB
PHP
502 lines
17 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Sylius package.
|
|
*
|
|
* (c) Paweł Jędrzejewski
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Sylius\Tests\Controller;
|
|
|
|
use Lakion\ApiTestCase\JsonApiTestCase;
|
|
use Sylius\Component\Promotion\Model\PromotionInterface;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
/**
|
|
* @author Anna Walasek <anna.walasek@lakion.com>
|
|
*/
|
|
final class PromotionApiTest extends JsonApiTestCase
|
|
{
|
|
/**
|
|
* @var array
|
|
*/
|
|
private static $authorizedHeaderWithContentType = [
|
|
'HTTP_Authorization' => 'Bearer SampleTokenNjZkNjY2MDEwMTAzMDkxMGE0OTlhYzU3NzYyMTE0ZGQ3ODcyMDAwM2EwMDZjNDI5NDlhMDdlMQ',
|
|
'CONTENT_TYPE' => 'application/json',
|
|
];
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
private static $authorizedHeaderWithAccept = [
|
|
'HTTP_Authorization' => 'Bearer SampleTokenNjZkNjY2MDEwMTAzMDkxMGE0OTlhYzU3NzYyMTE0ZGQ3ODcyMDAwM2EwMDZjNDI5NDlhMDdlMQ',
|
|
'ACCEPT' => 'application/json',
|
|
];
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_does_not_allow_to_show_promotions_list_when_access_is_denied()
|
|
{
|
|
$this->loadFixturesFromFile('resources/promotions.yml');
|
|
|
|
$this->client->request('GET', '/api/v1/promotions/');
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'authentication/access_denied_response', Response::HTTP_UNAUTHORIZED);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_indexing_promotions()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$this->loadFixturesFromFile('resources/promotions.yml');
|
|
|
|
$this->client->request('GET', '/api/v1/promotions/', [], [], static::$authorizedHeaderWithAccept);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/index_response', Response::HTTP_OK);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_sorting_the_index_of_promotions_by_code()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$this->loadFixturesFromFile('resources/promotions.yml');
|
|
$this->loadFixturesFromFile('resources/many_promotions.yml');
|
|
|
|
$this->client->request('GET', '/api/v1/promotions/', ['sorting' => ['code' => 'asc']], [], static::$authorizedHeaderWithAccept);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/sorted_by_code_index_response');
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_sorting_the_index_of_promotions_by_name()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$this->loadFixturesFromFile('resources/promotions.yml');
|
|
$this->loadFixturesFromFile('resources/many_promotions.yml');
|
|
|
|
$this->client->request('GET', '/api/v1/promotions/', ['sorting' => ['name' => 'desc']], [], static::$authorizedHeaderWithAccept);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/sorted_by_name_index_response');
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_sorting_the_index_of_promotions_by_priority()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$this->loadFixturesFromFile('resources/promotions.yml');
|
|
$this->loadFixturesFromFile('resources/many_promotions.yml');
|
|
|
|
$this->client->request('GET', '/api/v1/promotions/', ['sorting' => ['priority' => 'asc']], [], static::$authorizedHeaderWithAccept);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/sorted_by_priority_index_response');
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_to_get_promotions_list_filtered_by_name_and_code()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$this->loadFixturesFromFile('resources/promotions.yml');
|
|
$this->loadFixturesFromFile('resources/many_promotions.yml');
|
|
|
|
$this->client->request('GET', '/api/v1/promotions/', ['criteria' => ['search' => 'promo']], [], [
|
|
'HTTP_Authorization' => 'Bearer SampleTokenNjZkNjY2MDEwMTAzMDkxMGE0OTlhYzU3NzYyMTE0ZGQ3ODcyMDAwM2EwMDZjNDI5NDlhMDdlMQ',
|
|
]);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/filtered_by_code_and_name_index_response', Response::HTTP_OK);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_to_get_list_of_coupon_based_promotions()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$this->loadFixturesFromFile('resources/promotions.yml');
|
|
$this->loadFixturesFromFile('resources/many_promotions.yml');
|
|
|
|
$this->client->request('GET', '/api/v1/promotions/', ['criteria' => ['couponBased' => 'true']], [], [
|
|
'HTTP_Authorization' => 'Bearer SampleTokenNjZkNjY2MDEwMTAzMDkxMGE0OTlhYzU3NzYyMTE0ZGQ3ODcyMDAwM2EwMDZjNDI5NDlhMDdlMQ',
|
|
]);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/only_coupon_based_index_response', Response::HTTP_OK);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_does_not_allow_to_show_promotion_when_it_does_not_exist()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
|
|
$this->client->request('GET', '/api/v1/promotions/-1', [], [], static::$authorizedHeaderWithAccept);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'error/not_found_response', Response::HTTP_NOT_FOUND);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_showing_promotion()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$promotions = $this->loadFixturesFromFile('resources/promotions.yml');
|
|
$promotion = $promotions['promotion2'];
|
|
|
|
$this->client->request('GET', $this->getPromotionUrl($promotion), [], [], static::$authorizedHeaderWithAccept);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/show_response', Response::HTTP_OK);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_does_not_allow_to_delete_promotion_if_it_does_not_exist()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
|
|
$this->client->request('DELETE', '/api/v1/promotions/-1', [], [], static::$authorizedHeaderWithAccept);
|
|
|
|
$response = $this->client->getResponse();
|
|
|
|
$this->assertResponse($response, 'error/not_found_response', Response::HTTP_NOT_FOUND);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_to_delete_promotion()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$promotions = $this->loadFixturesFromFile('resources/promotions.yml');
|
|
$promotion = $promotions['promotion1'];
|
|
|
|
$this->client->request('DELETE', $this->getPromotionUrl($promotion), [], [], static::$authorizedHeaderWithContentType, []);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponseCode($response, Response::HTTP_NO_CONTENT);
|
|
|
|
$this->client->request('GET', $this->getPromotionUrl($promotion), [], [], static::$authorizedHeaderWithAccept);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'error/not_found_response', Response::HTTP_NOT_FOUND);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_does_not_allow_to_create_promotion_without_required_fields()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
|
|
$this->client->request('POST', '/api/v1/promotions/', [], [], static::$authorizedHeaderWithContentType, []);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/create_validation_fail_response', Response::HTTP_BAD_REQUEST);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_to_create_promotion()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
|
|
$data =
|
|
<<<EOT
|
|
{
|
|
"code": "christmas-promotion",
|
|
"name": "Christmas Promotion"
|
|
}
|
|
EOT;
|
|
$this->client->request('POST', '/api/v1/promotions/', [], [], static::$authorizedHeaderWithContentType, $data);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/create_response', Response::HTTP_CREATED);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_to_create_promotion_with_channels()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$this->loadFixturesFromFile('resources/channels.yml');
|
|
|
|
$data =
|
|
<<<EOT
|
|
{
|
|
"code": "christmas-promotion",
|
|
"name": "Christmas Promotion",
|
|
"channels": [
|
|
"WEB",
|
|
"MOB"
|
|
]
|
|
}
|
|
EOT;
|
|
$this->client->request('POST', '/api/v1/promotions/', [], [], static::$authorizedHeaderWithContentType, $data);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/create_response_with_channels', Response::HTTP_CREATED);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_to_create_promotion_with_time_of_duration()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
|
|
$data =
|
|
<<<EOT
|
|
{
|
|
"code": "christmas-promotion",
|
|
"name": "Christmas Promotion",
|
|
"startsAt": {
|
|
"date": "2017-12-05",
|
|
"time": "11:00"
|
|
},
|
|
"endsAt": {
|
|
"date": "2017-12-31",
|
|
"time": "11:00"
|
|
}
|
|
}
|
|
EOT;
|
|
$this->client->request('POST', '/api/v1/promotions/', [], [], static::$authorizedHeaderWithContentType, $data);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/create_response_with_time_of_duration', Response::HTTP_CREATED);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_to_create_promotion_with_rules()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$this->loadFixturesFromFile('resources/channels.yml');
|
|
|
|
$data =
|
|
<<<EOT
|
|
{
|
|
"code": "christmas-promotion",
|
|
"name": "Christmas Promotion",
|
|
"rules": [
|
|
{
|
|
"type": "nth_order",
|
|
"configuration": {
|
|
"nth": 3
|
|
}
|
|
},
|
|
{
|
|
"type": "item_total",
|
|
"configuration": {
|
|
"WEB": {
|
|
"amount": 12
|
|
},
|
|
"MOB": {
|
|
"amount": 15
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
EOT;
|
|
$this->client->request('POST', '/api/v1/promotions/', [], [], static::$authorizedHeaderWithContentType, $data);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/create_response_with_rules', Response::HTTP_CREATED);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_to_create_promotion_with_actions()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$this->loadFixturesFromFile('resources/channels.yml');
|
|
$this->loadFixturesFromFile('resources/products.yml');
|
|
$this->loadFixturesFromFile('resources/product_taxons.yml');
|
|
|
|
$data =
|
|
<<<EOT
|
|
{
|
|
"code": "christmas-promotion",
|
|
"name": "Christmas Promotion",
|
|
"actions": [
|
|
{
|
|
"type": "unit_percentage_discount",
|
|
"configuration": {
|
|
"WEB": {
|
|
"percentage": 15,
|
|
"filters": {
|
|
"price_range_filter": {
|
|
"min": 1,
|
|
"max": 12000
|
|
},
|
|
"taxons_filter": {
|
|
"taxons": "mugs"
|
|
},
|
|
"products_filter": {
|
|
"products": "MUG_SW,MUG_LOTR"
|
|
}
|
|
}
|
|
},
|
|
"MOB": {
|
|
"percentage": 20,
|
|
"filters": {
|
|
"products_filter": {
|
|
"products": "MUG_SW"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"type": "order_fixed_discount",
|
|
"configuration": {
|
|
"WEB": {
|
|
"amount": 12
|
|
},
|
|
"MOB": {
|
|
"amount": 15
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
EOT;
|
|
|
|
$this->client->request('POST', '/api/v1/promotions/', [], [], static::$authorizedHeaderWithContentType, $data);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/create_response_with_actions', Response::HTTP_CREATED);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_to_create_coupon_based_promotion()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
|
|
$data =
|
|
<<<EOT
|
|
{
|
|
"code": "christmas-promotion",
|
|
"name": "Christmas Promotion",
|
|
"couponBased": true
|
|
}
|
|
EOT;
|
|
$this->client->request('POST', '/api/v1/promotions/', [], [], static::$authorizedHeaderWithContentType, $data);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/create_coupon_based_response', Response::HTTP_CREATED);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_to_create_exclusive_promotion()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
|
|
$data =
|
|
<<<EOT
|
|
{
|
|
"code": "christmas-promotion",
|
|
"name": "Christmas Promotion",
|
|
"exclusive": true,
|
|
"priority": 0
|
|
}
|
|
EOT;
|
|
$this->client->request('POST', '/api/v1/promotions/', [], [], static::$authorizedHeaderWithContentType, $data);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/create_exclusive_response', Response::HTTP_CREATED);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_updating_promotion()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$promotions = $this->loadFixturesFromFile('resources/promotions.yml');
|
|
$promotion = $promotions["promotion1"];
|
|
|
|
$data =
|
|
<<<EOT
|
|
{
|
|
"name": "Monday promotion",
|
|
"priority": 0
|
|
}
|
|
EOT;
|
|
$this->client->request('PUT', $this->getPromotionUrl($promotion), [], [], static::$authorizedHeaderWithContentType, $data);
|
|
$response = $this->client->getResponse();
|
|
|
|
$this->assertResponseCode($response, Response::HTTP_NO_CONTENT);
|
|
|
|
$this->client->request('GET', $this->getPromotionUrl($promotion), [], [], static::$authorizedHeaderWithAccept);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/show_response_after_update', Response::HTTP_OK);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_allows_updating_partial_information_about_promotion()
|
|
{
|
|
$this->loadFixturesFromFile('authentication/api_administrator.yml');
|
|
$promotions = $this->loadFixturesFromFile('resources/promotions.yml');
|
|
$promotion = $promotions["promotion1"];
|
|
|
|
$data =
|
|
<<<EOT
|
|
{
|
|
"exclusive": true
|
|
}
|
|
EOT;
|
|
$this->client->request('PATCH', $this->getPromotionUrl($promotion), [], [], static::$authorizedHeaderWithContentType, $data);
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponseCode($response, Response::HTTP_NO_CONTENT);
|
|
|
|
$this->client->request('GET', $this->getPromotionUrl($promotion), [], [], static::$authorizedHeaderWithAccept);
|
|
|
|
$response = $this->client->getResponse();
|
|
$this->assertResponse($response, 'promotion/show_response_after_partial_update', Response::HTTP_OK);
|
|
}
|
|
|
|
/**
|
|
* @param PromotionInterface $promotion
|
|
*
|
|
* @return string
|
|
*/
|
|
private function getPromotionUrl(PromotionInterface $promotion)
|
|
{
|
|
return '/api/v1/promotions/' . $promotion->getCode();
|
|
}
|
|
}
|