diff --git a/tests/unit/framework/web/JsonResponseFormatterTest.php b/tests/unit/framework/web/JsonResponseFormatterTest.php new file mode 100644 index 0000000000..ee43de27b4 --- /dev/null +++ b/tests/unit/framework/web/JsonResponseFormatterTest.php @@ -0,0 +1,135 @@ +id = $id; + $this->title = $title; + } +} + +/** + * @author Alexander Makarov + * @since 2.0.3 + * + * @group web + */ +class JsonResponseFormatterTest extends \yiiunit\TestCase +{ + /** + * @var Response + */ + public $response; + /** + * @var JsonResponseFormatter + */ + public $formatter; + + protected function setUp() + { + $this->mockApplication(); + $this->response = new Response; + $this->formatter = new JsonResponseFormatter; + } + + /** + * @param mixed $data the data to be formatted + * @param string $json the expected JSON body + * @dataProvider formatScalarDataProvider + */ + public function testFormatScalar($data, $json) + { + $this->response->data = $data; + $this->formatter->format($this->response); + $this->assertEquals($json, $this->response->content); + } + + public function formatScalarDataProvider() + { + return [ + [null, 'null'], + [1, 1], + ['abc', '"abc"'], + [true, 'true'], + ["<>", '"<>"'], + ]; + } + + /** + * @param mixed $data the data to be formatted + * @param string $json the expected JSON body + * @dataProvider formatArrayDataProvider + */ + public function testFormatArrays($data, $json) + { + $this->response->data = $data; + $this->formatter->format($this->response); + $this->assertEquals($json, $this->response->content); + } + + public function formatArrayDataProvider() + { + return [ + [[], "[]"], + [[1, 'abc'], '[1,"abc"]'], + [[ + 'a' => 1, + 'b' => 'abc', + ], '{"a":1,"b":"abc"}'], + [[ + 1, + 'abc', + [2, 'def'], + true, + ], '[1,"abc",[2,"def"],true]'], + [[ + 'a' => 1, + 'b' => 'abc', + 'c' => [2, '<>'], + true, + ], '{"a":1,"b":"abc","c":[2,"<>"],"0":true}'], + ]; + } + + /** + * @param mixed $data the data to be formatted + * @param string $json the expected JSON body + * @dataProvider formatObjectDataProvider + */ + public function testFormatObjects($data, $json) + { + $this->response->data = $data; + $this->formatter->format($this->response); + $this->assertEquals($json, $this->response->content); + } + + public function formatObjectDataProvider() + { + return [ + [new Post(123, 'abc'), '{"id":123,"title":"abc"}'], + [[ + new Post(123, 'abc'), + new Post(456, 'def'), + ], '[{"id":123,"title":"abc"},{"id":456,"title":"def"}]'], + [[ + new Post(123, '<>'), + 'a' => new Post(456, 'def'), + ], '{"0":{"id":123,"title":"<>"},"a":{"id":456,"title":"def"}}'], + ]; + } +}