Skip to content
This repository has been archived by the owner on Sep 3, 2024. It is now read-only.

Commit

Permalink
tests
Browse files Browse the repository at this point in the history
  • Loading branch information
p-zielinski committed Jan 24, 2024
1 parent c558a0e commit 3f2abe5
Show file tree
Hide file tree
Showing 14 changed files with 405 additions and 331 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ WORKDIR /app

COPY --from=composer /app /app

CMD ["php", "-S", "0.0.0.0:5050", "./__tests__/index.php"]
CMD ["php", "vendor/bin/codecept", "run", "Unit"]
16 changes: 16 additions & 0 deletions __tests__/Acceptance.suite.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Codeception Test Suite Configuration
#
# Suite for acceptance tests.
# Perform tests in browser using the WebDriver or PhpBrowser.
# If you need both WebDriver and PHPBrowser tests - create a separate suite.

actor: AcceptanceTester
modules:
enabled:
- PhpBrowser:
url: http://localhost/myapp
# add Codeception\Step\Retry trait to AcceptanceTester to enable retries
step_decorators:
- Codeception\Step\ConditionalAssertion
- Codeception\Step\TryTo
- Codeception\Step\Retry
12 changes: 12 additions & 0 deletions __tests__/Functional.suite.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Codeception Test Suite Configuration
#
# Suite for functional tests
# Emulate web requests and make application process them
# Include one of framework modules (Symfony, Yii2, Laravel, Phalcon5) to use it
# Remove this suite if you don't use frameworks

actor: FunctionalTester
modules:
enabled:
# add a framework module here
step_decorators: ~
29 changes: 29 additions & 0 deletions __tests__/Support/AcceptanceTester.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

namespace Tests\Support;

/**
* Inherited Methods
* @method void wantTo($text)
* @method void wantToTest($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method void pause($vars = [])
*
* @SuppressWarnings(PHPMD)
*/
class AcceptanceTester extends \Codeception\Actor
{
use _generated\AcceptanceTesterActions;

/**
* Define custom actions here
*/
}
Empty file added __tests__/Support/Data/.gitkeep
Empty file.
29 changes: 29 additions & 0 deletions __tests__/Support/FunctionalTester.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

namespace Tests\Support;

/**
* Inherited Methods
* @method void wantTo($text)
* @method void wantToTest($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method void pause($vars = [])
*
* @SuppressWarnings(PHPMD)
*/
class FunctionalTester extends \Codeception\Actor
{
use _generated\FunctionalTesterActions;

/**
* Define custom actions here
*/
}
29 changes: 29 additions & 0 deletions __tests__/Support/UnitTester.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

namespace Tests\Support;

/**
* Inherited Methods
* @method void wantTo($text)
* @method void wantToTest($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method void pause($vars = [])
*
* @SuppressWarnings(PHPMD)
*/
class UnitTester extends \Codeception\Actor
{
use _generated\UnitTesterActions;

/**
* Define custom actions here
*/
}
2 changes: 2 additions & 0 deletions __tests__/Support/_generated/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*
!.gitignore
9 changes: 9 additions & 0 deletions __tests__/Unit.suite.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Codeception Test Suite Configuration
#
# Suite for unit or integration tests.

actor: UnitTester
modules:
enabled:
- Asserts
step_decorators: ~
254 changes: 254 additions & 0 deletions __tests__/Unit/MainTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
<?php
//load SDK
require_once(dirname(dirname(__DIR__)) . '/vendor/autoload.php');

//test
class MainTest extends \Codeception\Test\Unit
{
protected $productsApiInstance;
protected $campaignsApiInstance;
protected $validationRulesApiInstance;
protected $customersApiInstance;
protected $qualificationsApiInstance;
protected $redemptionsApiInstance;
protected $stackedDiscountsApiInstance;

protected function _before()
{
//load .env
$env = parse_ini_file('.env');

$config = OpenAPI\Client\Configuration::getDefaultConfiguration()->setApiKey('X-App-Id', $env["X_APP_ID"]);
$config = OpenAPI\Client\Configuration::getDefaultConfiguration()->setApiKey('X-App-Token', $env["X_APP_TOKEN"]);
$config = OpenAPI\Client\Configuration::getDefaultConfiguration()->setHost($env["VOUCHERIFY_HOST"]);

$this->productsApiInstance = new OpenAPI\Client\Api\ProductsApi(
new GuzzleHttp\Client(),
$config
);
$this->campaignsApiInstance = new OpenAPI\Client\Api\CampaignsApi(
new GuzzleHttp\Client(),
$config
);
$this->validationRulesApiInstance = new OpenAPI\Client\Api\ValidationRulesApi(
new GuzzleHttp\Client(),
$config
);
$this->customersApiInstance = new OpenAPI\Client\Api\CustomersApi(
new GuzzleHttp\Client(),
$config
);
$this->qualificationsApiInstance = new OpenAPI\Client\Api\QualificationsApi(
new GuzzleHttp\Client(),
$config
);
$this->stackedDiscountsApiInstance = new OpenAPI\Client\Api\StackableDiscountsApi(
new GuzzleHttp\Client(),
$config
);
$this->redemptionsApiInstance = new OpenAPI\Client\Api\RedemptionsApi(
new GuzzleHttp\Client(),
$config
);
}

// helper functions
public function generateRandomString($length = 10)
{
$randomString = '';
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

$max = strlen($characters) - 1;

for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[random_int(0, $max)];
}

return $randomString;
}

public function createTwoProducts()
{
$products_create_request_body = new \OpenAPI\Client\Model\ProductsCreateRequestBody();
$products_create_request_body->setSourceId($this->generateRandomString());
$products_create_request_body->setName($this->generateRandomString());
$products_create_request_body->setPrice(20000);
$products_create_request_body->setAttributes(["color", "memory", "processor"]);
$created_product = $this->productsApiInstance->createProduct($products_create_request_body);
$products_create_request_body->setSourceId($this->generateRandomString());
$products_create_request_body->setName($this->generateRandomString());
$products_create_request_body->setPrice(66000);
$created_product2 = $this->productsApiInstance->createProduct($products_create_request_body);
return [$created_product, $created_product2];
}

public function createValidationRule()
{
$created_products = $this->createTwoProducts();
$validation_rules_create_request_body = new \OpenAPI\Client\Model\ValidationRulesCreateRequestBody();
$applicable_to_created_product2 = new \OpenAPI\Client\Model\ApplicableTo();
$applicable_to_created_product2->setProductId($created_products[0]->getId());
$applicable_to_created_product2->setObject("product");
$validation_rules_create_request_body->setApplicableTo(new \OpenAPI\Client\Model\ValidationRuleBaseApplicableTo());
$validation_rules_create_request_body->getApplicableTo()->setIncluded([$applicable_to_created_product2]);
$validation_rules_create_request_body->setType("basic");
$validation_rules_create_request_body->setName($this->generateRandomString());
return $this->validationRulesApiInstance->createValidationRules($validation_rules_create_request_body);
}

public function createDiscountCampaign()
{
$campaigns_create_request_body_discount = new \OpenAPI\Client\Model\CampaignsCreateRequestBody();
$campaigns_create_request_body_discount->setName($this->generateRandomString(12));
$campaigns_create_request_body_discount->setCampaignType("DISCOUNT_COUPONS");
$campaigns_create_request_body_discount->setType("AUTO_UPDATE");
$campaigns_create_request_body_discount->setVoucher(new \OpenAPI\Client\Model\CampaignsCreateRequestBodyVoucher());
$campaigns_create_request_body_discount->getVoucher()->setType("DISCOUNT_VOUCHER");
$campaigns_create_request_body_discount->getVoucher()->setDiscount(new \OpenAPI\Client\Model\Discount());
$campaigns_create_request_body_discount->getVoucher()->getDiscount()->setType("AMOUNT");
$campaigns_create_request_body_discount->getVoucher()->getDiscount()->setAmountOff(1000);
return $this->campaignsApiInstance->createCampaign($campaigns_create_request_body_discount);
}

public function createPromotionCampaign()
{
$promotionTierCreateParams = new \OpenAPI\Client\Model\PromotionTierCreateParams();
$promotionTierCreateParams->setName($this->generateRandomString());
$promotionTierCreateParams->setBanner('testBanner');
$promotionTierCreateParams->setAction(new \OpenAPI\Client\Model\PromotionTierAction());
$promotionTierCreateParams->getAction()->setDiscount(new \OpenAPI\Client\Model\Discount());
$promotionTierCreateParams->getAction()->getDiscount()->setType("AMOUNT");
$promotionTierCreateParams->getAction()->getDiscount()->setAmountOff(1000);
$campaigns_create_request_body_promotion = new \OpenAPI\Client\Model\CampaignsCreateRequestBody();
$campaigns_create_request_body_promotion->setName($this->generateRandomString(12));
$campaigns_create_request_body_promotion->setCampaignType("PROMOTION");
$campaigns_create_request_body_promotion->setPromotion(new \OpenAPI\Client\Model\CampaignsCreateRequestBodyPromotion());
$campaigns_create_request_body_promotion->getPromotion()->setTiers([$promotionTierCreateParams]);
return $this->campaignsApiInstance->createCampaign($campaigns_create_request_body_promotion);
}

public function createCustomer()
{
$customersCreateRequestBody = new \OpenAPI\Client\Model\CustomersCreateRequestBody();
$customersCreateRequestBody->setSourceId('test123');
$customersCreateRequestBody->setName('test123');
$customersCreateRequestBody->setAddress(new \OpenAPI\Client\Model\CustomerBaseAddress());
$customersCreateRequestBody->getAddress()->setCountry('US');
$customersCreateRequestBody->getAddress()->setCity('Vice City');
$customersCreateRequestBody->getAddress()->setLine1('123');
$customersCreateRequestBody->getAddress()->setPostalCode('60089');
return $this->customersApiInstance->createCustomer($customersCreateRequestBody);
}

public function deleteCampaign($id)
{
return $this->campaignsApiInstance->deleteCampaign($id, true);
}

// tests
public function testCreateTwoProducts()
{
$this->createTwoProducts();
}

public function testCreateValidationRule()
{
$this->createValidationRule();
}

public function testCreateAndRemoveDiscountCampaign()
{
$created_discount_campaign = $this->createDiscountCampaign();
$this->deleteCampaign($created_discount_campaign->getId());
}

public function testCreateAndRemovePromotionCampaign()
{
$created_discount_campaign = $this->createPromotionCampaign();
$this->deleteCampaign($created_discount_campaign->getId());
}

public function testListCampaigns()
{
$limit = 2; // int | A limit on the number of objects to be returned. Limit can range between 1 and 100 items.
$page = 1; // int | Which page of results to return.
$campaign_type = \OpenAPI\Client\Model\ParameterCampaignType::DISCOUNT_COUPONS->value; // ParameterCampaignType
$expand = \OpenAPI\Client\Model\ParameterExpandListCampaigns::CATEGORY->value; // ParameterExpandListCampaigns
$order = \OpenAPI\Client\Model\ParameterOrderListCampaigns::CREATED_AT2->value; // ParameterOrderListCampaigns
$this->campaignsApiInstance->listCampaigns($limit, $page, $campaign_type, $expand, $order);
}

public function testCreateCustomer()
{
$this->createCustomer();
}

public function testCheckEligibilityAndDoStackedValidationAndRedemption()
{
$created_discount_campaign = $this->createDiscountCampaign();

$created_customer = $this->createCustomer();
$created_product = $this->createTwoProducts()[0];

$order_item = new \OpenAPI\Client\Model\OrderItem();
$order_item->setPrice($created_product->getPrice());
$order_item->setQuantity(3);
$order_item->setProductId($created_product->getId());

// check eligibility
$qualifications_check_eligibility_request_body = new \OpenAPI\Client\Model\QualificationsCheckEligibilityRequestBody();
$qualifications_check_eligibility_request_body->setCustomer(new \OpenAPI\Client\Model\Customer());
$qualifications_check_eligibility_request_body->getCustomer()->setId($created_customer->getId());
$qualifications_check_eligibility_request_body->setOrder(new \OpenAPI\Client\Model\Order());
$qualifications_check_eligibility_request_body->getOrder()->setStatus("CREATED");
$qualifications_check_eligibility_request_body->getOrder()->setItems([$order_item]);
$qualifications_check_eligibility_request_body->setMode("BASIC");
$qualifications_check_eligibility_request_body->setScenario("ALL");
$check_eligibility_result = $this->qualificationsApiInstance->checkEligibility($qualifications_check_eligibility_request_body);

$applicable_promotion_tiers = array_slice(array_filter($check_eligibility_result->getRedeemables()->getData(), function ($redeemable) {
return $redeemable->getObject() === 'promotion_tier';
}), 0, 3);
$applicable_promotion_tiers_ids = array_map(function ($promotion_tier) {
return $promotion_tier->getId();
}, $applicable_promotion_tiers);

$campaign_voucher = $this->campaignsApiInstance->addVouchersToCampaign($created_discount_campaign->getId(), 1);

// stacked validation
$validations_validate_request_body = new \OpenAPI\Client\Model\ValidationsValidateRequestBody();
$validations_validate_request_body->setOrder(new \OpenAPI\Client\Model\Order());
$validations_validate_request_body->getOrder()->setStatus("CREATED");
$validations_validate_request_body->getOrder()->setItems([$order_item]);
$validations_validate_request_body->setCustomer(new \OpenAPI\Client\Model\Customer());
$validations_validate_request_body->getCustomer()->setSourceId($created_customer->getSourceId());
$validations_validate_request_body_redeemables = [];
foreach ($applicable_promotion_tiers_ids as $promotion_tier_id) {
$redeemable = new \OpenAPI\Client\Model\StackableValidateRedeemBaseRedeemablesItem();
$redeemable->setId($promotion_tier_id);
$redeemable->setObject("promotion_tier");
array_push($validations_validate_request_body_redeemables, $redeemable);
}
$voucher_redeemable = new \OpenAPI\Client\Model\StackableValidateRedeemBaseRedeemablesItem();
$voucher_redeemable->setId($campaign_voucher->getCode());
$voucher_redeemable->setObject("voucher");
array_push($validations_validate_request_body_redeemables, $voucher_redeemable);
$validations_validate_request_body->setRedeemables($validations_validate_request_body_redeemables);
$this->stackedDiscountsApiInstance->validateStackedDiscounts($validations_validate_request_body);

// stacked redemption
$redemptions_redeem_request_body = new \OpenAPI\Client\Model\RedemptionsRedeemRequestBody();
$redemptions_redeem_request_body->setOrder(new \OpenAPI\Client\Model\Order());
$redemptions_redeem_request_body->getOrder()->setStatus("CREATED");
$redemptions_redeem_request_body->getOrder()->setItems([$order_item]);
$redemptions_redeem_request_body->setCustomer(new \OpenAPI\Client\Model\Customer());
$redemptions_redeem_request_body->getCustomer()->setSourceId($created_customer->getSourceId());
$redemptions_redeem_request_body->setRedeemables($validations_validate_request_body_redeemables);
$this->stackedDiscountsApiInstance->redeemStackedDiscounts($redemptions_redeem_request_body);
}

public function testListRedemptions()
{
$this->redemptionsApiInstance->listRedemptions(1, 1);
}
}
2 changes: 2 additions & 0 deletions __tests__/_output/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*
!.gitignore
Loading

0 comments on commit 3f2abe5

Please sign in to comment.