mirror of
https://github.com/elyby/accounts.git
synced 2024-10-30 15:33:21 +05:30
c0aa78d156
Completely removed usage of the RabbitMQ. Queue now based on Redis channels. Worker process now extracted as separate docker container. Base image upgraded to the 1.8.0 version (PHP 7.2.7 and pcntl extension).
133 lines
5.0 KiB
PHP
133 lines
5.0 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace tests\codeception\common\unit\tasks;
|
|
|
|
use common\tasks\DeliveryWebHook;
|
|
use GuzzleHttp\Exception\ConnectException;
|
|
use GuzzleHttp\Exception\ServerException;
|
|
use GuzzleHttp\Handler\MockHandler;
|
|
use GuzzleHttp\HandlerStack;
|
|
use GuzzleHttp\Middleware;
|
|
use GuzzleHttp\Psr7\Request;
|
|
use GuzzleHttp\Psr7\Response;
|
|
use tests\codeception\common\unit\TestCase;
|
|
use yii\queue\Queue;
|
|
|
|
/**
|
|
* @covers \common\tasks\DeliveryWebHook
|
|
*/
|
|
class DeliveryWebHookTest extends TestCase {
|
|
|
|
private $historyContainer = [];
|
|
|
|
/**
|
|
* @var Response|\GuzzleHttp\Exception\GuzzleException
|
|
*/
|
|
private $response;
|
|
|
|
public function testCanRetry() {
|
|
$task = new DeliveryWebHook();
|
|
$this->assertFalse($task->canRetry(1, new \Exception()));
|
|
$request = new Request('POST', 'http://localhost');
|
|
$this->assertTrue($task->canRetry(4, new ConnectException('', $request)));
|
|
$this->assertTrue($task->canRetry(4, new ServerException('', $request)));
|
|
$this->assertFalse($task->canRetry(5, new ConnectException('', $request)));
|
|
$this->assertFalse($task->canRetry(5, new ServerException('', $request)));
|
|
}
|
|
|
|
public function testExecuteSuccessDelivery() {
|
|
$this->response = new Response();
|
|
$task = $this->createMockedTask();
|
|
$task->type = 'account.edit';
|
|
$task->url = 'http://localhost:81/webhooks/ely';
|
|
$task->payloads = [
|
|
'key' => 'value',
|
|
'another' => 'value',
|
|
];
|
|
$task->execute(mock(Queue::class));
|
|
/** @var Request $request */
|
|
$request = $this->historyContainer[0]['request'];
|
|
$this->assertSame('http://localhost:81/webhooks/ely', (string)$request->getUri());
|
|
$this->assertStringStartsWith('Account-Ely-Hookshot/', $request->getHeaders()['User-Agent'][0]);
|
|
$this->assertSame('account.edit', $request->getHeaders()['X-Ely-Accounts-Event'][0]);
|
|
$this->assertSame('application/x-www-form-urlencoded', $request->getHeaders()['Content-Type'][0]);
|
|
$this->assertArrayNotHasKey('X-Hub-Signature', $request->getHeaders());
|
|
$this->assertEquals('key=value&another=value', (string)$request->getBody());
|
|
}
|
|
|
|
public function testExecuteSuccessDeliveryWithSignature() {
|
|
$this->response = new Response();
|
|
$task = $this->createMockedTask();
|
|
$task->type = 'account.edit';
|
|
$task->url = 'http://localhost:81/webhooks/ely';
|
|
$task->secret = 'secret';
|
|
$task->payloads = [
|
|
'key' => 'value',
|
|
'another' => 'value',
|
|
];
|
|
$task->execute(mock(Queue::class));
|
|
/** @var Request $request */
|
|
$request = $this->historyContainer[0]['request'];
|
|
$this->assertSame('http://localhost:81/webhooks/ely', (string)$request->getUri());
|
|
$this->assertStringStartsWith('Account-Ely-Hookshot/', $request->getHeaders()['User-Agent'][0]);
|
|
$this->assertSame('account.edit', $request->getHeaders()['X-Ely-Accounts-Event'][0]);
|
|
$this->assertSame('application/x-www-form-urlencoded', $request->getHeaders()['Content-Type'][0]);
|
|
$this->assertSame('sha1=3c0b1eef564b2d3a5e9c0f2a8302b1b42b3d4784', $request->getHeaders()['X-Hub-Signature'][0]);
|
|
$this->assertEquals('key=value&another=value', (string)$request->getBody());
|
|
}
|
|
|
|
public function testExecuteHandleClientException() {
|
|
$this->response = new Response(403);
|
|
$task = $this->createMockedTask();
|
|
$task->type = 'account.edit';
|
|
$task->url = 'http://localhost:81/webhooks/ely';
|
|
$task->secret = 'secret';
|
|
$task->payloads = [
|
|
'key' => 'value',
|
|
'another' => 'value',
|
|
];
|
|
$task->execute(mock(Queue::class));
|
|
}
|
|
|
|
/**
|
|
* @expectedException \GuzzleHttp\Exception\ServerException
|
|
*/
|
|
public function testExecuteUnhandledException() {
|
|
$this->response = new Response(502);
|
|
$task = $this->createMockedTask();
|
|
$task->type = 'account.edit';
|
|
$task->url = 'http://localhost:81/webhooks/ely';
|
|
$task->secret = 'secret';
|
|
$task->payloads = [
|
|
'key' => 'value',
|
|
'another' => 'value',
|
|
];
|
|
$task->execute(mock(Queue::class));
|
|
}
|
|
|
|
private function createMockedTask(): DeliveryWebHook {
|
|
$container = &$this->historyContainer;
|
|
$response = $this->response;
|
|
return new class ($container, $response) extends DeliveryWebHook {
|
|
private $historyContainer;
|
|
|
|
private $response;
|
|
|
|
public function __construct(array &$historyContainer, $response) {
|
|
$this->historyContainer = &$historyContainer;
|
|
$this->response = $response;
|
|
}
|
|
|
|
protected function createStack(): HandlerStack {
|
|
$stack = parent::createStack();
|
|
$stack->setHandler(new MockHandler([$this->response]));
|
|
$stack->push(Middleware::history($this->historyContainer));
|
|
|
|
return $stack;
|
|
}
|
|
};
|
|
}
|
|
|
|
}
|