PageRenderTime 45ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/OData Producer for PHP/Tests/UriProcessor/ResourcePathProcessor/SegmentParser/KeyDescriptorTest.php

#
PHP | 267 lines | 218 code | 33 blank | 16 comment | 6 complexity | 2eb2ebccfb907cd8155acb828eb0ff40 MD5 | raw file
  1. <?php
  2. use ODataProducer\UriProcessor\ResourcePathProcessor\SegmentParser\KeyDescriptor;
  3. use ODataProducer\Common\InvalidOperationException;
  4. use ODataProducer\Common\ODataException;
  5. require_once 'PHPUnit\Framework\Assert.php';
  6. require_once 'PHPUnit\Framework\Test.php';
  7. require_once 'PHPUnit\Framework\SelfDescribing.php';
  8. require_once 'PHPUnit\Framework\TestCase.php';
  9. require_once 'PHPUnit\Framework\TestSuite.php';
  10. require_once 'ODataProducer\Common\ClassAutoLoader.php';
  11. require_once (dirname(__FILE__) . "\..\..\..\Resources\NorthWindMetadata.php");
  12. ODataProducer\Common\ClassAutoLoader::register();
  13. class TestKeyDescriptor extends PHPUnit_Framework_TestCase
  14. {
  15. protected function setUp()
  16. {
  17. }
  18. public function testKeyPredicateParsing()
  19. {
  20. try {
  21. $keyDescriptor = null;
  22. $keyPredicate = ' ';
  23. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  24. $this->assertTrue($validPredicateSyntax);
  25. $this->assertFalse(is_null($keyDescriptor));
  26. $this->assertTrue($keyDescriptor->isEmpty());
  27. $this->assertEquals($keyDescriptor->valueCount(), 0);
  28. $keyDescriptor = null;
  29. $keyPredicate = 'ProductID=11, OrderID=2546';
  30. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  31. $this->assertTrue($validPredicateSyntax);
  32. $this->assertFalse(is_null($keyDescriptor));
  33. $this->assertFalse($keyDescriptor->isEmpty());
  34. $this->assertTrue($keyDescriptor->areNamedValues());
  35. $this->assertEquals($keyDescriptor->valueCount(), 2);
  36. $namedValues = $keyDescriptor->getNamedValues();
  37. $this->assertFalse(empty($namedValues));
  38. $this->assertTrue(array_key_exists('ProductID', $namedValues));
  39. $this->assertTrue(array_key_exists('OrderID', $namedValues));
  40. $productVal = $namedValues['ProductID'];
  41. $orderVal = $namedValues['OrderID'];
  42. $this->assertEquals($productVal[0], 11);
  43. $this->assertEquals($orderVal[0], 2546);
  44. $exceptionThrown = false;
  45. try {
  46. $keyDescriptor->getValidatedNamedValues();
  47. } catch (InvalidOperationException $exception) {
  48. $exceptionThrown = true;
  49. }
  50. if (!$exceptionThrown) {
  51. $this->fail('An expected InvalidOperationException has not been raised');
  52. }
  53. $keyDescriptor = null;
  54. $keyPredicate = '11, 2546';
  55. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  56. $this->assertTrue($validPredicateSyntax);
  57. $this->assertFalse(is_null($keyDescriptor));
  58. $this->assertFalse($keyDescriptor->isEmpty());
  59. $this->assertFalse($keyDescriptor->areNamedValues());
  60. $this->assertEquals($keyDescriptor->valueCount(), 2);
  61. $positionalValues = $keyDescriptor->getPositionalValues();
  62. $this->assertFalse(empty($positionalValues));
  63. $productVal = $positionalValues[0];
  64. $orderVal = $positionalValues[1];
  65. $this->assertEquals($productVal[0], 11);
  66. $this->assertEquals($orderVal[0], 2546);
  67. $exceptionThrown = false;
  68. try {
  69. $keyDescriptor->getValidatedNamedValues();
  70. } catch (InvalidOperationException $exception) {
  71. $exceptionThrown = true;
  72. }
  73. if (!$exceptionThrown) {
  74. $this->fail('An expected InvalidOperationException has not been raised');
  75. }
  76. //Test Mixing of Named and Positional values
  77. $keyDescriptor = null;
  78. $keyPredicate = '11, OrderID=2546';
  79. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  80. $this->assertFalse($validPredicateSyntax);
  81. //Test Mixing of Named and Positional values
  82. $keyDescriptor = null;
  83. $keyPredicate = 'ProductID=11, 2546';
  84. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  85. $this->assertFalse($validPredicateSyntax);
  86. //Syntax of single key should be keyName=keyValue
  87. $keyDescriptor = null;
  88. $keyPredicate = 'ProductID, OrderID=2546';
  89. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  90. $this->assertFalse($validPredicateSyntax);
  91. //Syntax of single key should be keyName=keyValue
  92. $keyDescriptor = null;
  93. $keyPredicate = 'ProductID=, OrderID=2546';
  94. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  95. $this->assertFalse($validPredicateSyntax);
  96. //Null is not a valid key value
  97. $keyDescriptor = null;
  98. $keyPredicate = 'ProductID=null, OrderID=2546';
  99. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  100. $this->assertFalse($validPredicateSyntax);
  101. //Identifer is not a valid key value
  102. $keyDescriptor = null;
  103. $keyPredicate = 'ProductID=OrderID';
  104. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  105. $this->assertFalse($validPredicateSyntax);
  106. //Key name duplication not allowed
  107. $keyDescriptor = null;
  108. $keyPredicate = 'ProductID=11, OrderID=2546, ProductID=11';
  109. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  110. $this->assertFalse($validPredicateSyntax);
  111. //comma connot be terminating char
  112. $keyDescriptor = null;
  113. $keyPredicate = 'ProductID=11, OrderID=2546,';
  114. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  115. $this->assertFalse($validPredicateSyntax);
  116. //Guid is a valid key value
  117. $keyDescriptor = null;
  118. $keyPredicate = 'Id=guid\'05b242e7-52eb-46bd-8f0e-6568b72cd9a5\', PlaceName=\'Ktym\'';
  119. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  120. $this->assertTrue($validPredicateSyntax);
  121. $namedValues = $keyDescriptor->getNamedValues();
  122. $this->assertFalse(empty($namedValues));
  123. $this->assertTrue(array_key_exists('Id', $namedValues));
  124. $idVal = $namedValues['Id'];
  125. $this->assertEquals($idVal[0], '\'05b242e7-52eb-46bd-8f0e-6568b72cd9a5\'');
  126. //Test invalid guid
  127. $keyDescriptor = null;
  128. $keyPredicate = 'Id=guid\'05b242e7---52eb-46bd-8f0e-6568b72cd9a5\', PlaceName=\'Ktym\'';
  129. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  130. $this->assertFalse($validPredicateSyntax);
  131. } catch (\Exception $exception) {
  132. $this->fail('An unexpected Exception has been raised.' . $exception->getMessage());
  133. }
  134. }
  135. public function testKeyDescriptorValidation()
  136. {
  137. try {
  138. $northWindMetadata = CreateNorthWindMetadata3::Create();
  139. $orderDetailsResourceType = $northWindMetadata->resolveResourceType('Order_Details');
  140. $this->assertFalse(is_null($orderDetailsResourceType));
  141. $keyDescriptor = null;
  142. //Test with a valid named value key predicate
  143. $keyPredicate = 'ProductID=11, OrderID=2546';
  144. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  145. $this->assertTrue($validPredicateSyntax);
  146. $this->assertFalse(is_null($keyDescriptor));
  147. $keyDescriptor->validate('Order_Details(ProductID=11, OrderID=2546)', $orderDetailsResourceType);
  148. $validatedNamedValues = $keyDescriptor->getValidatedNamedValues();
  149. $this->assertTrue(array_key_exists('ProductID', $validatedNamedValues));
  150. $this->assertTrue(array_key_exists('OrderID', $validatedNamedValues));
  151. $productVal = $validatedNamedValues['ProductID'];
  152. $orderVal = $validatedNamedValues['OrderID'];
  153. $this->assertEquals($productVal[0], 11);
  154. $this->assertEquals($orderVal[0], 2546);
  155. $keyDescriptor = null;
  156. //Test with a valid positional value key predicate
  157. $keyPredicate = '11, 2546';
  158. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  159. $this->assertTrue($validPredicateSyntax);
  160. $this->assertFalse(is_null($keyDescriptor));
  161. $keyDescriptor->validate('Order_Details(11, 2546)', $orderDetailsResourceType);
  162. $validatedNamedValues = $keyDescriptor->getValidatedNamedValues();
  163. $this->assertEquals(count($validatedNamedValues), 2);
  164. $this->assertTrue(array_key_exists('ProductID', $validatedNamedValues));
  165. $this->assertTrue(array_key_exists('OrderID', $validatedNamedValues));
  166. $productVal = $validatedNamedValues['ProductID'];
  167. $orderVal = $validatedNamedValues['OrderID'];
  168. $this->assertEquals($productVal[0], 11);
  169. $this->assertEquals($orderVal[0], 2546);
  170. //Test for key count
  171. $keyDescriptor = null;
  172. $keyPredicate = 'ProductID=11';
  173. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  174. $exceptionThrown = false;
  175. try {
  176. $keyDescriptor->validate('Order_Details(ProductID=11)', $orderDetailsResourceType);
  177. } catch (ODataException $exception) {
  178. $this->assertStringEndsWith(' expect 2 keys but 1 provided', $exception->getMessage());
  179. $exceptionThrown = true;
  180. }
  181. if (!$exceptionThrown) {
  182. $this->fail('An expected ODataException for predicate key count has not been thrown');
  183. }
  184. //test for missing key
  185. $keyDescriptor = null;
  186. $keyPredicate = 'ProductID=11, OrderID1=2546';
  187. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  188. $exceptionThrown = false;
  189. try {
  190. $keyDescriptor->validate('Order_Details(ProductID=11, OrderID1=2546)', $orderDetailsResourceType);
  191. } catch (ODataException $exception) {
  192. $this->assertStringEndsWith('The key predicate expect the keys \'ProductID, OrderID\'', $exception->getMessage());
  193. $exceptionThrown = true;
  194. }
  195. if (!$exceptionThrown) {
  196. $this->fail('An expected ODataException for missing of keys in the predicate has not been thrown');
  197. }
  198. //test for key type
  199. $keyDescriptor = null;
  200. $keyPredicate = 'ProductID=11.12, OrderID=2546';
  201. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  202. $exceptionThrown = false;
  203. try {
  204. $keyDescriptor->validate('Order_Details(ProductID=11.12, OrderID=2546)', $orderDetailsResourceType);
  205. } catch (ODataException $exception) {
  206. $this->assertStringEndsWith('The value of key property \'ProductID\' should be of type Edm.Int32, given Edm.Double', $exception->getMessage());
  207. $exceptionThrown = true;
  208. }
  209. if (!$exceptionThrown) {
  210. $this->fail('An expected ODataException for type incompactibility has not been thrown');
  211. }
  212. //test for key type
  213. $keyDescriptor = null;
  214. $keyPredicate = '11, \'ABCD\'';
  215. $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
  216. $exceptionThrown = false;
  217. try {
  218. $keyDescriptor->validate('Order_Details(11, \'ABCD\')', $orderDetailsResourceType);
  219. } catch (ODataException $exception) {
  220. $this->assertStringEndsWith('The value of key property \'OrderID\' at position 1 should be of type Edm.Int32, given Edm.String', $exception->getMessage());
  221. $exceptionThrown = true;
  222. }
  223. if (!$exceptionThrown) {
  224. $this->fail('An expected ODataException for type incompactibility has not been thrown');
  225. }
  226. } catch (\Exception $exception) {
  227. $this->fail('An unexpected Exception has been raised.' . $exception->getMessage());
  228. }
  229. }
  230. protected function tearDown()
  231. {
  232. }
  233. }
  234. ?>