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', 'extra' => 'raw', ]]); $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, 'extra' => 'raw', ], $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, 'extra' => 'raw', ]]); $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, 'extra' => 'raw', ], $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); } 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(EndpointFactory::class, [ 'createEndpoint' => function () use ($requestCallback) { return new Endpoint($requestCallback); } ]), $this->diContainer->get(WordPress::class) ); } }