* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace JMS\Serializer\Tests\Serializer; use JMS\Serializer\Context; use JMS\Serializer\SerializationContext; use JMS\Serializer\Tests\Fixtures\InvalidUsageOfXmlValue; use JMS\Serializer\Exception\InvalidArgumentException; use JMS\Serializer\Tests\Fixtures\PersonCollection; use JMS\Serializer\Tests\Fixtures\PersonLocation; use JMS\Serializer\Tests\Fixtures\Person; use JMS\Serializer\Tests\Fixtures\ObjectWithVirtualXmlProperties; use JMS\Serializer\Tests\Fixtures\ObjectWithXmlKeyValuePairs; use JMS\Serializer\Tests\Fixtures\Input; class XmlSerializationTest extends BaseSerializationTest { /** * @expectedException JMS\Serializer\Exception\RuntimeException */ public function testInvalidUsageOfXmlValue() { $obj = new InvalidUsageOfXmlValue(); $this->serialize($obj); } public function testPropertyIsObjectWithAttributeAndValue() { $personCollection = new PersonLocation; $person = new Person; $person->name = 'Matthias Noback'; $person->age = 28; $personCollection->person = $person; $personCollection->location = 'The Netherlands'; $this->assertEquals($this->getContent('person_location'), $this->serialize($personCollection)); } public function testPropertyIsCollectionOfObjectsWithAttributeAndValue() { $personCollection = new PersonCollection; $person = new Person; $person->name = 'Matthias Noback'; $person->age = 28; $personCollection->persons->add($person); $personCollection->location = 'The Netherlands'; $this->assertEquals($this->getContent('person_collection'), $this->serialize($personCollection)); } /** * @expectedException JMS\Serializer\Exception\InvalidArgumentException * @expectedExceptionMessage The document type "]>" is not allowed. If it is safe, you may add it to the whitelist configuration. */ public function testExternalEntitiesAreDisabledByDefault() { $this->deserialize(' ]> &foo; ', 'stdClass'); } /** * @expectedException JMS\Serializer\Exception\InvalidArgumentException * @expectedExceptionMessage The document type "" is not allowed. If it is safe, you may add it to the whitelist configuration. */ public function testDocumentTypesAreNotAllowed() { $this->deserialize('', 'stdClass'); } public function testWhitelistedDocumentTypesAreAllowed() { $this->deserializationVisitors->get('xml')->get()->setDoctypeWhitelist(array( '', ']>')); $this->serializer->deserialize(' ', 'stdClass', 'xml'); $this->serializer->deserialize(' ]> ', 'stdClass', 'xml'); } public function testVirtualAttributes() { $this->assertEquals( $this->getContent('virtual_attributes'), $this->serialize(new ObjectWithVirtualXmlProperties(), SerializationContext::create()->setGroups(array('attributes'))) ); } public function testVirtualValues() { $this->assertEquals( $this->getContent('virtual_values'), $this->serialize(new ObjectWithVirtualXmlProperties(), SerializationContext::create()->setGroups(array('values'))) ); } public function testVirtualXmlList() { $this->assertEquals( $this->getContent('virtual_properties_list'), $this->serialize(new ObjectWithVirtualXmlProperties(), SerializationContext::create()->setGroups(array('list'))) ); } public function testVirtualXmlMap() { $this->assertEquals( $this->getContent('virtual_properties_map'), $this->serialize(new ObjectWithVirtualXmlProperties(), SerializationContext::create()->setGroups(array('map'))) ); } public function testArrayKeyValues() { $this->assertEquals($this->getContent('array_key_values'), $this->serializer->serialize(new ObjectWithXmlKeyValuePairs(), 'xml')); } /** * @expectedException JMS\Serializer\Exception\RuntimeException * @expectedExceptionMessage Unsupported value type for XML attribute map. Expected array but got object */ public function testXmlAttributeMapWithoutArray() { $attributes = new \ArrayObject(array( 'type' => 'text', )); $this->serializer->serialize(new Input($attributes), $this->getFormat()); } public function testDeserializingNull() { $this->markTestSkipped('Not supported in XML.'); } /** * @param string $key */ protected function getContent($key) { if (!file_exists($file = __DIR__.'/xml/'.$key.'.xml')) { throw new InvalidArgumentException(sprintf('The key "%s" is not supported.', $key)); } return file_get_contents($file); } protected function getFormat() { return 'xml'; } }