WritingUtilsTest.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. namespace Knuckles\Scribe\Tests\Unit;
  3. use Knuckles\Scribe\Tests\BaseLaravelTest;
  4. use Knuckles\Scribe\Tools\WritingUtils;
  5. class WritingUtilsTest extends BaseLaravelTest
  6. {
  7. /** @test */
  8. public function print_query_params_as_key_value_js()
  9. {
  10. $queryParams = WritingUtils::printQueryParamsAsKeyValue($this->queryParams());
  11. $this->assertStringsEqualNormalizingNewlines(<<<EOL
  12. {
  13. "name query": "name value",
  14. "list query[0]": "list element 1",
  15. "list query[1]": "list element 2",
  16. "nested query[nested query level 1 array][nested query level 2 list][0]": "nested level 2 list element 1",
  17. "nested query[nested query level 1 array][nested query level 2 list][1]": "nested level 2 list element 2",
  18. "nested query[nested query level 1 array][nested query level 2 query]": "name nested 2",
  19. "nested query[nested query level 1 query]": "name nested 1",
  20. }
  21. EOL, $queryParams);
  22. }
  23. /** @test */
  24. public function print_query_params_as_key_value_php()
  25. {
  26. $queryParams = WritingUtils::printQueryParamsAsKeyValue($this->queryParams(), "'", " =>", 4, "[]");
  27. $this->assertStringsEqualNormalizingNewlines(<<<EOL
  28. [
  29. 'name query' => 'name value',
  30. 'list query[0]' => 'list element 1',
  31. 'list query[1]' => 'list element 2',
  32. 'nested query[nested query level 1 array][nested query level 2 list][0]' => 'nested level 2 list element 1',
  33. 'nested query[nested query level 1 array][nested query level 2 list][1]' => 'nested level 2 list element 2',
  34. 'nested query[nested query level 1 array][nested query level 2 query]' => 'name nested 2',
  35. 'nested query[nested query level 1 query]' => 'name nested 1',
  36. ]
  37. EOL, $queryParams);
  38. }
  39. /** @test */
  40. public function print_query_params_as_key_value_python()
  41. {
  42. $queryParams = WritingUtils::printQueryParamsAsKeyValue($this->queryParams(), "'", ":", 2, "{}");
  43. $this->assertStringsEqualNormalizingNewlines(<<<EOL
  44. {
  45. 'name query': 'name value',
  46. 'list query[0]': 'list element 1',
  47. 'list query[1]': 'list element 2',
  48. 'nested query[nested query level 1 array][nested query level 2 list][0]': 'nested level 2 list element 1',
  49. 'nested query[nested query level 1 array][nested query level 2 list][1]': 'nested level 2 list element 2',
  50. 'nested query[nested query level 1 array][nested query level 2 query]': 'name nested 2',
  51. 'nested query[nested query level 1 query]': 'name nested 1',
  52. }
  53. EOL, $queryParams);
  54. }
  55. /** @test */
  56. public function print_query_params_as_string_bash()
  57. {
  58. $queryParams = WritingUtils::printQueryParamsAsString($this->queryParams());
  59. $expected = implode('&', [
  60. 'name+query=name+value',
  61. 'list+query[]=list+element+1',
  62. 'list+query[]=list+element+2',
  63. 'nested+query[nested+query+level+1+array][nested+query+level+2+list][]=nested+level+2+list+element+1',
  64. 'nested+query[nested+query+level+1+array][nested+query+level+2+list][]=nested+level+2+list+element+2',
  65. 'nested+query[nested+query+level+1+array][nested+query+level+2+query]=name+nested+2',
  66. 'nested+query[nested+query+level+1+query]=name+nested+1',
  67. ]);
  68. $this->assertEquals($expected, $queryParams);
  69. }
  70. /** @test */
  71. public function get_sample_body_with_array_fields()
  72. {
  73. $sampleBody = WritingUtils::getSampleBody($this->bodyParamsWithArrayFields());
  74. $expected = [
  75. 'name' => 'Experience Form',
  76. 'fields' => [
  77. [
  78. 'name' => 'experience',
  79. 'label' => 'Experience',
  80. 'type' => 'textarea',
  81. 'order' => 1,
  82. ],
  83. ],
  84. ];
  85. $this->assertEquals($expected, $sampleBody);
  86. }
  87. private function queryParams(): array
  88. {
  89. return [
  90. 'name query' => 'name value',
  91. 'list query' => [
  92. 'list element 1',
  93. 'list element 2',
  94. ],
  95. 'nested query' => [
  96. 'nested query level 1 array' => [
  97. 'nested query level 2 list' => [
  98. 'nested level 2 list element 1',
  99. 'nested level 2 list element 2',
  100. ],
  101. 'nested query level 2 query' => 'name nested 2',
  102. ],
  103. 'nested query level 1 query' => 'name nested 1'
  104. ],
  105. ];
  106. }
  107. private function bodyParamsWithArrayFields(): array
  108. {
  109. return [
  110. 'name' => [
  111. 'name' => 'name',
  112. 'description' => 'Form\'s name',
  113. 'required' => true,
  114. 'example' => 'Experience Form',
  115. 'type' => 'string',
  116. 'custom' => [],
  117. '__fields' => [],
  118. ],
  119. 'fields' => [
  120. 'name' => 'fields',
  121. 'description' => 'Form\'s fields',
  122. 'required' => false,
  123. 'example' => [[]],
  124. 'type' => 'object[]',
  125. 'custom' => [],
  126. '__fields' => [
  127. 'name' => [
  128. 'name' => 'fields[].name',
  129. 'description' => 'Field\'s name',
  130. 'required' => true,
  131. 'example' => 'experience',
  132. 'type' => 'string',
  133. 'custom' => [],
  134. ],
  135. 'label' => [
  136. 'name' => 'fields[].label',
  137. 'description' => 'Field\'s label',
  138. 'required' => true,
  139. 'example' => 'Experience',
  140. 'type' => 'string',
  141. 'custom' => [],
  142. ],
  143. 'type' => [
  144. 'name' => 'fields[].type',
  145. 'description' => 'Field\'s type',
  146. 'required' => true,
  147. 'example' => 'textarea',
  148. 'type' => 'string',
  149. 'custom' => [],
  150. ],
  151. 'order' => [
  152. 'name' => 'fields[].order',
  153. 'description' => 'Field\'s order',
  154. 'required' => true,
  155. 'example' => 1,
  156. 'type' => 'number',
  157. 'custom' => [],
  158. ],
  159. ],
  160. ],
  161. ];
  162. }
  163. protected function assertStringsEqualNormalizingNewlines(string $expected, string $actual)
  164. {
  165. $this->assertEquals(str_replace("\r", "", $expected), str_replace("\r", "", $actual));
  166. }
  167. }