withHeader('X-RMN-Lab', 'rmn_request_'.$faker->randomNumber(5)); $requests[] = [$request]; return $requests; } /** * -- Data provider -- * Define request heading to a failure */ public function wrongRequestMissingHeader() { $requests = array(); $request = new Request('GET', '/something'); $requests[] = [$request]; return $requests; } /** * -- Data provider -- * Define request heading to a success */ public function wrongRequestWrongHeaderName() { $requests = array(); $faker = Faker::create(); $request = new Request('GET', '/something'); $request = $request->withHeader('X-RMN-Lab2', 'rmn_request_'.$faker->randomNumber(5)); $requests[] = [$request]; return $requests; } /** * -- Data provider -- * Define request heading to a success */ public function wrongRequestWrongHeaderValue() { $requests = array(); $faker = Faker::create(); $request = new Request('GET', '/something'); $request = $request->withHeader('X-RMN-Lab', 'rmn_request2_'.$faker->randomNumber(5)); $requests[] = [$request]; return $requests; } /** * What : Input a request in the middleware * Expected : wait for a 200 response code and an header X-RMN-Lab with the right value * @param Request $request * @dataProvider correctRequest */ public function testMiddlewareByFunctionSuccess($request) { $response = new Response(); $response = addHeaderMiddleware($request, $response); $rmnHeader = $request->getHeader('X-RMN-Lab'); $responseRmnHeader = $response->getHeader('X-RMN-Lab-Response'); if (!count($responseRmnHeader)) { $this->fail("Missing X-RMN-Lab-Response in Response object"); } preg_match('#rmn_request_(\d+)#', $rmnHeader[0], $matchesRequest); preg_match('#rmn_response_(\d+)#', $responseRmnHeader[0], $matchesResponse); if (!count($matchesResponse)) { $this->fail("Wrong pattern in X-RMN-Lab-Response value: rmn_response_(\d+)"); } $this->assertEquals(200, $response->getStatusCode()); $this->assertEquals($matchesRequest[1], $matchesResponse[1], "The response header ID doesn't match to request header ID"); } /** * What : Input a request in the middleware without header * Expected : wait for a 400 response code and a JSON error body * @param Request $request * @dataProvider wrongRequestMissingHeader */ public function testMiddlewareByFunctionFailureOnMissingHeader($request) { $response = new Response(); $response = addHeaderMiddleware($request, $response); ob_start(); echo $response->getBody(); $body = ob_get_clean(); $data = json_decode($body, true); if(is_null($data)) { $this->fail("Body isn't a correct JSON serialized string"); } $contentType = $response->getHeader('Content-Type'); if (!count($contentType)) { $this->fail("Missing Content-Type header"); } $this->assertEquals("application/json", $contentType[0]); $this->assertEquals(400, $response->getStatusCode()); $this->assertArrayHasKey('message', $data, "Message body must contain the 'message' key"); $this->assertArrayHasKey('code', $data, "Message body must contain the 'code' key"); $this->assertEquals('Missing "X-RMN-Lab" header', $data['message']); $this->assertEquals(1, $data['code']); } /** * What : Input a request in the middleware with a wrong header name * Expected : wait for a 400 response code and a JSON error body * @param Request $request * @dataProvider wrongRequestWrongHeaderName */ public function testMiddlewareByFunctionFailureOnWrongHeaderName($request) { $response = new Response(); $response = addHeaderMiddleware($request, $response); ob_start(); echo $response->getBody(); $body = ob_get_clean(); $data = json_decode($body, true); if(is_null($data)) { $this->fail("Body isn't a correct JSON serialized string"); } $contentType = $response->getHeader('Content-Type'); if (!count($contentType)) { $this->fail("Missing Content-Type header"); } $this->assertEquals("application/json", $contentType[0]); $this->assertEquals(400, $response->getStatusCode()); $this->assertArrayHasKey('message', $data, "Message body must contain the 'message' key"); $this->assertArrayHasKey('code', $data, "Message body must contain the 'code' key"); $this->assertEquals('Missing "X-RMN-Lab" header', $data['message']); $this->assertEquals(1, $data['code']); } /** * What : Input a request in the middleware with a wrong header value * Expected : wait for a 400 response code and a JSON error body * @param Request $request * @dataProvider wrongRequestWrongHeaderValue */ public function testMiddlewareByFunctionFailureOnWrongHeaderValue($request) { $response = new Response(); $response = addHeaderMiddleware($request, $response); ob_start(); echo $response->getBody(); $body = ob_get_clean(); $data = json_decode($body, true); if(is_null($data)) { $this->fail("Body isn't a correct JSON serialized string"); } $rmnHeader = $request->getHeader('X-RMN-Lab')[0]; $contentType = $response->getHeader('Content-Type'); if (!count($contentType)) { $this->fail("Missing Content-Type header"); } $this->assertEquals("application/json", $contentType[0]); $this->assertEquals(400, $response->getStatusCode()); $this->assertArrayHasKey('message', $data, "Message body must contain the 'message' key"); $this->assertArrayHasKey('code', $data, "Message body must contain the 'code' key"); $this->assertEquals('Invalid "X-RMN-Lab" header: '.$rmnHeader, $data['message']); $this->assertEquals(2, $data['code']); } /** * What : Input a request in the middleware * Expected : wait for a 200 response code and an header X-RMN-Lab with the right value * @param Request $request * @dataProvider correctRequest */ public function testMiddlewareByFunctionChainedSuccess($request) { $middleware1 = function($request, $response, $next=null) { return addHeaderMiddleware($request, $response, $next); }; $middleware2 = function($request, $response, $next=null) { return dummyMiddleware($request, $response, $next); }; $middleware3 = function($request, $response, $next=null) { return dummyMiddleware2($request, $response, $next); }; $response = new Response(); $response = $middleware1($request, $response, function($request, $response) use($middleware2, $middleware3) { return $middleware2($request, $response, function($request, $response) use($middleware3) { return $middleware3($request, $response, function ($request, $response) { return $response; }); }); }); $middlewareHeader1 = $response->getHeader('X-RMN-DummyMiddleware'); $middlewareHeader2 = $response->getHeader('X-RMN-DummyMiddleware2'); $rmnHeader = $request->getHeader('X-RMN-Lab'); $responseRmnHeader = $response->getHeader('X-RMN-Lab-Response'); if (!count($responseRmnHeader)) { $this->fail("Missing X-RMN-Lab-Response in Response object"); } if (!count($middlewareHeader1)) { $this->fail("Missing X-RMN-DummyMiddleware in Response object"); } if (!count($middlewareHeader2)) { $this->fail("Missing X-RMN-DummyMiddleware2 in Response object"); } preg_match('#rmn_request_(\d+)#', $rmnHeader[0], $matchesRequest); preg_match('#rmn_response_(\d+)#', $responseRmnHeader[0], $matchesResponse); if (!count($matchesResponse)) { $this->fail("Wrong pattern in X-RMN-Lab-Response value: rmn_response_(\d+)"); } $this->assertEquals(200, $response->getStatusCode()); $this->assertEquals($matchesRequest[1], $matchesResponse[1], "The response header ID doesn't match to request header ID"); $this->assertEquals('I was here : dummy middleware', $middlewareHeader1[0]); $this->assertEquals('I was here : dummy middleware 2', $middlewareHeader2[0]); } }