796 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			796 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| namespace GuzzleHttp\Tests\Command\Guzzle\ResponseLocation;
 | |
| 
 | |
| use GuzzleHttp\Command\Guzzle\Parameter;
 | |
| use GuzzleHttp\Command\Guzzle\ResponseLocation\XmlLocation;
 | |
| use GuzzleHttp\Command\Result;
 | |
| use GuzzleHttp\Psr7\Response;
 | |
| 
 | |
| /**
 | |
|  * @covers \GuzzleHttp\Command\Guzzle\ResponseLocation\XmlLocation
 | |
|  */
 | |
| class XmlLocationTest extends \PHPUnit_Framework_TestCase
 | |
| {
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testVisitsLocation()
 | |
|     {
 | |
|         $location = new XmlLocation();
 | |
|         $parameter = new Parameter([
 | |
|             'name'    => 'val',
 | |
|             'sentAs'  => 'vim',
 | |
|             'filters' => ['strtoupper']
 | |
|         ]);
 | |
|         $model = new Parameter();
 | |
|         $response = new Response(200, [], \GuzzleHttp\Psr7\stream_for('<w><vim>bar</vim></w>'));
 | |
|         $result = new Result();
 | |
|         $result = $location->before($result, $response, $model);
 | |
|         $result = $location->visit($result, $response, $parameter);
 | |
|         $result = $location->after($result, $response, $model);
 | |
|         $this->assertEquals('BAR', $result['val']);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testVisitsAdditionalProperties()
 | |
|     {
 | |
|         $location = new XmlLocation();
 | |
|         $parameter = new Parameter();
 | |
|         $model = new Parameter(['additionalProperties' => ['location' => 'xml']]);
 | |
|         $response = new Response(200, [], \GuzzleHttp\Psr7\stream_for('<w><vim>bar</vim></w>'));
 | |
|         $result = new Result();
 | |
|         $result = $location->before($result, $response, $parameter);
 | |
|         $result = $location->visit($result, $response, $parameter);
 | |
|         $result = $location->after($result, $response, $model);
 | |
|         $this->assertEquals('bar', $result['vim']);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testEnsuresFlatArraysAreFlat()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'location' => 'xml',
 | |
|             'name'     => 'foo',
 | |
|             'type'     => 'array',
 | |
|             'items'    => ['type' => 'string'],
 | |
|         ]);
 | |
| 
 | |
|         $xml = '<xml><foo>bar</foo><foo>baz</foo></xml>';
 | |
|         $this->xmlTest($param, $xml, ['foo' => ['bar', 'baz']]);
 | |
|         $this->xmlTest($param, '<xml><foo>bar</foo></xml>', ['foo' => ['bar']]);
 | |
|     }
 | |
| 
 | |
|     public function xmlDataProvider()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'location' => 'xml',
 | |
|             'name'     => 'Items',
 | |
|             'type'     => 'array',
 | |
|             'items'    => [
 | |
|                 'type'       => 'object',
 | |
|                 'name'       => 'Item',
 | |
|                 'properties' => [
 | |
|                     'Bar' => ['type' => 'string'],
 | |
|                     'Baz' => ['type' => 'string'],
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
| 
 | |
|         return [
 | |
|             [$param, '<Test><Items><Item><Bar>1</Bar></Item><Item><Bar>2</Bar></Item></Items></Test>', [
 | |
|                 'Items' => [
 | |
|                     ['Bar' => 1],
 | |
|                     ['Bar' => 2],
 | |
|                 ],
 | |
|             ]],
 | |
|             [$param, '<Test><Items><Item><Bar>1</Bar></Item></Items></Test>', [
 | |
|                 'Items' => [
 | |
|                     ['Bar' => 1],
 | |
|                 ]
 | |
|             ]],
 | |
|             [$param, '<Test><Items /></Test>', [
 | |
|                 'Items' => [],
 | |
|             ]]
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @dataProvider xmlDataProvider
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testEnsuresWrappedArraysAreInCorrectLocations($param, $xml, $expected)
 | |
|     {
 | |
|         $location = new XmlLocation();
 | |
|         $model = new Parameter();
 | |
|         $response = new Response(200, [], \GuzzleHttp\Psr7\stream_for($xml));
 | |
|         $result = new Result();
 | |
|         $result = $location->before($result, $response, $param);
 | |
|         $result = $location->visit($result, $response, $param);
 | |
|         $result = $location->after($result, $response, $model);
 | |
|         $this->assertEquals($expected, $result->toArray());
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testCanRenameValues()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'name'     => 'TerminatingInstances',
 | |
|             'type'     => 'array',
 | |
|             'location' => 'xml',
 | |
|             'sentAs'   => 'instancesSet',
 | |
|             'items'    => [
 | |
|                 'name'       => 'item',
 | |
|                 'type'       => 'object',
 | |
|                 'sentAs'     => 'item',
 | |
|                 'properties' => [
 | |
|                     'InstanceId'    => [
 | |
|                         'type'   => 'string',
 | |
|                         'sentAs' => 'instanceId',
 | |
|                     ],
 | |
|                     'CurrentState'  => [
 | |
|                         'type'       => 'object',
 | |
|                         'sentAs'     => 'currentState',
 | |
|                         'properties' => [
 | |
|                             'Code' => [
 | |
|                                 'type'   => 'numeric',
 | |
|                                 'sentAs' => 'code',
 | |
|                             ],
 | |
|                             'Name' => [
 | |
|                                 'type'   => 'string',
 | |
|                                 'sentAs' => 'name',
 | |
|                             ],
 | |
|                         ],
 | |
|                     ],
 | |
|                     'PreviousState' => [
 | |
|                         'type'       => 'object',
 | |
|                         'sentAs'     => 'previousState',
 | |
|                         'properties' => [
 | |
|                             'Code' => [
 | |
|                                 'type'   => 'numeric',
 | |
|                                 'sentAs' => 'code',
 | |
|                             ],
 | |
|                             'Name' => [
 | |
|                                 'type'   => 'string',
 | |
|                                 'sentAs' => 'name',
 | |
|                             ],
 | |
|                         ],
 | |
|                     ],
 | |
|                 ],
 | |
|             ]
 | |
|         ]);
 | |
| 
 | |
|         $xml = '
 | |
|             <xml>
 | |
|                 <instancesSet>
 | |
|                     <item>
 | |
|                         <instanceId>i-3ea74257</instanceId>
 | |
|                         <currentState>
 | |
|                             <code>32</code>
 | |
|                             <name>shutting-down</name>
 | |
|                         </currentState>
 | |
|                         <previousState>
 | |
|                             <code>16</code>
 | |
|                             <name>running</name>
 | |
|                         </previousState>
 | |
|                     </item>
 | |
|                 </instancesSet>
 | |
|             </xml>
 | |
|         ';
 | |
| 
 | |
|         $this->xmlTest($param, $xml, [
 | |
|             'TerminatingInstances' => [
 | |
|                 [
 | |
|                     'InstanceId'    => 'i-3ea74257',
 | |
|                     'CurrentState'  => [
 | |
|                         'Code' => '32',
 | |
|                         'Name' => 'shutting-down',
 | |
|                     ],
 | |
|                     'PreviousState' => [
 | |
|                         'Code' => '16',
 | |
|                         'Name' => 'running',
 | |
|                     ],
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testCanRenameAttributes()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'name'     => 'RunningQueues',
 | |
|             'type'     => 'array',
 | |
|             'location' => 'xml',
 | |
|             'items'    => [
 | |
|                 'type'       => 'object',
 | |
|                 'sentAs'     => 'item',
 | |
|                 'properties' => [
 | |
|                     'QueueId'       => [
 | |
|                         'type'   => 'string',
 | |
|                         'sentAs' => 'queue_id',
 | |
|                         'data'   => [
 | |
|                             'xmlAttribute' => true,
 | |
|                         ],
 | |
|                     ],
 | |
|                     'CurrentState'  => [
 | |
|                         'type'       => 'object',
 | |
|                         'properties' => [
 | |
|                             'Code' => [
 | |
|                                 'type'   => 'numeric',
 | |
|                                 'sentAs' => 'code',
 | |
|                                 'data'   => [
 | |
|                                     'xmlAttribute' => true,
 | |
|                                 ],
 | |
|                             ],
 | |
|                             'Name' => [
 | |
|                                 'sentAs' => 'name',
 | |
|                                 'data'   => [
 | |
|                                     'xmlAttribute' => true,
 | |
|                                 ],
 | |
|                             ],
 | |
|                         ],
 | |
|                     ],
 | |
|                     'PreviousState' => [
 | |
|                         'type'       => 'object',
 | |
|                         'properties' => [
 | |
|                             'Code' => [
 | |
|                                 'type'   => 'numeric',
 | |
|                                 'sentAs' => 'code',
 | |
|                                 'data'   => [
 | |
|                                     'xmlAttribute' => true,
 | |
|                                 ],
 | |
|                             ],
 | |
|                             'Name' => [
 | |
|                                 'sentAs' => 'name',
 | |
|                                 'data'   => [
 | |
|                                     'xmlAttribute' => true,
 | |
|                                 ],
 | |
|                             ],
 | |
|                         ],
 | |
|                     ],
 | |
|                 ],
 | |
|             ]
 | |
|         ]);
 | |
| 
 | |
|         $xml = '
 | |
|             <wrap>
 | |
|                 <RunningQueues>
 | |
|                     <item queue_id="q-3ea74257">
 | |
|                         <CurrentState code="32" name="processing" />
 | |
|                         <PreviousState code="16" name="wait" />
 | |
|                     </item>
 | |
|                 </RunningQueues>
 | |
|             </wrap>';
 | |
| 
 | |
|         $this->xmlTest($param, $xml, [
 | |
|             'RunningQueues' => [
 | |
|                 [
 | |
|                     'QueueId'       => 'q-3ea74257',
 | |
|                     'CurrentState'  => [
 | |
|                         'Code' => '32',
 | |
|                         'Name' => 'processing',
 | |
|                     ],
 | |
|                     'PreviousState' => [
 | |
|                         'Code' => '16',
 | |
|                         'Name' => 'wait',
 | |
|                     ],
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testAddsEmptyArraysWhenValueIsMissing()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'name'     => 'Foo',
 | |
|             'type'     => 'array',
 | |
|             'location' => 'xml',
 | |
|             'items'    => [
 | |
|                 'type'       => 'object',
 | |
|                 'properties' => [
 | |
|                     'Baz' => ['type' => 'array'],
 | |
|                     'Bar' => [
 | |
|                         'type'       => 'object',
 | |
|                         'properties' => [
 | |
|                             'Baz' => ['type' => 'array'],
 | |
|                         ],
 | |
|                     ],
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
| 
 | |
|         $xml = '<xml><Foo><Bar></Bar></Foo></xml>';
 | |
| 
 | |
|         $this->xmlTest($param, $xml, [
 | |
|             'Foo' => [
 | |
|                 [
 | |
|                     'Bar' => [],
 | |
|                 ]
 | |
|             ],
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group issue-399, ResponseLocation
 | |
|      * @link  https://github.com/guzzle/guzzle/issues/399
 | |
|      */
 | |
|     public function testDiscardingUnknownProperties()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'name'                 => 'foo',
 | |
|             'type'                 => 'object',
 | |
|             'additionalProperties' => false,
 | |
|             'properties'           => [
 | |
|                 'bar' => [
 | |
|                     'type' => 'string',
 | |
|                     'name' => 'bar',
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
| 
 | |
|         $xml = '
 | |
|             <xml>
 | |
|                 <foo>
 | |
|                     <bar>15</bar>
 | |
|                     <unknown>discard me</unknown>
 | |
|                 </foo>
 | |
|             </xml>
 | |
|         ';
 | |
| 
 | |
|         $this->xmlTest($param, $xml, [
 | |
|             'foo' => [
 | |
|                 'bar' => 15
 | |
|             ]
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group issue-399, ResponseLocation
 | |
|      * @link  https://github.com/guzzle/guzzle/issues/399
 | |
|      */
 | |
|     public function testDiscardingUnknownPropertiesWithAliasing()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'name'                 => 'foo',
 | |
|             'type'                 => 'object',
 | |
|             'additionalProperties' => false,
 | |
|             'properties'           => [
 | |
|                 'bar' => [
 | |
|                     'name'   => 'bar',
 | |
|                     'sentAs' => 'baz',
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
| 
 | |
|         $xml = '
 | |
|             <xml>
 | |
|                 <foo>
 | |
|                     <baz>15</baz>
 | |
|                     <unknown>discard me</unknown>
 | |
|                 </foo>
 | |
|             </xml>
 | |
|         ';
 | |
| 
 | |
|         $this->xmlTest($param, $xml, [
 | |
|             'foo' => [
 | |
|                 'bar' => 15,
 | |
|             ],
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testProcessingOfNestedAdditionalProperties()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'name'                 => 'foo',
 | |
|             'type'                 => 'object',
 | |
|             'additionalProperties' => true,
 | |
|             'properties'           => [
 | |
|                 'bar' => [
 | |
|                     'name'   => 'bar',
 | |
|                     'sentAs' => 'baz',
 | |
|                 ],
 | |
|                 'nestedNoAdditional'  => [
 | |
|                     'type' => 'object',
 | |
|                     'additionalProperties' => false,
 | |
|                     'properties' => [
 | |
|                         'id' => [
 | |
|                             'type' => 'integer',
 | |
|                         ],
 | |
|                     ],
 | |
|                 ],
 | |
|                 'nestedWithAdditional' => [
 | |
|                     'type' => 'object',
 | |
|                     'additionalProperties' => true,
 | |
|                 ],
 | |
|                 'nestedWithAdditionalSchema' => [
 | |
|                     'type' => 'object',
 | |
|                     'additionalProperties' => [
 | |
|                         'type'  => 'array',
 | |
|                         'items' => [
 | |
|                             'type' => 'string',
 | |
|                         ],
 | |
|                     ],
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
| 
 | |
|         $xml = '
 | |
|             <xml>
 | |
|                 <foo>
 | |
|                     <baz>15</baz>
 | |
|                     <additional>include me</additional>
 | |
|                     <nestedNoAdditional>
 | |
|                         <id>15</id>
 | |
|                         <unknown>discard me</unknown>
 | |
|                     </nestedNoAdditional>
 | |
|                     <nestedWithAdditional>
 | |
|                         <id>15</id>
 | |
|                         <additional>include me</additional>
 | |
|                     </nestedWithAdditional>
 | |
|                     <nestedWithAdditionalSchema>
 | |
|                         <arrayA>
 | |
|                             <item>1</item>
 | |
|                             <item>2</item>
 | |
|                             <item>3</item>
 | |
|                         </arrayA>
 | |
|                         <arrayB>
 | |
|                             <item>A</item>
 | |
|                             <item>B</item>
 | |
|                             <item>C</item>
 | |
|                         </arrayB>
 | |
|                     </nestedWithAdditionalSchema>
 | |
|                 </foo>
 | |
|             </xml>
 | |
|         ';
 | |
| 
 | |
|         $this->xmlTest($param, $xml, [
 | |
|             'foo' => [
 | |
|                 'bar' => '15',
 | |
|                 'additional' => 'include me',
 | |
|                 'nestedNoAdditional' => [
 | |
|                     'id' => '15',
 | |
|                 ],
 | |
|                 'nestedWithAdditional' => [
 | |
|                     'id'         => '15',
 | |
|                     'additional' => 'include me',
 | |
|                 ],
 | |
|                 'nestedWithAdditionalSchema' => [
 | |
|                     'arrayA' => ['1', '2', '3'],
 | |
|                     'arrayB' => ['A', 'B', 'C'],
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testConvertsMultipleAssociativeElementsToArray()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'name'                 => 'foo',
 | |
|             'type'                 => 'object',
 | |
|             'additionalProperties' => true,
 | |
|         ]);
 | |
| 
 | |
|         $xml = '
 | |
|             <xml>
 | |
|                 <foo>
 | |
|                     <baz>15</baz>
 | |
|                     <baz>25</baz>
 | |
|                     <bar>hi</bar>
 | |
|                     <bam>test</bam>
 | |
|                     <bam attr="hi" />
 | |
|                 </foo>
 | |
|             </xml>
 | |
|         ';
 | |
| 
 | |
|         $this->xmlTest($param, $xml, [
 | |
|             'foo' => [
 | |
|                 'baz' => ['15', '25'],
 | |
|                 'bar' => 'hi',
 | |
|                 'bam' => [
 | |
|                     'test',
 | |
|                     ['@attributes' => ['attr' => 'hi']]
 | |
|                 ]
 | |
|             ]
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testUnderstandsNamespaces()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'name'     => 'nstest',
 | |
|             'type'     => 'array',
 | |
|             'location' => 'xml',
 | |
|             'items'    => [
 | |
|                 'name'       => 'item',
 | |
|                 'type'       => 'object',
 | |
|                 'sentAs'     => 'item',
 | |
|                 'properties' => [
 | |
|                     'id'           => [
 | |
|                         'type' => 'string',
 | |
|                     ],
 | |
|                     'isbn:number'  => [
 | |
|                         'type' => 'string',
 | |
|                     ],
 | |
|                     'meta'         => [
 | |
|                         'type'       => 'object',
 | |
|                         'sentAs'     => 'abstract:meta',
 | |
|                         'properties' => [
 | |
|                             'foo' => [
 | |
|                                 'type' => 'numeric',
 | |
|                             ],
 | |
|                             'bar' => [
 | |
|                                 'type'       => 'object',
 | |
|                                 'properties' =>[
 | |
|                                     'attribute' => [
 | |
|                                         'type' => 'string',
 | |
|                                         'data' => [
 | |
|                                             'xmlAttribute' => true,
 | |
|                                             'xmlNs'        => 'abstract',
 | |
|                                         ],
 | |
|                                     ],
 | |
|                                 ],
 | |
|                             ],
 | |
|                         ],
 | |
|                     ],
 | |
|                     'gamma'        => [
 | |
|                         'type'                 => 'object',
 | |
|                         'data'                 => [
 | |
|                             'xmlNs' => 'abstract',
 | |
|                         ],
 | |
|                         'additionalProperties' => true,
 | |
|                     ],
 | |
|                     'nonExistent'  => [
 | |
|                         'type'                 => 'object',
 | |
|                         'data'                 => [
 | |
|                             'xmlNs' => 'abstract',
 | |
|                         ],
 | |
|                         'additionalProperties' => true,
 | |
|                     ],
 | |
|                     'nonExistent2' => [
 | |
|                         'type'                 => 'object',
 | |
|                         'additionalProperties' => true,
 | |
|                     ],
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
| 
 | |
|         $xml = '
 | |
|             <xml>
 | |
|                 <nstest xmlns:isbn="urn:ISBN:0-395-36341-6" xmlns:abstract="urn:my.org:abstract">
 | |
|                     <item>
 | |
|                         <id>101</id>
 | |
|                         <isbn:number>1568491379</isbn:number>
 | |
|                         <abstract:meta>
 | |
|                             <foo>10</foo>
 | |
|                             <bar abstract:attribute="foo"></bar>
 | |
|                         </abstract:meta>
 | |
|                         <abstract:gamma>
 | |
|                             <foo>bar</foo>
 | |
|                         </abstract:gamma>
 | |
|                     </item>
 | |
|                     <item>
 | |
|                         <id>102</id>
 | |
|                         <isbn:number>1568491999</isbn:number>
 | |
|                         <abstract:meta>
 | |
|                             <foo>20</foo>
 | |
|                             <bar abstract:attribute="bar"></bar>
 | |
|                         </abstract:meta>
 | |
|                         <abstract:gamma>
 | |
|                             <foo>baz</foo>
 | |
|                         </abstract:gamma>
 | |
|                     </item>
 | |
|                 </nstest>
 | |
|             </xml>
 | |
|         ';
 | |
| 
 | |
|         $this->xmlTest($param, $xml, [
 | |
|             'nstest' => [
 | |
|                 [
 | |
|                     'id'          => '101',
 | |
|                     'isbn:number' => 1568491379,
 | |
|                     'meta'        => [
 | |
|                         'foo' => 10,
 | |
|                         'bar' => [
 | |
|                             'attribute' => 'foo',
 | |
|                         ],
 | |
|                     ],
 | |
|                     'gamma'       => [
 | |
|                         'foo' => 'bar',
 | |
|                     ],
 | |
|                 ],
 | |
|                 [
 | |
|                     'id'          => '102',
 | |
|                     'isbn:number' => 1568491999,
 | |
|                     'meta'        => [
 | |
|                         'foo' => 20,
 | |
|                         'bar' => [
 | |
|                             'attribute' => 'bar'
 | |
|                         ],
 | |
|                     ],
 | |
|                     'gamma'       => [
 | |
|                         'foo' => 'baz',
 | |
|                     ],
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testCanWalkUndefinedPropertiesWithNamespace()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'name'     => 'nstest',
 | |
|             'type'     => 'array',
 | |
|             'location' => 'xml',
 | |
|             'items'    => [
 | |
|                 'name' => 'item',
 | |
|                 'type' => 'object',
 | |
|                 'sentAs' => 'item',
 | |
|                 'additionalProperties' => [
 | |
|                     'type' => 'object',
 | |
|                     'data' => [
 | |
|                         'xmlNs' => 'abstract'
 | |
|                     ],
 | |
|                 ],
 | |
|                 'properties' => [
 | |
|                     'id' => [
 | |
|                         'type' => 'string',
 | |
|                     ],
 | |
|                     'isbn:number' => [
 | |
|                         'type' => 'string',
 | |
|                     ],
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
| 
 | |
|         $xml = '
 | |
|             <xml>
 | |
|                 <nstest xmlns:isbn="urn:ISBN:0-395-36341-6" xmlns:abstract="urn:my.org:abstract">
 | |
|                     <item>
 | |
|                         <id>101</id>
 | |
|                         <isbn:number>1568491379</isbn:number>
 | |
|                         <abstract:meta>
 | |
|                             <foo>10</foo>
 | |
|                             <bar>baz</bar>
 | |
|                         </abstract:meta>
 | |
|                     </item>
 | |
|                     <item>
 | |
|                         <id>102</id>
 | |
|                         <isbn:number>1568491999</isbn:number>
 | |
|                         <abstract:meta>
 | |
|                             <foo>20</foo>
 | |
|                             <bar>foo</bar>
 | |
|                         </abstract:meta>
 | |
|                     </item>
 | |
|                 </nstest>
 | |
|             </xml>
 | |
|         ';
 | |
| 
 | |
|         $this->xmlTest($param, $xml, [
 | |
|             'nstest' => [
 | |
|                 [
 | |
|                     'id'          => '101',
 | |
|                     'isbn:number' => 1568491379,
 | |
|                     'meta'        => [
 | |
|                         'foo' => 10,
 | |
|                         'bar' => 'baz',
 | |
|                     ],
 | |
|                 ],
 | |
|                 [
 | |
|                     'id'          => '102',
 | |
|                     'isbn:number' => 1568491999,
 | |
|                     'meta'        => [
 | |
|                         'foo' => 20,
 | |
|                         'bar' => 'foo',
 | |
|                     ],
 | |
|                 ],
 | |
|             ]
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testCanWalkSimpleArrayWithNamespace()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'name'     => 'nstest',
 | |
|             'type'     => 'array',
 | |
|             'location' => 'xml',
 | |
|             'items'    => [
 | |
|                 'type'   => 'string',
 | |
|                 'sentAs' => 'number',
 | |
|                 'data'   => [
 | |
|                     'xmlNs' => 'isbn'
 | |
|                 ],
 | |
|             ],
 | |
|         ]);
 | |
| 
 | |
|         $xml = '
 | |
|             <xml>
 | |
|                 <nstest xmlns:isbn="urn:ISBN:0-395-36341-6">
 | |
|                     <isbn:number>1568491379</isbn:number>
 | |
|                     <isbn:number>1568491999</isbn:number>
 | |
|                     <isbn:number>1568492999</isbn:number>
 | |
|                 </nstest>
 | |
|             </xml>
 | |
|         ';
 | |
| 
 | |
|         $this->xmlTest($param, $xml, [
 | |
|             'nstest' => [
 | |
|                 1568491379,
 | |
|                 1568491999,
 | |
|                 1568492999,
 | |
|             ],
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @group ResponseLocation
 | |
|      */
 | |
|     public function testCanWalkSimpleArrayWithNamespace2()
 | |
|     {
 | |
|         $param = new Parameter([
 | |
|             'name'     => 'nstest',
 | |
|             'type'     => 'array',
 | |
|             'location' => 'xml',
 | |
|             'items'    => [
 | |
|                 'type'   => 'string',
 | |
|                 'sentAs' => 'isbn:number',
 | |
|             ]
 | |
|         ]);
 | |
| 
 | |
|         $xml = '
 | |
|             <xml>
 | |
|                 <nstest xmlns:isbn="urn:ISBN:0-395-36341-6">
 | |
|                     <isbn:number>1568491379</isbn:number>
 | |
|                     <isbn:number>1568491999</isbn:number>
 | |
|                     <isbn:number>1568492999</isbn:number>
 | |
|                 </nstest>
 | |
|             </xml>
 | |
|         ';
 | |
| 
 | |
|         $this->xmlTest($param, $xml, [
 | |
|             'nstest' => [
 | |
|                 1568491379,
 | |
|                 1568491999,
 | |
|                 1568492999,
 | |
|             ],
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     private function xmlTest(Parameter $param, $xml, $expected)
 | |
|     {
 | |
|         $location = new XmlLocation();
 | |
|         $model = new Parameter();
 | |
|         $response = new Response(200, [], \GuzzleHttp\Psr7\stream_for($xml));
 | |
|         $result = new Result();
 | |
|         $result = $location->before($result, $response, $param);
 | |
|         $result = $location->visit($result, $response, $param);
 | |
|         $result = $location->after($result, $response, $model);
 | |
|         $this->assertEquals($expected, $result->toArray());
 | |
|     }
 | |
| }
 |