HttpJsonResponseTest.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace Illuminate\Tests\Http;
  3. use Illuminate\Contracts\Support\Arrayable;
  4. use Illuminate\Contracts\Support\Jsonable;
  5. use Illuminate\Http\JsonResponse;
  6. use InvalidArgumentException;
  7. use JsonSerializable;
  8. use PHPUnit\Framework\TestCase;
  9. use stdClass;
  10. class HttpJsonResponseTest extends TestCase
  11. {
  12. /**
  13. * @dataProvider setAndRetrieveDataProvider
  14. */
  15. public function testSetAndRetrieveData($data)
  16. {
  17. $response = new JsonResponse($data);
  18. $this->assertInstanceOf(stdClass::class, $response->getData());
  19. $this->assertSame('bar', $response->getData()->foo);
  20. }
  21. public function setAndRetrieveDataProvider()
  22. {
  23. return [
  24. 'Jsonable data' => [new JsonResponseTestJsonableObject],
  25. 'JsonSerializable data' => [new JsonResponseTestJsonSerializeObject],
  26. 'Arrayable data' => [new JsonResponseTestArrayableObject],
  27. 'Array data' => [['foo' => 'bar']],
  28. 'stdClass data' => [(object) ['foo' => 'bar']],
  29. ];
  30. }
  31. public function testGetOriginalContent()
  32. {
  33. $response = new JsonResponse(new JsonResponseTestArrayableObject);
  34. $this->assertInstanceOf(JsonResponseTestArrayableObject::class, $response->getOriginalContent());
  35. $response = new JsonResponse;
  36. $response->setData(new JsonResponseTestArrayableObject);
  37. $this->assertInstanceOf(JsonResponseTestArrayableObject::class, $response->getOriginalContent());
  38. }
  39. public function testSetAndRetrieveOptions()
  40. {
  41. $response = new JsonResponse(['foo' => 'bar']);
  42. $response->setEncodingOptions(JSON_PRETTY_PRINT);
  43. $this->assertSame(JSON_PRETTY_PRINT, $response->getEncodingOptions());
  44. }
  45. public function testSetAndRetrieveDefaultOptions()
  46. {
  47. $response = new JsonResponse(['foo' => 'bar']);
  48. $this->assertSame(0, $response->getEncodingOptions());
  49. }
  50. public function testSetAndRetrieveStatusCode()
  51. {
  52. $response = new JsonResponse(['foo' => 'bar'], 404);
  53. $this->assertSame(404, $response->getStatusCode());
  54. $response = new JsonResponse(['foo' => 'bar']);
  55. $response->setStatusCode(404);
  56. $this->assertSame(404, $response->getStatusCode());
  57. }
  58. /**
  59. * @dataProvider jsonErrorDataProvider
  60. */
  61. public function testInvalidArgumentExceptionOnJsonError($data)
  62. {
  63. $this->expectException(InvalidArgumentException::class);
  64. new JsonResponse(['data' => $data]);
  65. }
  66. /**
  67. * @dataProvider jsonErrorDataProvider
  68. */
  69. public function testGracefullyHandledSomeJsonErrorsWithPartialOutputOnError($data)
  70. {
  71. new JsonResponse(['data' => $data], 200, [], JSON_PARTIAL_OUTPUT_ON_ERROR);
  72. }
  73. public function jsonErrorDataProvider()
  74. {
  75. // Resources can't be encoded
  76. $resource = tmpfile();
  77. // Recursion can't be encoded
  78. $recursiveObject = new stdClass;
  79. $objectB = new stdClass;
  80. $recursiveObject->b = $objectB;
  81. $objectB->a = $recursiveObject;
  82. // NAN or INF can't be encoded
  83. $nan = NAN;
  84. return [
  85. [$resource],
  86. [$recursiveObject],
  87. [$nan],
  88. ];
  89. }
  90. public function testFromJsonString()
  91. {
  92. $json_string = '{"foo":"bar"}';
  93. $response = JsonResponse::fromJsonString($json_string);
  94. $this->assertSame('bar', $response->getData()->foo);
  95. }
  96. }
  97. class JsonResponseTestJsonableObject implements Jsonable
  98. {
  99. public function toJson($options = 0)
  100. {
  101. return '{"foo":"bar"}';
  102. }
  103. }
  104. class JsonResponseTestJsonSerializeObject implements JsonSerializable
  105. {
  106. public function jsonSerialize(): array
  107. {
  108. return ['foo' => 'bar'];
  109. }
  110. }
  111. class JsonResponseTestArrayableObject implements Arrayable
  112. {
  113. public function toArray()
  114. {
  115. return ['foo' => 'bar'];
  116. }
  117. }