<?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yiiunit\framework\web; use yii\base\Object; use yii\web\Response; use yii\web\XmlResponseFormatter; class Post extends Object { public $id; public $title; public function __construct($id, $title) { $this->id = $id; $this->title = $title; } } /** * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */ class XmlResponseFormatterTest extends \yiiunit\TestCase { /** * @var Response */ public $response; /** * @var XmlResponseFormatter */ public $formatter; protected function setUp() { $this->mockApplication(); $this->response = new Response; $this->formatter = new XmlResponseFormatter; } /** * @param mixed $data the data to be formatted * @param string $xml the expected XML body * @dataProvider formatScalarDataProvider */ public function testFormatScalar($data, $xml) { $head = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; $this->response->data = $data; $this->formatter->format($this->response); $this->assertEquals($head . $xml, $this->response->content); } public function formatScalarDataProvider() { return array( array(null, "<response></response>\n"), array(1, "<response>1</response>\n"), array('abc', "<response>abc</response>\n"), array(true, "<response>1</response>\n"), array("<>", "<response><></response>\n"), ); } /** * @param mixed $data the data to be formatted * @param string $xml the expected XML body * @dataProvider formatArrayDataProvider */ public function testFormatArrays($data, $xml) { $head = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; $this->response->data = $data; $this->formatter->format($this->response); $this->assertEquals($head . $xml, $this->response->content); } public function formatArrayDataProvider() { return array( array(array(), "<response/>\n"), array(array(1, 'abc'), "<response><item>1</item><item>abc</item></response>\n"), array(array( 'a' => 1, 'b' => 'abc', ), "<response><a>1</a><b>abc</b></response>\n"), array(array( 1, 'abc', array(2, 'def'), true, ), "<response><item>1</item><item>abc</item><item><item>2</item><item>def</item></item><item>1</item></response>\n"), array(array( 'a' => 1, 'b' => 'abc', 'c' => array(2, '<>'), true, ), "<response><a>1</a><b>abc</b><c><item>2</item><item><></item></c><item>1</item></response>\n"), ); } /** * @param mixed $data the data to be formatted * @param string $xml the expected XML body * @dataProvider formatObjectDataProvider */ public function testFormatObjects($data, $xml) { $head = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; $this->response->data = $data; $this->formatter->format($this->response); $this->assertEquals($head . $xml, $this->response->content); } public function formatObjectDataProvider() { return array( array(new Post(123, 'abc'), "<response><Post><id>123</id><title>abc</title></Post></response>\n"), array(array( new Post(123, 'abc'), new Post(456, 'def'), ), "<response><Post><id>123</id><title>abc</title></Post><Post><id>456</id><title>def</title></Post></response>\n"), array(array( new Post(123, '<>'), 'a' => new Post(456, 'def'), ), "<response><Post><id>123</id><title><></title></Post><a><Post><id>456</id><title>def</title></Post></a></response>\n"), ); } }