setAccessible(true); $bodyReflection = new ReflectionProperty($response, 'body'); $bodyReflection->setAccessible(true); $this->assertEquals(200, $response->getStatusCode()); $this->assertInstanceOf(Headers::class, $headersReflection->getValue($response)); $this->assertInstanceOf(Stream::class, $bodyReflection->getValue($response)); } public function testConstructorWithCustomArgs() { $headers = new Headers(); $body = new Stream(fopen('php://temp', 'r+')); $response = new Response(404, $headers, $body); $headersReflection = new ReflectionProperty($response, 'headers'); $headersReflection->setAccessible(true); $bodyReflection = new ReflectionProperty($response, 'body'); $bodyReflection->setAccessible(true); $this->assertEquals(404, $response->getStatusCode()); $this->assertSame($headers, $headersReflection->getValue($response)); $this->assertSame($body, $bodyReflection->getValue($response)); } public function testDeepCopyClone() { $headers = new Headers(); $body = new Stream(fopen('php://temp', 'r+')); $response = new Response(404, $headers, $body); $clone = clone $response; $headersReflection = new ReflectionProperty($response, 'headers'); $headersReflection->setAccessible(true); $this->assertEquals(404, $clone->getStatusCode()); $this->assertEquals('1.1', $clone->getProtocolVersion()); $this->assertNotSame($headers, $headersReflection->getValue($clone)); } public function testDisableSetter() { $response = new Response(); $response->foo = 'bar'; $this->assertFalse(property_exists($response, 'foo')); } public function testGetStatusCode() { $response = new Response(); $responseStatus = new ReflectionProperty($response, 'status'); $responseStatus->setAccessible(true); $responseStatus->setValue($response, 404); $this->assertEquals(404, $response->getStatusCode()); } public function testWithStatus() { $response = new Response(); $clone = $response->withStatus(302); $this->assertEquals(302, $clone->getStatusCode()); } public function testWithStatusInvalidStatusCodeThrowsException() { $this->expectException(InvalidArgumentException::class); $response = new Response(); $response->withStatus(800); } public function testWithStatusInvalidReasonPhraseThrowsException() { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Response reason phrase must be a string'); $response = new Response(); $response->withStatus(200, null); } public function testWithStatusEmptyReasonPhrase() { $responseWithNoMessage = new Response(310); $this->assertEquals('', $responseWithNoMessage->getReasonPhrase()); } public function testReasonPhraseContainsCarriageReturn() { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Reason phrase contains one of the following prohibited characters: \r \n'); $response = new Response(); $response = $response->withStatus(404, "Not Found\r"); } public function testReasonPhraseContainsLineFeed() { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Reason phrase contains one of the following prohibited characters: \r \n'); $response = new Response(); $response = $response->withStatus(404, "Not Found\n"); } public function testWithStatusValidReasonPhraseObject() { $mock = $this->getMockBuilder(stdClass::class)->addMethods(['__toString'])->getMock(); $mock->expects($this->once()) ->method('__toString') ->will($this->returnValue('Slim OK')); $response = new Response(); $response = $response->withStatus(200, $mock); $this->assertEquals('Slim OK', $response->getReasonPhrase()); } public function testGetReasonPhrase() { $response = new Response(404); $this->assertEquals('Not Found', $response->getReasonPhrase()); } public function testEmptyReasonPhraseForUnrecognisedCode() { $response = new Response(); $response = $response->withStatus(199); $this->assertSame('', $response->getReasonPhrase()); } public function testSetReasonPhraseForUnrecognisedCode() { $response = new Response(); $response = $response->withStatus(199, 'Random Message'); $this->assertEquals('Random Message', $response->getReasonPhrase()); } public function testGetCustomReasonPhrase() { $response = new Response(); $clone = $response->withStatus(200, 'Custom Phrase'); $this->assertEquals('Custom Phrase', $clone->getReasonPhrase()); } public function testResponseHeadersDoNotContainAuthorizationHeader() { $_SERVER = Environment::mock( [ 'PHP_AUTH_USER' => 'foo' ] ); $response = new Response(); $this->assertEmpty($response->getHeaders()); } }