MessageTest.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. <?php
  2. declare(strict_types=1);
  3. namespace Sabre\HTTP;
  4. class MessageTest extends \PHPUnit\Framework\TestCase
  5. {
  6. public function testConstruct()
  7. {
  8. $message = new MessageMock();
  9. $this->assertInstanceOf('Sabre\HTTP\Message', $message);
  10. }
  11. public function testStreamBody()
  12. {
  13. $body = 'foo';
  14. $h = fopen('php://memory', 'r+');
  15. fwrite($h, $body);
  16. rewind($h);
  17. $message = new MessageMock();
  18. $message->setBody($h);
  19. $this->assertEquals($body, $message->getBodyAsString());
  20. rewind($h);
  21. $this->assertEquals($body, stream_get_contents($message->getBodyAsStream()));
  22. rewind($h);
  23. $this->assertEquals($body, stream_get_contents($message->getBody()));
  24. }
  25. public function testStringBody()
  26. {
  27. $body = 'foo';
  28. $message = new MessageMock();
  29. $message->setBody($body);
  30. $this->assertEquals($body, $message->getBodyAsString());
  31. $this->assertEquals($body, stream_get_contents($message->getBodyAsStream()));
  32. $this->assertEquals($body, $message->getBody());
  33. }
  34. public function testCallbackBodyAsString()
  35. {
  36. $body = $this->createCallback('foo');
  37. $message = new MessageMock();
  38. $message->setBody($body);
  39. $string = $message->getBodyAsString();
  40. $this->assertSame('foo', $string);
  41. }
  42. public function testCallbackBodyAsStream()
  43. {
  44. $body = $this->createCallback('foo');
  45. $message = new MessageMock();
  46. $message->setBody($body);
  47. $stream = $message->getBodyAsStream();
  48. $this->assertSame('foo', stream_get_contents($stream));
  49. }
  50. public function testGetBodyWhenCallback()
  51. {
  52. $callback = $this->createCallback('foo');
  53. $message = new MessageMock();
  54. $message->setBody($callback);
  55. $this->assertSame($callback, $message->getBody());
  56. }
  57. /**
  58. * It's possible that streams contains more data than the Content-Length.
  59. *
  60. * The request object should make sure to never emit more than
  61. * Content-Length, if Content-Length is set.
  62. *
  63. * This is in particular useful when responding to range requests with
  64. * streams that represent files on the filesystem, as it's possible to just
  65. * seek the stream to a certain point, set the content-length and let the
  66. * request object do the rest.
  67. */
  68. public function testLongStreamToStringBody()
  69. {
  70. $body = fopen('php://memory', 'r+');
  71. fwrite($body, 'abcdefg');
  72. fseek($body, 2);
  73. $message = new MessageMock();
  74. $message->setBody($body);
  75. $message->setHeader('Content-Length', '4');
  76. $this->assertEquals(
  77. 'cdef',
  78. $message->getBodyAsString()
  79. );
  80. }
  81. /**
  82. * Some clients include a content-length header, but the header is empty.
  83. * This is definitely broken behavior, but we should support it.
  84. */
  85. public function testEmptyContentLengthHeader()
  86. {
  87. $body = fopen('php://memory', 'r+');
  88. fwrite($body, 'abcdefg');
  89. fseek($body, 2);
  90. $message = new MessageMock();
  91. $message->setBody($body);
  92. $message->setHeader('Content-Length', '');
  93. $this->assertEquals(
  94. 'cdefg',
  95. $message->getBodyAsString()
  96. );
  97. }
  98. public function testGetEmptyBodyStream()
  99. {
  100. $message = new MessageMock();
  101. $body = $message->getBodyAsStream();
  102. $this->assertEquals('', stream_get_contents($body));
  103. }
  104. public function testGetEmptyBodyString()
  105. {
  106. $message = new MessageMock();
  107. $body = $message->getBodyAsString();
  108. $this->assertEquals('', $body);
  109. }
  110. public function testHeaders()
  111. {
  112. $message = new MessageMock();
  113. $message->setHeader('X-Foo', 'bar');
  114. // Testing caselessness
  115. $this->assertEquals('bar', $message->getHeader('X-Foo'));
  116. $this->assertEquals('bar', $message->getHeader('x-fOO'));
  117. $this->assertTrue(
  118. $message->removeHeader('X-FOO')
  119. );
  120. $this->assertNull($message->getHeader('X-Foo'));
  121. $this->assertFalse(
  122. $message->removeHeader('X-FOO')
  123. );
  124. }
  125. public function testSetHeaders()
  126. {
  127. $message = new MessageMock();
  128. $headers = [
  129. 'X-Foo' => ['1'],
  130. 'X-Bar' => ['2'],
  131. ];
  132. $message->setHeaders($headers);
  133. $this->assertEquals($headers, $message->getHeaders());
  134. $message->setHeaders([
  135. 'X-Foo' => ['3', '4'],
  136. 'X-Bar' => '5',
  137. ]);
  138. $expected = [
  139. 'X-Foo' => ['3', '4'],
  140. 'X-Bar' => ['5'],
  141. ];
  142. $this->assertEquals($expected, $message->getHeaders());
  143. }
  144. public function testAddHeaders()
  145. {
  146. $message = new MessageMock();
  147. $headers = [
  148. 'X-Foo' => ['1'],
  149. 'X-Bar' => ['2'],
  150. ];
  151. $message->addHeaders($headers);
  152. $this->assertEquals($headers, $message->getHeaders());
  153. $message->addHeaders([
  154. 'X-Foo' => ['3', '4'],
  155. 'X-Bar' => '5',
  156. ]);
  157. $expected = [
  158. 'X-Foo' => ['1', '3', '4'],
  159. 'X-Bar' => ['2', '5'],
  160. ];
  161. $this->assertEquals($expected, $message->getHeaders());
  162. }
  163. public function testSendBody()
  164. {
  165. $message = new MessageMock();
  166. // String
  167. $message->setBody('foo');
  168. // Stream
  169. $h = fopen('php://memory', 'r+');
  170. fwrite($h, 'bar');
  171. rewind($h);
  172. $message->setBody($h);
  173. $body = $message->getBody();
  174. rewind($body);
  175. $this->assertEquals('bar', stream_get_contents($body));
  176. }
  177. public function testMultipleHeaders()
  178. {
  179. $message = new MessageMock();
  180. $message->setHeader('a', '1');
  181. $message->addHeader('A', '2');
  182. $this->assertEquals(
  183. '1,2',
  184. $message->getHeader('A')
  185. );
  186. $this->assertEquals(
  187. '1,2',
  188. $message->getHeader('a')
  189. );
  190. $this->assertEquals(
  191. ['1', '2'],
  192. $message->getHeaderAsArray('a')
  193. );
  194. $this->assertEquals(
  195. ['1', '2'],
  196. $message->getHeaderAsArray('A')
  197. );
  198. $this->assertEquals(
  199. [],
  200. $message->getHeaderAsArray('B')
  201. );
  202. }
  203. public function testHasHeaders()
  204. {
  205. $message = new MessageMock();
  206. $this->assertFalse($message->hasHeader('X-Foo'));
  207. $message->setHeader('X-Foo', 'Bar');
  208. $this->assertTrue($message->hasHeader('X-Foo'));
  209. }
  210. /**
  211. * @param string $content
  212. *
  213. * @return \Closure Returns a callback printing $content to php://output stream
  214. */
  215. private function createCallback($content)
  216. {
  217. return function () use ($content) {
  218. echo $content;
  219. };
  220. }
  221. }
  222. class MessageMock extends Message
  223. {
  224. }