2011-01-18 19:17:24 +00:00
< ? php
namespace Symfony\Tests\Component\Serializer\Encoder ;
require_once __DIR__ . '/../Fixtures/Dummy.php' ;
require_once __DIR__ . '/../Fixtures/ScalarDummy.php' ;
use Symfony\Tests\Component\Serializer\Fixtures\Dummy ;
use Symfony\Tests\Component\Serializer\Fixtures\ScalarDummy ;
use Symfony\Component\Serializer\Encoder\XmlEncoder ;
use Symfony\Component\Serializer\Serializer ;
2012-02-24 12:26:13 +00:00
use Symfony\Component\Serializer\Exception\UnexpectedValueException ;
2011-01-18 19:17:24 +00:00
use Symfony\Component\Serializer\Normalizer\CustomNormalizer ;
/*
* This file is part of the Symfony framework .
*
2011-03-06 11:40:06 +00:00
* ( c ) Fabien Potencier < fabien @ symfony . com >
2011-01-18 19:17:24 +00:00
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE .
*/
class XmlEncoderTest extends \PHPUnit_Framework_TestCase
{
public function setUp ()
{
$this -> encoder = new XmlEncoder ;
2011-06-10 00:11:51 +01:00
$serializer = new Serializer ( array ( new CustomNormalizer ), array ( 'xml' => new XmlEncoder ()));
$this -> encoder -> setSerializer ( $serializer );
2011-01-18 19:17:24 +00:00
}
public function testEncodeScalar ()
{
$obj = new ScalarDummy ;
$obj -> xmlFoo = " foo " ;
$expected = '<?xml version="1.0"?>' . " \n " .
'<response><![CDATA[foo]]></response>' . " \n " ;
$this -> assertEquals ( $expected , $this -> encoder -> encode ( $obj , 'xml' ));
}
2011-02-13 14:58:52 +00:00
public function testSetRootNodeName ()
{
$obj = new ScalarDummy ;
$obj -> xmlFoo = " foo " ;
$this -> encoder -> setRootNodeName ( 'test' );
$expected = '<?xml version="1.0"?>' . " \n " .
'<test><![CDATA[foo]]></test>' . " \n " ;
$this -> assertEquals ( $expected , $this -> encoder -> encode ( $obj , 'xml' ));
}
2011-02-14 09:42:58 +00:00
public function testAttributes ()
{
$obj = new ScalarDummy ;
$obj -> xmlFoo = array (
'foo-bar' => array (
'@id' => 1 ,
'@name' => 'Bar'
),
'Foo' => array (
'Bar' => " Test " ,
'@Type' => 'test'
),
2011-03-23 19:27:58 +00:00
'föo_bär' => 'a' ,
2011-03-12 14:23:30 +00:00
" Bar " => array ( 1 , 2 , 3 ),
'a' => 'b' ,
2011-02-14 09:42:58 +00:00
);
$expected = '<?xml version="1.0"?>' . " \n " .
'<response>' .
'<foo-bar id="1" name="Bar"/>' .
'<Foo Type="test"><Bar><![CDATA[Test]]></Bar></Foo>' .
2011-03-23 19:27:58 +00:00
'<föo_bär><![CDATA[a]]></föo_bär>' .
2011-02-14 09:42:58 +00:00
'<Bar>1</Bar>' .
'<Bar>2</Bar>' .
'<Bar>3</Bar>' .
2011-03-12 14:23:30 +00:00
'<a><![CDATA[b]]></a>' .
2011-02-14 09:42:58 +00:00
'</response>' . " \n " ;
$this -> assertEquals ( $expected , $this -> encoder -> encode ( $obj , 'xml' ));
}
2011-02-13 15:14:43 +00:00
public function testElementNameValid ()
{
$obj = new ScalarDummy ;
$obj -> xmlFoo = array (
2011-03-23 19:27:58 +00:00
'foo-bar' => 'a' ,
'foo_bar' => 'a' ,
'föo_bär' => 'a' ,
2011-02-13 15:14:43 +00:00
);
$expected = '<?xml version="1.0"?>' . " \n " .
'<response>' .
2011-03-23 19:27:58 +00:00
'<foo-bar><![CDATA[a]]></foo-bar>' .
'<foo_bar><![CDATA[a]]></foo_bar>' .
'<föo_bär><![CDATA[a]]></föo_bär>' .
2011-02-13 15:14:43 +00:00
'</response>' . " \n " ;
$this -> assertEquals ( $expected , $this -> encoder -> encode ( $obj , 'xml' ));
}
2011-02-12 12:02:04 +00:00
public function testEncodeSimpleXML ()
{
$xml = simplexml_load_string ( '<firstname>Peter</firstname>' );
$array = array ( 'person' => $xml );
$expected = '<?xml version="1.0"?>' . " \n " .
'<response><person><firstname>Peter</firstname></person></response>' . " \n " ;
$this -> assertEquals ( $expected , $this -> encoder -> encode ( $array , 'xml' ));
}
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
public function testEncodeScalarRootAttributes ()
{
$array = array (
'#' => 'Paul' ,
2011-06-08 18:56:59 +01:00
'@gender' => 'm'
2011-04-27 21:16:24 +01:00
);
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
$expected = '<?xml version="1.0"?>' . " \n " .
'<response gender="m"><![CDATA[Paul]]></response>' . " \n " ;
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
$this -> assertEquals ( $expected , $this -> encoder -> encode ( $array , 'xml' ));
}
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
public function testEncodeRootAttributes ()
{
$array = array (
'firstname' => 'Paul' ,
2011-06-08 18:56:59 +01:00
'@gender' => 'm'
2011-04-27 21:16:24 +01:00
);
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
$expected = '<?xml version="1.0"?>' . " \n " .
'<response gender="m"><firstname><![CDATA[Paul]]></firstname></response>' . " \n " ;
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
$this -> assertEquals ( $expected , $this -> encoder -> encode ( $array , 'xml' ));
}
2011-04-15 20:12:02 +01:00
2011-04-11 23:58:21 +01:00
public function testEncodeScalarWithAttribute ()
{
$array = array (
'person' => array ( '@gender' => 'M' , '#' => 'Peter' ),
);
2011-04-15 20:12:02 +01:00
2011-04-11 23:58:21 +01:00
$expected = '<?xml version="1.0"?>' . " \n " .
'<response><person gender="M"><![CDATA[Peter]]></person></response>' . " \n " ;
2011-04-15 20:12:02 +01:00
2011-04-11 23:58:21 +01:00
$this -> assertEquals ( $expected , $this -> encoder -> encode ( $array , 'xml' ));
}
2011-02-12 12:02:04 +00:00
2011-01-18 19:17:24 +00:00
public function testDecodeScalar ()
{
$source = '<?xml version="1.0"?>' . " \n " .
'<response>foo</response>' . " \n " ;
$this -> assertEquals ( 'foo' , $this -> encoder -> decode ( $source , 'xml' ));
}
public function testEncode ()
{
$source = $this -> getXmlSource ();
$obj = $this -> getObject ();
$this -> assertEquals ( $source , $this -> encoder -> encode ( $obj , 'xml' ));
}
public function testDecode ()
{
$source = $this -> getXmlSource ();
$obj = $this -> getObject ();
$this -> assertEquals ( get_object_vars ( $obj ), $this -> encoder -> decode ( $source , 'xml' ));
}
2011-04-15 20:12:02 +01:00
2011-04-11 23:58:21 +01:00
public function testDecodeScalarWithAttribute ()
{
$source = '<?xml version="1.0"?>' . " \n " .
'<response><person gender="M">Peter</person></response>' . " \n " ;
2011-04-15 20:12:02 +01:00
2011-04-11 23:58:21 +01:00
$expected = array (
'person' => array ( '@gender' => 'M' , '#' => 'Peter' ),
);
2011-04-15 20:12:02 +01:00
2011-04-11 23:58:21 +01:00
$this -> assertEquals ( $expected , $this -> encoder -> decode ( $source , 'xml' ));
}
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
public function testDecodeScalarRootAttributes ()
{
$source = '<?xml version="1.0"?>' . " \n " .
'<person gender="M">Peter</person>' . " \n " ;
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
$expected = array (
'#' => 'Peter' ,
'@gender' => 'M'
);
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
$this -> assertEquals ( $expected , $this -> encoder -> decode ( $source , 'xml' ));
}
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
public function testDecodeRootAttributes ()
{
$source = '<?xml version="1.0"?>' . " \n " .
'<person gender="M"><firstname>Peter</firstname><lastname>Mac Calloway</lastname></person>' . " \n " ;
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
$expected = array (
'firstname' => 'Peter' ,
'lastname' => 'Mac Calloway' ,
'@gender' => 'M'
);
2011-06-08 18:56:59 +01:00
2011-04-27 21:16:24 +01:00
$this -> assertEquals ( $expected , $this -> encoder -> decode ( $source , 'xml' ));
}
2011-04-15 20:12:02 +01:00
2011-04-11 23:58:21 +01:00
public function testDecodeArray ()
{
$source = '<?xml version="1.0"?>' . " \n " .
'<response>' .
'<people>' .
'<person><firstname>Benjamin</firstname><lastname>Alexandre</lastname></person>' .
'<person><firstname>Damien</firstname><lastname>Clay</lastname></person>' .
'</people>' .
'</response>' . " \n " ;
2011-04-15 20:12:02 +01:00
2011-04-11 23:58:21 +01:00
$expected = array (
'people' => array ( 'person' => array (
array ( 'firstname' => 'Benjamin' , 'lastname' => 'Alexandre' ),
array ( 'firstname' => 'Damien' , 'lastname' => 'Clay' )
))
);
2011-04-15 20:12:02 +01:00
2011-04-11 23:58:21 +01:00
$this -> assertEquals ( $expected , $this -> encoder -> decode ( $source , 'xml' ));
}
2011-01-18 19:17:24 +00:00
2012-02-24 12:26:13 +00:00
/**
* @ expectedException Symfony\Component\Serializer\Exception\UnexpectedValueException
*/
public function testPreventsComplexExternalEntities ()
{
$oldCwd = getcwd ();
chdir ( __DIR__ );
try {
$decoded = $this -> encoder -> decode ( '<?xml version="1.0"?><!DOCTYPE scan[<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=XmlEncoderTest.php">]><scan>&test;</scan>' , 'xml' );
chdir ( $oldCwd );
} catch ( UnexpectedValueException $e ) {
chdir ( $oldCwd );
throw $e ;
}
}
2011-01-18 19:17:24 +00:00
protected function getXmlSource ()
{
return '<?xml version="1.0"?>' . " \n " .
'<response>' .
'<foo><![CDATA[foo]]></foo>' .
2011-02-14 09:42:58 +00:00
'<bar><![CDATA[a]]></bar><bar><![CDATA[b]]></bar>' .
'<baz><key><![CDATA[val]]></key><key2><![CDATA[val]]></key2><item key="A B"><![CDATA[bar]]></item>' .
'<Barry><FooBar id="1"><Baz><![CDATA[Ed]]></Baz></FooBar></Barry></baz>' .
2011-01-18 19:17:24 +00:00
'<qux>1</qux>' .
'</response>' . " \n " ;
}
protected function getObject ()
{
$obj = new Dummy ;
$obj -> foo = 'foo' ;
$obj -> bar = array ( 'a' , 'b' );
2011-04-11 23:58:21 +01:00
$obj -> baz = array ( 'key' => 'val' , 'key2' => 'val' , 'A B' => 'bar' , " Barry " => array ( 'FooBar' => array ( " Baz " => " Ed " , " @id " => 1 )));
2011-01-18 19:17:24 +00:00
$obj -> qux = " 1 " ;
2011-06-08 18:56:59 +01:00
2011-01-18 19:17:24 +00:00
return $obj ;
}
}