disco_app 0.14.4 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (429) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -5
  3. data/app/clients/disco_app/api_client.rb +5 -4
  4. data/app/clients/disco_app/graphql_client.rb +85 -0
  5. data/app/controllers/disco_app/admin/app_settings_controller.rb +2 -0
  6. data/app/controllers/disco_app/admin/application_controller.rb +1 -0
  7. data/app/controllers/disco_app/admin/concerns/app_settings_controller.rb +2 -1
  8. data/app/controllers/disco_app/admin/concerns/authenticated_controller.rb +5 -3
  9. data/app/controllers/disco_app/admin/concerns/plans_controller.rb +3 -2
  10. data/app/controllers/disco_app/admin/concerns/shops_controller.rb +1 -0
  11. data/app/controllers/disco_app/admin/concerns/sources_controller.rb +2 -1
  12. data/app/controllers/disco_app/admin/concerns/subscriptions_controller.rb +3 -2
  13. data/app/controllers/disco_app/admin/plans_controller.rb +2 -0
  14. data/app/controllers/disco_app/admin/resources/shops_controller.rb +2 -0
  15. data/app/controllers/disco_app/admin/shops_controller.rb +2 -0
  16. data/app/controllers/disco_app/admin/sources_controller.rb +2 -0
  17. data/app/controllers/disco_app/admin/subscriptions_controller.rb +2 -0
  18. data/app/controllers/disco_app/charges_controller.rb +6 -7
  19. data/app/controllers/disco_app/concerns/app_proxy_controller.rb +6 -6
  20. data/app/controllers/disco_app/concerns/authenticated_controller.rb +24 -25
  21. data/app/controllers/disco_app/concerns/carrier_request_controller.rb +22 -11
  22. data/app/controllers/disco_app/concerns/user_authenticated_controller.rb +1 -0
  23. data/app/controllers/disco_app/concerns/webhooks_controller.rb +49 -0
  24. data/app/controllers/disco_app/flow/actions_controller.rb +9 -0
  25. data/app/controllers/disco_app/flow/concerns/actions_controller.rb +50 -0
  26. data/app/controllers/disco_app/frame_controller.rb +0 -1
  27. data/app/controllers/disco_app/install_controller.rb +3 -6
  28. data/app/controllers/disco_app/subscriptions_controller.rb +12 -4
  29. data/app/controllers/disco_app/user_sessions_controller.rb +1 -0
  30. data/app/controllers/disco_app/webhooks_controller.rb +2 -44
  31. data/app/controllers/sessions_controller.rb +4 -3
  32. data/app/helpers/disco_app/application_helper.rb +7 -7
  33. data/app/jobs/disco_app/app_installed_job.rb +2 -0
  34. data/app/jobs/disco_app/app_uninstalled_job.rb +2 -0
  35. data/app/jobs/disco_app/concerns/app_installed_job.rb +2 -3
  36. data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +2 -1
  37. data/app/jobs/disco_app/concerns/render_asset_group_job.rb +1 -0
  38. data/app/jobs/disco_app/concerns/shop_update_job.rb +9 -2
  39. data/app/jobs/disco_app/concerns/subscription_changed_job.rb +2 -1
  40. data/app/jobs/disco_app/concerns/synchronise_carrier_service_job.rb +8 -7
  41. data/app/jobs/disco_app/concerns/synchronise_resources_job.rb +1 -0
  42. data/app/jobs/disco_app/concerns/synchronise_users_job.rb +6 -3
  43. data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +4 -5
  44. data/app/jobs/disco_app/flow/process_action_job.rb +11 -0
  45. data/app/jobs/disco_app/flow/process_trigger_job.rb +11 -0
  46. data/app/jobs/disco_app/render_asset_group_job.rb +2 -0
  47. data/app/jobs/disco_app/shop_job.rb +10 -10
  48. data/app/jobs/disco_app/shop_update_job.rb +2 -0
  49. data/app/jobs/disco_app/subscription_changed_job.rb +2 -0
  50. data/app/jobs/disco_app/synchronise_carrier_service_job.rb +2 -0
  51. data/app/jobs/disco_app/synchronise_resources_job.rb +2 -0
  52. data/app/jobs/disco_app/synchronise_users_job.rb +2 -0
  53. data/app/jobs/disco_app/synchronise_webhooks_job.rb +2 -0
  54. data/app/models/application_record.rb +2 -0
  55. data/app/models/disco_app/app_settings.rb +2 -0
  56. data/app/models/disco_app/application_charge.rb +1 -1
  57. data/app/models/disco_app/concerns/app_settings.rb +2 -0
  58. data/app/models/disco_app/concerns/can_be_liquified.rb +29 -14
  59. data/app/models/disco_app/concerns/has_metafields.rb +1 -2
  60. data/app/models/disco_app/concerns/plan.rb +3 -4
  61. data/app/models/disco_app/concerns/plan_code.rb +1 -2
  62. data/app/models/disco_app/concerns/renders_assets.rb +14 -18
  63. data/app/models/disco_app/concerns/shop.rb +11 -12
  64. data/app/models/disco_app/concerns/source.rb +2 -3
  65. data/app/models/disco_app/concerns/subscription.rb +3 -3
  66. data/app/models/disco_app/concerns/synchronises.rb +10 -15
  67. data/app/models/disco_app/concerns/taggable.rb +1 -0
  68. data/app/models/disco_app/concerns/user.rb +3 -2
  69. data/app/models/disco_app/flow/action.rb +9 -0
  70. data/app/models/disco_app/flow/concerns/action.rb +27 -0
  71. data/app/models/disco_app/flow/concerns/trigger.rb +27 -0
  72. data/app/models/disco_app/flow/trigger.rb +9 -0
  73. data/app/models/disco_app/plan.rb +2 -0
  74. data/app/models/disco_app/plan_code.rb +2 -0
  75. data/app/models/disco_app/session_storage.rb +3 -0
  76. data/app/models/disco_app/shop.rb +2 -0
  77. data/app/models/disco_app/source.rb +2 -0
  78. data/app/models/disco_app/subscription.rb +2 -0
  79. data/app/models/disco_app/user.rb +2 -0
  80. data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +12 -15
  81. data/app/resources/disco_app/admin/resources/shop_resource.rb +1 -0
  82. data/app/services/disco_app/carrier_request_service.rb +3 -3
  83. data/app/services/disco_app/charges_service.rb +26 -34
  84. data/app/services/disco_app/flow/create_action.rb +35 -0
  85. data/app/services/disco_app/flow/create_trigger.rb +34 -0
  86. data/app/services/disco_app/flow/process_action.rb +50 -0
  87. data/app/services/disco_app/flow/process_trigger.rb +52 -0
  88. data/app/services/disco_app/partner_app_service.rb +1 -1
  89. data/app/services/disco_app/proxy_service.rb +2 -2
  90. data/app/services/disco_app/request_validation_service.rb +2 -2
  91. data/app/services/disco_app/subscription_service.rb +60 -32
  92. data/app/services/disco_app/webhook_service.rb +9 -11
  93. data/config/routes.rb +7 -3
  94. data/db/migrate/20150525000000_create_shops_if_not_existent.rb +80 -80
  95. data/db/migrate/20170315062548_create_disco_app_sources.rb +2 -0
  96. data/db/migrate/20170315062629_add_sources_to_shop_subscriptions.rb +3 -1
  97. data/db/migrate/20170327214540_create_disco_app_users.rb +2 -1
  98. data/db/migrate/20170606160751_fix_disco_app_users_index.rb +2 -0
  99. data/db/migrate/20181229100327_create_flow_actions_and_triggers.rb +32 -0
  100. data/lib/disco_app/configuration.rb +9 -5
  101. data/lib/disco_app/constants.rb +4 -2
  102. data/lib/disco_app/engine.rb +1 -1
  103. data/lib/disco_app/session.rb +1 -0
  104. data/lib/disco_app/support/file_fixtures.rb +2 -1
  105. data/lib/disco_app/version.rb +3 -1
  106. data/lib/generators/disco_app/install/USAGE +5 -0
  107. data/lib/generators/disco_app/install/install_generator.rb +287 -0
  108. data/lib/generators/disco_app/{templates → install/templates}/assets/javascripts/application.js +0 -0
  109. data/lib/generators/disco_app/{templates → install/templates}/assets/javascripts/components.js +0 -0
  110. data/lib/generators/disco_app/{templates → install/templates}/assets/stylesheets/application.scss +0 -0
  111. data/lib/generators/disco_app/install/templates/config/appsignal.yml +12 -0
  112. data/lib/generators/disco_app/install/templates/config/cable.yml.tt +11 -0
  113. data/lib/generators/disco_app/{templates → install/templates}/config/database.yml.tt +6 -3
  114. data/lib/generators/disco_app/install/templates/config/environments/staging.rb +108 -0
  115. data/lib/generators/disco_app/{templates → install/templates}/config/puma.rb +0 -0
  116. data/lib/generators/disco_app/{templates → install/templates}/controllers/home_controller.rb +1 -0
  117. data/lib/generators/disco_app/{templates → install/templates}/initializers/disco_app.rb +0 -0
  118. data/lib/generators/disco_app/install/templates/initializers/session_store.rb +2 -0
  119. data/lib/generators/disco_app/{templates → install/templates}/initializers/shopify_app.rb +0 -0
  120. data/lib/generators/disco_app/{templates → install/templates}/initializers/shopify_session_repository.rb +0 -0
  121. data/lib/generators/disco_app/install/templates/initializers/timber.rb +6 -0
  122. data/lib/generators/disco_app/{templates → install/templates}/root/.editorconfig +0 -0
  123. data/lib/generators/disco_app/{templates → install/templates}/root/.env +3 -0
  124. data/lib/generators/disco_app/{templates → install/templates}/root/.env.local +3 -0
  125. data/lib/generators/disco_app/install/templates/root/.github/PULL_REQUEST_TEMPLATE.md +18 -0
  126. data/lib/generators/disco_app/{templates → install/templates}/root/.gitignore +10 -0
  127. data/lib/generators/disco_app/install/templates/root/.rspec +1 -0
  128. data/lib/generators/disco_app/{templates → install/templates}/root/.rubocop.yml +263 -170
  129. data/lib/generators/disco_app/{templates → install/templates}/root/.ruby-version +0 -0
  130. data/lib/generators/disco_app/{templates → install/templates}/root/CHECKS +0 -0
  131. data/lib/generators/disco_app/{templates → install/templates}/root/Procfile +0 -0
  132. data/lib/generators/disco_app/{templates → install/templates}/root/README.md +0 -0
  133. data/lib/generators/disco_app/install/templates/spec/rails_helper.rb +40 -0
  134. data/lib/generators/disco_app/install/templates/spec/spec_helper.rb +24 -0
  135. data/lib/generators/disco_app/install/templates/spec/support/active_job.rb +13 -0
  136. data/lib/generators/disco_app/install/templates/spec/support/coveralls.rb +3 -0
  137. data/lib/generators/disco_app/install/templates/spec/support/database_cleaner.rb +17 -0
  138. data/lib/generators/disco_app/install/templates/spec/support/factory_bot.rb +3 -0
  139. data/lib/generators/disco_app/install/templates/spec/support/helpers/json_helper.rb +13 -0
  140. data/lib/generators/disco_app/install/templates/spec/support/shared_examples/a_synchronise_job.rb +12 -0
  141. data/lib/generators/disco_app/install/templates/spec/support/shoulda.rb +6 -0
  142. data/lib/generators/disco_app/install/templates/spec/support/vcr.rb +14 -0
  143. data/lib/generators/disco_app/install/templates/spec/support/webmock.rb +8 -0
  144. data/lib/generators/disco_app/{templates → install/templates}/views/home/index.html.erb +0 -0
  145. data/lib/generators/disco_app/react/USAGE +5 -0
  146. data/lib/generators/disco_app/react/react_generator.rb +108 -0
  147. data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/base_controller.rb +18 -0
  148. data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/home_controller.rb +10 -0
  149. data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/shops_controller.rb +11 -0
  150. data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/users_controller.rb +11 -0
  151. data/lib/generators/disco_app/react/templates/app/controllers/embedded/home_controller.rb +13 -0
  152. data/lib/generators/disco_app/react/templates/app/models/api_response.rb +107 -0
  153. data/lib/generators/disco_app/react/templates/app/serializers/disco_app/shop_serializer.rb +13 -0
  154. data/lib/generators/disco_app/react/templates/app/serializers/disco_app/user_serializer.rb +13 -0
  155. data/lib/generators/disco_app/react/templates/app/serializers/empty_serializer.rb +5 -0
  156. data/lib/generators/disco_app/react/templates/app/serializers/error_serializer.rb +76 -0
  157. data/lib/generators/disco_app/react/templates/app/views/embedded/home/index.html.erb +12 -0
  158. data/lib/generators/disco_app/react/templates/app/views/layouts/embedded.html.erb +10 -0
  159. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/App.jsx +77 -0
  160. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/HomePage.jsx +34 -0
  161. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/EmbeddedPage.jsx +70 -0
  162. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/ErrorBanner.jsx +58 -0
  163. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/PaginationWrapper.jsx +10 -0
  164. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/ScrollToTop.jsx +23 -0
  165. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/withApi.jsx +125 -0
  166. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/index.jsx +39 -0
  167. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/utils.js +19 -0
  168. data/lib/generators/disco_app/react/templates/app/webpack/packs/embedded.js +2 -0
  169. data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/banners.scss +7 -0
  170. data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/busy.scss +3 -0
  171. data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/index.scss +3 -0
  172. data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/pagination.scss +5 -0
  173. data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded.scss +2 -0
  174. data/lib/generators/disco_app/react/templates/config/initializers/mime_types.rb +13 -0
  175. data/lib/generators/disco_app/react/templates/config/initializers/omniauth.rb +27 -0
  176. data/lib/generators/disco_app/react/templates/config/initializers/version.rb.tt +7 -0
  177. data/lib/generators/disco_app/react/templates/config/webpack/staging.js +5 -0
  178. data/lib/generators/disco_app/react/templates/config/webpack/test.js +5 -0
  179. data/lib/generators/disco_app/react/templates/config/webpacker.yml +96 -0
  180. data/lib/generators/disco_app/react/templates/root/.eslintignore +5 -0
  181. data/lib/generators/disco_app/react/templates/root/.eslintrc +69 -0
  182. data/lib/generators/disco_app/react/templates/root/.prettierrc +3 -0
  183. data/lib/generators/disco_app/react/templates/root/VERSION +1 -0
  184. data/lib/generators/disco_app/react/templates/root/babel.config.js +72 -0
  185. data/lib/generators/disco_app/react/templates/root/package.json.tt +84 -0
  186. data/lib/generators/disco_app/react/templates/root/postcss.config.js +14 -0
  187. data/lib/tasks/api.rake +0 -2
  188. data/lib/tasks/carrier_service.rake +0 -2
  189. data/lib/tasks/database.rake +1 -1
  190. data/lib/tasks/sessions.rake +0 -2
  191. data/lib/tasks/shops.rake +0 -2
  192. data/lib/tasks/users.rake +0 -2
  193. data/lib/tasks/webhooks.rake +0 -2
  194. data/test/clients/disco_app/api_client_test.rb +3 -3
  195. data/test/controllers/disco_app/admin/shops_controller_test.rb +1 -0
  196. data/test/controllers/disco_app/charges_controller_test.rb +7 -8
  197. data/test/controllers/disco_app/install_controller_test.rb +2 -1
  198. data/test/controllers/disco_app/subscriptions_controller_test.rb +1 -0
  199. data/test/controllers/disco_app/webhooks_controller_test.rb +1 -0
  200. data/test/controllers/home_controller_test.rb +1 -1
  201. data/test/disco_app_test.rb +3 -1
  202. data/test/dummy/Rakefile +1 -1
  203. data/test/dummy/app/controllers/application_controller.rb +2 -0
  204. data/test/dummy/app/controllers/carrier_request_controller.rb +1 -0
  205. data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +1 -0
  206. data/test/dummy/app/controllers/home_controller.rb +1 -0
  207. data/test/dummy/app/controllers/proxy_controller.rb +1 -0
  208. data/test/dummy/app/jobs/disco_app/app_installed_job.rb +2 -3
  209. data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +1 -0
  210. data/test/dummy/app/models/application_record.rb +2 -0
  211. data/test/dummy/app/models/cart.rb +4 -3
  212. data/test/dummy/app/models/disco_app/shop.rb +4 -5
  213. data/test/dummy/app/models/js_configuration.rb +1 -0
  214. data/test/dummy/app/models/product.rb +3 -2
  215. data/test/dummy/app/models/widget_configuration.rb +1 -0
  216. data/test/dummy/bin/bundle +1 -1
  217. data/test/dummy/bin/rails +1 -1
  218. data/test/dummy/bin/setup +8 -8
  219. data/test/dummy/config/application.rb +4 -3
  220. data/test/dummy/config/boot.rb +2 -2
  221. data/test/dummy/config/database.yml +3 -0
  222. data/test/dummy/config/environment.rb +1 -1
  223. data/test/dummy/config/environments/staging.rb +85 -0
  224. data/test/dummy/config/initializers/disco_app.rb +1 -1
  225. data/test/dummy/config/initializers/omniauth.rb +3 -4
  226. data/test/dummy/config/initializers/session_store.rb +1 -1
  227. data/test/dummy/config/routes.rb +0 -2
  228. data/test/dummy/config/secrets.yml +3 -0
  229. data/test/dummy/db/migrate/20160307182229_create_products.rb +3 -1
  230. data/test/dummy/db/migrate/20160530160739_create_asset_models.rb +3 -1
  231. data/test/dummy/db/migrate/20161105054746_create_carts.rb +2 -1
  232. data/test/dummy/db/schema.rb +179 -152
  233. data/test/dummy/log/development.log +123 -0
  234. data/test/dummy/log/test.log +22884 -0
  235. data/test/dummy/tmp/cache/assets/sprockets/v3.0/-p/-p4kkBudGSkrc-Hs2yVEjJfJGuf9E8MY-5Huo4W9iZ0.cache +3 -0
  236. data/test/dummy/tmp/cache/assets/sprockets/v3.0/02/02ODr719GA9zZyrA_CgJwh5Vg-Pq_dHkMMbUvRIygtA.cache +3 -0
  237. data/test/dummy/tmp/cache/assets/sprockets/v3.0/0y/0yiARCmpEBX_JoExohBEcHFx0vv-nWUcjHbxtQbEA3w.cache +1 -0
  238. data/test/dummy/tmp/cache/assets/sprockets/v3.0/12/12KLSO9fSADQ-vGWrYiIRQqP1yFoPcxxZfCvm6paqnE.cache +1 -0
  239. data/test/dummy/tmp/cache/assets/sprockets/v3.0/1h/1ho8ca9C4lfKF780RN8l2MHAActK0WYWa_5I_LQO_ag.cache +1 -0
  240. data/test/dummy/tmp/cache/assets/sprockets/v3.0/2E/2E5jz5DyydbByixysW06PLr06e_FQdg9TtbY_LxsRo8.cache +0 -0
  241. data/test/dummy/tmp/cache/assets/sprockets/v3.0/2J/2JdcXeYI4Ed1DoLpSzLbKAvxbzMjrdwRoNICGVN45dU.cache +0 -0
  242. data/test/dummy/tmp/cache/assets/sprockets/v3.0/2X/2X74oB94L9QPqDYRPZkVEcbdsec1wp6qB_y7h3qwYp4.cache +1 -0
  243. data/test/dummy/tmp/cache/assets/sprockets/v3.0/32/32y6lFrrvtuqVj8A3uafoeX0iA_l4YhD5PJS1JvQIfk.cache +0 -0
  244. data/test/dummy/tmp/cache/assets/sprockets/v3.0/35/35LlNk3lHMnnozK9qRT4mpTbnAtOnjBpfHIybikbcfo.cache +0 -0
  245. data/test/dummy/tmp/cache/assets/sprockets/v3.0/3X/3Xl5kEo1hpRF6kHX2lvLp2kUaNDYGuAkylPqJsOLKXQ.cache +0 -0
  246. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4H/4HXBYKkHtI3ZmDZncAS7pdUwtVhzmwt8XWQMGH1R5xo.cache +0 -0
  247. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4H/4hR2zE1hAnLGpPIQS2v71qG-jmiWb2SHAbGiQjxijck.cache +1 -0
  248. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4O/4OJh4kuEsZJ7ok8p5Wd0wui5pwAE46AFCurNgp2gSmk.cache +1 -0
  249. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4Q/4Qe1126dQRjtMngpBX8SwgKoZu8tQFMDj6XxRU8h4TM.cache +1 -0
  250. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4a/4aPQ7FUdl3IqfTnkIvvU_TbAQVz9rEuUbGQk4YMlFHc.cache +4 -0
  251. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4t/4t0ZbDDyABeGi5MqrX0f4_dHY4BEtHc_zGRi1rkQRog.cache +3 -0
  252. data/test/dummy/tmp/cache/assets/sprockets/v3.0/5e/5efYNzR4038HZsit1p-T65aXkUBH4ZVleUZb9hEvXIw.cache +1 -0
  253. data/test/dummy/tmp/cache/assets/sprockets/v3.0/5f/5fTS4gj7gRDTvcAIYd46ZVrIJqJxQXrLVHhxzWoSJnw.cache +0 -0
  254. data/test/dummy/tmp/cache/assets/sprockets/v3.0/6B/6B5j5ojbS7-L49BW-pNvcpI-SvSgiwvMtK7cKz9UnVE.cache +1 -0
  255. data/test/dummy/tmp/cache/assets/sprockets/v3.0/87/87o1fQc0-Zza8i-HNr9IqA4HYu8ePoAOkIJKIKf8Z6c.cache +0 -0
  256. data/test/dummy/tmp/cache/assets/sprockets/v3.0/8G/8Gp6gCGqi_pI4TmiSRkdhdWznz8tSvZmez3YdyJLNDk.cache +1 -0
  257. data/test/dummy/tmp/cache/assets/sprockets/v3.0/8Z/8Z6fieaymg-zBK1iKgH2xBNnbfeA8Or1VfihnmwZfDc.cache +1 -0
  258. data/test/dummy/tmp/cache/assets/sprockets/v3.0/95/95puf81N4E8lDxbeI9yL09DueyWMUjfsUJ9IAP5jOOM.cache +1 -0
  259. data/test/dummy/tmp/cache/assets/sprockets/v3.0/9E/9E3lx2-LKkXgLWP5jG38B5uCsGiSeWq2po03Die5KF4.cache +3 -0
  260. data/test/dummy/tmp/cache/assets/sprockets/v3.0/9m/9m2H02fp4A1UDiXojyy9sl9NgiiNhAbWFL99jKLSUXQ.cache +1 -0
  261. data/test/dummy/tmp/cache/assets/sprockets/v3.0/A-/A-NmGmyyn0mjkLyKGGU0KRIZalJ2fZNyOkgZt5e910I.cache +3 -0
  262. data/test/dummy/tmp/cache/assets/sprockets/v3.0/AF/AFq71LdWk8T3oJ3clzVzZV--uw0vgLDhG7eMv-RzXWQ.cache +0 -0
  263. data/test/dummy/tmp/cache/assets/sprockets/v3.0/AV/AVaNyVl3EijOrYMZaI7oNgwVbsBIxZHrTKLar1ze83A.cache +0 -0
  264. data/test/dummy/tmp/cache/assets/sprockets/v3.0/B-/B-Qo2b4ZsaxV28WasrCQxMuvqER0D7WhzdE4ydvu6bs.cache +1 -0
  265. data/test/dummy/tmp/cache/assets/sprockets/v3.0/BC/BCGc2X3UiMM53c7SecA7o8rP8PnnWI-msrib8ngDCzU.cache +1 -0
  266. data/test/dummy/tmp/cache/assets/sprockets/v3.0/B_/B_Zzsw0s5HhMI_CS94zPqXl1CdI5oR2CksO7cRDTQKk.cache +0 -0
  267. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Bk/BkOwynwXRQOTj1eL9WyhTbRj-UqFPIrWaIpShoHs9Ck.cache +1 -0
  268. data/test/dummy/tmp/cache/assets/sprockets/v3.0/CP/CPGMneZZYKfNQIQfykCtq6C_kPvs-Q_5IT7-62sQig8.cache +0 -0
  269. data/test/dummy/tmp/cache/assets/sprockets/v3.0/D4/D4FYk677edDaB59dMMpaLK_laiH2ExaAoNfQ3tckUe0.cache +0 -0
  270. data/test/dummy/tmp/cache/assets/sprockets/v3.0/D9/D9O72M_cglvDAMJDjtzio3B6-aC_mmcbI4mLvvKnBX8.cache +1 -0
  271. data/test/dummy/tmp/cache/assets/sprockets/v3.0/DM/DMgq30X20--UWPvaAZ5Cf4oEvG4tBBHF4gLe5mnePRI.cache +1 -0
  272. data/test/dummy/tmp/cache/assets/sprockets/v3.0/E0/E03lez839JRYKgxWxjIrCnVdXJ26UoZDCSHUmR4ojdc.cache +0 -0
  273. data/test/dummy/tmp/cache/assets/sprockets/v3.0/E4/E4Pb3S8O5ZHVIkRSm6c-VFO-17tIFqQzHVloIC9yVQQ.cache +2 -0
  274. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ep/Eph4FRIXVEgT6ofe0aGn6s-8A-Q0jsyxstY422Btwgk.cache +0 -0
  275. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Eq/Eq6J05FaAYDioPfJRie-I5fIzVt8N8Cc9fFrum3R0kU.cache +2 -0
  276. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ev/EvGs2l1aBK0RXGSw8osKl01fEOHn6RuiWkR55TIZADE.cache +0 -0
  277. data/test/dummy/tmp/cache/assets/sprockets/v3.0/F3/F3sM5VHZOb3PYnt59S-zBWfWtU_HMpihPI61bBdqtPo.cache +0 -0
  278. data/test/dummy/tmp/cache/assets/sprockets/v3.0/FV/FVpKiOBNCAznp4Ya_eMnQ38K-xO3tK46uPBg-mFB4v4.cache +0 -0
  279. data/test/dummy/tmp/cache/assets/sprockets/v3.0/G5/G5aZsL6LP4HC_Of4i2yYsPaOm8dEOLIXkYdZ6tfuYH4.cache +1 -0
  280. data/test/dummy/tmp/cache/assets/sprockets/v3.0/GP/GPc2gCWO8la32JX3fK1ArDYv3QM63WVQ4S0iwpyJinA.cache +1 -0
  281. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Hg/Hgo9RBfSwY8h8vBNKW38aTRYrA2POVwE2v0ZUs4H4iY.cache +1 -0
  282. data/test/dummy/tmp/cache/assets/sprockets/v3.0/I2/I2iRIXHbnG_vgyhptOqXgQHRe8AIPfa34zmkDL06ibY.cache +2 -0
  283. data/test/dummy/tmp/cache/assets/sprockets/v3.0/IT/ITu-bZPOSBI44uFwzG-2bXQvYQvlsjFhIzQtA6FjpzI.cache +0 -0
  284. data/test/dummy/tmp/cache/assets/sprockets/v3.0/IU/IUU7_XlyzslBC48YPBBx35oNruWg9vN906B_uV4GiDg.cache +0 -0
  285. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Jt/JtSpiYSuQ7CjfmgQNb7_FLI2Bls3o7yLZf-2Yn3Tp2U.cache +1 -0
  286. data/test/dummy/tmp/cache/assets/sprockets/v3.0/KA/KA1WZHj-tCh9wJTjQ82C6RW2abPAHfPbczUvt3U0tBA.cache +1 -0
  287. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Kr/KrbYQRjOQilz5PwngxqljeBbo7gnho2oNCzt9xeostM.cache +2 -0
  288. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Kv/KvrosnOxWBhs2jdBY359Jd_PuPgvRxTEhknjpLZI2J4.cache +1 -0
  289. data/test/dummy/tmp/cache/assets/sprockets/v3.0/LB/LBKCbI8U7auhpX6SCBMuQUyESeMLr90SUzMlnB2u9K0.cache +0 -0
  290. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Lx/LxvZGzkKI0YLuIZB1jBioj31ElpU3JOmhzZrQIqu6f4.cache +2 -0
  291. data/test/dummy/tmp/cache/assets/sprockets/v3.0/MA/MAY9X_jK8UHgcT3acJjAPNRR1io9S2E5KXFZjk9BVoc.cache +0 -0
  292. data/test/dummy/tmp/cache/assets/sprockets/v3.0/MA/MAjMl63wcw2lt9F7Fu0Aml-DdcReV0Op4kCwLLkgZzE.cache +1 -0
  293. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Mb/MbUcsjDehlhHnLqP_sU8IKStNYDZEz09Ga5gk4psMZU.cache +1 -0
  294. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Mf/Mfdr1mda4l8eqbsSlL2hylksXaiTeYfwU-fq4ko_F_s.cache +1 -0
  295. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ND/NDwUm11hTOtktv5tkuUYsrSYAA911qwhO2acqloyxas.cache +0 -0
  296. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ND/ndYRNd1Jv1ESobiH7xjHCJXHooPNdUPSxG8OUoCVi40.cache +1 -0
  297. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Nu/NuS-wdnyjTJSg7hUaprtYh_3hQyvNGTTaRSmK0tUNiU.cache +3 -0
  298. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Nz/NzUGztrNqSgb4WfJOviqI6mjmx1g1L9T6V7BdOgZs3A.cache +0 -0
  299. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Oo/Oox1vL8lRd_YME1JHrD8fTh4Osz1njTWieFpIZ0_G2Y.cache +1 -0
  300. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Pj/PjFSX3ELsmK13-CVKc39OnguIcUMb4EbMV6s0lspCps.cache +1 -0
  301. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qa/Qa6iUyiZsHRjXGz39RPFnBoVYB2YNZJRlihJjDXm1Bk.cache +0 -0
  302. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qa/qA0PpX9EMQtQoiP0QbK5bYMUX9OkK1OKTIKwGLtqEMw.cache +0 -0
  303. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qv/Qvrsp8Of-JGCe25QvfmdH--wQL5vGbLtKiKb921jFq4.cache +1 -0
  304. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qx/QxOtw5pSMh_dcbeU_FmhURV2lEsclOCcFfNrk2EoSRA.cache +0 -0
  305. data/test/dummy/tmp/cache/assets/sprockets/v3.0/RB/RBgpR6mjFySj9-G4E_qadgKjQbF7G_pAA6D_iRDUk1k.cache +0 -0
  306. data/test/dummy/tmp/cache/assets/sprockets/v3.0/RY/RYr7AxgrTd-Qg2KQa84E8ph9qmA7YFrdrVHMRxMxh_w.cache +0 -0
  307. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Re/ReX-_166hRZykFAwmvCQ19NZEbV6Wa82TEZyyIJna4I.cache +3 -0
  308. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Rk/Rk2lt4VSCTBJ_5w3zwlezlAymCnCIrj-u4hkGrphzDM.cache +1 -0
  309. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Rl/RlgTK-oa7AfiImaIV0ABJ7Gfbg0PdFMeQitXJ-wgKA4.cache +1 -0
  310. data/test/dummy/tmp/cache/assets/sprockets/v3.0/SG/SGGTeEpmk20e5GZV4hcfdbmHMbsQgC8C1VhYlrrQ66M.cache +0 -0
  311. data/test/dummy/tmp/cache/assets/sprockets/v3.0/SK/SKaaVqp6uc_kLTIG2y22QaCGc6g3O4GhL8G4LwJJB8s.cache +1 -0
  312. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Sw/SwRQFgc8QgHfYpyQ7yxe3tPOoP2VJ4Gg6hNH1-fS7LQ.cache +0 -0
  313. data/test/dummy/tmp/cache/assets/sprockets/v3.0/TF/TFzMURDWcxBdkePR_mAtaTIrdc4vWlLJuL48b_xiOxQ.cache +0 -0
  314. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ul/Ulgt7E1quzZA4FaG37lmxJCoTzG74eHZg-dpjniHHYw.cache +0 -0
  315. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Vr/Vr3hv8nrf3Q9kTPp7bZK9GzGVXU77Yrd_iW4QjMda08.cache +0 -0
  316. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wg/WgJ8nC_59fjWlE7iFIGPD94i3QCNLt1kR9gcAFkou_4.cache +1 -0
  317. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wi/WiufxFw0JHFbFUn_8t_eC06A3pMN-vHT-Bs-bxXLsJk.cache +1 -0
  318. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wx/WxK5JQ5Syi4DSTgcxH3k0-PfF_g7eeb7qW1z5EEqEkY.cache +1 -0
  319. data/test/dummy/tmp/cache/assets/sprockets/v3.0/XB/XBj30cQH2Bw6KE9wpF6ylqczHNtz1rvailJi85_aXFY.cache +0 -0
  320. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Xf/XfRpHm7iz1vW_wpIEZRO4i4dFQLBLzmdP3UPg1tcf-E.cache +0 -0
  321. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Xt/Xtcw2vyNc82l8ChsSieO0h0kbELj9P2Tw9TxjmttoEw.cache +1 -0
  322. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Y0/Y0IFckg4LNe1fBvLBTvZct2gfX_g_1MpAMoTBU8qfLg.cache +0 -0
  323. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Y0/y0SkzhEQe_b3MQq69A2KH5LjHUB7vPYj6wp4neZzf6Q.cache +1 -0
  324. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Y4/Y4jdKVp7dOOcuMaUutQ1s4NmmLXq47L1LWhyXZXEaLg.cache +3 -0
  325. data/test/dummy/tmp/cache/assets/sprockets/v3.0/YE/YEjjWfxdNXU6i_3BklG7anaVrOdu-5jksfoL9GufaGU.cache +0 -0
  326. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Yi/YitmSGSMIDji4aC0llOHl0AS6taxqjRk6e_SYw-V1Is.cache +1 -0
  327. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zb/Zbler-n-7XzOneefutPvH2Cu1UsS967fqjldXwVuStU.cache +0 -0
  328. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zs/Zs5ig01Gu3Y1thnsToaKQbOIFKAQPCQm0HEEec_vblE.cache +1 -0
  329. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_C/_C10TQWkrfsm41Aaav86lCOkEcLdO7fX8yojbphLRbE.cache +1 -0
  330. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_G/_GCN7qhLkwrwMKEGcBZ9ITsu0QC1l9HD9XaViXBlNQM.cache +0 -0
  331. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_H/_HRU4CZPSyJ4PEUvsGMJSiIVZqSkNIvU3PoQGUB4l2I.cache +3 -0
  332. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_T/_TQROPFCUq0STw2BzbGITspAWA8dF_WvVa7aR02nXAE.cache +2 -0
  333. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_d/_dgNuvKh1O-ss5yC3qg8KPo3anB_pzCXJw3sphxrAFI.cache +0 -0
  334. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_p/_pqVJRc7OZRexEiqcsNQKd5ip8aNkUW9mKQc6OpAp8I.cache +0 -0
  335. data/test/dummy/tmp/cache/assets/sprockets/v3.0/a1/a1P7jCwGayzCGMYDX1CYCSvT7-pi0eiRewg9KbC-6mI.cache +2 -0
  336. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ao/aoPwSmt5N3P9MyBoWUSbkg8F3_b0jhvKuZ6GlBbwRw0.cache +1 -0
  337. data/test/dummy/tmp/cache/assets/sprockets/v3.0/au/au5wohs0fb0VW1crV3GXkqZs18247x-hRKniPTdRqRM.cache +3 -0
  338. data/test/dummy/tmp/cache/assets/sprockets/v3.0/bW/bWiegRudr21oJdzrS11Fu6RMJ9hjYELHp5F94RA6zRI.cache +1 -0
  339. data/test/dummy/tmp/cache/assets/sprockets/v3.0/c1/c1tUtq98JfLhITxPjfdj6g0Ys9pCpneLHq6wBa9v4co.cache +1 -0
  340. data/test/dummy/tmp/cache/assets/sprockets/v3.0/cC/cCneJUl-S3YnUyRCXIUSQxORgSrNf3K24tBhWxLceo4.cache +0 -0
  341. data/test/dummy/tmp/cache/assets/sprockets/v3.0/cK/cK54mTNBuCdAdDEaSzhZ43uo00XDN8FDTMcsViGpmUc.cache +0 -0
  342. data/test/dummy/tmp/cache/assets/sprockets/v3.0/cy/cydtDFqB_RwfVSEq7ACddUz8us2dp3h4WtZnAJTukfU.cache +0 -0
  343. data/test/dummy/tmp/cache/assets/sprockets/v3.0/dY/dYKoKcEw2XuaSJKsyIixsGilwIzRPtXACDh0e-w3PAM.cache +1 -0
  344. data/test/dummy/tmp/cache/assets/sprockets/v3.0/eY/eYr7xslMqmPqzIH5i1RCZ-XnPoU9owIbQ-hnrsR9SFk.cache +1 -0
  345. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ec/ecxUdWV-k6NvipoXNVXRmH32mnDSwr-ZeNVGhBlpYQQ.cache +0 -0
  346. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ej/ejTWaTrHa-76kUnlqc-EfP1NfTPMyHyqS00NMupK9WQ.cache +0 -0
  347. data/test/dummy/tmp/cache/assets/sprockets/v3.0/f7/f7tLgf7D2qMZcsHSt8R97kFvH30wBYGkeLz9-8U6uhc.cache +1 -0
  348. data/test/dummy/tmp/cache/assets/sprockets/v3.0/fX/fXmxRq4KBzpEegCEzFlkLnWGxPMakZmprlIYMFbQJ1E.cache +0 -0
  349. data/test/dummy/tmp/cache/assets/sprockets/v3.0/g7/g7UL8J5-FXcqK8YQM_ghdj_iEx4xnApvwAaWbgBV0TY.cache +1 -0
  350. data/test/dummy/tmp/cache/assets/sprockets/v3.0/gV/gVz5L3gA5w0S8o3yZpVZF-mP-TreyN5iepl1RRZ-R-E.cache +0 -0
  351. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hI/hIpGOQMTq1d2_3DlNrPG4Q7MfO1WPpkjtd7RFyBWu3A.cache +1 -0
  352. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hI/hiDKOMo7TGsMf1DyunEb03ce439H742gxAM3mgi6Ihg.cache +0 -0
  353. data/test/dummy/tmp/cache/assets/sprockets/v3.0/iG/iGaY16bCJiW0AwP1GzM9Uwad-mZCe1Q937irWUgiI9c.cache +0 -0
  354. data/test/dummy/tmp/cache/assets/sprockets/v3.0/iy/iyzEFHfDRV_piHvWtrdYZuaKMqScr_j4oPKDNHfsDjU.cache +1 -0
  355. data/test/dummy/tmp/cache/assets/sprockets/v3.0/kn/knb5R_X55aCiFz3vJWuSUSQPM4CHSNnp0iae5UMECcw.cache +1 -0
  356. data/test/dummy/tmp/cache/assets/sprockets/v3.0/lJ/lJBk3thZoWRjF0s__eDJF7w6qLdkFpA4eAbwgxH_Dho.cache +1 -0
  357. data/test/dummy/tmp/cache/assets/sprockets/v3.0/lY/lYQpdxF4JQIu4RN2ECazZRXa2r04cIJxhUIa05qojZE.cache +3 -0
  358. data/test/dummy/tmp/cache/assets/sprockets/v3.0/m4/m4QRh4VcQWkjLezj3he7eCiAI-NzVhXPeLzAAcIlYxU.cache +3 -0
  359. data/test/dummy/tmp/cache/assets/sprockets/v3.0/mH/mHZUE9U2nO5Wpi1_6ZOvKorTK0DB1XAgAy8vCzKwPUE.cache +3 -0
  360. data/test/dummy/tmp/cache/assets/sprockets/v3.0/mM/mMFR0RXDB_d00Q-DWF3raKUOK_pKIoLKWe8sbByIbmA.cache +2 -0
  361. data/test/dummy/tmp/cache/assets/sprockets/v3.0/mj/mjHlIUoMbdf3_s3E3yHmx6cD3XBpNw44VkLuszduuQU.cache +2 -0
  362. data/test/dummy/tmp/cache/assets/sprockets/v3.0/mj/mjVM7LYY8IA7tuNN3xA7teC_8er8vfGYt2yIlZtm9ss.cache +1 -0
  363. data/test/dummy/tmp/cache/assets/sprockets/v3.0/my/myTGA5_heGVdkdReWuRE40AphRvs-JEHfS14DVL5pIk.cache +1 -0
  364. data/test/dummy/tmp/cache/assets/sprockets/v3.0/nb/nbBwrQkAIneOVTkIGBCdsMtZIT4043SIOR6sXJP_LHU.cache +0 -0
  365. data/test/dummy/tmp/cache/assets/sprockets/v3.0/nq/nqJAnHctHKNe0jSpv19MqPf8BB_w495YOe2rzF_ehos.cache +1 -0
  366. data/test/dummy/tmp/cache/assets/sprockets/v3.0/nq/nqj0Mk3m_97LBVDR7MZgIC80X4_mAeL6ZwDdqgtI1Gw.cache +0 -0
  367. data/test/dummy/tmp/cache/assets/sprockets/v3.0/od/odSXqZl0ZH48zGt8AMIRhQkDU-YtstjobbS5e7ZkN3k.cache +0 -0
  368. data/test/dummy/tmp/cache/assets/sprockets/v3.0/pO/pOygnjQeOv1F__tZVlOBgQIns_FPOY0Hg8jD24Q1MzQ.cache +0 -0
  369. data/test/dummy/tmp/cache/assets/sprockets/v3.0/pZ/pZ0SU1EHDUQqCK7f8encuHCG6TMsPQBoRaMFxy5vqfo.cache +1 -0
  370. data/test/dummy/tmp/cache/assets/sprockets/v3.0/pp/ppVvwCOmFUDtfjoiXcUyRCdjSHm90PXKtkb4qnuRXco.cache +3 -0
  371. data/test/dummy/tmp/cache/assets/sprockets/v3.0/pu/puTfP5YER7biq4Y4_EFFbcfDeYmOSuBt6z0CGzwFGkA.cache +2 -0
  372. data/test/dummy/tmp/cache/assets/sprockets/v3.0/q1/q1F3pWmX7ZJXbKtQUuNQE2PWTRGmvfAySjo0yHBS_BM.cache +1 -0
  373. data/test/dummy/tmp/cache/assets/sprockets/v3.0/q8/q8rvNJwHhh0RwP_ggTBQX15sVQfAGmHVkhopI3IPsHY.cache +0 -0
  374. data/test/dummy/tmp/cache/assets/sprockets/v3.0/q9/q9Mvo1FFlvxT_LCt7H3xYwBY1V5h3Jpe0eEXH8fv5Wk.cache +1 -0
  375. data/test/dummy/tmp/cache/assets/sprockets/v3.0/qG/qGfHn3hSyl2R1i-xwZDvumLbhV-cFIv5USU0_1iehb4.cache +1 -0
  376. data/test/dummy/tmp/cache/assets/sprockets/v3.0/qS/qSUOLK2mlX6Qg4pb39vYusg3MMB-5KqC4PqOt3qqU_I.cache +0 -0
  377. data/test/dummy/tmp/cache/assets/sprockets/v3.0/qZ/qZ7PeULj1cXaHw1RbEoymDg9vVEWoqR7b2tfe6Bjc-g.cache +1 -0
  378. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ql/qldoyykCYdfXs4qvYwGJiKYSq-r0R1Hlw6cjY8IUfmk.cache +3 -0
  379. data/test/dummy/tmp/cache/assets/sprockets/v3.0/s9/s91U__cBvKPCirRM_cTGjn2d8Iv3KUJ2NbC6HeITxbg.cache +0 -0
  380. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sI/sINrJvpYJWwxFKLJbhUC7OAf7ZuyUP888wzWFOlBPts.cache +3 -0
  381. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sI/sIyfH9Z6L3jrjvuKCFI7EqiQOZ2AETT6OvpnumLpjQg.cache +1 -0
  382. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sU/sU13DKNwa_RkHnSkgjrhcBWQed7kETAwwikJRsAU00M.cache +1 -0
  383. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sq/sqx5Hs0Pydu-MUCvGvLJVo9B2Q3rFkn88DuIz9KSkaU.cache +1 -0
  384. data/test/dummy/tmp/cache/assets/sprockets/v3.0/tp/tpDl_cHg-S7_NzWixr_IxfubDy8a3sRY9mOfB_eDu_0.cache +0 -0
  385. data/test/dummy/tmp/cache/assets/sprockets/v3.0/tt/tthgO-QyL3rkOmOxkriE3s0lD3m_en6g7IVBmP6WfpQ.cache +1 -0
  386. data/test/dummy/tmp/cache/assets/sprockets/v3.0/tu/tuvygi0c8-7HYCnG21mYtnMbRq3byGoC-v0EPr_rcqw.cache +1 -0
  387. data/test/dummy/tmp/cache/assets/sprockets/v3.0/u7/u7Ba9DdA5Y5nYCATAuCiIkwdzV8uFn2mIAz6uIKQGCY.cache +1 -0
  388. data/test/dummy/tmp/cache/assets/sprockets/v3.0/u9/u9kCUfXtoYIqW4g4MTByGD589fmczyYmfBSV1aBwKlA.cache +1 -0
  389. data/test/dummy/tmp/cache/assets/sprockets/v3.0/vo/vo2bQsrDyQHltM8J3UVYBos-ex4ksUlyS_JaAXL9gp8.cache +0 -0
  390. data/test/dummy/tmp/cache/assets/sprockets/v3.0/wN/wNuzOUQkHcNtINLMu5i-oArMVgYINdApTU3CTGrBcr0.cache +1 -0
  391. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xH/xHIb5G7OYHTA8bRoeHgv0B_-ttn9qrt7X8tNzWmBOSw.cache +0 -0
  392. data/test/dummy/tmp/cache/assets/sprockets/v3.0/yG/yGybriOHUct9EJuL4y_xiTsDmXYhzyhtdyjMl_bdnyA.cache +0 -0
  393. data/test/dummy/tmp/cache/assets/sprockets/v3.0/yH/yHWDEeVRq__H83jsasoRVfR13AGZqz3-ljrem37eYhA.cache +1 -0
  394. data/test/dummy/tmp/cache/assets/sprockets/v3.0/yJ/yJOgszuKdJlo777tz6syyQBm-5U9m92DdtWG80FyLrk.cache +1 -0
  395. data/test/dummy/tmp/cache/assets/sprockets/v3.0/zN/zN6nRw3aNJhIaKnykNJFXsCpDZNJhoeGEh6OC0YmBEQ.cache +0 -0
  396. data/test/dummy/tmp/cache/assets/sprockets/v3.0/zZ/zZz-dhRhZqpFP0QbFY4EnkgUw5okSYV61DC3u-Uo_Lg.cache +1 -0
  397. data/test/dummy/tmp/cache/assets/sprockets/v3.0/zy/zyV8aFlgWhLDl1dtI6PHd8CiddDhYL9jpZTc6f00L2Y.cache +0 -0
  398. data/test/integration/synchronises_test.rb +2 -1
  399. data/test/jobs/disco_app/app_installed_job_test.rb +27 -8
  400. data/test/jobs/disco_app/app_uninstalled_job_test.rb +5 -2
  401. data/test/jobs/disco_app/send_subscription_job_test.rb +3 -2
  402. data/test/jobs/disco_app/synchronise_carrier_service_job_test.rb +1 -0
  403. data/test/jobs/disco_app/synchronise_users_job_test.rb +1 -0
  404. data/test/jobs/disco_app/synchronise_webhooks_job_test.rb +31 -14
  405. data/test/models/disco_app/can_be_liquified_test.rb +3 -1
  406. data/test/models/disco_app/has_metafields_test.rb +37 -18
  407. data/test/models/disco_app/renders_assets_test.rb +2 -1
  408. data/test/models/disco_app/session_test.rb +2 -2
  409. data/test/services/disco_app/charges_service_test.rb +7 -8
  410. data/test/services/disco_app/flow/create_action_test.rb +51 -0
  411. data/test/services/disco_app/flow/create_trigger_test.rb +56 -0
  412. data/test/services/disco_app/flow/process_action_test.rb +68 -0
  413. data/test/services/disco_app/flow/process_trigger_test.rb +61 -0
  414. data/test/services/disco_app/subscription_service_test.rb +3 -2
  415. data/test/support/test_file_fixtures.rb +2 -2
  416. data/test/support/test_shopify_api.rb +1 -1
  417. data/test/test_helper.rb +7 -7
  418. data/test/vcr/flow_trigger_invalid_title.yml +35 -0
  419. data/test/vcr/flow_trigger_valid.yml +38 -0
  420. metadata +732 -250
  421. data/app/clients/disco_app/rollbar_client.rb +0 -53
  422. data/app/clients/disco_app/rollbar_client_error.rb +0 -2
  423. data/lib/generators/disco_app/USAGE +0 -5
  424. data/lib/generators/disco_app/disco_app_generator.rb +0 -236
  425. data/lib/generators/disco_app/templates/config/newrelic.yml +0 -26
  426. data/lib/generators/disco_app/templates/initializers/rollbar.rb +0 -23
  427. data/lib/generators/disco_app/templates/initializers/session_store.rb +0 -2
  428. data/lib/generators/disco_app/templates/root/.codeclimate.yml +0 -7
  429. data/lib/tasks/rollbar.rake +0 -24
@@ -0,0 +1 @@
1
+ "%��Q ��[��hy�n��%�lp�X�[���6
@@ -0,0 +1 @@
1
+ I"�app/assets/javascripts/application.js?type=application/javascript&pipeline=self&id=f3cc80238a137fa894ead2565beff098101aa9e4051f8a72c804092b9a92743e:ET
@@ -0,0 +1 @@
1
+ "%l3��%��g�ݫJ|��� .h�e��d����
@@ -0,0 +1 @@
1
+ I"�/Users/johnvoon/Developer/disco_app/app/assets/stylesheets/disco_app/frame.scss?type=text/css&pipeline=self&id=04d51957b7e62e5fb7c7ebcd2a120dd139f12b4c772fda4400688e00b4c63b63:ET
@@ -0,0 +1 @@
1
+ "%G'���H�5HE�<%����|�+�[�VD�
@@ -0,0 +1 @@
1
+ "%�d�-�K���`���8Y��3�͹/Y����a~K
@@ -0,0 +1 @@
1
+ "%�].qG-�G�ѥJAXu&��J��@�]���
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class SynchronisesTest < ActionDispatch::IntegrationTest
4
+
4
5
  include ActiveJob::TestHelper
5
6
  fixtures :all
6
7
 
@@ -57,7 +58,7 @@ class SynchronisesTest < ActionDispatch::IntegrationTest
57
58
  test 'shopify api model still allows synchronisation' do
58
59
  assert_equal({}, @product.data)
59
60
 
60
- shopify_product = ShopifyAPI::Product.new(ActiveSupport::JSON.decode(webhook_fixture('product_updated')))
61
+ shopify_product = ShopifyAPI::Product.new(JSON.parse(webhook_fixture('product_updated')))
61
62
  Product.synchronise(@shop, shopify_product)
62
63
 
63
64
  # Assert the product was updated locally, with the correct attributes.
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DiscoApp::AppInstalledJobTest < ActionController::TestCase
4
+
4
5
  include ActiveJob::TestHelper
5
6
 
6
7
  def setup
@@ -11,7 +12,7 @@ class DiscoApp::AppInstalledJobTest < ActionController::TestCase
11
12
  stub_request(:get, "#{@shop.admin_url}/shop.json").to_return(status: 200, body: api_fixture('widget_store/shop').to_json)
12
13
  stub_request(:get, "#{@shop.admin_url}/carrier_services.json").to_return(status: 200, body: api_fixture('widget_store/carrier_services').to_json)
13
14
  stub_request(:post, "#{@shop.admin_url}/carrier_services.json").to_return(status: 200)
14
- stub_request(:post, "https://api.discolabs.com/v1/app_subscriptions.json").to_return(status: 200)
15
+ stub_request(:post, 'https://api.discolabs.com/v1/app_subscriptions.json').to_return(status: 200)
15
16
  end
16
17
 
17
18
  def teardown
@@ -20,9 +21,11 @@ class DiscoApp::AppInstalledJobTest < ActionController::TestCase
20
21
  end
21
22
 
22
23
  test 'app installed job performs shop update job' do
23
- # Assert the main install job can be enqueued and performed.
24
- perform_enqueued_jobs do
25
- DiscoApp::AppInstalledJob.perform_later(@shop)
24
+ with_suppressed_output do
25
+ # Assert the main install job can be enqueued and performed.
26
+ perform_enqueued_jobs do
27
+ DiscoApp::AppInstalledJob.perform_later(@shop)
28
+ end
26
29
  end
27
30
 
28
31
  # Assert the update shop job was performed.
@@ -33,8 +36,10 @@ class DiscoApp::AppInstalledJobTest < ActionController::TestCase
33
36
  test 'app installed job automatically subscribes stores to the correct default plan' do
34
37
  @shop.current_subscription.destroy
35
38
 
36
- perform_enqueued_jobs do
37
- DiscoApp::AppInstalledJob.perform_later(@shop)
39
+ with_suppressed_output do
40
+ perform_enqueued_jobs do
41
+ DiscoApp::AppInstalledJob.perform_later(@shop)
42
+ end
38
43
  end
39
44
 
40
45
  # Assert the shop was subscribed to the development plan.
@@ -44,8 +49,10 @@ class DiscoApp::AppInstalledJobTest < ActionController::TestCase
44
49
  test 'app installed job automatically subscribes stores to the correct default plan with a plan code and a source' do
45
50
  @shop.current_subscription.destroy
46
51
 
47
- perform_enqueued_jobs do
48
- DiscoApp::AppInstalledJob.perform_later(@shop, 'PODCAST', 'smp')
52
+ with_suppressed_output do
53
+ perform_enqueued_jobs do
54
+ DiscoApp::AppInstalledJob.perform_later(@shop, 'PODCAST', 'smp')
55
+ end
49
56
  end
50
57
 
51
58
  # Assert the shop was subscribed to the development plan.
@@ -54,4 +61,16 @@ class DiscoApp::AppInstalledJobTest < ActionController::TestCase
54
61
  assert_equal 'smpodcast', @shop.current_subscription.source.name
55
62
  end
56
63
 
64
+ private
65
+
66
+ # Prevents the output from the webhook synchronisation from
67
+ # printing to STDOUT and messing up the test output
68
+ def with_suppressed_output
69
+ original_stdout = $stdout.clone
70
+ $stdout.reopen(File.new('/dev/null', 'w'))
71
+ yield
72
+ ensure
73
+ $stdout.reopen(original_stdout)
74
+ end
75
+
57
76
  end
@@ -1,11 +1,12 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DiscoApp::AppUninstalledJobTest < ActionController::TestCase
4
+
4
5
  include ActiveJob::TestHelper
5
6
 
6
7
  def setup
7
8
  @shop = disco_app_shops(:widget_store)
8
- stub_request(:post, "https://api.discolabs.com/v1/app_subscriptions.json").to_return(status: 200)
9
+ stub_request(:post, 'https://api.discolabs.com/v1/app_subscriptions.json').to_return(status: 200)
9
10
  perform_enqueued_jobs do
10
11
  DiscoApp::AppUninstalledJob.perform_later(@shop, {})
11
12
  end
@@ -25,6 +26,8 @@ class DiscoApp::AppUninstalledJobTest < ActionController::TestCase
25
26
  test 'app uninstalled job can be extended using concerns' do
26
27
  assert_performed_jobs 2
27
28
  @shop.reload
28
- assert_equal 'Nowhere', @shop.data[:country_name] # Assert extended method called.
29
+ # Assert extended method called.
30
+ assert_equal 'Nowhere', @shop.data[:country_name]
29
31
  end
32
+
30
33
  end
@@ -1,11 +1,12 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DiscoApp::SendSubscriptionJobTest < ActionController::TestCase
4
+
4
5
  include ActiveJob::TestHelper
5
6
 
6
7
  def setup
7
8
  @shop = disco_app_shops(:widget_store)
8
- stub_request(:post, "https://api.discolabs.com/v1/app_subscriptions.json").to_return(status: 200)
9
+ stub_request(:post, 'https://api.discolabs.com/v1/app_subscriptions.json').to_return(status: 200)
9
10
  end
10
11
 
11
12
  def teardown
@@ -18,7 +19,7 @@ class DiscoApp::SendSubscriptionJobTest < ActionController::TestCase
18
19
  perform_enqueued_jobs do
19
20
  DiscoApp::SendSubscriptionJob.perform_later(@shop)
20
21
  end
21
- assert_requested(:post, "https://api.discolabs.com/v1/app_subscriptions.json", times: 1)
22
+ assert_requested(:post, 'https://api.discolabs.com/v1/app_subscriptions.json', times: 1)
22
23
  end
23
24
 
24
25
  end
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DiscoApp::SynchroniseCarrierServiceJobTest < ActionController::TestCase
4
+
4
5
  include ActiveJob::TestHelper
5
6
 
6
7
  def setup
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DiscoApp::SynchroniseUsersJobTest < ActionController::TestCase
4
+
4
5
  include ActiveJob::TestHelper
5
6
 
6
7
  def setup
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DiscoApp::SynchroniseWebhooksJobTest < ActionController::TestCase
4
+
4
5
  include ActiveJob::TestHelper
5
6
 
6
7
  def setup
@@ -13,30 +14,46 @@ class DiscoApp::SynchroniseWebhooksJobTest < ActionController::TestCase
13
14
  end
14
15
 
15
16
  test 'webhook synchronisation job creates webhooks for all expected topics' do
16
- stub_request(:get, "#{@shop.admin_url}/webhooks.json").to_return(status: 200, body: api_fixture('widget_store/webhooks').to_json)
17
- stub_request(:post, "#{@shop.admin_url}/webhooks.json").to_return(status: 200)
17
+ with_suppressed_output do
18
+ stub_request(:get, "#{@shop.admin_url}/webhooks.json").to_return(status: 200, body: api_fixture('widget_store/webhooks').to_json)
19
+ stub_request(:post, "#{@shop.admin_url}/webhooks.json").to_return(status: 200)
18
20
 
19
- perform_enqueued_jobs do
20
- DiscoApp::SynchroniseWebhooksJob.perform_later(@shop)
21
- end
21
+ perform_enqueued_jobs do
22
+ DiscoApp::SynchroniseWebhooksJob.perform_later(@shop)
23
+ end
22
24
 
23
- # Assert that all 4 expected webhook topics were POSTed to.
24
- ['app/uninstalled', 'shop/update', 'orders/create', 'orders/paid'].each do |expected_webhook_topic|
25
- assert_requested(:post, "#{@shop.admin_url}/webhooks.json", times: 1) { |request| request.body.include?(expected_webhook_topic) }
25
+ # Assert that all 4 expected webhook topics were POSTed to.
26
+ ['app/uninstalled', 'shop/update', 'orders/create', 'orders/paid'].each do |expected_webhook_topic|
27
+ assert_requested(:post, "#{@shop.admin_url}/webhooks.json", times: 1) { |request| request.body.include?(expected_webhook_topic) }
28
+ end
26
29
  end
27
30
  end
28
31
 
29
32
  test 'returns error messages for webhooks that cannot be registered' do
30
33
  VCR.use_cassette('webhook_failure') do
31
- output = capture_io do
32
- perform_enqueued_jobs do
33
- DiscoApp::SynchroniseWebhooksJob.perform_later(@shop)
34
+ with_suppressed_output do
35
+ output = capture_io do
36
+ perform_enqueued_jobs do
37
+ DiscoApp::SynchroniseWebhooksJob.perform_later(@shop)
38
+ end
34
39
  end
35
- end
36
40
 
37
- assert output.first.include?('Invalid topic specified.')
38
- assert output.first.include?('orders/create - not registered')
41
+ assert output.first.include?('Invalid topic specified.')
42
+ assert output.first.include?('orders/create - not registered')
43
+ end
39
44
  end
40
45
  end
41
46
 
47
+ private
48
+
49
+ # Prevents the output from the webhook synchronisation from
50
+ # printing to STDOUT and messing up the test output
51
+ def with_suppressed_output
52
+ original_stdout = $stdout.clone
53
+ $stdout.reopen(File.new('/dev/null', 'w'))
54
+ yield
55
+ ensure
56
+ $stdout.reopen(original_stdout)
57
+ end
58
+
42
59
  end
@@ -3,6 +3,7 @@ require 'test_helper'
3
3
  class DiscoApp::CanBeLiquifiedTest < ActiveSupport::TestCase
4
4
 
5
5
  class Model
6
+
6
7
  include ActiveModel::Model
7
8
  include DiscoApp::Concerns::CanBeLiquified
8
9
 
@@ -17,6 +18,7 @@ class DiscoApp::CanBeLiquifiedTest < ActiveSupport::TestCase
17
18
  def liquid_model_name
18
19
  'model'
19
20
  end
21
+
20
22
  end
21
23
 
22
24
  def setup
@@ -48,7 +50,7 @@ class DiscoApp::CanBeLiquifiedTest < ActiveSupport::TestCase
48
50
 
49
51
  # Return an asset fixture as a string.
50
52
  def liquid_fixture(path)
51
- filename = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'fixtures', 'liquid', "#{path}")
53
+ filename = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'fixtures', 'liquid', path.to_s)
52
54
  File.read(filename).strip
53
55
  end
54
56
 
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DiscoApp::HasMetafieldsTest < ActiveSupport::TestCase
4
+
4
5
  include DiscoApp::Test::ShopifyAPI
5
6
 
6
7
  def setup
@@ -14,27 +15,45 @@ class DiscoApp::HasMetafieldsTest < ActiveSupport::TestCase
14
15
  end
15
16
 
16
17
  test 'can write metafields with a single namespace' do
17
- stub_api_request(:put, "#{@shop.admin_url}/products/#{@product.id}.json", 'widget_store/products/write_metafields_single_namespace')
18
- assert @shop.with_api_context { @product.write_metafields(
19
- namespace1: {
20
- key1: 'value1',
21
- key2: 2
22
- }
23
- ) }
18
+ stub_api_request(
19
+ :put,
20
+ "#{@shop.admin_url}/products/#{@product.id}.json",
21
+ 'widget_store/products/write_metafields_single_namespace'
22
+ )
23
+
24
+ assert(
25
+ @shop.with_api_context do
26
+ @product.write_metafields(
27
+ namespace1: {
28
+ key1: 'value1',
29
+ key2: 2
30
+ }
31
+ )
32
+ end
33
+ )
24
34
  end
25
35
 
26
36
  test 'can write metafields with multiple namespaces' do
27
- stub_api_request(:put, "#{@shop.admin_url}/products/#{@product.id}.json", 'widget_store/products/write_metafields_multiple_namespaces')
28
- assert @shop.with_api_context { @product.write_metafields(
29
- namespace1: {
30
- n1key1: 'value1',
31
- n1key2: 2
32
- },
33
- namespace2: {
34
- n2key3: 'value3',
35
- n2key4: 2
36
- },
37
- ) }
37
+ stub_api_request(
38
+ :put,
39
+ "#{@shop.admin_url}/products/#{@product.id}.json",
40
+ 'widget_store/products/write_metafields_multiple_namespaces'
41
+ )
42
+
43
+ assert(
44
+ @shop.with_api_context do
45
+ @product.write_metafields(
46
+ namespace1: {
47
+ n1key1: 'value1',
48
+ n1key2: 2
49
+ },
50
+ namespace2: {
51
+ n2key3: 'value3',
52
+ n2key4: 2
53
+ }
54
+ )
55
+ end
56
+ )
38
57
  end
39
58
 
40
59
  end
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DiscoApp::RendersAssetsTest < ActiveSupport::TestCase
4
+
4
5
  include ActiveJob::TestHelper
5
6
  include DiscoApp::Test::ShopifyAPI
6
7
 
@@ -102,7 +103,7 @@ class DiscoApp::RendersAssetsTest < ActiveSupport::TestCase
102
103
 
103
104
  # Return an asset fixture as a string.
104
105
  def asset_fixture(path)
105
- filename = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'fixtures', 'assets', "#{path}")
106
+ filename = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'fixtures', 'assets', path.to_s)
106
107
  File.read(filename)
107
108
  end
108
109
 
@@ -7,8 +7,8 @@ class DiscoApp::SessionTest < ActiveSupport::TestCase
7
7
  @session = DiscoApp::Session.create(
8
8
  session_id: 'a91bfc51fa79c9d09d43e2615d9345d4',
9
9
  data: {
10
- :shopify => @shop.id,
11
- :shopify_domain => @shop.shopify_domain
10
+ shopify: @shop.id,
11
+ shopify_domain: @shop.shopify_domain
12
12
  }
13
13
  )
14
14
  end
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DiscoApp::ChargesServiceTest < ActiveSupport::TestCase
4
+
4
5
  include DiscoApp::Test::ShopifyAPI
5
6
 
6
7
  def setup
@@ -30,15 +31,13 @@ class DiscoApp::ChargesServiceTest < ActiveSupport::TestCase
30
31
  end
31
32
 
32
33
  test 'creating a new charge for a recurring subscription is successful' do
33
- res = { "recurring_application_charge": { "name": "Basic",
34
- "price": "9.99",
35
- "trial_days": 14,
36
- "return_url": /^https:\/\/test\.example\.com\/subscriptions\/304261385\/charges\/53297050(1|2)\/activate$/,
37
- "test": true
38
- } }
34
+ res = { "recurring_application_charge": { "name": 'Basic',
35
+ "price": '9.99',
36
+ "trial_days": 14,
37
+ "return_url": %r{^https://test\.example\.com/subscriptions/304261385/charges/53297050(1|2)/activate$},
38
+ "test": true } }
39
39
  stub_request(:post, "#{@shop.admin_url}/recurring_application_charges.json")
40
- .with(body: res
41
- ).to_return(status: 201, body:api_fixture("widget_store/charges/create_recurring_application_charge_response").to_json)
40
+ .with(body: res).to_return(status: 201, body: api_fixture('widget_store/charges/create_recurring_application_charge_response').to_json)
42
41
 
43
42
  new_charge = DiscoApp::ChargesService.create(@shop, @subscription)
44
43
  assert_equal 654381179, new_charge.shopify_id
@@ -0,0 +1,51 @@
1
+ require 'test_helper'
2
+
3
+ module DiscoApp
4
+ module Flow
5
+ class CreateActionTest < ActiveSupport::TestCase
6
+
7
+ include ActiveJob::TestHelper
8
+
9
+ def setup
10
+ @shop = disco_app_shops(:widget_store)
11
+ end
12
+
13
+ def teardown
14
+ @shop = nil
15
+ end
16
+
17
+ test 'call to create flow action creates model' do
18
+ result = CreateAction.call(shop: @shop, action_id: action_id, action_run_id: action_run_id, properties: properties)
19
+ assert result.success?
20
+ assert result.action.persisted?
21
+ assert result.action.pending?
22
+ assert_equal action_id, result.action.action_id
23
+ assert_equal action_run_id, result.action.action_run_id
24
+ assert_equal properties, result.action.properties
25
+ end
26
+
27
+ test 'call to create flow action enqueues processing job' do
28
+ assert_enqueued_with(job: ProcessActionJob) do
29
+ CreateAction.call(shop: @shop, action_id: action_id, action_run_id: action_run_id, properties: properties)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def action_id
36
+ 'test_action_id'
37
+ end
38
+
39
+ def action_run_id
40
+ 'bdb15e45-4f9d-4c80-88c8-7b43a24edaac-30892-cc8eb62a-14db-43fc-bc33-d6dea41ae623'
41
+ end
42
+
43
+ def properties
44
+ {
45
+ 'customer_email' => 'name@example.com'
46
+ }
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,56 @@
1
+ require 'test_helper'
2
+
3
+ module DiscoApp
4
+ module Flow
5
+ class CreateTriggerTest < ActiveSupport::TestCase
6
+
7
+ include ActiveJob::TestHelper
8
+
9
+ def setup
10
+ @shop = disco_app_shops(:widget_store)
11
+ end
12
+
13
+ def teardown
14
+ @shop = nil
15
+ end
16
+
17
+ test 'call to create flow trigger creates model' do
18
+ result = CreateTrigger.call(shop: @shop, title: title, resource_name: resource_name, resource_url: resource_url, properties: properties)
19
+ assert result.success?
20
+ assert result.trigger.persisted?
21
+ assert result.trigger.pending?
22
+ assert_equal title, result.trigger.title
23
+ assert_equal resource_name, result.trigger.resource_name
24
+ assert_equal resource_url, result.trigger.resource_url
25
+ assert_equal properties, result.trigger.properties
26
+ end
27
+
28
+ test 'call to create flow trigger enqueues processing job' do
29
+ assert_enqueued_with(job: ProcessTriggerJob) do
30
+ CreateTrigger.call(shop: @shop, title: title, resource_name: resource_name, resource_url: resource_url, properties: properties)
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def title
37
+ 'Test trigger'
38
+ end
39
+
40
+ def resource_name
41
+ 'test_resource_name'
42
+ end
43
+
44
+ def resource_url
45
+ 'https://example.com/test-resource-url'
46
+ end
47
+
48
+ def properties
49
+ {
50
+ 'Customer email' => 'name@example.com'
51
+ }
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,68 @@
1
+ require 'test_helper'
2
+ require 'interactor'
3
+
4
+ class TestActionId
5
+
6
+ include Interactor
7
+
8
+ def call
9
+ # noop
10
+ end
11
+
12
+ end
13
+
14
+ module DiscoApp
15
+ module Flow
16
+ class ProcessActionTest < ActiveSupport::TestCase
17
+
18
+ include ActiveJob::TestHelper
19
+
20
+ def setup
21
+ @shop = disco_app_shops(:widget_store)
22
+ @action = @shop.flow_actions.create(
23
+ action_id: 'test_action_id',
24
+ action_run_id: 'bdb15e45-4f9d-4c80-88c8-7b43a24edaac-30892-cc8eb62a-14db-43fc-bc33-d6dea41ae623',
25
+ properties: { 'customer_email' => 'name@example.com' }
26
+ )
27
+ @now = Time.zone.parse('2018-12-29T00:00:00Z')
28
+ Timecop.freeze(@now)
29
+ end
30
+
31
+ def teardown
32
+ @shop = nil
33
+ @action = nil
34
+ @now = nil
35
+ Timecop.return
36
+ end
37
+
38
+ test 'call to process action that has already succeeded fails' do
39
+ @action.succeeded!
40
+ result = ProcessAction.call(action: @action)
41
+ assert_not result.success?
42
+ end
43
+
44
+ test 'call to process trigger that has already failed fails' do
45
+ @action.failed!
46
+ result = ProcessAction.call(action: @action)
47
+ assert_not result.success?
48
+ end
49
+
50
+ test 'processing pending action with existing service class succeeds' do
51
+ result = ProcessAction.call(action: @action)
52
+ assert result.success?
53
+ assert @action.succeeded?
54
+ assert_equal @now, @action.processed_at
55
+ end
56
+
57
+ test 'processing pending action with non-existent service class does not succeed' do
58
+ @action.update!(action_id: 'unknown_test_action_id')
59
+ result = ProcessAction.call(action: @action)
60
+ assert_not result.success?
61
+ assert @action.failed?
62
+ assert_equal @now, @action.processed_at
63
+ assert_equal ['Could not find service class for unknown_test_action_id'], @action.processing_errors
64
+ end
65
+
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,61 @@
1
+ require 'test_helper'
2
+
3
+ module DiscoApp
4
+ module Flow
5
+ class ProcessTriggerTest < ActiveSupport::TestCase
6
+
7
+ include ActiveJob::TestHelper
8
+
9
+ def setup
10
+ @shop = disco_app_shops(:widget_store)
11
+ @trigger = @shop.flow_triggers.create(
12
+ title: 'Test trigger',
13
+ resource_name: 'test_resource_name',
14
+ resource_url: 'https://example.com/test-resource-url',
15
+ properties: { 'Customer email' => 'name@example.com' }
16
+ )
17
+ @now = Time.zone.parse('2018-12-29T00:00:00Z')
18
+ Timecop.freeze(@now)
19
+ end
20
+
21
+ def teardown
22
+ @shop = nil
23
+ @trigger = nil
24
+ @now = nil
25
+ Timecop.return
26
+ end
27
+
28
+ test 'call to process trigger that has already succeeded fails' do
29
+ @trigger.succeeded!
30
+ result = ProcessTrigger.call(trigger: @trigger)
31
+ assert_not result.success?
32
+ end
33
+
34
+ test 'call to process trigger that has already failed fails' do
35
+ @trigger.failed!
36
+ result = ProcessTrigger.call(trigger: @trigger)
37
+ assert_not result.success?
38
+ end
39
+
40
+ test 'processing valid pending trigger succeeds and makes the expected api call' do
41
+ VCR.use_cassette('flow_trigger_valid') do
42
+ result = ProcessTrigger.call(trigger: @trigger)
43
+ assert result.success?
44
+ assert @trigger.succeeded?
45
+ assert_equal @now, @trigger.processed_at
46
+ end
47
+ end
48
+
49
+ test 'processing invalid pending trigger makes the expected api call with errors logged' do
50
+ VCR.use_cassette('flow_trigger_invalid_title') do
51
+ result = ProcessTrigger.call(trigger: @trigger)
52
+ assert_not result.success?
53
+ assert @trigger.failed?
54
+ assert_equal @now, @trigger.processed_at
55
+ assert_equal 1, @trigger.processing_errors.size
56
+ end
57
+ end
58
+
59
+ end
60
+ end
61
+ end