Untitled

 avatar
unknown
php
a year ago
4.1 kB
8
Indexable
<?php

declare(strict_types=1);

namespace Deposit\Tests\Integration;

use Deposit\Model\BankTransferDeposit\BankTransferDeposit;
use ExchangeTechnologies\Test\DoctrineFixturesTrait;
use InterNations\Component\HttpMock\PHPUnit\HttpMockTrait;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;

class GlobitexBankTransferImportTest extends KernelTestCase
{
    use DoctrineFixturesTrait;
    use HttpMockTrait;

    public static function setUpBeforeClass(): void
    {
        static::setUpHttpMockBeforeClass('8085', 'localhost');
    }

    public static function tearDownAfterClass(): void
    {
        static::tearDownHttpMockAfterClass();
    }

    public function setUp(): void
    {
        parent::setUp();

        $this->setUpHttpMock();
    }

    public function testItShouldImportDepoositsFromGlobitexAPI(): void
    {
        $this->purgeDatabase();

        $kernel = static::bootKernel();
        $kernel->boot();

        $application = new Application($kernel);
        $application->setAutoExit(false);

        $this->mockGLobitexStatementResponse();

        $this->mockWireTransferTitleRequest('9KHAY39KKRY', '8e4082ef-d7ef-4741-84a6-d81ae288146f');
        $this->mockWireTransferTitleRequest('9JM7F39JPNF', 'd8949819-4140-41d2-a9a3-0439e3f1405c');

        $this->http->mock->once()
            ->when()
                ->methodIs('GET')
                ->pathIs('/api/v1/checkwirecode/ASASCE9H9')
            ->then()
                ->statusCode(404)
            ->end();

        $this->http->setUp();

        $input = new ArrayInput(['command' => 'app:import:globitex']);

        $repository = $kernel->getContainer()->get('doctrine')->getRepository(BankTransferDeposit::class);

        $deposits = $repository->findAllByProvider('globitex');

        $this->assertCount(0, $deposits);

        $output = new NullOutput();

        $application->run($input, $output);

        /**
         * @var BankTransferDeposit
         * @var BankTransferDeposit $deposit2
         * @var BankTransferDeposit $deposit3
         * @var BankTransferDeposit $deposit4
         */
        $deposit1 = $repository->findOneBy(
            ['wireTransferTitle.wireTransferTitle' => '9KHAY39KKRY', 'paymentProvider.value' => 'globitex']
        );
        $this->assertEquals('8e4082ef-d7ef-4741-84a6-d81ae288146f', $deposit1->userId()->toString());
        $this->assertEquals('waiting_for_approval', $deposit1->status()->toString());

        $deposit2 = $repository->findOneBy(
            ['wireTransferTitle.wireTransferTitle' => '9JM7F39JPNF', 'paymentProvider.value' => 'globitex']
        );
        $this->assertEquals('d8949819-4140-41d2-a9a3-0439e3f1405c', $deposit2->userId()->toString());
        $this->assertEquals('waiting_for_approval', $deposit2->status()->toString());

        $deposit3 = $repository->findOneBy(
            ['wireTransferTitle.wireTransferTitle' => 'ASASCE9H9', 'paymentProvider.value' => 'globitex']
        );
        $this->assertEquals(null, $deposit3->userId());
        $this->assertEquals('waiting_for_approval', $deposit3->status()->toString());
    }

    private function mockGLobitexStatementResponse(): void
    {
        $statementResponse = file_get_contents(__DIR__.'/../resources/globitex/globitex_statement_response.json');

        $this->http->mock->once()
            ->when()
                ->pathIs('/api/1/eurowallet/payments/history')
                ->methodIs('GET')
            ->then()
                ->statusCode(200)
                ->body($statementResponse)
            ->end();
    }

    private function mockWireTransferTitleRequest(string $wireTransferTitle, string $userId): void
    {
        $this->http->mock->once()
            ->when()
                ->methodIs('GET')
                ->pathIs('/api/v1/checkwirecode/'.$wireTransferTitle)
            ->then()
                ->statusCode(200)
                ->body('{"uuid":"'.$userId.'"}')
            ->end();
    }
}
Editor is loading...
Leave a Comment