disco_app 0.10.5

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 (362) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +37 -0
  3. data/app/assets/images/disco_app/icon.svg +1 -0
  4. data/app/assets/images/disco_app/icons.svg +0 -0
  5. data/app/assets/javascripts/disco_app/components/custom/filterable_shop_list.js.jsx +61 -0
  6. data/app/assets/javascripts/disco_app/components/custom/inline-radio-options.es6.jsx +59 -0
  7. data/app/assets/javascripts/disco_app/components/custom/rules-editor.es6.jsx +432 -0
  8. data/app/assets/javascripts/disco_app/components/custom/shop_filter_query.js.jsx +13 -0
  9. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tab.js.jsx +34 -0
  10. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tabs.js.jsx +21 -0
  11. data/app/assets/javascripts/disco_app/components/custom/shop_list.js.jsx +142 -0
  12. data/app/assets/javascripts/disco_app/components/custom/shop_row.js.jsx +43 -0
  13. data/app/assets/javascripts/disco_app/components/custom/shopify_admin_link.js.jsx +29 -0
  14. data/app/assets/javascripts/disco_app/components/ui-kit/cards/card-footer.es6.jsx +11 -0
  15. data/app/assets/javascripts/disco_app/components/ui-kit/cards/card-header.es6.jsx +11 -0
  16. data/app/assets/javascripts/disco_app/components/ui-kit/cards/card-section.es6.jsx +30 -0
  17. data/app/assets/javascripts/disco_app/components/ui-kit/cards/card.es6.jsx +16 -0
  18. data/app/assets/javascripts/disco_app/components/ui-kit/cards/cart-section-title.es6.jsx +17 -0
  19. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_form.es6.jsx +72 -0
  20. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_input.es6.jsx +20 -0
  21. data/app/assets/javascripts/disco_app/components/ui-kit/forms/button.es6.jsx +15 -0
  22. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-checkbox.es6.jsx +30 -0
  23. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-radio.es6.jsx +30 -0
  24. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-select.es6.jsx +45 -0
  25. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-text.es6.jsx +69 -0
  26. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-textarea.es6.jsx +48 -0
  27. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-time.es6.jsx +7 -0
  28. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__element.es6.jsx +17 -0
  29. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__group.es6.jsx +11 -0
  30. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__section.es6.jsx +11 -0
  31. data/app/assets/javascripts/disco_app/components/ui-kit/icons/icon-chevron.es6.jsx +33 -0
  32. data/app/assets/javascripts/disco_app/components/ui-kit/icons/next-icon.es6.jsx +18 -0
  33. data/app/assets/javascripts/disco_app/components/ui-kit/input_select.es6.jsx +21 -0
  34. data/app/assets/javascripts/disco_app/components/ui-kit/tables/table.es6.jsx +22 -0
  35. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-annotated-section.es6.jsx +29 -0
  36. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-empty-state.es6.jsx +35 -0
  37. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-footer-help.es6.jsx +13 -0
  38. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-layout-item.es6.jsx +11 -0
  39. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-layout-section.es6.jsx +19 -0
  40. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-layout-sections.es6.jsx +11 -0
  41. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-layout.es6.jsx +11 -0
  42. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-page-actions.es6.jsx +13 -0
  43. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-page-actions__buttons.es6.jsx +27 -0
  44. data/app/assets/javascripts/disco_app/components.js +2 -0
  45. data/app/assets/javascripts/disco_app/disco_app.js +9 -0
  46. data/app/assets/javascripts/disco_app/frame.js +152 -0
  47. data/app/assets/javascripts/disco_app/shopify-turbolinks.js +7 -0
  48. data/app/assets/javascripts/disco_app/ui-kit.js +1 -0
  49. data/app/assets/stylesheets/disco_app/admin/_header.scss +75 -0
  50. data/app/assets/stylesheets/disco_app/admin/_layout.scss +32 -0
  51. data/app/assets/stylesheets/disco_app/admin/_nav.scss +184 -0
  52. data/app/assets/stylesheets/disco_app/admin.scss +11 -0
  53. data/app/assets/stylesheets/disco_app/disco_app.scss +21 -0
  54. data/app/assets/stylesheets/disco_app/frame/_buttons.scss +54 -0
  55. data/app/assets/stylesheets/disco_app/frame/_forms.scss +26 -0
  56. data/app/assets/stylesheets/disco_app/frame/_layout.scss +77 -0
  57. data/app/assets/stylesheets/disco_app/frame/_type.scss +25 -0
  58. data/app/assets/stylesheets/disco_app/frame.scss +10 -0
  59. data/app/assets/stylesheets/disco_app/mixins/_flexbox.scss +400 -0
  60. data/app/assets/stylesheets/disco_app/ui-kit/_ui-empty-state.scss +121 -0
  61. data/app/assets/stylesheets/disco_app/ui-kit/_ui-footer-help.scss +28 -0
  62. data/app/assets/stylesheets/disco_app/ui-kit/_ui-forms.scss +69 -0
  63. data/app/assets/stylesheets/disco_app/ui-kit/_ui-icons.scss +28 -0
  64. data/app/assets/stylesheets/disco_app/ui-kit/_ui-kit.scss +5116 -0
  65. data/app/assets/stylesheets/disco_app/ui-kit/_ui-layout.scss +15 -0
  66. data/app/assets/stylesheets/disco_app/ui-kit/_ui-page-actions.scss +23 -0
  67. data/app/assets/stylesheets/disco_app/ui-kit/_ui-stack.scss +39 -0
  68. data/app/assets/stylesheets/disco_app/ui-kit/_ui-tabs.scss +75 -0
  69. data/app/assets/stylesheets/disco_app/ui-kit/_ui-type.scss +13 -0
  70. data/app/controllers/disco_app/admin/app_settings_controller.rb +3 -0
  71. data/app/controllers/disco_app/admin/application_controller.rb +3 -0
  72. data/app/controllers/disco_app/admin/concerns/app_settings_controller.rb +24 -0
  73. data/app/controllers/disco_app/admin/concerns/authenticated_controller.rb +20 -0
  74. data/app/controllers/disco_app/admin/concerns/plans_controller.rb +54 -0
  75. data/app/controllers/disco_app/admin/concerns/shops_controller.rb +7 -0
  76. data/app/controllers/disco_app/admin/concerns/subscriptions_controller.rb +29 -0
  77. data/app/controllers/disco_app/admin/plans_controller.rb +3 -0
  78. data/app/controllers/disco_app/admin/resources/shops_controller.rb +3 -0
  79. data/app/controllers/disco_app/admin/shops_controller.rb +3 -0
  80. data/app/controllers/disco_app/admin/subscriptions_controller.rb +3 -0
  81. data/app/controllers/disco_app/charges_controller.rb +47 -0
  82. data/app/controllers/disco_app/concerns/app_proxy_controller.rb +40 -0
  83. data/app/controllers/disco_app/concerns/authenticated_controller.rb +56 -0
  84. data/app/controllers/disco_app/concerns/carrier_request_controller.rb +35 -0
  85. data/app/controllers/disco_app/frame_controller.rb +9 -0
  86. data/app/controllers/disco_app/install_controller.rb +27 -0
  87. data/app/controllers/disco_app/subscriptions_controller.rb +32 -0
  88. data/app/controllers/disco_app/webhooks_controller.rb +46 -0
  89. data/app/controllers/sessions_controller.rb +28 -0
  90. data/app/helpers/disco_app/application_helper.rb +50 -0
  91. data/app/jobs/disco_app/app_installed_job.rb +3 -0
  92. data/app/jobs/disco_app/app_uninstalled_job.rb +3 -0
  93. data/app/jobs/disco_app/concerns/app_installed_job.rb +39 -0
  94. data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +20 -0
  95. data/app/jobs/disco_app/concerns/render_asset_group_job.rb +8 -0
  96. data/app/jobs/disco_app/concerns/shop_update_job.rb +13 -0
  97. data/app/jobs/disco_app/concerns/subscription_changed_job.rb +7 -0
  98. data/app/jobs/disco_app/concerns/synchronise_carrier_service_job.rb +55 -0
  99. data/app/jobs/disco_app/concerns/synchronise_resources_job.rb +12 -0
  100. data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +52 -0
  101. data/app/jobs/disco_app/render_asset_group_job.rb +3 -0
  102. data/app/jobs/disco_app/shop_job.rb +27 -0
  103. data/app/jobs/disco_app/shop_update_job.rb +3 -0
  104. data/app/jobs/disco_app/subscription_changed_job.rb +3 -0
  105. data/app/jobs/disco_app/synchronise_carrier_service_job.rb +3 -0
  106. data/app/jobs/disco_app/synchronise_resources_job.rb +3 -0
  107. data/app/jobs/disco_app/synchronise_webhooks_job.rb +3 -0
  108. data/app/models/disco_app/app_settings.rb +3 -0
  109. data/app/models/disco_app/application_charge.rb +18 -0
  110. data/app/models/disco_app/concerns/app_settings.rb +7 -0
  111. data/app/models/disco_app/concerns/can_be_liquified.rb +45 -0
  112. data/app/models/disco_app/concerns/has_metafields.rb +48 -0
  113. data/app/models/disco_app/concerns/plan.rb +26 -0
  114. data/app/models/disco_app/concerns/plan_code.rb +15 -0
  115. data/app/models/disco_app/concerns/renders_assets.rb +166 -0
  116. data/app/models/disco_app/concerns/shop.rb +84 -0
  117. data/app/models/disco_app/concerns/subscription.rb +60 -0
  118. data/app/models/disco_app/concerns/synchronises.rb +58 -0
  119. data/app/models/disco_app/concerns/taggable.rb +16 -0
  120. data/app/models/disco_app/plan.rb +3 -0
  121. data/app/models/disco_app/plan_code.rb +3 -0
  122. data/app/models/disco_app/recurring_application_charge.rb +18 -0
  123. data/app/models/disco_app/session_storage.rb +18 -0
  124. data/app/models/disco_app/shop.rb +3 -0
  125. data/app/models/disco_app/subscription.rb +3 -0
  126. data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +100 -0
  127. data/app/resources/disco_app/admin/resources/shop_resource.rb +4 -0
  128. data/app/services/disco_app/carrier_request_service.rb +15 -0
  129. data/app/services/disco_app/charges_service.rb +81 -0
  130. data/app/services/disco_app/proxy_service.rb +17 -0
  131. data/app/services/disco_app/subscription_service.rb +46 -0
  132. data/app/services/disco_app/webhook_service.rb +30 -0
  133. data/app/views/disco_app/admin/app_settings/edit.html.erb +5 -0
  134. data/app/views/disco_app/admin/plans/_form.html.erb +72 -0
  135. data/app/views/disco_app/admin/plans/_plan_code_fields.html.erb +15 -0
  136. data/app/views/disco_app/admin/plans/edit.html.erb +7 -0
  137. data/app/views/disco_app/admin/plans/index.html.erb +43 -0
  138. data/app/views/disco_app/admin/plans/new.html.erb +7 -0
  139. data/app/views/disco_app/admin/shops/index.html.erb +13 -0
  140. data/app/views/disco_app/admin/subscriptions/edit.html.erb +33 -0
  141. data/app/views/disco_app/charges/activate.html.erb +1 -0
  142. data/app/views/disco_app/charges/create.html.erb +1 -0
  143. data/app/views/disco_app/charges/new.html.erb +23 -0
  144. data/app/views/disco_app/frame/frame.html.erb +36 -0
  145. data/app/views/disco_app/install/installing.html.erb +22 -0
  146. data/app/views/disco_app/install/uninstalling.html.erb +1 -0
  147. data/app/views/disco_app/proxy_errors/404.html.erb +1 -0
  148. data/app/views/disco_app/shared/_card.html.erb +14 -0
  149. data/app/views/disco_app/shared/_icons.html.erb +1 -0
  150. data/app/views/disco_app/shared/_section.html.erb +17 -0
  151. data/app/views/disco_app/subscriptions/new.html.erb +25 -0
  152. data/app/views/layouts/admin/_nav_items.erb +20 -0
  153. data/app/views/layouts/admin.html.erb +67 -0
  154. data/app/views/layouts/application.html.erb +18 -0
  155. data/app/views/layouts/embedded_app.html.erb +44 -0
  156. data/app/views/layouts/embedded_app_modal.html.erb +28 -0
  157. data/app/views/sessions/new.html.erb +28 -0
  158. data/config/routes.rb +63 -0
  159. data/db/migrate/20150525000000_create_shops_if_not_existent.rb +15 -0
  160. data/db/migrate/20150525162112_add_status_to_shops.rb +5 -0
  161. data/db/migrate/20150525171422_add_meta_to_shops.rb +11 -0
  162. data/db/migrate/20150629210346_add_charge_status_to_shop.rb +5 -0
  163. data/db/migrate/20150814214025_add_more_meta_to_shops.rb +15 -0
  164. data/db/migrate/20151017231302_create_disco_app_plans.rb +13 -0
  165. data/db/migrate/20151017232027_create_disco_app_subscriptions.rb +15 -0
  166. data/db/migrate/20151017234409_move_shop_to_disco_app_engine.rb +5 -0
  167. data/db/migrate/20160112233706_create_disco_app_sessions.rb +12 -0
  168. data/db/migrate/20160113194418_add_shop_id_to_disco_app_sessions.rb +6 -0
  169. data/db/migrate/20160223111044_create_disco_app_settings.rb +8 -0
  170. data/db/migrate/20160301223215_update_plans.rb +22 -0
  171. data/db/migrate/20160301224558_update_subscriptions.rb +13 -0
  172. data/db/migrate/20160302104816_create_disco_app_recurring_application_charges.rb +14 -0
  173. data/db/migrate/20160302105259_create_disco_app_application_charges.rb +14 -0
  174. data/db/migrate/20160302134728_drop_charge_status_from_shops.rb +5 -0
  175. data/db/migrate/20160302142941_add_shopify_attributes_to_charges.rb +8 -0
  176. data/db/migrate/20160331093148_create_disco_app_plan_codes.rb +14 -0
  177. data/db/migrate/20160401044420_add_status_to_plan_codes.rb +5 -0
  178. data/db/migrate/20160401045551_add_amount_and_plan_code_to_disco_app_subscriptions.rb +7 -0
  179. data/db/migrate/20160425205211_add_source_to_disco_app_subscriptions.rb +5 -0
  180. data/db/migrate/20160426033520_add_trial_period_days_to_disco_app_subscriptions.rb +5 -0
  181. data/db/migrate/20160513140727_add_name_to_disco_app_shops.rb +5 -0
  182. data/db/migrate/20160521135510_move_shop_to_synchronises.rb +61 -0
  183. data/lib/disco_app/configuration.rb +45 -0
  184. data/lib/disco_app/constants.rb +4 -0
  185. data/lib/disco_app/engine.rb +26 -0
  186. data/lib/disco_app/session.rb +14 -0
  187. data/lib/disco_app/support/file_fixtures.rb +23 -0
  188. data/lib/disco_app/test_help.rb +11 -0
  189. data/lib/disco_app/version.rb +3 -0
  190. data/lib/disco_app.rb +7 -0
  191. data/lib/generators/disco_app/USAGE +5 -0
  192. data/lib/generators/disco_app/disco_app_generator.rb +239 -0
  193. data/lib/generators/disco_app/templates/assets/javascripts/application.js +17 -0
  194. data/lib/generators/disco_app/templates/assets/javascripts/components.js +3 -0
  195. data/lib/generators/disco_app/templates/assets/stylesheets/application.scss +5 -0
  196. data/lib/generators/disco_app/templates/config/database.yml.tt +20 -0
  197. data/lib/generators/disco_app/templates/config/newrelic.yml +26 -0
  198. data/lib/generators/disco_app/templates/config/puma.rb +15 -0
  199. data/lib/generators/disco_app/templates/controllers/home_controller.rb +7 -0
  200. data/lib/generators/disco_app/templates/initializers/disco_app.rb +28 -0
  201. data/lib/generators/disco_app/templates/initializers/rollbar.rb +19 -0
  202. data/lib/generators/disco_app/templates/initializers/session_store.rb +2 -0
  203. data/lib/generators/disco_app/templates/initializers/shopify_app.rb +7 -0
  204. data/lib/generators/disco_app/templates/initializers/shopify_session_repository.rb +7 -0
  205. data/lib/generators/disco_app/templates/root/CHECKS +4 -0
  206. data/lib/generators/disco_app/templates/root/Procfile +2 -0
  207. data/lib/generators/disco_app/templates/views/home/index.html.erb +2 -0
  208. data/lib/tasks/carrier_service.rake +10 -0
  209. data/lib/tasks/database.rake +8 -0
  210. data/lib/tasks/sessions.rake +9 -0
  211. data/lib/tasks/shops.rake +10 -0
  212. data/lib/tasks/start.rake +3 -0
  213. data/lib/tasks/webhooks.rake +10 -0
  214. data/test/controllers/disco_app/admin/shops_controller_test.rb +54 -0
  215. data/test/controllers/disco_app/charges_controller_test.rb +99 -0
  216. data/test/controllers/disco_app/install_controller_test.rb +50 -0
  217. data/test/controllers/disco_app/subscriptions_controller_test.rb +68 -0
  218. data/test/controllers/disco_app/webhooks_controller_test.rb +58 -0
  219. data/test/controllers/home_controller_test.rb +92 -0
  220. data/test/controllers/proxy_controller_test.rb +42 -0
  221. data/test/disco_app_test.rb +7 -0
  222. data/test/dummy/Rakefile +6 -0
  223. data/test/dummy/app/assets/javascripts/application.js +17 -0
  224. data/test/dummy/app/assets/stylesheets/application.scss +5 -0
  225. data/test/dummy/app/controllers/application_controller.rb +6 -0
  226. data/test/dummy/app/controllers/carrier_request_controller.rb +10 -0
  227. data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +8 -0
  228. data/test/dummy/app/controllers/home_controller.rb +7 -0
  229. data/test/dummy/app/controllers/proxy_controller.rb +8 -0
  230. data/test/dummy/app/helpers/application_helper.rb +2 -0
  231. data/test/dummy/app/jobs/carts_update_job.rb +7 -0
  232. data/test/dummy/app/jobs/disco_app/app_installed_job.rb +16 -0
  233. data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +11 -0
  234. data/test/dummy/app/jobs/products_create_job.rb +7 -0
  235. data/test/dummy/app/jobs/products_delete_job.rb +7 -0
  236. data/test/dummy/app/jobs/products_update_job.rb +7 -0
  237. data/test/dummy/app/models/cart.rb +24 -0
  238. data/test/dummy/app/models/disco_app/shop.rb +15 -0
  239. data/test/dummy/app/models/js_configuration.rb +8 -0
  240. data/test/dummy/app/models/product.rb +9 -0
  241. data/test/dummy/app/models/widget_configuration.rb +10 -0
  242. data/test/dummy/app/views/assets/script_tag.js.erb +1 -0
  243. data/test/dummy/app/views/assets/test.js.erb +1 -0
  244. data/test/dummy/app/views/assets/widget.js.erb +2 -0
  245. data/test/dummy/app/views/assets/widget.scss.erb +3 -0
  246. data/test/dummy/app/views/home/index.html.erb +2 -0
  247. data/test/dummy/app/views/snippets/widget.liquid.erb +1 -0
  248. data/test/dummy/bin/bundle +3 -0
  249. data/test/dummy/bin/rails +4 -0
  250. data/test/dummy/bin/rake +4 -0
  251. data/test/dummy/bin/setup +29 -0
  252. data/test/dummy/config/application.rb +38 -0
  253. data/test/dummy/config/boot.rb +5 -0
  254. data/test/dummy/config/database.codeship.yml +23 -0
  255. data/test/dummy/config/database.gitlab-ci.yml +24 -0
  256. data/test/dummy/config/database.yml +20 -0
  257. data/test/dummy/config/environment.rb +5 -0
  258. data/test/dummy/config/environments/development.rb +41 -0
  259. data/test/dummy/config/environments/production.rb +85 -0
  260. data/test/dummy/config/environments/test.rb +42 -0
  261. data/test/dummy/config/initializers/assets.rb +11 -0
  262. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  263. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  264. data/test/dummy/config/initializers/disco_app.rb +28 -0
  265. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  266. data/test/dummy/config/initializers/inflections.rb +16 -0
  267. data/test/dummy/config/initializers/mime_types.rb +4 -0
  268. data/test/dummy/config/initializers/omniauth.rb +9 -0
  269. data/test/dummy/config/initializers/session_store.rb +2 -0
  270. data/test/dummy/config/initializers/shopify_app.rb +7 -0
  271. data/test/dummy/config/initializers/shopify_session_repository.rb +7 -0
  272. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  273. data/test/dummy/config/locales/en.yml +23 -0
  274. data/test/dummy/config/routes.rb +11 -0
  275. data/test/dummy/config/secrets.yml +22 -0
  276. data/test/dummy/config.ru +4 -0
  277. data/test/dummy/db/migrate/20160307182229_create_products.rb +11 -0
  278. data/test/dummy/db/migrate/20160530160739_create_asset_models.rb +19 -0
  279. data/test/dummy/db/migrate/20161105054746_create_carts.rb +13 -0
  280. data/test/dummy/db/schema.rb +152 -0
  281. data/test/dummy/public/404.html +67 -0
  282. data/test/dummy/public/422.html +67 -0
  283. data/test/dummy/public/500.html +66 -0
  284. data/test/dummy/public/favicon.ico +0 -0
  285. data/test/fixtures/api/widget_store/assets/create_script_tag_js_request.json +6 -0
  286. data/test/fixtures/api/widget_store/assets/create_script_tag_js_response.json +12 -0
  287. data/test/fixtures/api/widget_store/assets/create_script_tag_request.json +6 -0
  288. data/test/fixtures/api/widget_store/assets/create_script_tag_response.json +10 -0
  289. data/test/fixtures/api/widget_store/assets/create_test_js_request.json +6 -0
  290. data/test/fixtures/api/widget_store/assets/create_test_js_response.json +12 -0
  291. data/test/fixtures/api/widget_store/assets/create_widget_js_request.json +6 -0
  292. data/test/fixtures/api/widget_store/assets/create_widget_js_response.json +12 -0
  293. data/test/fixtures/api/widget_store/assets/create_widget_liquid_request.json +6 -0
  294. data/test/fixtures/api/widget_store/assets/create_widget_liquid_response.json +12 -0
  295. data/test/fixtures/api/widget_store/assets/create_widget_scss_request.json +6 -0
  296. data/test/fixtures/api/widget_store/assets/create_widget_scss_response.json +12 -0
  297. data/test/fixtures/api/widget_store/assets/get_script_tags_empty_request.json +1 -0
  298. data/test/fixtures/api/widget_store/assets/get_script_tags_empty_response.json +1 -0
  299. data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_request.json +1 -0
  300. data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_response.json +12 -0
  301. data/test/fixtures/api/widget_store/assets/update_script_tag_request.json +10 -0
  302. data/test/fixtures/api/widget_store/assets/update_script_tag_response.json +10 -0
  303. data/test/fixtures/api/widget_store/carrier_services.json +1 -0
  304. data/test/fixtures/api/widget_store/carrier_services_create.json +8 -0
  305. data/test/fixtures/api/widget_store/charges/activate_application_charge_request.json +16 -0
  306. data/test/fixtures/api/widget_store/charges/activate_application_charge_response.json +1 -0
  307. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_request.json +20 -0
  308. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_response.json +1 -0
  309. data/test/fixtures/api/widget_store/charges/create_application_charge_request.json +9 -0
  310. data/test/fixtures/api/widget_store/charges/create_application_charge_response.json +16 -0
  311. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_request.json +9 -0
  312. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_response.json +20 -0
  313. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_request.json +9 -0
  314. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_response.json +20 -0
  315. data/test/fixtures/api/widget_store/charges/get_accepted_application_charge_response.json +16 -0
  316. data/test/fixtures/api/widget_store/charges/get_accepted_recurring_application_charge_response.json +20 -0
  317. data/test/fixtures/api/widget_store/charges/get_declined_application_charge_response.json +16 -0
  318. data/test/fixtures/api/widget_store/charges/get_declined_recurring_application_charge_response.json +20 -0
  319. data/test/fixtures/api/widget_store/charges/get_pending_application_charge_response.json +16 -0
  320. data/test/fixtures/api/widget_store/charges/get_pending_recurring_application_charge_response.json +20 -0
  321. data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_request.json +31 -0
  322. data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_response.json +1 -0
  323. data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_request.json +19 -0
  324. data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_response.json +1 -0
  325. data/test/fixtures/api/widget_store/shop.json +46 -0
  326. data/test/fixtures/api/widget_store/webhooks.json +1 -0
  327. data/test/fixtures/assets/test.js +1 -0
  328. data/test/fixtures/assets/test.min.js +1 -0
  329. data/test/fixtures/carts.yml +5 -0
  330. data/test/fixtures/disco_app/application_charges.yml +11 -0
  331. data/test/fixtures/disco_app/plan_codes.yml +13 -0
  332. data/test/fixtures/disco_app/plans.yml +37 -0
  333. data/test/fixtures/disco_app/recurring_application_charges.yml +11 -0
  334. data/test/fixtures/disco_app/shops.yml +10 -0
  335. data/test/fixtures/disco_app/subscriptions.yml +22 -0
  336. data/test/fixtures/js_configurations.yml +3 -0
  337. data/test/fixtures/liquid/model.liquid +8 -0
  338. data/test/fixtures/products.yml +4 -0
  339. data/test/fixtures/webhooks/app_uninstalled.json +46 -0
  340. data/test/fixtures/webhooks/cart_updated.json +28 -0
  341. data/test/fixtures/webhooks/product_created.json +167 -0
  342. data/test/fixtures/webhooks/product_deleted.json +3 -0
  343. data/test/fixtures/webhooks/product_updated.json +167 -0
  344. data/test/fixtures/widget_configurations.yml +4 -0
  345. data/test/integration/synchronises_test.rb +62 -0
  346. data/test/jobs/disco_app/app_installed_job_test.rb +57 -0
  347. data/test/jobs/disco_app/app_uninstalled_job_test.rb +30 -0
  348. data/test/jobs/disco_app/synchronise_carrier_service_job_test.rb +25 -0
  349. data/test/jobs/disco_app/synchronise_webhooks_job_test.rb +30 -0
  350. data/test/models/disco_app/can_be_liquified_test.rb +55 -0
  351. data/test/models/disco_app/has_metafields_test.rb +40 -0
  352. data/test/models/disco_app/plan_test.rb +5 -0
  353. data/test/models/disco_app/renders_assets_test.rb +109 -0
  354. data/test/models/disco_app/session_test.rb +31 -0
  355. data/test/models/disco_app/shop_test.rb +43 -0
  356. data/test/models/disco_app/subscription_test.rb +19 -0
  357. data/test/services/disco_app/charges_service_test.rb +112 -0
  358. data/test/services/disco_app/subscription_service_test.rb +60 -0
  359. data/test/support/test_file_fixtures.rb +29 -0
  360. data/test/support/test_shopify_api.rb +16 -0
  361. data/test/test_helper.rb +55 -0
  362. metadata +888 -0
@@ -0,0 +1,62 @@
1
+ require 'test_helper'
2
+
3
+ class SynchronisesTest < ActionDispatch::IntegrationTest
4
+ fixtures :all
5
+
6
+ def setup
7
+ @shop = disco_app_shops(:widget_store)
8
+ @product = products(:ipod)
9
+ @routes = DiscoApp::Engine.routes
10
+ end
11
+
12
+ def teardown
13
+ @shop = nil
14
+ end
15
+
16
+ test 'new product is created when product created webhook is received' do
17
+ post_webhook('product_created', :'products/create')
18
+
19
+ # Assert the product was created locally, with the correct attributes.
20
+ product = Product.find(632910392)
21
+ assert_equal 'IPod Nano - 8GB', product.data['title']
22
+ end
23
+
24
+ test 'existing product is updated when product updated webhook is received' do
25
+ assert_equal({}, @product.data)
26
+
27
+ post_webhook('product_updated', :'products/update')
28
+
29
+ # Assert the product was updated locally, with the correct attributes.
30
+ @product.reload
31
+ assert_equal 632910393, @product.id
32
+ assert_equal 'IPod Nano - 8GB', @product.data['title']
33
+ end
34
+
35
+ test 'existing product is deleted when product deleted webhook is received' do
36
+ post_webhook('product_deleted', :'products/delete')
37
+ assert_equal 0, Product.count
38
+ end
39
+
40
+ test 'cart with token for id is updated when cart updated webhook is received' do
41
+ post_webhook('cart_updated', :'carts/update')
42
+
43
+ # Assert the cart data was correctly updated
44
+ assert_equal 3200.0, carts(:cart).total_price
45
+ end
46
+
47
+ private
48
+
49
+ def webhooks_url
50
+ DiscoApp::Engine.routes.url_helpers.webhooks_url
51
+ end
52
+
53
+ def post_webhook(fixture_name, webhook_topic)
54
+ body = webhook_fixture(fixture_name)
55
+ post(webhooks_url, body, {
56
+ HTTP_X_SHOPIFY_TOPIC: webhook_topic,
57
+ HTTP_X_SHOPIFY_SHOP_DOMAIN: @shop.shopify_domain,
58
+ HTTP_X_SHOPIFY_HMAC_SHA256: DiscoApp::WebhookService.calculated_hmac(body, ShopifyApp.configuration.secret)
59
+ })
60
+ end
61
+
62
+ end
@@ -0,0 +1,57 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::AppInstalledJobTest < ActionController::TestCase
4
+ include ActiveJob::TestHelper
5
+
6
+ def setup
7
+ @shop = disco_app_shops(:widget_store)
8
+
9
+ stub_request(:get, "#{@shop.admin_url}/webhooks.json").to_return(status: 200, body: api_fixture('widget_store/webhooks').to_json)
10
+ stub_request(:post, "#{@shop.admin_url}/webhooks.json").to_return(status: 200)
11
+ stub_request(:get, "#{@shop.admin_url}/shop.json").to_return(status: 200, body: api_fixture('widget_store/shop').to_json)
12
+ stub_request(:get, "#{@shop.admin_url}/carrier_services.json").to_return(status: 200, body: api_fixture('widget_store/carrier_services').to_json)
13
+ stub_request(:post, "#{@shop.admin_url}/carrier_services.json").to_return(status: 200)
14
+ end
15
+
16
+ def teardown
17
+ @shop = nil
18
+
19
+ WebMock.reset!
20
+ end
21
+
22
+ 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)
26
+ end
27
+
28
+ # Assert the update shop job was performed.
29
+ @shop.reload
30
+ assert_equal 'United States', @shop.data['country_name']
31
+ end
32
+
33
+ test 'app installed job automatically subscribes stores to the correct default plan' do
34
+ @shop.current_subscription.destroy
35
+
36
+ perform_enqueued_jobs do
37
+ DiscoApp::AppInstalledJob.perform_later(@shop)
38
+ end
39
+
40
+ # Assert the shop was subscribed to the development plan.
41
+ assert_equal disco_app_plans(:development), @shop.current_subscription.plan
42
+ end
43
+
44
+ test 'app installed job automatically subscribes stores to the correct default plan with a plan code and a source' do
45
+ @shop.current_subscription.destroy
46
+
47
+ perform_enqueued_jobs do
48
+ DiscoApp::AppInstalledJob.perform_later(@shop, 'PODCAST', 'smpodcast')
49
+ end
50
+
51
+ # Assert the shop was subscribed to the development plan.
52
+ assert_equal disco_app_plans(:development), @shop.current_subscription.plan
53
+ assert_equal disco_app_plan_codes(:podcast_dev), @shop.current_subscription.plan_code
54
+ assert_equal 'smpodcast', @shop.current_subscription.source
55
+ end
56
+
57
+ end
@@ -0,0 +1,30 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::AppUninstalledJobTest < ActionController::TestCase
4
+ include ActiveJob::TestHelper
5
+
6
+ def setup
7
+ @shop = disco_app_shops(:widget_store)
8
+
9
+ perform_enqueued_jobs do
10
+ DiscoApp::AppUninstalledJob.perform_later(@shop, {})
11
+ end
12
+ end
13
+
14
+ def teardown
15
+ @shop = nil
16
+ end
17
+
18
+ test 'app uninstalled job changes shop status' do
19
+ assert_performed_jobs 1
20
+ @shop.reload
21
+ assert @shop.uninstalled?
22
+ end
23
+
24
+ test 'app uninstalled job can be extended using concerns' do
25
+ assert_performed_jobs 1
26
+ @shop.reload
27
+ assert_equal 'Nowhere', @shop.data['country_name'] # Assert extended method called.
28
+ end
29
+
30
+ end
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::SynchroniseCarrierServiceJobTest < ActionController::TestCase
4
+ include ActiveJob::TestHelper
5
+
6
+ def setup
7
+ @shop = disco_app_shops(:widget_store)
8
+
9
+ stub_request(:get, "#{@shop.admin_url}/carrier_services.json").to_return(status: 200, body: api_fixture('widget_store/carrier_services').to_json)
10
+ stub_request(:post, "#{@shop.admin_url}/carrier_services.json").with(body: api_fixture('widget_store/carrier_services_create').to_json).to_return(status: 200)
11
+ end
12
+
13
+ def teardown
14
+ @shop = nil
15
+
16
+ WebMock.reset!
17
+ end
18
+
19
+ test 'carrier service synchronisation job creates expected carrier service' do
20
+ perform_enqueued_jobs do
21
+ DiscoApp::SynchroniseCarrierServiceJob.perform_later(@shop)
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,30 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::SynchroniseWebhooksJobTest < ActionController::TestCase
4
+ include ActiveJob::TestHelper
5
+
6
+ def setup
7
+ @shop = disco_app_shops(:widget_store)
8
+
9
+ stub_request(:get, "#{@shop.admin_url}/webhooks.json").to_return(status: 200, body: api_fixture('widget_store/webhooks').to_json)
10
+ stub_request(:post, "#{@shop.admin_url}/webhooks.json").to_return(status: 200)
11
+ end
12
+
13
+ def teardown
14
+ @shop = nil
15
+
16
+ WebMock.reset!
17
+ end
18
+
19
+ test 'webhook synchronisation job creates webhooks for all expected topics' do
20
+ perform_enqueued_jobs do
21
+ DiscoApp::SynchroniseWebhooksJob.perform_later(@shop)
22
+ end
23
+
24
+ # Assert that all 4 expected webhook topics were POSTed to.
25
+ ['app/uninstalled', 'shop/update', 'orders/create', 'orders/paid'].each do |expected_webhook_topic|
26
+ assert_requested(:post, "#{@shop.admin_url}/webhooks.json", times: 1) { |request| request.body.include?(expected_webhook_topic) }
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,55 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::CanBeLiquifiedTest < ActiveSupport::TestCase
4
+
5
+ class Model
6
+ include ActiveModel::Model
7
+ include DiscoApp::Concerns::CanBeLiquified
8
+
9
+ def initialize(attributes = {})
10
+ @attributes = attributes
11
+ end
12
+
13
+ def as_json
14
+ @attributes.as_json
15
+ end
16
+
17
+ def liquid_model_name
18
+ 'model'
19
+ end
20
+ end
21
+
22
+ def setup
23
+ @model = Model.new(
24
+ numeric: 42,
25
+ boolean: true,
26
+ empty: nil,
27
+ string: "The cat's pyjamas are \"great\".",
28
+ string_html: "The cat's pyjamas are <strong style=\"color: red;\">great</strong>.",
29
+ array_of_numerics: [1, 2, 3],
30
+ array_of_strings: ['A', 'B', 'C'],
31
+ hash: {}
32
+ )
33
+ end
34
+
35
+ def teardown
36
+ @model = nil
37
+ end
38
+
39
+ ##
40
+ # Test Liquid output.
41
+ ##
42
+
43
+ test 'correct liquid is output for model' do
44
+ assert_equal liquid_fixture('model.liquid'), @model.to_liquid
45
+ end
46
+
47
+ private
48
+
49
+ # Return an asset fixture as a string.
50
+ def liquid_fixture(path)
51
+ filename = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'fixtures', 'liquid', "#{path}")
52
+ File.read(filename).strip
53
+ end
54
+
55
+ end
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::HasMetafieldsTest < ActiveSupport::TestCase
4
+ include DiscoApp::Test::ShopifyAPI
5
+
6
+ def setup
7
+ @product = products(:ipod)
8
+ @shop = @product.shop
9
+ end
10
+
11
+ def teardown
12
+ @product = nil
13
+ @shop = nil
14
+ end
15
+
16
+ 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.temp { @product.write_metafields(
19
+ namespace1: {
20
+ key1: 'value1',
21
+ key2: 2
22
+ }
23
+ ) }
24
+ end
25
+
26
+ 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.temp { @product.write_metafields(
29
+ namespace1: {
30
+ n1key1: 'value1',
31
+ n1key2: 2
32
+ },
33
+ namespace2: {
34
+ n2key3: 'value3',
35
+ n2key4: 2
36
+ },
37
+ ) }
38
+ end
39
+
40
+ end
@@ -0,0 +1,5 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::PlanTest < ActiveSupport::TestCase
4
+
5
+ end
@@ -0,0 +1,109 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::RendersAssetsTest < ActiveSupport::TestCase
4
+ include ActiveJob::TestHelper
5
+ include DiscoApp::Test::ShopifyAPI
6
+
7
+ def setup
8
+ @shop = disco_app_shops(:widget_store)
9
+ @js_configuration = js_configurations(:js_swedish)
10
+ @widget_configuration = widget_configurations(:widget_swedish)
11
+ end
12
+
13
+ def teardown
14
+ @shop = nil
15
+ @js_configuration = nil
16
+ @widget_configuration = nil
17
+ end
18
+
19
+ ##
20
+ # Test queueing behaviour.
21
+ ##
22
+
23
+ test 'rendering of javascript asset group queued when locale changed' do
24
+ assert_enqueued_with(job: DiscoApp::RenderAssetGroupJob) do
25
+ @js_configuration.update(locale: :no)
26
+ end
27
+ end
28
+
29
+ test 'rendering of javascript asset group not queued when label changed' do
30
+ assert_no_enqueued_jobs do
31
+ @js_configuration.update(label: 'Sample')
32
+ end
33
+ end
34
+
35
+ test 'rendering of widget asset group queued when locale changed' do
36
+ assert_enqueued_with(job: DiscoApp::RenderAssetGroupJob, args: [@widget_configuration.shop, @widget_configuration, 'widget_assets']) do
37
+ @widget_configuration.update(locale: :no)
38
+ end
39
+ end
40
+
41
+ test 'rendering of liquid asset group queued when locale changed' do
42
+ assert_enqueued_with(job: DiscoApp::RenderAssetGroupJob, args: [@widget_configuration.shop, @widget_configuration, 'liquid_assets']) do
43
+ @widget_configuration.update(locale: :no)
44
+ end
45
+ end
46
+
47
+ test 'rendering of widget asset group queued when background color changed' do
48
+ assert_enqueued_with(job: DiscoApp::RenderAssetGroupJob, args: [@widget_configuration.shop, @widget_configuration, 'widget_assets']) do
49
+ @widget_configuration.update(background_color: '#FF0000')
50
+ end
51
+ end
52
+
53
+ test 'rendering of liquid asset group not queued when background color changed' do
54
+ assert_enqueued_jobs 1 do
55
+ @widget_configuration.update(background_color: '#FF0000')
56
+ end
57
+ end
58
+
59
+ ##
60
+ # Test rendering behaviour.
61
+ ##
62
+
63
+ test 'individual js asset renders correctly' do
64
+ assert_equal asset_fixture('test.js'), @js_configuration.send('render_asset_group_asset', 'assets/test.js', {}, {})
65
+ end
66
+
67
+ test 'individual js asset renders correctly with minification' do
68
+ assert_equal asset_fixture('test.min.js').strip, @js_configuration.send('render_asset_group_asset', 'assets/test.js', {}, minify: true)
69
+ end
70
+
71
+ test 'js asset group renders and uploads to shopify' do
72
+ stub_api_request(:put, "#{@shop.admin_url}/assets.json", 'widget_store/assets/create_test_js')
73
+ @js_configuration.render_asset_group(:js_assets)
74
+ end
75
+
76
+ test 'widget asset group renders and uploads to shopify' do
77
+ stub_api_request(:put, "#{@shop.admin_url}/assets.json", 'widget_store/assets/create_widget_scss')
78
+ stub_api_request(:put, "#{@shop.admin_url}/assets.json", 'widget_store/assets/create_widget_js')
79
+ @widget_configuration.render_asset_group(:widget_assets)
80
+ end
81
+
82
+ test 'liquid asset group renders and uploads to shopify' do
83
+ stub_api_request(:put, "#{@shop.admin_url}/assets.json", 'widget_store/assets/create_widget_liquid')
84
+ @widget_configuration.render_asset_group(:liquid_assets)
85
+ end
86
+
87
+ test 'script tag asset group renders, uploads to shopify and creates new script tag' do
88
+ stub_api_request(:put, "#{@shop.admin_url}/assets.json", 'widget_store/assets/create_script_tag_js')
89
+ stub_api_request(:get, "#{@shop.admin_url}/script_tags.json", 'widget_store/assets/get_script_tags_empty')
90
+ stub_api_request(:post, "#{@shop.admin_url}/script_tags.json", 'widget_store/assets/create_script_tag')
91
+ @widget_configuration.render_asset_group(:script_tag_assets)
92
+ end
93
+
94
+ test 'script tag asset group renders, uploads to shopify and updates existing script tag' do
95
+ stub_api_request(:put, "#{@shop.admin_url}/assets.json", 'widget_store/assets/create_script_tag_js')
96
+ stub_api_request(:get, "#{@shop.admin_url}/script_tags.json", 'widget_store/assets/get_script_tags_preexisting')
97
+ stub_api_request(:put, "#{@shop.admin_url}/script_tags/38138886.json", 'widget_store/assets/update_script_tag')
98
+ @widget_configuration.render_asset_group(:script_tag_assets)
99
+ end
100
+
101
+ private
102
+
103
+ # Return an asset fixture as a string.
104
+ def asset_fixture(path)
105
+ filename = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'fixtures', 'assets', "#{path}")
106
+ File.read(filename)
107
+ end
108
+
109
+ end
@@ -0,0 +1,31 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::SessionTest < ActiveSupport::TestCase
4
+
5
+ def setup
6
+ @shop = disco_app_shops(:widget_store)
7
+ @session = DiscoApp::Session.create(
8
+ session_id: 'a91bfc51fa79c9d09d43e2615d9345d4',
9
+ data: {
10
+ :shopify => @shop.id,
11
+ :shopify_domain => @shop.shopify_domain
12
+ }
13
+ )
14
+ end
15
+
16
+ test 'logged in sessions are linked to their shop' do
17
+ assert_equal @shop.id, @session.shop_id
18
+ end
19
+
20
+ test 'can fetch sessions for a particular shop through association' do
21
+ assert_equal 1, @shop.sessions.size
22
+ end
23
+
24
+ test 'sessions can be deleted by shop' do
25
+ DiscoApp::Session.create(session_id: 'a91bfc51fa79c9d09d43e2615d9345d5', data: {})
26
+ assert_equal 2, DiscoApp::Session.count
27
+ @shop.sessions.delete_all
28
+ assert_equal 1, DiscoApp::Session.count
29
+ end
30
+
31
+ end
@@ -0,0 +1,43 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::ShopTest < ActiveSupport::TestCase
4
+
5
+ def setup
6
+ @shop = disco_app_shops(:widget_store)
7
+ end
8
+
9
+ def teardown
10
+ @shop = nil
11
+ end
12
+
13
+ test 'shops can be extended via concerns' do
14
+ assert_equal 'Australia', @shop.country.name
15
+ end
16
+
17
+ test 'can fetch a list of all of a shops subscriptions' do
18
+ assert_equal 2, @shop.subscriptions.size
19
+ end
20
+
21
+ test 'can fetch a shops current subscription' do
22
+ assert_equal 1, @shop.subscriptions.active.size
23
+ assert @shop.current_subscription?
24
+ assert_equal disco_app_subscriptions(:current_widget_store_subscription), @shop.current_subscription
25
+ end
26
+
27
+ test 'time_zone helper returns correct time zone instance when known timezone defined' do
28
+ assert_equal 'Melbourne', @shop.time_zone.name
29
+ end
30
+
31
+ test 'time_zone helper returns default Rails timezone when no known timezone defined' do
32
+ assert_equal 'UTC', disco_app_shops(:widget_store_dev).time_zone.name
33
+ end
34
+
35
+ test 'locale helper returns correct locale when defined on shop model' do
36
+ assert_equal :sv, disco_app_shops(:widget_store_dev).locale
37
+ end
38
+
39
+ test 'locale helper returns correct en locale when no known locale defined' do
40
+ assert_equal :en, disco_app_shops(:widget_store).locale
41
+ end
42
+
43
+ end
@@ -0,0 +1,19 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::SubscriptionTest < ActiveSupport::TestCase
4
+
5
+ def setup
6
+ @shop = disco_app_shops(:widget_store)
7
+ end
8
+
9
+ def teardown
10
+ @shop = nil
11
+ end
12
+
13
+ test 'changing the amount on a subscription cancels its charge' do
14
+ assert @shop.current_subscription.active_charge?
15
+ @shop.current_subscription.update(amount: 1138)
16
+ assert_not @shop.current_subscription.active_charge?
17
+ end
18
+
19
+ end
@@ -0,0 +1,112 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::ChargesServiceTest < ActiveSupport::TestCase
4
+ include DiscoApp::Test::ShopifyAPI
5
+
6
+ def setup
7
+ @shop = disco_app_shops(:widget_store)
8
+ @subscription = disco_app_subscriptions(:current_widget_store_subscription)
9
+ @new_charge = disco_app_recurring_application_charges(:new_widget_store_subscription_recurring_charge)
10
+
11
+ @dev_shop = disco_app_shops(:widget_store_dev)
12
+ @dev_subscription = disco_app_subscriptions(:current_widget_store_dev_subscription)
13
+ @dev_new_charge = disco_app_application_charges(:new_widget_store_dev_subscription_one_time_charge)
14
+
15
+ Timecop.freeze
16
+ end
17
+
18
+ def teardown
19
+ @shop = nil
20
+ @subscription = nil
21
+ @new_charge = nil
22
+
23
+ @dev_shop = nil
24
+ @dev_subscription = nil
25
+ @dev_new_charge = nil
26
+
27
+ Timecop.return
28
+
29
+ WebMock.reset!
30
+ end
31
+
32
+ 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
+ } }
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)
42
+
43
+ new_charge = DiscoApp::ChargesService.create(@shop, @subscription)
44
+ assert_equal 654381179, new_charge.shopify_id
45
+ assert_equal 'https://apple.myshopify.com/admin/charges/654381179/confirm_recurring_application_charge?signature=BAhpBHsQASc%3D--b2e90c6e4e94fbae15a464c566a31a1c23e6bffa', new_charge.confirmation_url
46
+ end
47
+
48
+ test 'activating a pending recurring charge is not successful' do
49
+ stub_api_request(:get, "#{@shop.admin_url}/recurring_application_charges/654381179.json", 'widget_store/charges/get_pending_recurring_application_charge')
50
+ assert_not DiscoApp::ChargesService.activate(@shop, @new_charge)
51
+ assert @new_charge.pending?
52
+ end
53
+
54
+ test 'activating a declined recurring charge is not successful' do
55
+ stub_api_request(:get, "#{@shop.admin_url}/recurring_application_charges/654381179.json", 'widget_store/charges/get_declined_recurring_application_charge')
56
+ assert_not DiscoApp::ChargesService.activate(@shop, @new_charge)
57
+ assert @new_charge.declined?
58
+ end
59
+
60
+ test 'activating an accepted recurring charge is successful and cancels any existing recurring charges' do
61
+ stub_api_request(:get, "#{@shop.admin_url}/recurring_application_charges/654381179.json", 'widget_store/charges/get_accepted_recurring_application_charge')
62
+ stub_api_request(:post, "#{@shop.admin_url}/recurring_application_charges/654381179/activate.json", 'widget_store/charges/activate_recurring_application_charge')
63
+
64
+ old_charge = @subscription.active_charge
65
+ assert old_charge.active?
66
+
67
+ assert DiscoApp::ChargesService.activate(@shop, @new_charge)
68
+ assert @new_charge.active?
69
+
70
+ old_charge.reload
71
+ assert old_charge.cancelled?
72
+ end
73
+
74
+ test 'activating an accepted recurring charge cancels other recurring charges' do
75
+ stub_api_request(:get, "#{@shop.admin_url}/recurring_application_charges/654381179.json", 'widget_store/charges/get_accepted_recurring_application_charge')
76
+ stub_api_request(:post, "#{@shop.admin_url}/recurring_application_charges/654381179/activate.json", 'widget_store/charges/activate_recurring_application_charge')
77
+
78
+ assert DiscoApp::ChargesService.activate(@shop, @new_charge)
79
+ assert @new_charge.active?
80
+ end
81
+
82
+ test 'creating a new charge for a one-time subscription is successful' do
83
+ stub_api_request(:post, "#{@dev_shop.admin_url}/application_charges.json", 'widget_store/charges/create_application_charge')
84
+
85
+ new_charge = DiscoApp::ChargesService.create(@dev_shop, @dev_subscription)
86
+ assert_equal 1012637323, new_charge.shopify_id
87
+ assert_equal 'https://apple.myshopify.com/admin/charges/1012637323/confirm_application_charge?signature=BAhpBIueWzw%3D--0ea1abacaf9d6fd538b7e9a7023e9b71ce1c7e98', new_charge.confirmation_url
88
+ end
89
+
90
+ test 'activating a pending one-time charge is not successful' do
91
+ stub_api_request(:get, "#{@dev_shop.admin_url}/application_charges/1012637323.json", 'widget_store/charges/get_pending_application_charge')
92
+
93
+ assert_not DiscoApp::ChargesService.activate(@dev_shop, @dev_new_charge)
94
+ assert @dev_new_charge.pending?
95
+ end
96
+
97
+ test 'activating a declined one-time charge is not successful' do
98
+ stub_api_request(:get, "#{@dev_shop.admin_url}/application_charges/1012637323.json", 'widget_store/charges/get_declined_application_charge')
99
+
100
+ assert_not DiscoApp::ChargesService.activate(@dev_shop, @dev_new_charge)
101
+ assert @dev_new_charge.declined?
102
+ end
103
+
104
+ test 'activating an accepted one-time charge is successful' do
105
+ stub_api_request(:get, "#{@dev_shop.admin_url}/application_charges/1012637323.json", 'widget_store/charges/get_accepted_application_charge')
106
+ stub_api_request(:post, "#{@dev_shop.admin_url}/application_charges/1012637323/activate.json", 'widget_store/charges/activate_application_charge')
107
+
108
+ assert DiscoApp::ChargesService.activate(@dev_shop, @dev_new_charge)
109
+ assert @dev_new_charge.active?
110
+ end
111
+
112
+ end