Files
piratepoet/mailpoet/tests/integration/REST/API/EndpointTest.php
2022-09-12 14:40:36 -05:00

134 lines
3.9 KiB
PHP

<?php declare(strict_types = 1);
namespace MailPoet\REST\Automation\API;
require_once __DIR__ . '/../Test.php';
require_once __DIR__ . '/Endpoint.php';
use MailPoet\API\REST\API;
use MailPoet\API\REST\EndpointContainer;
use MailPoet\API\REST\Request;
use MailPoet\REST\Automation\API\Endpoints\Endpoint;
use MailPoet\REST\Test;
use MailPoet\WP\Functions as WPFunctions;
class EndpointTest extends Test {
/** @var string */
private $prefix = '/mailpoet/v1/mailpoet-api-testing-route';
public function testGetParams(): void {
$path = strtolower(__FUNCTION__);
$request = null;
$this->registerTestingGetRoute($path, function (Request $req) use (&$request) {
$request = $req;
});
$response = $this->get("$this->prefix/$path", ['query' => [
'required' => 'required',
'string' => 'abc',
'number-1' => '0.123',
'number-2' => '123',
'integer-1' => '123',
'integer-2' => '-123',
'boolean-1' => '0',
'boolean-2' => 'true',
]]);
$this->assertInstanceOf(Request::class, $request);
$this->assertSame(['data' => null], $response);
$this->assertSame([
'required' => 'required',
'string' => 'abc',
'number-1' => 0.123,
'number-2' => 123.0,
'integer-1' => 123,
'integer-2' => -123,
'boolean-1' => false,
'boolean-2' => true,
], $request->getParams());
}
public function testPostParams(): void {
$path = strtolower(__FUNCTION__);
$request = null;
$this->registerTestingPostRoute($path, function (Request $req) use (&$request) {
$request = $req;
});
$response = $this->post("$this->prefix/$path", ['post' => [
'required' => 'required',
'string' => 'abc',
'number-1' => 0.123,
'number-2' => 123,
'integer-1' => 123,
'integer-2' => -123,
'boolean-1' => 0,
'boolean-2' => true,
]]);
$this->assertInstanceOf(Request::class, $request);
$this->assertSame(['data' => null], $response);
$this->assertSame([
'required' => 'required',
'string' => 'abc',
'number-1' => 0.123,
'number-2' => 123.0,
'integer-1' => 123,
'integer-2' => -123,
'boolean-1' => false,
'boolean-2' => true,
], $request->getParams());
}
public function testMissingParam(): void {
$path = strtolower(__FUNCTION__);
$this->registerTestingGetRoute($path);
$response = $this->get("$this->prefix/$path");
$this->assertSame([
'code' => 'rest_missing_callback_param',
'message' => 'Missing parameter(s): required',
'data' => [
'status' => 400,
'params' => ['required'],
],
], $response);
}
public function testExtraParam(): void {
$path = strtolower(__FUNCTION__);
$request = null;
$this->registerTestingGetRoute($path, function (Request $req) use (&$request) {
$request = $req;
});
$this->get("$this->prefix/$path", ['query' => ['required' => 'required', 'extra' => 'extra']]);
$this->assertInstanceOf(Request::class, $request);
$this->assertSame($request->getParams(), ['required' => 'required']);
}
private function registerTestingGetRoute(string $path, callable $requestCallback = null): void {
$api = $this->createApi($requestCallback);
$api->registerGetRoute("mailpoet-api-testing-route/$path", Endpoint::class);
}
private function registerTestingPostRoute(string $path, callable $requestCallback = null): void {
$api = $this->createApi($requestCallback);
$api->registerPostRoute("mailpoet-api-testing-route/$path", Endpoint::class);
}
private function createApi(callable $requestCallback = null): API {
// ensure REST server is initialized for endpoint registration
rest_get_server();
return new API(
$this->make(EndpointContainer::class, [
'get' => function () use ($requestCallback) {
return new Endpoint($requestCallback);
}
]),
$this->diContainer->get(WPFunctions::class)
);
}
}