disco_app 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (287) 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 +60 -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 +360 -0
  8. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tab.js.jsx +34 -0
  9. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tabs.js.jsx +21 -0
  10. data/app/assets/javascripts/disco_app/components/custom/shop_list.js.jsx +142 -0
  11. data/app/assets/javascripts/disco_app/components/custom/shop_row.js.jsx +43 -0
  12. data/app/assets/javascripts/disco_app/components/custom/shopify_admin_link.js.jsx +29 -0
  13. data/app/assets/javascripts/disco_app/components/ui-kit/cards/card-section.es6.jsx +30 -0
  14. data/app/assets/javascripts/disco_app/components/ui-kit/cards/card.es6.jsx +9 -0
  15. data/app/assets/javascripts/disco_app/components/ui-kit/cards/cart-section-title.es6.jsx +7 -0
  16. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_form.es6.jsx +72 -0
  17. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_input.es6.jsx +20 -0
  18. data/app/assets/javascripts/disco_app/components/ui-kit/forms/button.es6.jsx +13 -0
  19. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-radio.es6.jsx +30 -0
  20. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-select.es6.jsx +39 -0
  21. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-text.es6.jsx +59 -0
  22. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-textarea.es6.jsx +48 -0
  23. data/app/assets/javascripts/disco_app/components/ui-kit/icons/icon-chevron.es6.jsx +33 -0
  24. data/app/assets/javascripts/disco_app/components/ui-kit/icons/next-icon.es6.jsx +18 -0
  25. data/app/assets/javascripts/disco_app/components/ui-kit/input_select.es6.jsx +21 -0
  26. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-annotated-section.es6.jsx +29 -0
  27. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-empty-state.es6.jsx +35 -0
  28. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-footer-help.es6.jsx +13 -0
  29. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-page-actions.es6.jsx +39 -0
  30. data/app/assets/javascripts/disco_app/components.js +2 -0
  31. data/app/assets/javascripts/disco_app/disco_app.js +10 -0
  32. data/app/assets/javascripts/disco_app/frame.js +152 -0
  33. data/app/assets/javascripts/disco_app/shopify-turbolinks.js +7 -0
  34. data/app/assets/javascripts/disco_app/ui-kit.js +1 -0
  35. data/app/assets/stylesheets/disco_app/admin/_header.scss +66 -0
  36. data/app/assets/stylesheets/disco_app/admin/_layout.scss +40 -0
  37. data/app/assets/stylesheets/disco_app/admin/_nav.scss +172 -0
  38. data/app/assets/stylesheets/disco_app/admin.scss +11 -0
  39. data/app/assets/stylesheets/disco_app/disco_app.scss +16 -0
  40. data/app/assets/stylesheets/disco_app/frame/_buttons.scss +54 -0
  41. data/app/assets/stylesheets/disco_app/frame/_forms.scss +26 -0
  42. data/app/assets/stylesheets/disco_app/frame/_layout.scss +77 -0
  43. data/app/assets/stylesheets/disco_app/frame/_type.scss +32 -0
  44. data/app/assets/stylesheets/disco_app/frame.scss +9 -0
  45. data/app/assets/stylesheets/disco_app/mixins/_flexbox.scss +400 -0
  46. data/app/assets/stylesheets/disco_app/ui-kit/_ui-empty-state.scss +94 -0
  47. data/app/assets/stylesheets/disco_app/ui-kit/_ui-footer-help.scss +25 -0
  48. data/app/assets/stylesheets/disco_app/ui-kit/_ui-icons.scss +28 -0
  49. data/app/assets/stylesheets/disco_app/ui-kit/_ui-kit.scss +5086 -0
  50. data/app/assets/stylesheets/disco_app/ui-kit/_ui-layout.scss +10 -0
  51. data/app/assets/stylesheets/disco_app/ui-kit/_ui-page-actions.scss +21 -0
  52. data/app/assets/stylesheets/disco_app/ui-kit/_ui-tabs.scss +63 -0
  53. data/app/assets/stylesheets/disco_app/ui-kit/_ui-type.scss +13 -0
  54. data/app/controllers/disco_app/admin/app_settings_controller.rb +3 -0
  55. data/app/controllers/disco_app/admin/application_controller.rb +3 -0
  56. data/app/controllers/disco_app/admin/concerns/app_settings_controller.rb +24 -0
  57. data/app/controllers/disco_app/admin/concerns/authenticated_controller.rb +20 -0
  58. data/app/controllers/disco_app/admin/concerns/plans_controller.rb +54 -0
  59. data/app/controllers/disco_app/admin/concerns/shops_controller.rb +7 -0
  60. data/app/controllers/disco_app/admin/concerns/subscriptions_controller.rb +32 -0
  61. data/app/controllers/disco_app/admin/plans_controller.rb +3 -0
  62. data/app/controllers/disco_app/admin/resources/shops_controller.rb +3 -0
  63. data/app/controllers/disco_app/admin/shops_controller.rb +3 -0
  64. data/app/controllers/disco_app/admin/subscriptions_controller.rb +3 -0
  65. data/app/controllers/disco_app/charges_controller.rb +47 -0
  66. data/app/controllers/disco_app/concerns/app_proxy_controller.rb +40 -0
  67. data/app/controllers/disco_app/concerns/authenticated_controller.rb +56 -0
  68. data/app/controllers/disco_app/concerns/carrier_request_controller.rb +21 -0
  69. data/app/controllers/disco_app/frame_controller.rb +9 -0
  70. data/app/controllers/disco_app/install_controller.rb +27 -0
  71. data/app/controllers/disco_app/subscriptions_controller.rb +32 -0
  72. data/app/controllers/disco_app/webhooks_controller.rb +46 -0
  73. data/app/controllers/sessions_controller.rb +28 -0
  74. data/app/helpers/disco_app/application_helper.rb +50 -0
  75. data/app/jobs/disco_app/app_installed_job.rb +3 -0
  76. data/app/jobs/disco_app/app_uninstalled_job.rb +3 -0
  77. data/app/jobs/disco_app/concerns/app_installed_job.rb +39 -0
  78. data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +20 -0
  79. data/app/jobs/disco_app/concerns/shop_update_job.rb +16 -0
  80. data/app/jobs/disco_app/concerns/subscription_changed_job.rb +7 -0
  81. data/app/jobs/disco_app/concerns/synchronise_carrier_service_job.rb +52 -0
  82. data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +61 -0
  83. data/app/jobs/disco_app/shop_job.rb +27 -0
  84. data/app/jobs/disco_app/shop_update_job.rb +3 -0
  85. data/app/jobs/disco_app/subscription_changed_job.rb +3 -0
  86. data/app/jobs/disco_app/synchronise_carrier_service_job.rb +3 -0
  87. data/app/jobs/disco_app/synchronise_webhooks_job.rb +3 -0
  88. data/app/models/disco_app/app_settings.rb +3 -0
  89. data/app/models/disco_app/application_charge.rb +18 -0
  90. data/app/models/disco_app/concerns/app_settings.rb +7 -0
  91. data/app/models/disco_app/concerns/plan.rb +26 -0
  92. data/app/models/disco_app/concerns/plan_code.rb +15 -0
  93. data/app/models/disco_app/concerns/shop.rb +76 -0
  94. data/app/models/disco_app/concerns/subscription.rb +60 -0
  95. data/app/models/disco_app/concerns/synchronises.rb +39 -0
  96. data/app/models/disco_app/plan.rb +3 -0
  97. data/app/models/disco_app/plan_code.rb +3 -0
  98. data/app/models/disco_app/recurring_application_charge.rb +18 -0
  99. data/app/models/disco_app/session_storage.rb +18 -0
  100. data/app/models/disco_app/shop.rb +3 -0
  101. data/app/models/disco_app/subscription.rb +3 -0
  102. data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +82 -0
  103. data/app/resources/disco_app/admin/resources/shop_resource.rb +4 -0
  104. data/app/services/disco_app/carrier_request_service.rb +15 -0
  105. data/app/services/disco_app/charges_service.rb +81 -0
  106. data/app/services/disco_app/proxy_service.rb +17 -0
  107. data/app/services/disco_app/subscription_service.rb +46 -0
  108. data/app/services/disco_app/webhook_service.rb +30 -0
  109. data/app/views/disco_app/admin/app_settings/edit.html.erb +5 -0
  110. data/app/views/disco_app/admin/plans/_form.html.erb +72 -0
  111. data/app/views/disco_app/admin/plans/_plan_code_fields.html.erb +15 -0
  112. data/app/views/disco_app/admin/plans/edit.html.erb +7 -0
  113. data/app/views/disco_app/admin/plans/index.html.erb +43 -0
  114. data/app/views/disco_app/admin/plans/new.html.erb +7 -0
  115. data/app/views/disco_app/admin/shops/index.html.erb +13 -0
  116. data/app/views/disco_app/admin/subscriptions/edit.html.erb +33 -0
  117. data/app/views/disco_app/charges/activate.html.erb +1 -0
  118. data/app/views/disco_app/charges/create.html.erb +1 -0
  119. data/app/views/disco_app/charges/new.html.erb +12 -0
  120. data/app/views/disco_app/frame/frame.html.erb +36 -0
  121. data/app/views/disco_app/install/installing.html.erb +7 -0
  122. data/app/views/disco_app/install/uninstalling.html.erb +1 -0
  123. data/app/views/disco_app/proxy_errors/404.html.erb +1 -0
  124. data/app/views/disco_app/shared/_card.html.erb +14 -0
  125. data/app/views/disco_app/shared/_icons.html.erb +3 -0
  126. data/app/views/disco_app/shared/_section.html.erb +17 -0
  127. data/app/views/disco_app/subscriptions/new.html.erb +25 -0
  128. data/app/views/layouts/admin/_nav_items.erb +20 -0
  129. data/app/views/layouts/admin.html.erb +67 -0
  130. data/app/views/layouts/application.html.erb +18 -0
  131. data/app/views/layouts/embedded_app.html.erb +43 -0
  132. data/app/views/layouts/embedded_app_modal.html.erb +28 -0
  133. data/app/views/sessions/new.html.erb +26 -0
  134. data/config/routes.rb +48 -0
  135. data/db/migrate/20150525000000_create_shops_if_not_existent.rb +15 -0
  136. data/db/migrate/20150525162112_add_status_to_shops.rb +5 -0
  137. data/db/migrate/20150525171422_add_meta_to_shops.rb +11 -0
  138. data/db/migrate/20150629210346_add_charge_status_to_shop.rb +5 -0
  139. data/db/migrate/20150814214025_add_more_meta_to_shops.rb +15 -0
  140. data/db/migrate/20151017231302_create_disco_app_plans.rb +13 -0
  141. data/db/migrate/20151017232027_create_disco_app_subscriptions.rb +15 -0
  142. data/db/migrate/20151017234409_move_shop_to_disco_app_engine.rb +5 -0
  143. data/db/migrate/20160112233706_create_disco_app_sessions.rb +12 -0
  144. data/db/migrate/20160113194418_add_shop_id_to_disco_app_sessions.rb +6 -0
  145. data/db/migrate/20160223111044_create_disco_app_settings.rb +8 -0
  146. data/db/migrate/20160301223215_update_plans.rb +22 -0
  147. data/db/migrate/20160301224558_update_subscriptions.rb +13 -0
  148. data/db/migrate/20160302104816_create_disco_app_recurring_application_charges.rb +14 -0
  149. data/db/migrate/20160302105259_create_disco_app_application_charges.rb +14 -0
  150. data/db/migrate/20160302134728_drop_charge_status_from_shops.rb +5 -0
  151. data/db/migrate/20160302142941_add_shopify_attributes_to_charges.rb +8 -0
  152. data/db/migrate/20160331093148_create_disco_app_plan_codes.rb +14 -0
  153. data/db/migrate/20160401044420_add_status_to_plan_codes.rb +5 -0
  154. data/db/migrate/20160401045551_add_amount_and_plan_code_to_disco_app_subscriptions.rb +7 -0
  155. data/db/migrate/20160425205211_add_source_to_disco_app_subscriptions.rb +5 -0
  156. data/db/migrate/20160426033520_add_trial_period_days_to_disco_app_subscriptions.rb +5 -0
  157. data/lib/disco_app/configuration.rb +39 -0
  158. data/lib/disco_app/constants.rb +4 -0
  159. data/lib/disco_app/engine.rb +27 -0
  160. data/lib/disco_app/session.rb +14 -0
  161. data/lib/disco_app/support/file_fixtures.rb +23 -0
  162. data/lib/disco_app/test_help.rb +11 -0
  163. data/lib/disco_app/version.rb +3 -0
  164. data/lib/disco_app.rb +7 -0
  165. data/lib/generators/disco_app/USAGE +5 -0
  166. data/lib/generators/disco_app/disco_app_generator.rb +197 -0
  167. data/lib/generators/disco_app/mailify/mailify_generator.rb +54 -0
  168. data/lib/generators/disco_app/monitorify/monitorify_generator.rb +28 -0
  169. data/lib/generators/disco_app/monitorify/templates/config/newrelic.yml +26 -0
  170. data/lib/generators/disco_app/monitorify/templates/initializers/rollbar.rb +12 -0
  171. data/lib/generators/disco_app/templates/assets/javascripts/application.js +17 -0
  172. data/lib/generators/disco_app/templates/assets/javascripts/components.js +3 -0
  173. data/lib/generators/disco_app/templates/assets/stylesheets/application.scss +5 -0
  174. data/lib/generators/disco_app/templates/config/database.yml.tt +20 -0
  175. data/lib/generators/disco_app/templates/config/puma.rb +15 -0
  176. data/lib/generators/disco_app/templates/controllers/home_controller.rb +7 -0
  177. data/lib/generators/disco_app/templates/initializers/disco_app.rb +19 -0
  178. data/lib/generators/disco_app/templates/initializers/session_store.rb +2 -0
  179. data/lib/generators/disco_app/templates/initializers/shopify_app.rb +7 -0
  180. data/lib/generators/disco_app/templates/initializers/shopify_session_repository.rb +7 -0
  181. data/lib/generators/disco_app/templates/root/Procfile +2 -0
  182. data/lib/generators/disco_app/templates/views/home/index.html.erb +2 -0
  183. data/lib/tasks/carrier_service.rake +10 -0
  184. data/lib/tasks/database.rake +8 -0
  185. data/lib/tasks/sessions.rake +9 -0
  186. data/lib/tasks/start.rake +3 -0
  187. data/lib/tasks/webhooks.rake +10 -0
  188. data/test/controllers/disco_app/admin/shops_controller_test.rb +54 -0
  189. data/test/controllers/disco_app/charges_controller_test.rb +99 -0
  190. data/test/controllers/disco_app/install_controller_test.rb +50 -0
  191. data/test/controllers/disco_app/subscriptions_controller_test.rb +68 -0
  192. data/test/controllers/disco_app/webhooks_controller_test.rb +58 -0
  193. data/test/controllers/home_controller_test.rb +92 -0
  194. data/test/controllers/proxy_controller_test.rb +42 -0
  195. data/test/disco_app_test.rb +7 -0
  196. data/test/dummy/Rakefile +6 -0
  197. data/test/dummy/app/assets/javascripts/application.js +17 -0
  198. data/test/dummy/app/assets/stylesheets/application.scss +5 -0
  199. data/test/dummy/app/controllers/application_controller.rb +6 -0
  200. data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +8 -0
  201. data/test/dummy/app/controllers/home_controller.rb +7 -0
  202. data/test/dummy/app/controllers/proxy_controller.rb +8 -0
  203. data/test/dummy/app/helpers/application_helper.rb +2 -0
  204. data/test/dummy/app/jobs/disco_app/app_installed_job.rb +16 -0
  205. data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +11 -0
  206. data/test/dummy/app/jobs/products_create_job.rb +7 -0
  207. data/test/dummy/app/jobs/products_delete_job.rb +7 -0
  208. data/test/dummy/app/jobs/products_update_job.rb +7 -0
  209. data/test/dummy/app/models/disco_app/shop.rb +15 -0
  210. data/test/dummy/app/models/product.rb +6 -0
  211. data/test/dummy/app/views/home/index.html.erb +2 -0
  212. data/test/dummy/bin/bundle +3 -0
  213. data/test/dummy/bin/rails +4 -0
  214. data/test/dummy/bin/rake +4 -0
  215. data/test/dummy/bin/setup +29 -0
  216. data/test/dummy/config/application.rb +38 -0
  217. data/test/dummy/config/boot.rb +5 -0
  218. data/test/dummy/config/database.codeship.yml +23 -0
  219. data/test/dummy/config/database.yml +20 -0
  220. data/test/dummy/config/environment.rb +5 -0
  221. data/test/dummy/config/environments/development.rb +41 -0
  222. data/test/dummy/config/environments/production.rb +85 -0
  223. data/test/dummy/config/environments/test.rb +42 -0
  224. data/test/dummy/config/initializers/assets.rb +11 -0
  225. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  226. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  227. data/test/dummy/config/initializers/disco_app.rb +19 -0
  228. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  229. data/test/dummy/config/initializers/inflections.rb +16 -0
  230. data/test/dummy/config/initializers/mime_types.rb +4 -0
  231. data/test/dummy/config/initializers/omniauth.rb +9 -0
  232. data/test/dummy/config/initializers/session_store.rb +2 -0
  233. data/test/dummy/config/initializers/shopify_app.rb +7 -0
  234. data/test/dummy/config/initializers/shopify_session_repository.rb +7 -0
  235. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  236. data/test/dummy/config/locales/en.yml +23 -0
  237. data/test/dummy/config/routes.rb +10 -0
  238. data/test/dummy/config/secrets.yml +22 -0
  239. data/test/dummy/config.ru +4 -0
  240. data/test/dummy/db/migrate/20160307182229_create_products.rb +11 -0
  241. data/test/dummy/db/schema.rb +140 -0
  242. data/test/dummy/public/404.html +67 -0
  243. data/test/dummy/public/422.html +67 -0
  244. data/test/dummy/public/500.html +66 -0
  245. data/test/dummy/public/favicon.ico +0 -0
  246. data/test/fixtures/api/widget_store/charges/activate_application_charge_request.json +16 -0
  247. data/test/fixtures/api/widget_store/charges/activate_application_charge_response.json +1 -0
  248. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_request.json +20 -0
  249. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_response.json +1 -0
  250. data/test/fixtures/api/widget_store/charges/create_application_charge_request.json +9 -0
  251. data/test/fixtures/api/widget_store/charges/create_application_charge_response.json +16 -0
  252. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_request.json +9 -0
  253. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_response.json +20 -0
  254. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_request.json +9 -0
  255. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_response.json +20 -0
  256. data/test/fixtures/api/widget_store/charges/get_accepted_application_charge_response.json +16 -0
  257. data/test/fixtures/api/widget_store/charges/get_accepted_recurring_application_charge_response.json +20 -0
  258. data/test/fixtures/api/widget_store/charges/get_declined_application_charge_response.json +16 -0
  259. data/test/fixtures/api/widget_store/charges/get_declined_recurring_application_charge_response.json +20 -0
  260. data/test/fixtures/api/widget_store/charges/get_pending_application_charge_response.json +16 -0
  261. data/test/fixtures/api/widget_store/charges/get_pending_recurring_application_charge_response.json +20 -0
  262. data/test/fixtures/api/widget_store/shop.json +46 -0
  263. data/test/fixtures/api/widget_store/webhooks.json +1 -0
  264. data/test/fixtures/disco_app/application_charges.yml +11 -0
  265. data/test/fixtures/disco_app/plan_codes.yml +13 -0
  266. data/test/fixtures/disco_app/plans.yml +37 -0
  267. data/test/fixtures/disco_app/recurring_application_charges.yml +11 -0
  268. data/test/fixtures/disco_app/shops.yml +10 -0
  269. data/test/fixtures/disco_app/subscriptions.yml +22 -0
  270. data/test/fixtures/products.yml +4 -0
  271. data/test/fixtures/webhooks/app_uninstalled.json +46 -0
  272. data/test/fixtures/webhooks/product_created.json +167 -0
  273. data/test/fixtures/webhooks/product_deleted.json +3 -0
  274. data/test/fixtures/webhooks/product_updated.json +167 -0
  275. data/test/integration/synchronises_test.rb +55 -0
  276. data/test/jobs/disco_app/app_installed_job_test.rb +55 -0
  277. data/test/jobs/disco_app/app_uninstalled_job_test.rb +30 -0
  278. data/test/models/disco_app/plan_test.rb +5 -0
  279. data/test/models/disco_app/session_test.rb +31 -0
  280. data/test/models/disco_app/shop_test.rb +27 -0
  281. data/test/models/disco_app/subscription_test.rb +19 -0
  282. data/test/services/disco_app/charges_service_test.rb +112 -0
  283. data/test/services/disco_app/subscription_service_test.rb +60 -0
  284. data/test/support/test_file_fixtures.rb +29 -0
  285. data/test/support/test_shopify_api.rb +16 -0
  286. data/test/test_helper.rb +55 -0
  287. metadata +722 -0
@@ -0,0 +1,167 @@
1
+ {
2
+ "id": 632910393,
3
+ "title": "IPod Nano - 8GB",
4
+ "body_html": "<p>It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.<\/p>",
5
+ "vendor": "Apple",
6
+ "product_type": "Cult Products",
7
+ "created_at": "2015-09-02T14:50:32-04:00",
8
+ "handle": "ipod-nano",
9
+ "updated_at": "2015-09-02T14:50:32-04:00",
10
+ "published_at": "2007-12-31T19:00:00-05:00",
11
+ "template_suffix": null,
12
+ "published_scope": "web",
13
+ "tags": "Emotive, Flash Memory, MP3, Music",
14
+ "variants": [
15
+ {
16
+ "id": 808950810,
17
+ "product_id": 632910392,
18
+ "title": "Pink",
19
+ "sku": "IPOD2008PINK",
20
+ "position": 1,
21
+ "grams": 200,
22
+ "inventory_policy": "continue",
23
+ "fulfillment_service": "manual",
24
+ "inventory_management": "shopify",
25
+ "price": "199.00",
26
+ "compare_at_price": null,
27
+ "option1": "Pink",
28
+ "option2": null,
29
+ "option3": null,
30
+ "created_at": "2015-09-02T14:50:32-04:00",
31
+ "updated_at": "2015-09-02T14:50:32-04:00",
32
+ "taxable": true,
33
+ "requires_shipping": true,
34
+ "barcode": "1234_pink",
35
+ "inventory_quantity": 10,
36
+ "old_inventory_quantity": 10,
37
+ "image_id": 562641783,
38
+ "weight": 0.2,
39
+ "weight_unit": "kg"
40
+ },
41
+ {
42
+ "id": 49148385,
43
+ "product_id": 632910392,
44
+ "title": "Red",
45
+ "sku": "IPOD2008RED",
46
+ "position": 2,
47
+ "grams": 200,
48
+ "inventory_policy": "continue",
49
+ "fulfillment_service": "manual",
50
+ "inventory_management": "shopify",
51
+ "price": "199.00",
52
+ "compare_at_price": null,
53
+ "option1": "Red",
54
+ "option2": null,
55
+ "option3": null,
56
+ "created_at": "2015-09-02T14:50:32-04:00",
57
+ "updated_at": "2015-09-02T14:50:32-04:00",
58
+ "taxable": true,
59
+ "requires_shipping": true,
60
+ "barcode": "1234_red",
61
+ "inventory_quantity": 20,
62
+ "old_inventory_quantity": 20,
63
+ "image_id": null,
64
+ "weight": 0.2,
65
+ "weight_unit": "kg"
66
+ },
67
+ {
68
+ "id": 39072856,
69
+ "product_id": 632910392,
70
+ "title": "Green",
71
+ "sku": "IPOD2008GREEN",
72
+ "position": 3,
73
+ "grams": 200,
74
+ "inventory_policy": "continue",
75
+ "fulfillment_service": "manual",
76
+ "inventory_management": "shopify",
77
+ "price": "199.00",
78
+ "compare_at_price": null,
79
+ "option1": "Green",
80
+ "option2": null,
81
+ "option3": null,
82
+ "created_at": "2015-09-02T14:50:32-04:00",
83
+ "updated_at": "2015-09-02T14:50:32-04:00",
84
+ "taxable": true,
85
+ "requires_shipping": true,
86
+ "barcode": "1234_green",
87
+ "inventory_quantity": 30,
88
+ "old_inventory_quantity": 30,
89
+ "image_id": null,
90
+ "weight": 0.2,
91
+ "weight_unit": "kg"
92
+ },
93
+ {
94
+ "id": 457924702,
95
+ "product_id": 632910392,
96
+ "title": "Black",
97
+ "sku": "IPOD2008BLACK",
98
+ "position": 4,
99
+ "grams": 200,
100
+ "inventory_policy": "continue",
101
+ "fulfillment_service": "manual",
102
+ "inventory_management": "shopify",
103
+ "price": "199.00",
104
+ "compare_at_price": null,
105
+ "option1": "Black",
106
+ "option2": null,
107
+ "option3": null,
108
+ "created_at": "2015-09-02T14:50:32-04:00",
109
+ "updated_at": "2015-09-02T14:50:32-04:00",
110
+ "taxable": true,
111
+ "requires_shipping": true,
112
+ "barcode": "1234_black",
113
+ "inventory_quantity": 40,
114
+ "old_inventory_quantity": 40,
115
+ "image_id": null,
116
+ "weight": 0.2,
117
+ "weight_unit": "kg"
118
+ }
119
+ ],
120
+ "options": [
121
+ {
122
+ "id": 594680422,
123
+ "product_id": 632910392,
124
+ "name": "Color",
125
+ "position": 1,
126
+ "values": [
127
+ "Pink",
128
+ "Red",
129
+ "Green",
130
+ "Black"
131
+ ]
132
+ }
133
+ ],
134
+ "images": [
135
+ {
136
+ "id": 850703190,
137
+ "product_id": 632910392,
138
+ "position": 1,
139
+ "created_at": "2015-09-02T14:50:32-04:00",
140
+ "updated_at": "2015-09-02T14:50:32-04:00",
141
+ "src": "https:\/\/cdn.shopify.com\/s\/files\/1\/0006\/9093\/3842\/products\/ipod-nano.png?v=1441219832",
142
+ "variant_ids": [
143
+ ]
144
+ },
145
+ {
146
+ "id": 562641783,
147
+ "product_id": 632910392,
148
+ "position": 2,
149
+ "created_at": "2015-09-02T14:50:32-04:00",
150
+ "updated_at": "2015-09-02T14:50:32-04:00",
151
+ "src": "https:\/\/cdn.shopify.com\/s\/files\/1\/0006\/9093\/3842\/products\/ipod-nano-2.png?v=1441219832",
152
+ "variant_ids": [
153
+ 808950810
154
+ ]
155
+ }
156
+ ],
157
+ "image": {
158
+ "id": 850703190,
159
+ "product_id": 632910392,
160
+ "position": 1,
161
+ "created_at": "2015-09-02T14:50:32-04:00",
162
+ "updated_at": "2015-09-02T14:50:32-04:00",
163
+ "src": "https:\/\/cdn.shopify.com\/s\/files\/1\/0006\/9093\/3842\/products\/ipod-nano.png?v=1441219832",
164
+ "variant_ids": [
165
+ ]
166
+ }
167
+ }
@@ -0,0 +1,55 @@
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 receieved' do
36
+ post_webhook('product_deleted', :'products/delete')
37
+ assert_equal 0, Product.count
38
+ end
39
+
40
+ private
41
+
42
+ def webhooks_url
43
+ DiscoApp::Engine.routes.url_helpers.webhooks_url
44
+ end
45
+
46
+ def post_webhook(fixture_name, webhook_topic)
47
+ body = webhook_fixture(fixture_name)
48
+ post(webhooks_url, body, {
49
+ HTTP_X_SHOPIFY_TOPIC: webhook_topic,
50
+ HTTP_X_SHOPIFY_SHOP_DOMAIN: @shop.shopify_domain,
51
+ HTTP_X_SHOPIFY_HMAC_SHA256: DiscoApp::WebhookService.calculated_hmac(body, ShopifyApp.configuration.secret)
52
+ })
53
+ end
54
+
55
+ end
@@ -0,0 +1,55 @@
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
+ end
13
+
14
+ def teardown
15
+ @shop = nil
16
+
17
+ WebMock.reset!
18
+ end
19
+
20
+ test 'app installed job performs shop update job' do
21
+ # Assert the main install job can be enqueued and performed.
22
+ perform_enqueued_jobs do
23
+ DiscoApp::AppInstalledJob.perform_later(@shop.shopify_domain)
24
+ end
25
+
26
+ # Assert the update shop job was performed.
27
+ @shop.reload
28
+ assert_equal 'United States', @shop.country_name
29
+ end
30
+
31
+ test 'app installed job automatically subscribes stores to the correct default plan' do
32
+ @shop.current_subscription.destroy
33
+
34
+ perform_enqueued_jobs do
35
+ DiscoApp::AppInstalledJob.perform_later(@shop.shopify_domain)
36
+ end
37
+
38
+ # Assert the shop was subscribed to the development plan.
39
+ assert_equal disco_app_plans(:development), @shop.current_subscription.plan
40
+ end
41
+
42
+ test 'app installed job automatically subscribes stores to the correct default plan with a plan code and a source' do
43
+ @shop.current_subscription.destroy
44
+
45
+ perform_enqueued_jobs do
46
+ DiscoApp::AppInstalledJob.perform_later(@shop.shopify_domain, 'PODCAST', 'smpodcast')
47
+ end
48
+
49
+ # Assert the shop was subscribed to the development plan.
50
+ assert_equal disco_app_plans(:development), @shop.current_subscription.plan
51
+ assert_equal disco_app_plan_codes(:podcast_dev), @shop.current_subscription.plan_code
52
+ assert_equal 'smpodcast', @shop.current_subscription.source
53
+ end
54
+
55
+ 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.shopify_domain, {})
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.country_name # Assert extended method called.
28
+ end
29
+
30
+ end
@@ -0,0 +1,5 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::PlanTest < ActiveSupport::TestCase
4
+
5
+ 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,27 @@
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
+ 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
@@ -0,0 +1,60 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::SubscriptionServiceTest < ActiveSupport::TestCase
4
+ include ActiveJob::TestHelper
5
+
6
+ def setup
7
+ @shop = disco_app_shops(:widget_store)
8
+ @subscription = disco_app_subscriptions(:current_widget_store_subscription)
9
+ Timecop.freeze
10
+ end
11
+
12
+ def teardown
13
+ @shop = nil
14
+ @subscription = nil
15
+ Timecop.return
16
+ end
17
+
18
+ test 'subscribing to a new plan deactivates current subscription and swaps to new plan' do
19
+ DiscoApp::SubscriptionService.subscribe(@shop, disco_app_plans(:premium))
20
+ @subscription.reload
21
+ assert @subscription.cancelled?
22
+ assert_equal disco_app_plans(:premium), @shop.current_subscription.plan
23
+ end
24
+
25
+ test 'subscribing to a new plan enqueues subscription changed background job' do
26
+ assert_enqueued_with(job: DiscoApp::SubscriptionChangedJob) do
27
+ DiscoApp::SubscriptionService.subscribe(@shop, disco_app_plans(:premium))
28
+ end
29
+ end
30
+
31
+ test 'subscribing to a new plan works for a shop without a subscription' do
32
+ @subscription.destroy
33
+ DiscoApp::SubscriptionService.subscribe(@shop, disco_app_plans(:premium))
34
+ assert_equal disco_app_plans(:premium), @shop.current_subscription.plan
35
+ end
36
+
37
+ test 'new subscription for a plan without a trial period created correctly' do
38
+ new_subscription = DiscoApp::SubscriptionService.subscribe(@shop, disco_app_plans(:comped))
39
+ assert new_subscription.active?
40
+ assert_equal nil, new_subscription.trial_start_at
41
+ assert_equal nil, new_subscription.trial_end_at
42
+ end
43
+
44
+ test 'new subscription for a plan with a trial period created correctly' do
45
+ new_subscription = DiscoApp::SubscriptionService.subscribe(@shop, disco_app_plans(:premium))
46
+ assert new_subscription.trial?
47
+ assert_equal Time.now, new_subscription.trial_start_at
48
+ assert_equal 28.days.from_now, new_subscription.trial_end_at
49
+ end
50
+
51
+ test 'new subscription for a plan with a plan code created correctly' do
52
+ new_subscription = DiscoApp::SubscriptionService.subscribe(@shop, disco_app_plans(:premium), 'PODCAST')
53
+ assert new_subscription.trial?
54
+ assert_equal Time.now, new_subscription.trial_start_at
55
+ assert_equal 60.days.from_now, new_subscription.trial_end_at
56
+ assert_equal 60, new_subscription.trial_period_days
57
+ assert_equal 8999, new_subscription.amount
58
+ end
59
+
60
+ end
@@ -0,0 +1,29 @@
1
+ module DiscoApp::Test
2
+ module FileFixtures
3
+
4
+ # Return an XML fixture as an XML string.
5
+ def xml_fixture(path)
6
+ filename = File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', 'xml', "#{path}.xml")
7
+ File.read(filename)
8
+ end
9
+
10
+ # Return a JSON fixture as an indifferent hash.
11
+ def json_fixture(path)
12
+ filename = File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', 'json', "#{path}.json")
13
+ HashWithIndifferentAccess.new(ActiveSupport::JSON.decode(File.read(filename)))
14
+ end
15
+
16
+ # API fixtures are special-case JSON fixtures.
17
+ def api_fixture(path)
18
+ filename = File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', 'api', "#{path}.json")
19
+ HashWithIndifferentAccess.new(ActiveSupport::JSON.decode(File.read(filename)))
20
+ end
21
+
22
+ # Webhook fixtures are special-case JSON fixtures.
23
+ def webhook_fixture(path)
24
+ filename = File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', 'webhooks', "#{path}.json")
25
+ File.read(filename)
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ module DiscoApp::Test
2
+ module ShopifyAPI
3
+
4
+ def stub_api_request(method, endpoint, fixture_name)
5
+ if method == :get
6
+ stub_request(method, endpoint)
7
+ .to_return(status: 200, body: api_fixture("#{fixture_name}_response").to_json)
8
+ elsif method == :post
9
+ stub_request(method, endpoint)
10
+ .with(body: api_fixture("#{fixture_name}_request").to_json)
11
+ .to_return(status: 201, body: api_fixture("#{fixture_name}_response").to_json)
12
+ end
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,55 @@
1
+ # Prevent warnings from showing up during testing.
2
+ $VERBOSE=nil
3
+
4
+ # Configure Rails Environment
5
+ ENV['RAILS_ENV'] = 'test'
6
+ ENV['DEFAULT_HOST'] = 'https://test.example.com'
7
+ ENV['SHOPIFY_APP_NAME'] = 'Test Application'
8
+ ENV['SHOPIFY_APP_API_KEY'] = 'f61b26d635309536c3c83c0adc3cb972'
9
+ ENV['SHOPIFY_APP_SECRET'] = 'b607d1f8b992dccb017f9315f07af9c4'
10
+ ENV['SHOPIFY_APP_REDIRECT_URI'] = 'https://test.example.com/shopify/auth/callback'
11
+ ENV['SHOPIFY_APP_SCOPE'] = 'read_products'
12
+ ENV['SHOPIFY_CHARGES_REAL'] = 'false'
13
+
14
+ require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
15
+ ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
16
+ ActiveRecord::Migrator.migrations_paths << File.expand_path('../../db/migrate', __FILE__)
17
+ require "rails/test_help"
18
+
19
+ # Require our additional test support helpers.
20
+ require 'support/test_file_fixtures'
21
+ require 'support/test_shopify_api'
22
+
23
+ # Require WebMock
24
+ require 'webmock/minitest'
25
+
26
+ # Filter out Minitest backtrace while allowing backtrace from other libraries
27
+ # to be shown.
28
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
29
+
30
+ # Load support files
31
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
32
+
33
+ # Load fixtures from the engine
34
+ if ActiveSupport::TestCase.respond_to?(:fixture_path=)
35
+ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
36
+ ActiveSupport::TestCase.fixtures :all
37
+ end
38
+
39
+ # Set up the base test class.
40
+ class ActiveSupport::TestCase
41
+
42
+ # Include helper modules common to all tests.
43
+ include DiscoApp::Test::FileFixtures
44
+
45
+ def log_in_as(shop)
46
+ session[:shopify] = shop.id
47
+ session[:shopify_domain] = shop.shopify_domain
48
+ end
49
+
50
+ def log_out
51
+ session[:shopify] = nil
52
+ session[:shopify_domain] = nil
53
+ end
54
+
55
+ end