* @since 2.0 * * @group web */ class XmlResponseFormatterTest extends FormatterTest { /** * @param array $options * @return XmlResponseFormatter */ protected function getFormatterInstance($options = []) { return new XmlResponseFormatter($options); } private $xmlHead = "\n"; private function addXmlHead(array $data) { foreach ($data as &$item) { $item[1] = $this->xmlHead . $item[1]; } return $data; } public function formatScalarDataProvider() { return $this->addXmlHead([ [1, "1\n"], ['abc', "abc\n"], [true, "true\n"], [false, "false\n"], ["<>", "<>\n"], ]); } public function formatArrayDataProvider() { return $this->addXmlHead([ [[], "\n"], [[1, 'abc'], "1abc\n"], [[ 'a' => 1, 'b' => 'abc', ], "1abc\n"], [[ 1, 'abc', [2, 'def'], true, ], "1abc2deftrue\n"], [[ 'a' => 1, 'b' => 'abc', 'c' => [2, '<>'], false, ], "1abc2<>false\n"], ]); } public function formatTraversableObjectDataProvider() { $expectedXmlForStack = ''; $postsStack = new \SplStack(); $postsStack->push(new Post(915, 'record1')); $expectedXmlForStack = '915record1' . $expectedXmlForStack; $postsStack->push(new Post(456, 'record2')); $expectedXmlForStack = '456record2' . $expectedXmlForStack; $data = [ [$postsStack, "$expectedXmlForStack\n"] ]; return $this->addXmlHead($data); } public function formatObjectDataProvider() { return $this->addXmlHead([ [new Post(123, 'abc'), "123abc\n"], [[ new Post(123, 'abc'), new Post(456, 'def'), ], "123abc456def\n"], [[ new Post(123, '<>'), 'a' => new Post(456, 'def'), ], "123<>456def\n"], ]); } public function formatModelDataProvider() { return $this->addXmlHead([ [ new ModelStub(['id' => 123, 'title' => 'abc', 'hidden' => 'hidden']), "123abc\n" ] ]); } public function testCustomRootTag() { $rootTag = 'custom'; $formatter = $this->getFormatterInstance([ 'rootTag' => $rootTag, ]); $this->response->data = 1; $formatter->format($this->response); $this->assertEquals($this->xmlHead . "<$rootTag>1\n", $this->response->content); } public function testRootTagRemoval() { $formatter = $this->getFormatterInstance([ 'rootTag' => null, ]); $this->response->data = 1; $formatter->format($this->response); $this->assertEquals($this->xmlHead . "1\n", $this->response->content); } public function testNoObjectTags() { $formatter = $this->getFormatterInstance([ 'useObjectTags' => false, ]); $this->response->data = new Post(123, 'abc'); $formatter->format($this->response); $this->assertEquals($this->xmlHead . "123abc\n", $this->response->content); } }