http_stub 0.27.0 → 0.28.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. checksums.yaml +4 -4
  2. data/lib/http_stub/client.rb +18 -0
  3. data/lib/http_stub/client/client.rb +28 -0
  4. data/lib/http_stub/client/request.rb +38 -0
  5. data/lib/http_stub/client/server.rb +20 -0
  6. data/lib/http_stub/client/session.rb +43 -0
  7. data/lib/http_stub/configurator.rb +61 -0
  8. data/lib/http_stub/configurator/endpoint_template.rb +24 -0
  9. data/lib/http_stub/configurator/part.rb +23 -0
  10. data/lib/http_stub/configurator/scenario.rb +42 -0
  11. data/lib/http_stub/configurator/server.rb +53 -0
  12. data/lib/http_stub/configurator/state.rb +41 -0
  13. data/lib/http_stub/configurator/stub.rb +13 -0
  14. data/lib/http_stub/configurator/stub/stub.rb +75 -0
  15. data/lib/http_stub/{configurer/dsl/stub_builder_template.rb → configurator/stub/template.rb} +5 -5
  16. data/lib/http_stub/extensions/core/object.rb +17 -0
  17. data/lib/http_stub/rake/server_tasks.rb +2 -14
  18. data/lib/http_stub/rake/task_generators.rb +3 -3
  19. data/lib/http_stub/server.rb +110 -0
  20. data/lib/http_stub/server/application/application.rb +10 -6
  21. data/lib/http_stub/server/application/request_support.rb +2 -2
  22. data/lib/http_stub/server/application/routes/memory.rb +1 -6
  23. data/lib/http_stub/server/application/routes/scenario.rb +1 -11
  24. data/lib/http_stub/server/application/routes/session.rb +1 -1
  25. data/lib/http_stub/server/application/routes/status.rb +0 -10
  26. data/lib/http_stub/server/application/routes/stub.rb +2 -12
  27. data/lib/http_stub/server/daemon.rb +1 -10
  28. data/lib/http_stub/server/memory/controller.rb +2 -8
  29. data/lib/http_stub/server/memory/initial_state.rb +27 -0
  30. data/lib/http_stub/server/memory/memory.rb +6 -27
  31. data/lib/http_stub/server/registry.rb +3 -1
  32. data/lib/http_stub/server/request/factory.rb +3 -3
  33. data/lib/http_stub/server/response.rb +12 -6
  34. data/lib/http_stub/server/scenario.rb +2 -2
  35. data/lib/http_stub/server/scenario/controller.rb +3 -13
  36. data/lib/http_stub/server/scenario/registry.rb +25 -0
  37. data/lib/http_stub/server/scenario/scenario.rb +13 -8
  38. data/lib/http_stub/server/session.rb +0 -1
  39. data/lib/http_stub/server/session/controller.rb +7 -8
  40. data/lib/http_stub/server/session/identifier_strategy.rb +9 -2
  41. data/lib/http_stub/server/session/registry.rb +7 -13
  42. data/lib/http_stub/server/session/session.rb +4 -8
  43. data/lib/http_stub/server/stdout_logger.rb +13 -0
  44. data/lib/http_stub/server/stub.rb +3 -2
  45. data/lib/http_stub/server/stub/controller.rb +0 -10
  46. data/lib/http_stub/server/stub/empty.rb +2 -1
  47. data/lib/http_stub/server/stub/match/controller.rb +1 -1
  48. data/lib/http_stub/server/stub/match/exact_value_matcher.rb +2 -1
  49. data/lib/http_stub/server/stub/match/omitted_value_matcher.rb +1 -1
  50. data/lib/http_stub/server/stub/match/regexp_value_matcher.rb +1 -2
  51. data/lib/http_stub/server/stub/match/rule/body.rb +7 -29
  52. data/lib/http_stub/server/stub/match/rule/{json_body.rb → json_schema_body.rb} +1 -1
  53. data/lib/http_stub/server/stub/match/rule/method.rb +1 -1
  54. data/lib/http_stub/server/stub/match/rule/schema_body.rb +39 -0
  55. data/lib/http_stub/server/stub/match/rules.rb +6 -6
  56. data/lib/http_stub/server/stub/match/string_value_matcher.rb +1 -2
  57. data/lib/http_stub/server/stub/registry.rb +4 -4
  58. data/lib/http_stub/server/stub/response.rb +2 -6
  59. data/lib/http_stub/server/stub/response/blocks.rb +33 -0
  60. data/lib/http_stub/server/stub/response/body.rb +21 -0
  61. data/lib/http_stub/server/stub/response/file_body.rb +46 -0
  62. data/lib/http_stub/server/stub/response/headers.rb +24 -0
  63. data/lib/http_stub/server/stub/response/response.rb +52 -0
  64. data/lib/http_stub/server/stub/response/text_body.rb +32 -0
  65. data/lib/http_stub/server/stub/stub.rb +17 -11
  66. data/lib/http_stub/server/stub/triggers.rb +16 -5
  67. data/lib/http_stub/server/views/_file_body_response.haml +1 -0
  68. data/lib/http_stub/server/views/_response.haml +6 -1
  69. data/lib/http_stub/server/views/_text_body_response.haml +1 -0
  70. data/lib/http_stub/server/views/application.sass +31 -31
  71. data/lib/http_stub/version.rb +1 -1
  72. data/spec/acceptance/{configurer_part_spec.rb → configurator_part_spec.rb} +8 -8
  73. data/spec/acceptance/cross_origin_support_spec.rb +9 -11
  74. data/spec/acceptance/endpoint_template_spec.rb +5 -5
  75. data/spec/acceptance/scenario_spec.rb +8 -8
  76. data/spec/acceptance/server_defaults_spec.rb +3 -3
  77. data/spec/acceptance/server_memory_spec.rb +13 -5
  78. data/spec/acceptance/server_status_spec.rb +4 -21
  79. data/spec/acceptance/session_spec.rb +8 -11
  80. data/spec/acceptance/stub_body_request_matching_spec.rb +9 -9
  81. data/spec/acceptance/stub_control_values_spec.rb +74 -82
  82. data/spec/acceptance/stub_match_last_spec.rb +60 -80
  83. data/spec/acceptance/stub_match_list_spec.rb +30 -66
  84. data/spec/acceptance/stub_miss_list_spec.rb +19 -27
  85. data/spec/acceptance/stub_response_block_spec.rb +66 -0
  86. data/spec/acceptance/stub_spec.rb +109 -185
  87. data/spec/acceptance/stub_trigger_spec.rb +12 -89
  88. data/spec/helper.rb +32 -10
  89. data/spec/lib/http_stub/client/client_spec.rb +109 -0
  90. data/spec/lib/http_stub/client/request_integration_spec.rb +74 -0
  91. data/spec/lib/http_stub/client/request_spec.rb +32 -0
  92. data/spec/lib/http_stub/client/server_spec.rb +75 -0
  93. data/spec/lib/http_stub/client/session_spec.rb +117 -0
  94. data/spec/lib/http_stub/client_spec.rb +15 -0
  95. data/spec/lib/http_stub/{configurer/dsl/server_endpoint_template_spec.rb → configurator/endpoint_template_spec.rb} +49 -38
  96. data/spec/lib/http_stub/configurator/part_spec.rb +103 -0
  97. data/spec/lib/http_stub/configurator/scenario_spec.rb +162 -0
  98. data/spec/lib/http_stub/configurator/server_spec.rb +344 -0
  99. data/spec/lib/http_stub/configurator/state_spec.rb +113 -0
  100. data/spec/lib/http_stub/configurator/stub/stub_spec.rb +867 -0
  101. data/spec/lib/http_stub/{configurer/dsl/stub_builder_template_spec.rb → configurator/stub/template_spec.rb} +46 -44
  102. data/spec/lib/http_stub/configurator/stub_spec.rb +27 -0
  103. data/spec/lib/http_stub/configurator_spec.rb +113 -0
  104. data/spec/lib/http_stub/extensions/core/hash_spec.rb +3 -3
  105. data/spec/lib/http_stub/extensions/core/object_spec.rb +29 -0
  106. data/spec/lib/http_stub/rake/server_daemon_tasks_smoke_spec.rb +14 -9
  107. data/spec/lib/http_stub/rake/server_tasks_smoke_spec.rb +25 -53
  108. data/spec/lib/http_stub/rake/server_tasks_spec.rb +12 -55
  109. data/spec/lib/http_stub/server/application/application_spec.rb +4 -49
  110. data/spec/lib/http_stub/server/application/cross_origin_support_spec.rb +2 -5
  111. data/spec/lib/http_stub/server/application/request_support_integration_spec.rb +4 -4
  112. data/spec/lib/http_stub/server/application/request_support_spec.rb +16 -11
  113. data/spec/lib/http_stub/server/application/routes/memory_spec.rb +1 -21
  114. data/spec/lib/http_stub/server/application/routes/scenario_spec.rb +4 -56
  115. data/spec/lib/http_stub/server/application/routes/session_integration_spec.rb +1 -1
  116. data/spec/lib/http_stub/server/application/routes/status_spec.rb +2 -36
  117. data/spec/lib/http_stub/server/application/routes/stub_integration_spec.rb +3 -34
  118. data/spec/lib/http_stub/server/application/routes/stub_spec.rb +6 -55
  119. data/spec/lib/http_stub/server/daemon_integration_spec.rb +5 -1
  120. data/spec/lib/http_stub/server/daemon_spec.rb +8 -77
  121. data/spec/lib/http_stub/server/memory/controller_spec.rb +2 -28
  122. data/spec/lib/http_stub/server/memory/initial_state_spec.rb +57 -0
  123. data/spec/lib/http_stub/server/memory/memory_spec.rb +28 -116
  124. data/spec/lib/http_stub/server/registry_spec.rb +57 -2
  125. data/spec/lib/http_stub/server/request/factory_spec.rb +8 -6
  126. data/spec/lib/http_stub/server/response_spec.rb +32 -10
  127. data/spec/lib/http_stub/server/scenario/controller_spec.rb +14 -53
  128. data/spec/lib/http_stub/server/scenario/registry_spec.rb +147 -0
  129. data/spec/lib/http_stub/server/scenario/scenario_spec.rb +8 -10
  130. data/spec/lib/http_stub/server/scenario_spec.rb +1 -1
  131. data/spec/lib/http_stub/server/session/controller_spec.rb +4 -5
  132. data/spec/lib/http_stub/server/session/identifier_strategy_spec.rb +15 -48
  133. data/spec/lib/http_stub/server/session/registry_spec.rb +15 -28
  134. data/spec/lib/http_stub/server/session/session_spec.rb +13 -71
  135. data/spec/lib/http_stub/server/stdout_logger_spec.rb +17 -0
  136. data/spec/lib/http_stub/server/stub/controller_spec.rb +7 -65
  137. data/spec/lib/http_stub/server/stub/empty_spec.rb +8 -0
  138. data/spec/lib/http_stub/server/stub/match/controller_spec.rb +2 -2
  139. data/spec/lib/http_stub/server/stub/match/exact_value_matcher_spec.rb +49 -11
  140. data/spec/lib/http_stub/server/stub/match/hash_matcher_spec.rb +4 -4
  141. data/spec/lib/http_stub/server/stub/match/match_spec.rb +4 -4
  142. data/spec/lib/http_stub/server/stub/match/miss_spec.rb +2 -2
  143. data/spec/lib/http_stub/server/stub/match/omitted_value_matcher_spec.rb +31 -12
  144. data/spec/lib/http_stub/server/stub/match/regexp_value_matcher_spec.rb +20 -11
  145. data/spec/lib/http_stub/server/stub/match/rule/body_spec.rb +3 -3
  146. data/spec/lib/http_stub/server/stub/match/rule/{json_body_spec.rb → json_schema_body_spec.rb} +5 -5
  147. data/spec/lib/http_stub/server/stub/match/rule/method_spec.rb +42 -8
  148. data/spec/lib/http_stub/server/stub/match/rule/schema_body_spec.rb +64 -0
  149. data/spec/lib/http_stub/server/stub/match/rules_spec.rb +18 -18
  150. data/spec/lib/http_stub/server/stub/match/string_value_matcher_spec.rb +10 -63
  151. data/spec/lib/http_stub/server/stub/registry_integration_spec.rb +11 -28
  152. data/spec/lib/http_stub/server/stub/registry_spec.rb +6 -13
  153. data/spec/lib/http_stub/server/stub/response/blocks_spec.rb +64 -0
  154. data/spec/lib/http_stub/server/stub/response/body_spec.rb +52 -0
  155. data/spec/lib/http_stub/server/stub/response/file_body_spec.rb +117 -0
  156. data/spec/lib/http_stub/server/stub/response/headers_spec.rb +89 -0
  157. data/spec/lib/http_stub/server/stub/response/response_spec.rb +342 -0
  158. data/spec/lib/http_stub/server/stub/response/text_body_spec.rb +138 -0
  159. data/spec/lib/http_stub/server/stub/response_spec.rb +23 -32
  160. data/spec/lib/http_stub/server/stub/stub_spec.rb +33 -39
  161. data/spec/lib/http_stub/server/stub/triggers_spec.rb +47 -12
  162. data/spec/lib/http_stub/server/stub_spec.rb +1 -1
  163. data/spec/support/extensions/core/random.rb +23 -0
  164. data/spec/support/http_stub/configurator/scenario_builder.rb +35 -0
  165. data/spec/support/http_stub/configurator/scenario_fixture.rb +39 -0
  166. data/spec/support/http_stub/configurator/stub_builder.rb +112 -0
  167. data/spec/support/http_stub/configurator/stub_fixture.rb +58 -0
  168. data/spec/support/http_stub/configurator_fixture.rb +13 -0
  169. data/spec/support/http_stub/configurator_with_stub_builder_and_requester.rb +14 -0
  170. data/spec/support/http_stub/headers_fixture.rb +11 -0
  171. data/spec/support/http_stub/{html_view_excluding_request_details.rb → html_view_excluding_a_stub_request.rb} +2 -2
  172. data/spec/support/http_stub/{html_view_including_request_details.rb → html_view_including_a_stub_request.rb} +20 -12
  173. data/spec/support/http_stub/port.rb +12 -0
  174. data/spec/support/http_stub/server/application/http_stub_rack_application_test.rb +2 -3
  175. data/spec/support/http_stub/server/driver.rb +20 -15
  176. data/spec/support/http_stub/server/memory_fixture.rb +2 -2
  177. data/spec/support/http_stub/server/request/sinatra_request_fixture.rb +16 -0
  178. data/spec/support/http_stub/server/request_fixture.rb +11 -6
  179. data/spec/support/http_stub/server/scenario_fixture.rb +14 -2
  180. data/spec/support/http_stub/server/session_fixture.rb +2 -16
  181. data/spec/support/http_stub/server/silent_logger.rb +7 -0
  182. data/spec/support/http_stub/server/simple_request.rb +17 -0
  183. data/spec/support/http_stub/server/stub/match/match_fixture.rb +1 -1
  184. data/spec/support/http_stub/server/stub/response/blocks_fixture.rb +54 -0
  185. data/spec/support/http_stub/server/stub/response/file_body_fixture.rb +25 -0
  186. data/spec/support/http_stub/server/stub/response/text_body_fixture.rb +33 -0
  187. data/spec/support/http_stub/server/stub/response_builder.rb +24 -0
  188. data/spec/support/http_stub/server/stub/response_fixture.rb +15 -0
  189. data/spec/support/http_stub/server/stub_fixture.rb +21 -0
  190. data/spec/support/http_stub/server_integration.rb +9 -6
  191. data/spec/support/http_stub/stub_requester.rb +37 -0
  192. data/spec/support/object_convertable_to_json.rb +11 -0
  193. data/spec/support/rack/rack_application_test.rb +1 -1
  194. data/spec/support/rack/request_fixture.rb +22 -4
  195. metadata +166 -207
  196. data/lib/http_stub.rb +0 -131
  197. data/lib/http_stub/configurer.rb +0 -42
  198. data/lib/http_stub/configurer/dsl/request_attribute_referencer.rb +0 -19
  199. data/lib/http_stub/configurer/dsl/request_referencer.rb +0 -24
  200. data/lib/http_stub/configurer/dsl/scenario_builder.rb +0 -39
  201. data/lib/http_stub/configurer/dsl/server.rb +0 -80
  202. data/lib/http_stub/configurer/dsl/server_endpoint_template.rb +0 -23
  203. data/lib/http_stub/configurer/dsl/session.rb +0 -51
  204. data/lib/http_stub/configurer/dsl/session_endpoint_template.rb +0 -22
  205. data/lib/http_stub/configurer/dsl/session_factory.rb +0 -34
  206. data/lib/http_stub/configurer/dsl/stub_builder.rb +0 -65
  207. data/lib/http_stub/configurer/part.rb +0 -23
  208. data/lib/http_stub/configurer/request/controllable_value.rb +0 -19
  209. data/lib/http_stub/configurer/request/http/basic.rb +0 -27
  210. data/lib/http_stub/configurer/request/http/factory.rb +0 -33
  211. data/lib/http_stub/configurer/request/http/multipart.rb +0 -34
  212. data/lib/http_stub/configurer/request/omittable.rb +0 -26
  213. data/lib/http_stub/configurer/request/regexpable.rb +0 -33
  214. data/lib/http_stub/configurer/request/scenario.rb +0 -29
  215. data/lib/http_stub/configurer/request/stub.rb +0 -39
  216. data/lib/http_stub/configurer/request/stub_response.rb +0 -38
  217. data/lib/http_stub/configurer/request/stub_response_file.rb +0 -20
  218. data/lib/http_stub/configurer/request/triggers.rb +0 -25
  219. data/lib/http_stub/configurer/server/buffered_command_processor.rb +0 -24
  220. data/lib/http_stub/configurer/server/command.rb +0 -22
  221. data/lib/http_stub/configurer/server/command_processor.rb +0 -35
  222. data/lib/http_stub/configurer/server/configuration.rb +0 -33
  223. data/lib/http_stub/configurer/server/facade.rb +0 -61
  224. data/lib/http_stub/configurer/server/request_processor.rb +0 -30
  225. data/lib/http_stub/configurer/server/session_facade.rb +0 -57
  226. data/lib/http_stub/server/application/configuration.rb +0 -38
  227. data/lib/http_stub/server/application/response_pipeline.rb +0 -20
  228. data/lib/http_stub/server/application/response_support.rb +0 -19
  229. data/lib/http_stub/server/scenario/parser.rb +0 -17
  230. data/lib/http_stub/server/session/configuration.rb +0 -32
  231. data/lib/http_stub/server/status/controller.rb +0 -25
  232. data/lib/http_stub/server/stub/parser.rb +0 -17
  233. data/lib/http_stub/server/stub/payload.rb +0 -20
  234. data/lib/http_stub/server/stub/payload/base_uri_modifier.rb +0 -17
  235. data/lib/http_stub/server/stub/payload/response_body_modifier.rb +0 -21
  236. data/lib/http_stub/server/stub/response/attribute/body.rb +0 -32
  237. data/lib/http_stub/server/stub/response/attribute/headers.rb +0 -32
  238. data/lib/http_stub/server/stub/response/attribute/interpolator.rb +0 -26
  239. data/lib/http_stub/server/stub/response/attribute/interpolator/headers.rb +0 -27
  240. data/lib/http_stub/server/stub/response/attribute/interpolator/parameters.rb +0 -27
  241. data/lib/http_stub/server/stub/response/base.rb +0 -61
  242. data/lib/http_stub/server/stub/response/file.rb +0 -45
  243. data/lib/http_stub/server/stub/response/text.rb +0 -35
  244. data/lib/http_stub/server/views/_file_response.haml +0 -1
  245. data/lib/http_stub/server/views/_text_response.haml +0 -1
  246. data/spec/acceptance/configurer_initialization_spec.rb +0 -157
  247. data/spec/acceptance/request_reference_spec.rb +0 -42
  248. data/spec/lib/http_stub/configurer/dsl/request_attribute_referencer_spec.rb +0 -37
  249. data/spec/lib/http_stub/configurer/dsl/request_referencer_spec.rb +0 -37
  250. data/spec/lib/http_stub/configurer/dsl/scenario_builder_spec.rb +0 -201
  251. data/spec/lib/http_stub/configurer/dsl/server_spec.rb +0 -575
  252. data/spec/lib/http_stub/configurer/dsl/session_endpoint_template_spec.rb +0 -150
  253. data/spec/lib/http_stub/configurer/dsl/session_factory_spec.rb +0 -97
  254. data/spec/lib/http_stub/configurer/dsl/session_spec.rb +0 -210
  255. data/spec/lib/http_stub/configurer/dsl/stub_builder_spec.rb +0 -747
  256. data/spec/lib/http_stub/configurer/part_spec.rb +0 -103
  257. data/spec/lib/http_stub/configurer/request/controllable_value_spec.rb +0 -34
  258. data/spec/lib/http_stub/configurer/request/http/basic_spec.rb +0 -91
  259. data/spec/lib/http_stub/configurer/request/http/factory_spec.rb +0 -222
  260. data/spec/lib/http_stub/configurer/request/http/multipart_spec.rb +0 -118
  261. data/spec/lib/http_stub/configurer/request/omittable_spec.rb +0 -70
  262. data/spec/lib/http_stub/configurer/request/regexpable_spec.rb +0 -77
  263. data/spec/lib/http_stub/configurer/request/scenario_spec.rb +0 -69
  264. data/spec/lib/http_stub/configurer/request/stub_response_spec.rb +0 -195
  265. data/spec/lib/http_stub/configurer/request/stub_spec.rb +0 -231
  266. data/spec/lib/http_stub/configurer/request/triggers_spec.rb +0 -101
  267. data/spec/lib/http_stub/configurer/server/buffered_command_processor_spec.rb +0 -35
  268. data/spec/lib/http_stub/configurer/server/command_processor_integration_spec.rb +0 -75
  269. data/spec/lib/http_stub/configurer/server/command_spec.rb +0 -26
  270. data/spec/lib/http_stub/configurer/server/configuration_spec.rb +0 -139
  271. data/spec/lib/http_stub/configurer/server/facade_spec.rb +0 -235
  272. data/spec/lib/http_stub/configurer/server/request_processor_spec.rb +0 -100
  273. data/spec/lib/http_stub/configurer/server/session_facade_spec.rb +0 -285
  274. data/spec/lib/http_stub/configurer_spec.rb +0 -105
  275. data/spec/lib/http_stub/server/application/configuration_spec.rb +0 -59
  276. data/spec/lib/http_stub/server/application/response_pipeline_spec.rb +0 -29
  277. data/spec/lib/http_stub/server/application/response_support_spec.rb +0 -30
  278. data/spec/lib/http_stub/server/scenario/parser_spec.rb +0 -64
  279. data/spec/lib/http_stub/server/session/configuration_spec.rb +0 -94
  280. data/spec/lib/http_stub/server/status/controller_spec.rb +0 -47
  281. data/spec/lib/http_stub/server/stub/parser_spec.rb +0 -56
  282. data/spec/lib/http_stub/server/stub/payload/base_uri_modifier_spec.rb +0 -23
  283. data/spec/lib/http_stub/server/stub/payload/response_body_modifier_spec.rb +0 -84
  284. data/spec/lib/http_stub/server/stub/payload_spec.rb +0 -33
  285. data/spec/lib/http_stub/server/stub/response/attribute/body_spec.rb +0 -98
  286. data/spec/lib/http_stub/server/stub/response/attribute/headers_spec.rb +0 -73
  287. data/spec/lib/http_stub/server/stub/response/attribute/interpolator/headers_spec.rb +0 -53
  288. data/spec/lib/http_stub/server/stub/response/attribute/interpolator/parameters_spec.rb +0 -53
  289. data/spec/lib/http_stub/server/stub/response/attribute/interpolator_spec.rb +0 -41
  290. data/spec/lib/http_stub/server/stub/response/base_spec.rb +0 -217
  291. data/spec/lib/http_stub/server/stub/response/file_spec.rb +0 -197
  292. data/spec/lib/http_stub/server/stub/response/text_spec.rb +0 -182
  293. data/spec/resources/sample.pdf +0 -0
  294. data/spec/resources/sample.txt +0 -1
  295. data/spec/support/http_stub/configurer_integration.rb +0 -24
  296. data/spec/support/http_stub/empty_configurer.rb +0 -7
  297. data/spec/support/http_stub/scenario_fixture.rb +0 -33
  298. data/spec/support/http_stub/stub_fixture.rb +0 -125
  299. data/spec/support/http_stub/stub_registrator.rb +0 -83
@@ -0,0 +1,113 @@
1
+ describe HttpStub::Configurator::State do
2
+
3
+ let(:port) { 8888 }
4
+
5
+ let(:state) { described_class.new }
6
+
7
+ before(:example) { state.port = port }
8
+
9
+ describe "#external_base_uri" do
10
+
11
+ subject { state.external_base_uri }
12
+
13
+ before(:example) { @initial_base_uri = ENV["STUB_EXTERNAL_BASE_URI"] }
14
+
15
+ after(:example) { ENV["STUB_EXTERNAL_BASE_URI"] = @initial_base_uri }
16
+
17
+ context "when the STUB_EXTERNAL_BASE_URI environment variable is established" do
18
+
19
+ let(:base_uri) { "http://some/base/uri" }
20
+
21
+ before(:example) { ENV["STUB_EXTERNAL_BASE_URI"] = base_uri }
22
+
23
+ after(:example) { ENV["STUB_EXTERNAL_BASE_URI"] = @initial_base_uri }
24
+
25
+ it "returns the environments variables value" do
26
+ expect(subject).to eql(base_uri)
27
+ end
28
+
29
+ end
30
+
31
+ context "when the STUB_EXTERNAL_BASE_URI environment variable is not established" do
32
+
33
+ before(:example) { ENV["STUB_EXTERNAL_BASE_URI"] = nil }
34
+
35
+ it "returns a local uri containing the port" do
36
+ expect(subject).to eql("http://localhost:#{port}")
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ describe "#add_scenario" do
44
+
45
+ let(:scenario_hash) { { some_scenario_key: "some value" } }
46
+ let(:scenario) { instance_double(HttpStub::Configurator::Scenario, to_hash: scenario_hash) }
47
+
48
+ subject { state.add_scenario(scenario) }
49
+
50
+ it "adds the hash representation of the scenario" do
51
+ subject
52
+
53
+ expect(state.scenario_hashes).to include(scenario_hash)
54
+ end
55
+
56
+ end
57
+
58
+ describe "#add_stub" do
59
+
60
+ let(:stub_hash) { { some_stub_key: "some value" } }
61
+ let(:the_stub) { instance_double(HttpStub::Configurator::Stub::Stub, to_hash: stub_hash) }
62
+
63
+ subject { state.add_stub(the_stub) }
64
+
65
+ it "adds the hash representation of the stub" do
66
+ subject
67
+
68
+ expect(state.stub_hashes).to include(stub_hash)
69
+ end
70
+
71
+ end
72
+
73
+ describe "#application_settings" do
74
+
75
+ subject { state.application_settings }
76
+
77
+ it "includes the configured port" do
78
+ expect(subject).to include(port: port)
79
+ end
80
+
81
+ context "when a session identifier is provided" do
82
+
83
+ let(:session_identifier) { { parameter: "some_session_identifier" } }
84
+
85
+ before(:example) { state.session_identifier = session_identifier }
86
+
87
+ it "includes the session identifier" do
88
+ expect(subject).to include(session_identifier: session_identifier)
89
+ end
90
+
91
+ end
92
+
93
+ context "when cross-origin support is enabled" do
94
+
95
+ before(:example) { state.enable(:cross_origin_support) }
96
+
97
+ it "indicates cross-origin support is enabled" do
98
+ expect(subject).to include(cross_origin_support: true)
99
+ end
100
+
101
+ end
102
+
103
+ context "when cross-origin support is disabled" do
104
+
105
+ it "indicates cross-origin support is disabled" do
106
+ expect(subject).to include(cross_origin_support: false)
107
+ end
108
+
109
+ end
110
+
111
+ end
112
+
113
+ end
@@ -0,0 +1,867 @@
1
+ describe HttpStub::Configurator::Stub::Stub do
2
+
3
+ let(:parent_stub) { nil }
4
+
5
+ let(:composed_stub) { described_class.new(parent_stub) }
6
+
7
+ let(:composed_stub_match_rules_payload) { composed_stub.to_hash[:match_rules] }
8
+ let(:composed_stub_response_payload) { composed_stub.to_hash[:response] }
9
+ let(:composed_stub_triggers_payload) { composed_stub.to_hash[:triggers] }
10
+
11
+ shared_context "triggers one scenario" do
12
+
13
+ let(:trigger_scenario) { "Some triggered scenario" }
14
+
15
+ before(:example) { composed_stub.trigger(scenario: trigger_scenario) }
16
+
17
+ end
18
+
19
+ shared_context "triggers many scenarios" do
20
+
21
+ let(:trigger_scenarios) { (1..3).map { |i| "Some triggered scenario #{i}" } }
22
+
23
+ before(:example) { composed_stub.trigger(scenarios: trigger_scenarios) }
24
+
25
+ end
26
+
27
+ shared_context "triggers one stub" do
28
+
29
+ let(:trigger_stub_hash) { { trigger_key: "trigger value" } }
30
+ let(:trigger_stub) { instance_double(described_class, to_hash: trigger_stub_hash) }
31
+
32
+ before(:example) { composed_stub.trigger(stub: trigger_stub) }
33
+
34
+ end
35
+
36
+ shared_context "triggers many stubs" do
37
+
38
+ let(:trigger_stub_hashes) { (1..3).map { |i| { trigger_key: "trigger value #{i}" } } }
39
+ let(:trigger_stubs) { trigger_stub_hashes.map { |hash| instance_double(described_class, to_hash: hash) } }
40
+
41
+ before(:example) { composed_stub.trigger(stubs: trigger_stubs) }
42
+
43
+ end
44
+
45
+ describe "constructor" do
46
+
47
+ class HttpStub::Configurator::Stub::StubWithObservedMerge < HttpStub::Configurator::Stub::Stub
48
+
49
+ attr_reader :merged_stubs
50
+
51
+ def initialize(parent=nil, &block)
52
+ @merged_stubs = []
53
+ super(parent, &block)
54
+ end
55
+
56
+ def merge!(stub)
57
+ @merged_stubs << stub
58
+ end
59
+
60
+ end
61
+
62
+ context "when a parent stub is provided" do
63
+
64
+ let(:parent_stub) { instance_double(described_class) }
65
+
66
+ let(:composed_stub) { HttpStub::Configurator::Stub::StubWithObservedMerge.new(parent_stub) }
67
+
68
+ it "merges the parent stub" do
69
+ composed_stub
70
+
71
+ expect(composed_stub.merged_stubs).to eql([ parent_stub ])
72
+ end
73
+
74
+ end
75
+
76
+ context "when a block is provided" do
77
+
78
+ let(:block_verifier) { double("BlockVerifier", verify: nil) }
79
+ let(:block) { lambda { |builder| block_verifier.verify(builder) } }
80
+
81
+ let(:composed_stub) { HttpStub::Configurator::Stub::StubWithObservedMerge.new(&block) }
82
+
83
+ it "creates a stub that is yielded to the provided block" do
84
+ expect(block_verifier).to receive(:verify).with(a_kind_of(described_class))
85
+
86
+ composed_stub
87
+ end
88
+
89
+ it "does not merge any parent stubs" do
90
+ composed_stub
91
+
92
+ expect(composed_stub.merged_stubs).to eql([])
93
+ end
94
+
95
+ end
96
+
97
+ context "when neither a parent stub or block is provided" do
98
+
99
+ let(:composed_stub) { HttpStub::Configurator::Stub::StubWithObservedMerge.new(nil) }
100
+
101
+ it "does not merge any parent stub" do
102
+ composed_stub
103
+
104
+ expect(composed_stub.merged_stubs).to eql([])
105
+ end
106
+
107
+ end
108
+
109
+ end
110
+
111
+ describe "#match_requests" do
112
+
113
+ let(:fixture) { HttpStub::Configurator::StubBuilder.new }
114
+
115
+ subject { composed_stub.match_requests(fixture.match_rules) }
116
+
117
+ it "returns the stub to support method chaining" do
118
+ expect(subject).to eql(composed_stub)
119
+ end
120
+
121
+ end
122
+
123
+ describe "#schema" do
124
+
125
+ let(:type) { :some_type }
126
+
127
+ subject { composed_stub.schema(type, schema_definition) }
128
+
129
+ context "when a definition is provided in a ruby hash" do
130
+
131
+ let(:schema_definition) { { schema: "definition" } }
132
+
133
+ it "returns a hash with a :schema entry containing both the type and schema definition" do
134
+ expect(subject).to eql(schema: { type: type, definition: schema_definition })
135
+ end
136
+
137
+ end
138
+
139
+ end
140
+
141
+ describe "#respond_with" do
142
+
143
+ context "when a block is provided referencing the matching request" do
144
+
145
+ let(:response_block) { lambda { |request| { headers: request.headers[:some_header] } } }
146
+
147
+ subject { composed_stub.respond_with(&response_block) }
148
+
149
+ it "adds the block to the stub payloads response" do
150
+ subject
151
+
152
+ expect(composed_stub_response_payload).to include(blocks: [ response_block ])
153
+ end
154
+
155
+ it "returns the stub to support method chaining" do
156
+ expect(subject).to eql(composed_stub)
157
+ end
158
+
159
+ end
160
+
161
+ context "when a hash is provided" do
162
+
163
+ let(:response_hash) { { status: 201 } }
164
+
165
+ subject { composed_stub.respond_with(response_hash) }
166
+
167
+ it "includes the proivded hash in the stub payloads response" do
168
+ subject
169
+
170
+ expect(composed_stub_response_payload).to include(response_hash)
171
+ end
172
+
173
+ it "returns the stub to support method chaining" do
174
+ expect(subject).to eql(composed_stub)
175
+ end
176
+
177
+ end
178
+
179
+ end
180
+
181
+ describe "#trigger" do
182
+
183
+ let(:args) { {} }
184
+
185
+ subject { composed_stub.trigger(args) }
186
+
187
+ it "returns the stub to support method chaining" do
188
+ expect(subject).to eql(composed_stub)
189
+ end
190
+
191
+ context "when scenarios are provided" do
192
+
193
+ let(:scenarios) { (1..3).map { |i| "Scenario name #{i}" } }
194
+
195
+ let(:args) { { scenarios: scenarios } }
196
+
197
+ it "adds the scenarios" do
198
+ subject
199
+
200
+ expect(composed_stub_triggers_payload).to include(scenario_names: scenarios)
201
+ end
202
+
203
+ end
204
+
205
+ context "when a scenario is provided" do
206
+
207
+ let(:scenario) { "Some scenario name" }
208
+
209
+ let(:args) { { scenario: scenario } }
210
+
211
+ it "adds the scenario" do
212
+ subject
213
+
214
+ expect(composed_stub_triggers_payload).to include(scenario_names: [ scenario ])
215
+ end
216
+
217
+ end
218
+
219
+ context "when stubs are provided" do
220
+
221
+ let(:stub_hashes) { (1..3).map { |i| { stub_key: "stub value #{i}" } } }
222
+ let(:stubs) { stub_hashes.map { |hash| instance_double(described_class, to_hash: hash) } }
223
+
224
+ let(:args) { { stubs: stubs } }
225
+
226
+ it "adds the stubs" do
227
+ subject
228
+
229
+ expect(composed_stub_triggers_payload).to include(stubs: stub_hashes)
230
+ end
231
+
232
+ end
233
+
234
+ context "when a stub is provided" do
235
+
236
+ let(:stub_hash) { { stub_key: "stub value" } }
237
+ let(:stub) { instance_double(described_class, to_hash: stub_hash) }
238
+
239
+ let(:args) { { stub: stub } }
240
+
241
+ it "adds the stub" do
242
+ subject
243
+
244
+ expect(composed_stub_triggers_payload).to include(stubs: [ stub_hash ])
245
+ end
246
+
247
+ end
248
+
249
+ end
250
+
251
+ describe "#invoke" do
252
+
253
+ context "when the block accepts an argument" do
254
+
255
+ subject { composed_stub.invoke { |a_stub| a_stub.match_requests(uri: "/some_uri") } }
256
+
257
+ it "invokes the block with the stub as the argument" do
258
+ expect(composed_stub).to receive(:match_requests).with(uri: "/some_uri")
259
+
260
+ subject
261
+ end
262
+
263
+ end
264
+
265
+ context "when the block accepts no arguments" do
266
+
267
+ subject { composed_stub.invoke { match_requests(uri: "/some_uri") } }
268
+
269
+ it "invokes the block in the context of the stub" do
270
+ expect(composed_stub).to receive(:match_requests).with(uri: "/some_uri")
271
+
272
+ subject
273
+ end
274
+
275
+ end
276
+
277
+ end
278
+
279
+ describe "#merge!" do
280
+
281
+ subject { composed_stub.merge!(provided_stub) }
282
+
283
+ shared_context "a completely configured provided stub" do
284
+
285
+ let(:provided_trigger_scenarios) { (1..3).map { |i| "Triggered scenario #{i}" } }
286
+ let(:provided_trigger_stub_hashes) { (1..3).map { |i| { trigger_hash_key: "trigger hash value #{i}" } } }
287
+ let(:provided_trigger_stubs) do
288
+ provided_trigger_stub_hashes.map { |hash| instance_double(described_class, to_hash: hash) }
289
+ end
290
+
291
+ let(:provided_stub) do
292
+ described_class.new.tap do |a_stub|
293
+ a_stub.match_requests(uri: "/replacement_uri",
294
+ method: :put,
295
+ headers: { request_header_key: "replacement request header value",
296
+ other_request_header_key: "other request header value" },
297
+ parameters: { parameter_key: "replacement parameter value",
298
+ other_request_parameter_key: "other request parameter value" })
299
+ a_stub.respond_with(status: 203,
300
+ headers: { response_header_key: "replacement response header value",
301
+ other_response_header_key: "other response header value" },
302
+ body: "replacement body value",
303
+ delay_in_seconds: 3)
304
+ a_stub.trigger(scenarios: provided_trigger_scenarios,
305
+ stubs: provided_trigger_stubs)
306
+ end
307
+ end
308
+
309
+ end
310
+
311
+ context "when the stub has been completely configured" do
312
+
313
+ let(:original_trigger_scenarios) { (1..3).map { |i| "Original trigger scenario #{i}" } }
314
+ let(:original_trigger_stub_hashes) { (1..3).map { |i| { match_rules: { uri: "original/uri/#{i}" } } } }
315
+ let(:original_trigger_stubs) do
316
+ original_trigger_stub_hashes.map { |hash| instance_double(described_class, to_hash: hash) }
317
+ end
318
+
319
+ before(:example) do
320
+ composed_stub.match_requests(uri: "/original_uri",
321
+ method: :get,
322
+ headers: { request_header_key: "original request header value" },
323
+ parameters: { parameter_key: "original parameter value" })
324
+ composed_stub.respond_with(status: 202,
325
+ headers: { response_header_key: "original response header value" },
326
+ body: "original body",
327
+ delay_in_seconds: 2)
328
+ composed_stub.trigger(scenarios: original_trigger_scenarios,
329
+ stubs: original_trigger_stubs)
330
+ end
331
+
332
+ context "and a stub that is completely configured is provided" do
333
+ include_context "a completely configured provided stub"
334
+
335
+ it "replaces the matched uri" do
336
+ subject
337
+
338
+ expect(composed_stub_match_rules_payload).to include(uri: "/replacement_uri")
339
+ end
340
+
341
+ it "replaces the matched method" do
342
+ subject
343
+
344
+ expect(composed_stub_match_rules_payload).to include(method: :put)
345
+ end
346
+
347
+ it "deeply merges the matched headers" do
348
+ subject
349
+
350
+ expect(composed_stub_match_rules_payload).to(
351
+ include(headers: { request_header_key: "replacement request header value",
352
+ other_request_header_key: "other request header value" })
353
+ )
354
+ end
355
+
356
+ it "deeply merges the matched parameters" do
357
+ subject
358
+
359
+ expect(composed_stub_match_rules_payload).to(
360
+ include(parameters: { parameter_key: "replacement parameter value",
361
+ other_request_parameter_key: "other request parameter value" })
362
+ )
363
+ end
364
+
365
+ it "replaces the response status" do
366
+ subject
367
+
368
+ expect(composed_stub_response_payload).to include(status: 203)
369
+ end
370
+
371
+ it "deeply merges the response headers" do
372
+ subject
373
+
374
+ expect(composed_stub_response_payload).to(
375
+ include(headers: { response_header_key: "replacement response header value",
376
+ other_response_header_key: "other response header value" })
377
+ )
378
+ end
379
+
380
+ it "replaces the response body" do
381
+ subject
382
+
383
+ expect(composed_stub_response_payload).to include(body: "replacement body value")
384
+ end
385
+
386
+ it "replaces the response delay" do
387
+ subject
388
+
389
+ expect(composed_stub_response_payload).to include(delay_in_seconds: 3)
390
+ end
391
+
392
+ it "adds to the triggered scenarios" do
393
+ subject
394
+
395
+ expect(composed_stub_triggers_payload).to(
396
+ include(scenario_names: original_trigger_scenarios + provided_trigger_scenarios)
397
+ )
398
+ end
399
+
400
+ it "adds to the triggered stubs" do
401
+ subject
402
+
403
+ expect(composed_stub_triggers_payload).to(
404
+ include(stubs: original_trigger_stub_hashes + provided_trigger_stub_hashes)
405
+ )
406
+ end
407
+
408
+ end
409
+
410
+ context "and a stub that is empty is provided" do
411
+
412
+ let(:provided_stub) { described_class.new }
413
+
414
+ it "preserves the matched uri" do
415
+ subject
416
+
417
+ expect(composed_stub_match_rules_payload).to include(uri: "/original_uri")
418
+ end
419
+
420
+ it "preserves the matched method" do
421
+ subject
422
+
423
+ expect(composed_stub_match_rules_payload).to include(method: :get)
424
+ end
425
+
426
+ it "preserves the matched headers" do
427
+ subject
428
+
429
+ expect(composed_stub_match_rules_payload).to(
430
+ include(headers: { request_header_key: "original request header value" })
431
+ )
432
+ end
433
+
434
+ it "preserves the matched parameters" do
435
+ subject
436
+
437
+ expect(composed_stub_match_rules_payload).to(
438
+ include(parameters: { parameter_key: "original parameter value" })
439
+ )
440
+ end
441
+
442
+ it "preserves the response status" do
443
+ subject
444
+
445
+ expect(composed_stub_response_payload).to include(status: 202)
446
+ end
447
+
448
+ it "preserves the response headers" do
449
+ subject
450
+
451
+ expect(composed_stub_response_payload).to(
452
+ include(headers: { response_header_key: "original response header value" })
453
+ )
454
+ end
455
+
456
+ it "preserves the response body" do
457
+ subject
458
+
459
+ expect(composed_stub_response_payload).to include(body: "original body")
460
+ end
461
+
462
+ it "preserves the response delay" do
463
+ subject
464
+
465
+ expect(composed_stub_response_payload).to include(delay_in_seconds: 2)
466
+ end
467
+
468
+ it "preserves the triggered scenarios" do
469
+ subject
470
+
471
+ expect(composed_stub_triggers_payload).to include(scenario_names: original_trigger_scenarios)
472
+ end
473
+
474
+ it "preserves the triggered stubs" do
475
+ subject
476
+
477
+ expect(composed_stub_triggers_payload).to include(stubs: original_trigger_stub_hashes)
478
+ end
479
+
480
+ end
481
+
482
+ end
483
+
484
+ context "when the stub has not been previously configured" do
485
+ include_context "a completely configured provided stub"
486
+
487
+ it "assumes the provided matched uri" do
488
+ subject
489
+
490
+ expect(composed_stub_match_rules_payload).to include(uri: "/replacement_uri")
491
+ end
492
+
493
+ it "assumes the provided matched method" do
494
+ subject
495
+
496
+ expect(composed_stub_match_rules_payload).to include(method: :put)
497
+ end
498
+
499
+ it "assumes the provided matched headers" do
500
+ subject
501
+
502
+ expect(composed_stub_match_rules_payload).to(
503
+ include(headers: { request_header_key: "replacement request header value",
504
+ other_request_header_key: "other request header value" })
505
+ )
506
+ end
507
+
508
+ it "assumes the provided matched parameters" do
509
+ subject
510
+
511
+ expect(composed_stub_match_rules_payload).to(
512
+ include(parameters: { parameter_key: "replacement parameter value",
513
+ other_request_parameter_key: "other request parameter value" })
514
+ )
515
+ end
516
+
517
+ it "assumes the provided response status" do
518
+ subject
519
+
520
+ expect(composed_stub_response_payload).to include(status: 203)
521
+ end
522
+
523
+ it "assumes the provided response headers" do
524
+ subject
525
+
526
+ expect(composed_stub_response_payload).to(
527
+ include(headers: { response_header_key: "replacement response header value",
528
+ other_response_header_key: "other response header value" })
529
+ )
530
+ end
531
+
532
+ it "assumes the provided response body" do
533
+ subject
534
+
535
+ expect(composed_stub_response_payload).to include(body: "replacement body value")
536
+ end
537
+
538
+ it "assumes the provided response delay" do
539
+ subject
540
+
541
+ expect(composed_stub_response_payload).to include(delay_in_seconds: 3)
542
+ end
543
+
544
+ it "assumes the provided triggered scenarios" do
545
+ subject
546
+
547
+ expect(composed_stub_triggers_payload).to include(scenario_names: provided_trigger_scenarios)
548
+ end
549
+
550
+ it "assumes the provided triggered stubs" do
551
+ subject
552
+
553
+ expect(composed_stub_triggers_payload).to include(stubs: provided_trigger_stub_hashes)
554
+ end
555
+
556
+ end
557
+
558
+ end
559
+
560
+ describe "#id" do
561
+
562
+ let(:fixture) { HttpStub::Configurator::StubBuilder.new }
563
+
564
+ subject { composed_stub.id }
565
+
566
+ before(:example) do
567
+ fixture.with_response_block!
568
+ fixture.with_triggered_scenarios!
569
+ end
570
+
571
+ context "when a stub has been supplied data" do
572
+
573
+ before(:example) do
574
+ composed_stub.match_requests(fixture.match_rules)
575
+ composed_stub.respond_with(fixture.response)
576
+ end
577
+
578
+ it "returns a string identifying the stub" do
579
+ expect(composed_stub.id).to be_a(String)
580
+ end
581
+
582
+ context "when the stubs data has not changed" do
583
+
584
+ it "always returns an equal value" do
585
+ expect(subject).to eql(composed_stub.id)
586
+ end
587
+
588
+ end
589
+
590
+ context "when the stubs data has changed" do
591
+
592
+ before(:example) do
593
+ @initial_id = composed_stub.id
594
+
595
+ composed_stub.match_requests(uri: "some_other_uri")
596
+ end
597
+
598
+ it "returns a different value" do
599
+ expect(subject).to_not eql(@initial_id)
600
+ end
601
+
602
+ end
603
+
604
+ context "when compared with that of another stub" do
605
+
606
+ let(:other_composed_stub) { described_class.new(parent_stub) }
607
+
608
+ before(:example) do
609
+ other_composed_stub.match_requests(fixture.match_rules)
610
+ other_composed_stub.respond_with(fixture.response)
611
+ end
612
+
613
+ context "who has the same data" do
614
+
615
+ it "returns the same value" do
616
+ expect(subject).to eql(other_composed_stub.id)
617
+ end
618
+
619
+ end
620
+
621
+ context "who has different data" do
622
+
623
+ before(:example) { other_composed_stub.trigger(fixture.triggers) }
624
+
625
+ it "returns a different value" do
626
+ expect(subject).to_not eql(other_composed_stub.id)
627
+ end
628
+
629
+ end
630
+
631
+ end
632
+
633
+ end
634
+
635
+ context "when a stub has not been supplied data" do
636
+
637
+ it "always returns an equal value" do
638
+ expect(subject).to eql(composed_stub.id)
639
+ end
640
+
641
+ end
642
+
643
+ end
644
+
645
+ describe "#to_hash" do
646
+
647
+ let(:fixture) { HttpStub::Configurator::StubBuilder.new }
648
+ let(:triggers) { { scenarios: [], stubs: [] } }
649
+
650
+ subject do
651
+ composed_stub.match_requests(fixture.match_rules.to_hash)
652
+ composed_stub.respond_with(fixture.response.to_hash)
653
+ composed_stub.trigger(triggers)
654
+
655
+ composed_stub.to_hash
656
+ end
657
+
658
+ it "returns a hash with indifferent access" do
659
+ expect(subject).to be_a(HashWithIndifferentAccess)
660
+ end
661
+
662
+ context "when provided with request match and response data" do
663
+
664
+ it "creates a hash with match rules that include the uri and the match options" do
665
+ expect(subject[:match_rules]).to eql(fixture.match_rules.to_hash)
666
+ end
667
+
668
+ it "creates a hash with response arguments" do
669
+ expect(subject[:response]).to eql(fixture.response.to_hash)
670
+ end
671
+
672
+ context "and the response data contains blocks" do
673
+
674
+ before(:example) { fixture.with_response_block! }
675
+
676
+ it "creates a hash with response arguments that include the blocks" do
677
+ expect(subject[:response]).to include(blocks: fixture.response.blocks)
678
+ end
679
+
680
+ end
681
+
682
+ describe "creates a hash with triggers that" do
683
+
684
+ context "when a scenario trigger is added" do
685
+ include_context "triggers one scenario"
686
+
687
+ it "contain the provided trigger scenario name" do
688
+ expect(subject[:triggers]).to include(scenario_names: [ trigger_scenario ])
689
+
690
+ subject
691
+ end
692
+
693
+ end
694
+
695
+ context "when many scenario triggers are added" do
696
+ include_context "triggers many scenarios"
697
+
698
+ it "contain the provided trigger scenario names" do
699
+ expect(subject[:triggers]).to include(scenario_names: trigger_scenarios)
700
+
701
+ subject
702
+ end
703
+
704
+ end
705
+
706
+ context "when a stub trigger is added" do
707
+ include_context "triggers one stub"
708
+
709
+ it "contain the provided triggerred stub hash" do
710
+ expect(subject[:triggers]).to include(stubs: [ trigger_stub_hash ])
711
+
712
+ subject
713
+ end
714
+
715
+ end
716
+
717
+ context "when many stub triggers are added" do
718
+ include_context "triggers many stubs"
719
+
720
+ it "contains the provided triggerred stub hashes" do
721
+ expect(subject[:triggers]).to include(stubs: trigger_stub_hashes)
722
+
723
+ subject
724
+ end
725
+
726
+ end
727
+
728
+ end
729
+
730
+ context "when a stub is provided that contains defaults" do
731
+
732
+ let(:match_rule_defaults) do
733
+ {
734
+ uri: "/uri/value",
735
+ headers: { "request_header_name_1" => "request header value 1",
736
+ "request_header_name_2" => "request header value 2" },
737
+ parameters: { "parameter_name_1" => "parameter value 1",
738
+ "parameter_name_2" => "parameter value 2" },
739
+ body: "body value"
740
+ }
741
+ end
742
+ let(:response_block_default) do
743
+ lambda do
744
+ { status: 301 }
745
+ end
746
+ end
747
+ let(:response_defaults) do
748
+ {
749
+ status: 203,
750
+ headers: { "response_header_name_1" => "response header value 1",
751
+ "response_header_name_2" => "response header value 2" },
752
+ body: "some body",
753
+ delay_in_seconds: 8,
754
+ blocks: [ response_block_default ]
755
+ }
756
+ end
757
+ let(:trigger_scenario_defaults) { (1..3).map { |i| "Default trigger scenario #{i}" } }
758
+ let(:trigger_stub_hash_defaults) { (1..3).map { |i| { match_request: { uri: "Default stub uri #{i}" } } } }
759
+
760
+ let(:parent_hash) do
761
+ {
762
+ match_rules: match_rule_defaults,
763
+ response: response_defaults,
764
+ triggers: { scenario_names: trigger_scenario_defaults,
765
+ stubs: trigger_stub_hash_defaults }
766
+ }
767
+ end
768
+ let(:parent_stub) { instance_double(described_class, to_hash: parent_hash) }
769
+
770
+ describe "the match rules payload" do
771
+
772
+ let(:match_rule_overrides) do
773
+ {
774
+ uri: "/some/updated/uri",
775
+ headers: { "request_header_name_2" => "updated request header value 2",
776
+ "request_header_name_3" => "request header value 3" },
777
+ parameters: { "parameter_name_2" => "updated parameter value 2",
778
+ "parameter_name_3" => "parameter value 3" },
779
+ body: "updated body value"
780
+ }
781
+ end
782
+
783
+ before(:example) { fixture.match_rules = match_rule_overrides }
784
+
785
+ it "merges any defaults with values established in the stub" do
786
+ expect(subject[:match_rules]).to eql(
787
+ {
788
+ uri: "/some/updated/uri",
789
+ headers: { "request_header_name_1" => "request header value 1",
790
+ "request_header_name_2" => "updated request header value 2",
791
+ "request_header_name_3" => "request header value 3" },
792
+ parameters: { "parameter_name_1" => "parameter value 1",
793
+ "parameter_name_2" => "updated parameter value 2",
794
+ "parameter_name_3" => "parameter value 3" },
795
+ body: "updated body value"
796
+ }.with_indifferent_access
797
+ )
798
+ end
799
+
800
+ end
801
+
802
+ describe "the response payload" do
803
+
804
+ let(:response_block_override) do
805
+ lambda do
806
+ { status: 400 }
807
+ end
808
+ end
809
+ let(:response_overrides) do
810
+ {
811
+ status: 302,
812
+ headers: { "response_header_name_2" => "updated response header value 2",
813
+ "response_header_name_3" => "response header value 3" },
814
+ body: "updated body",
815
+ blocks: [ response_block_override ]
816
+ }
817
+ end
818
+
819
+ before(:example) { fixture.response = response_overrides }
820
+
821
+ it "merges any defaults with values established in the stub" do
822
+ expect(subject[:response]).to eql(
823
+ {
824
+ status: 302,
825
+ headers: { "response_header_name_1" => "response header value 1",
826
+ "response_header_name_2" => "updated response header value 2",
827
+ "response_header_name_3" => "response header value 3" },
828
+ body: "updated body",
829
+ delay_in_seconds: 8,
830
+ blocks: [ response_block_default, response_block_override ]
831
+ }.with_indifferent_access
832
+ )
833
+ end
834
+
835
+ end
836
+
837
+ describe "the triggers payload" do
838
+
839
+ let(:trigger_scenarios) { (1..3).map { |i| "Trigger scenario #{i}" } }
840
+ let(:trigger_stub_hashes) { (1..3).map { |i| { trigger_key: "trigger #{i}" } } }
841
+ let(:trigger_stubs) do
842
+ trigger_stub_hashes.map { |hash| instance_double(described_class, to_hash: hash) }
843
+ end
844
+
845
+ let(:triggers) { { scenarios: trigger_scenarios, stubs: trigger_stubs } }
846
+
847
+ it "combines any scenario defaults with values established in the stub" do
848
+ expect(subject[:triggers]).to include(scenario_names: trigger_scenario_defaults + trigger_scenarios)
849
+
850
+ subject
851
+ end
852
+
853
+ it "combines any stub defaults with values established in the stub" do
854
+ expect(subject[:triggers]).to include(stubs: trigger_stub_hash_defaults + trigger_stub_hashes)
855
+
856
+ subject
857
+ end
858
+
859
+ end
860
+
861
+ end
862
+
863
+ end
864
+
865
+ end
866
+
867
+ end