disco_app 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (346) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +37 -0
  3. data/app/assets/components/disco_app/buttons/model-destroy-button.es6.jsx +31 -0
  4. data/app/assets/components/disco_app/forms/model-form.es6.jsx +64 -0
  5. data/app/assets/components/embedded_app/bar.es6.jsx +31 -0
  6. data/app/assets/components/shopify/buttons/_buttons.scss +546 -0
  7. data/app/assets/components/shopify/buttons/button.es6.jsx +15 -0
  8. data/app/assets/components/shopify/card/_card.scss +342 -0
  9. data/app/assets/components/shopify/card/card-header.es6.jsx +34 -0
  10. data/app/assets/components/shopify/card/card-section.es6.jsx +26 -0
  11. data/app/assets/components/shopify/card/card.es6.jsx +16 -0
  12. data/app/assets/components/shopify/image/_image.scss +82 -0
  13. data/app/assets/components/shopify/table/_table.scss +18 -0
  14. data/app/assets/components/shopify/typography/_typography.scss +23 -0
  15. data/app/assets/components/shopify/typography/ui-heading.es6.jsx +16 -0
  16. data/app/assets/components/shopify/ui-layout/_ui-layout.scss +157 -0
  17. data/app/assets/components/shopify/ui-layout/ui-annotated-section.es6.jsx +29 -0
  18. data/app/assets/components/shopify/ui-layout/ui-empty-state.es6.jsx +35 -0
  19. data/app/assets/components/shopify/ui-layout/ui-footer-help.es6.jsx +13 -0
  20. data/app/assets/components/shopify/ui-layout/ui-layout-item.es6.jsx +11 -0
  21. data/app/assets/components/shopify/ui-layout/ui-layout-section.es6.jsx +19 -0
  22. data/app/assets/components/shopify/ui-layout/ui-layout-sections.es6.jsx +11 -0
  23. data/app/assets/components/shopify/ui-layout/ui-layout.es6.jsx +11 -0
  24. data/app/assets/components/shopify/ui-layout/ui-page-actions.es6.jsx +13 -0
  25. data/app/assets/components/shopify/ui-layout/ui-page-actions__buttons.es6.jsx +27 -0
  26. data/app/assets/components/shopify/ui-stack/_ui-stack.scss +39 -0
  27. data/app/assets/components/shopify/ui-stack/ui-stack-item.es6.jsx +21 -0
  28. data/app/assets/components/shopify/ui-stack/ui-stack.es6.jsx +24 -0
  29. data/app/assets/images/disco_app/icon.svg +1 -0
  30. data/app/assets/images/disco_app/icons.svg +0 -0
  31. data/app/assets/javascripts/disco_app/components/custom/filterable_shop_list.js.jsx +61 -0
  32. data/app/assets/javascripts/disco_app/components/custom/inline-radio-options.es6.jsx +59 -0
  33. data/app/assets/javascripts/disco_app/components/custom/rules-editor.es6.jsx +432 -0
  34. data/app/assets/javascripts/disco_app/components/custom/shop_filter_query.js.jsx +13 -0
  35. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tab.js.jsx +34 -0
  36. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tabs.js.jsx +21 -0
  37. data/app/assets/javascripts/disco_app/components/custom/shop_list.js.jsx +142 -0
  38. data/app/assets/javascripts/disco_app/components/custom/shop_row.js.jsx +43 -0
  39. data/app/assets/javascripts/disco_app/components/custom/shopify_admin_link.js.jsx +29 -0
  40. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_form.es6.jsx +72 -0
  41. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_input.es6.jsx +20 -0
  42. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-checkbox.es6.jsx +30 -0
  43. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-radio.es6.jsx +30 -0
  44. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-select.es6.jsx +45 -0
  45. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-text.es6.jsx +69 -0
  46. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-textarea.es6.jsx +48 -0
  47. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-time.es6.jsx +7 -0
  48. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__element.es6.jsx +17 -0
  49. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__group.es6.jsx +11 -0
  50. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__section.es6.jsx +11 -0
  51. data/app/assets/javascripts/disco_app/components/ui-kit/icons/icon-chevron.es6.jsx +33 -0
  52. data/app/assets/javascripts/disco_app/components/ui-kit/icons/next-icon.es6.jsx +19 -0
  53. data/app/assets/javascripts/disco_app/components/ui-kit/input_select.es6.jsx +21 -0
  54. data/app/assets/javascripts/disco_app/components/ui-kit/tables/table.es6.jsx +27 -0
  55. data/app/assets/javascripts/disco_app/components.js +3 -0
  56. data/app/assets/javascripts/disco_app/disco_app.js +9 -0
  57. data/app/assets/javascripts/disco_app/frame.js +152 -0
  58. data/app/assets/javascripts/disco_app/shopify-turbolinks.js +7 -0
  59. data/app/assets/javascripts/disco_app/ui-kit.js +1 -0
  60. data/app/assets/stylesheets/disco_app/admin/_header.scss +75 -0
  61. data/app/assets/stylesheets/disco_app/admin/_layout.scss +32 -0
  62. data/app/assets/stylesheets/disco_app/admin/_nav.scss +184 -0
  63. data/app/assets/stylesheets/disco_app/admin.scss +11 -0
  64. data/app/assets/stylesheets/disco_app/disco_app.scss +26 -0
  65. data/app/assets/stylesheets/disco_app/frame/_buttons.scss +54 -0
  66. data/app/assets/stylesheets/disco_app/frame/_forms.scss +26 -0
  67. data/app/assets/stylesheets/disco_app/frame/_layout.scss +77 -0
  68. data/app/assets/stylesheets/disco_app/frame/_type.scss +25 -0
  69. data/app/assets/stylesheets/disco_app/frame.scss +10 -0
  70. data/app/assets/stylesheets/disco_app/mixins/_flexbox.scss +400 -0
  71. data/app/assets/stylesheets/disco_app/ui-kit/_ui-forms.scss +69 -0
  72. data/app/assets/stylesheets/disco_app/ui-kit/_ui-icons.scss +28 -0
  73. data/app/assets/stylesheets/disco_app/ui-kit/_ui-kit.scss +5121 -0
  74. data/app/assets/stylesheets/disco_app/ui-kit/_ui-layout.scss +15 -0
  75. data/app/assets/stylesheets/disco_app/ui-kit/_ui-tabs.scss +75 -0
  76. data/app/assets/stylesheets/disco_app/ui-kit/_ui-type.scss +13 -0
  77. data/app/controllers/disco_app/admin/app_settings_controller.rb +3 -0
  78. data/app/controllers/disco_app/admin/application_controller.rb +3 -0
  79. data/app/controllers/disco_app/admin/concerns/app_settings_controller.rb +24 -0
  80. data/app/controllers/disco_app/admin/concerns/authenticated_controller.rb +20 -0
  81. data/app/controllers/disco_app/admin/concerns/plans_controller.rb +54 -0
  82. data/app/controllers/disco_app/admin/concerns/shops_controller.rb +7 -0
  83. data/app/controllers/disco_app/admin/concerns/subscriptions_controller.rb +29 -0
  84. data/app/controllers/disco_app/admin/plans_controller.rb +3 -0
  85. data/app/controllers/disco_app/admin/resources/shops_controller.rb +3 -0
  86. data/app/controllers/disco_app/admin/shops_controller.rb +3 -0
  87. data/app/controllers/disco_app/admin/subscriptions_controller.rb +3 -0
  88. data/app/controllers/disco_app/charges_controller.rb +47 -0
  89. data/app/controllers/disco_app/concerns/app_proxy_controller.rb +40 -0
  90. data/app/controllers/disco_app/concerns/authenticated_controller.rb +56 -0
  91. data/app/controllers/disco_app/concerns/carrier_request_controller.rb +35 -0
  92. data/app/controllers/disco_app/frame_controller.rb +9 -0
  93. data/app/controllers/disco_app/install_controller.rb +27 -0
  94. data/app/controllers/disco_app/subscriptions_controller.rb +32 -0
  95. data/app/controllers/disco_app/webhooks_controller.rb +46 -0
  96. data/app/controllers/sessions_controller.rb +28 -0
  97. data/app/helpers/disco_app/application_helper.rb +68 -0
  98. data/app/jobs/disco_app/app_installed_job.rb +3 -0
  99. data/app/jobs/disco_app/app_uninstalled_job.rb +3 -0
  100. data/app/jobs/disco_app/concerns/app_installed_job.rb +39 -0
  101. data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +20 -0
  102. data/app/jobs/disco_app/concerns/render_asset_group_job.rb +8 -0
  103. data/app/jobs/disco_app/concerns/shop_update_job.rb +13 -0
  104. data/app/jobs/disco_app/concerns/subscription_changed_job.rb +7 -0
  105. data/app/jobs/disco_app/concerns/synchronise_carrier_service_job.rb +55 -0
  106. data/app/jobs/disco_app/concerns/synchronise_resources_job.rb +12 -0
  107. data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +52 -0
  108. data/app/jobs/disco_app/render_asset_group_job.rb +3 -0
  109. data/app/jobs/disco_app/shop_job.rb +27 -0
  110. data/app/jobs/disco_app/shop_update_job.rb +3 -0
  111. data/app/jobs/disco_app/subscription_changed_job.rb +3 -0
  112. data/app/jobs/disco_app/synchronise_carrier_service_job.rb +3 -0
  113. data/app/jobs/disco_app/synchronise_resources_job.rb +3 -0
  114. data/app/jobs/disco_app/synchronise_webhooks_job.rb +3 -0
  115. data/app/models/disco_app/app_settings.rb +3 -0
  116. data/app/models/disco_app/application_charge.rb +18 -0
  117. data/app/models/disco_app/concerns/app_settings.rb +7 -0
  118. data/app/models/disco_app/concerns/can_be_liquified.rb +45 -0
  119. data/app/models/disco_app/concerns/has_metafields.rb +48 -0
  120. data/app/models/disco_app/concerns/plan.rb +26 -0
  121. data/app/models/disco_app/concerns/plan_code.rb +15 -0
  122. data/app/models/disco_app/concerns/renders_assets.rb +166 -0
  123. data/app/models/disco_app/concerns/shop.rb +86 -0
  124. data/app/models/disco_app/concerns/subscription.rb +60 -0
  125. data/app/models/disco_app/concerns/synchronises.rb +58 -0
  126. data/app/models/disco_app/concerns/taggable.rb +16 -0
  127. data/app/models/disco_app/plan.rb +3 -0
  128. data/app/models/disco_app/plan_code.rb +3 -0
  129. data/app/models/disco_app/recurring_application_charge.rb +18 -0
  130. data/app/models/disco_app/session_storage.rb +18 -0
  131. data/app/models/disco_app/shop.rb +3 -0
  132. data/app/models/disco_app/subscription.rb +3 -0
  133. data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +100 -0
  134. data/app/resources/disco_app/admin/resources/shop_resource.rb +4 -0
  135. data/app/services/disco_app/carrier_request_service.rb +15 -0
  136. data/app/services/disco_app/charges_service.rb +81 -0
  137. data/app/services/disco_app/proxy_service.rb +17 -0
  138. data/app/services/disco_app/subscription_service.rb +46 -0
  139. data/app/services/disco_app/webhook_service.rb +30 -0
  140. data/app/views/disco_app/admin/app_settings/edit.html.erb +5 -0
  141. data/app/views/disco_app/admin/plans/_form.html.erb +72 -0
  142. data/app/views/disco_app/admin/plans/_plan_code_fields.html.erb +15 -0
  143. data/app/views/disco_app/admin/plans/edit.html.erb +7 -0
  144. data/app/views/disco_app/admin/plans/index.html.erb +43 -0
  145. data/app/views/disco_app/admin/plans/new.html.erb +7 -0
  146. data/app/views/disco_app/admin/shops/index.html.erb +13 -0
  147. data/app/views/disco_app/admin/subscriptions/edit.html.erb +33 -0
  148. data/app/views/disco_app/charges/activate.html.erb +1 -0
  149. data/app/views/disco_app/charges/create.html.erb +1 -0
  150. data/app/views/disco_app/charges/new.html.erb +23 -0
  151. data/app/views/disco_app/frame/frame.html.erb +36 -0
  152. data/app/views/disco_app/install/installing.html.erb +22 -0
  153. data/app/views/disco_app/install/uninstalling.html.erb +1 -0
  154. data/app/views/disco_app/proxy_errors/404.html.erb +1 -0
  155. data/app/views/disco_app/shared/_card.html.erb +14 -0
  156. data/app/views/disco_app/shared/_icons.html.erb +1 -0
  157. data/app/views/disco_app/shared/_section.html.erb +17 -0
  158. data/app/views/disco_app/subscriptions/new.html.erb +25 -0
  159. data/app/views/layouts/admin/_nav_items.erb +20 -0
  160. data/app/views/layouts/admin.html.erb +67 -0
  161. data/app/views/layouts/application.html.erb +18 -0
  162. data/app/views/layouts/embedded_app.html.erb +50 -0
  163. data/app/views/layouts/embedded_app_modal.html.erb +28 -0
  164. data/app/views/sessions/new.html.erb +28 -0
  165. data/config/routes.rb +63 -0
  166. data/db/migrate/20150525000000_create_shops_if_not_existent.rb +110 -0
  167. data/lib/disco_app/configuration.rb +45 -0
  168. data/lib/disco_app/constants.rb +4 -0
  169. data/lib/disco_app/engine.rb +26 -0
  170. data/lib/disco_app/session.rb +14 -0
  171. data/lib/disco_app/support/file_fixtures.rb +23 -0
  172. data/lib/disco_app/test_help.rb +11 -0
  173. data/lib/disco_app/version.rb +3 -0
  174. data/lib/disco_app.rb +7 -0
  175. data/lib/generators/disco_app/USAGE +5 -0
  176. data/lib/generators/disco_app/disco_app_generator.rb +236 -0
  177. data/lib/generators/disco_app/templates/assets/javascripts/application.js +17 -0
  178. data/lib/generators/disco_app/templates/assets/javascripts/components.js +3 -0
  179. data/lib/generators/disco_app/templates/assets/stylesheets/application.scss +5 -0
  180. data/lib/generators/disco_app/templates/config/database.yml.tt +20 -0
  181. data/lib/generators/disco_app/templates/config/newrelic.yml +26 -0
  182. data/lib/generators/disco_app/templates/config/puma.rb +15 -0
  183. data/lib/generators/disco_app/templates/controllers/home_controller.rb +7 -0
  184. data/lib/generators/disco_app/templates/initializers/disco_app.rb +28 -0
  185. data/lib/generators/disco_app/templates/initializers/rollbar.rb +19 -0
  186. data/lib/generators/disco_app/templates/initializers/session_store.rb +2 -0
  187. data/lib/generators/disco_app/templates/initializers/shopify_app.rb +7 -0
  188. data/lib/generators/disco_app/templates/initializers/shopify_session_repository.rb +7 -0
  189. data/lib/generators/disco_app/templates/root/CHECKS +4 -0
  190. data/lib/generators/disco_app/templates/root/Procfile +2 -0
  191. data/lib/generators/disco_app/templates/views/home/index.html.erb +2 -0
  192. data/lib/tasks/carrier_service.rake +10 -0
  193. data/lib/tasks/database.rake +8 -0
  194. data/lib/tasks/sessions.rake +9 -0
  195. data/lib/tasks/shops.rake +10 -0
  196. data/lib/tasks/start.rake +3 -0
  197. data/lib/tasks/webhooks.rake +10 -0
  198. data/test/controllers/disco_app/admin/shops_controller_test.rb +54 -0
  199. data/test/controllers/disco_app/charges_controller_test.rb +99 -0
  200. data/test/controllers/disco_app/install_controller_test.rb +50 -0
  201. data/test/controllers/disco_app/subscriptions_controller_test.rb +68 -0
  202. data/test/controllers/disco_app/webhooks_controller_test.rb +58 -0
  203. data/test/controllers/home_controller_test.rb +92 -0
  204. data/test/controllers/proxy_controller_test.rb +42 -0
  205. data/test/disco_app_test.rb +7 -0
  206. data/test/dummy/Rakefile +6 -0
  207. data/test/dummy/app/assets/javascripts/application.js +17 -0
  208. data/test/dummy/app/assets/stylesheets/application.scss +5 -0
  209. data/test/dummy/app/controllers/application_controller.rb +6 -0
  210. data/test/dummy/app/controllers/carrier_request_controller.rb +10 -0
  211. data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +8 -0
  212. data/test/dummy/app/controllers/home_controller.rb +7 -0
  213. data/test/dummy/app/controllers/proxy_controller.rb +8 -0
  214. data/test/dummy/app/helpers/application_helper.rb +2 -0
  215. data/test/dummy/app/jobs/carts_update_job.rb +7 -0
  216. data/test/dummy/app/jobs/disco_app/app_installed_job.rb +16 -0
  217. data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +11 -0
  218. data/test/dummy/app/jobs/products_create_job.rb +7 -0
  219. data/test/dummy/app/jobs/products_delete_job.rb +7 -0
  220. data/test/dummy/app/jobs/products_update_job.rb +7 -0
  221. data/test/dummy/app/models/cart.rb +24 -0
  222. data/test/dummy/app/models/disco_app/shop.rb +20 -0
  223. data/test/dummy/app/models/js_configuration.rb +8 -0
  224. data/test/dummy/app/models/product.rb +9 -0
  225. data/test/dummy/app/models/widget_configuration.rb +10 -0
  226. data/test/dummy/app/views/assets/script_tag.js.erb +1 -0
  227. data/test/dummy/app/views/assets/test.js.erb +1 -0
  228. data/test/dummy/app/views/assets/widget.js.erb +2 -0
  229. data/test/dummy/app/views/assets/widget.scss.erb +3 -0
  230. data/test/dummy/app/views/home/index.html.erb +2 -0
  231. data/test/dummy/app/views/snippets/widget.liquid.erb +1 -0
  232. data/test/dummy/bin/bundle +3 -0
  233. data/test/dummy/bin/rails +4 -0
  234. data/test/dummy/bin/rake +4 -0
  235. data/test/dummy/bin/setup +29 -0
  236. data/test/dummy/config/application.rb +38 -0
  237. data/test/dummy/config/boot.rb +5 -0
  238. data/test/dummy/config/database.codeship.yml +23 -0
  239. data/test/dummy/config/database.gitlab-ci.yml +24 -0
  240. data/test/dummy/config/database.yml +20 -0
  241. data/test/dummy/config/environment.rb +5 -0
  242. data/test/dummy/config/environments/development.rb +41 -0
  243. data/test/dummy/config/environments/production.rb +85 -0
  244. data/test/dummy/config/environments/test.rb +42 -0
  245. data/test/dummy/config/initializers/assets.rb +11 -0
  246. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  247. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  248. data/test/dummy/config/initializers/disco_app.rb +28 -0
  249. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  250. data/test/dummy/config/initializers/inflections.rb +16 -0
  251. data/test/dummy/config/initializers/mime_types.rb +4 -0
  252. data/test/dummy/config/initializers/omniauth.rb +9 -0
  253. data/test/dummy/config/initializers/session_store.rb +2 -0
  254. data/test/dummy/config/initializers/shopify_app.rb +7 -0
  255. data/test/dummy/config/initializers/shopify_session_repository.rb +7 -0
  256. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  257. data/test/dummy/config/locales/en.yml +23 -0
  258. data/test/dummy/config/routes.rb +11 -0
  259. data/test/dummy/config/secrets.yml +22 -0
  260. data/test/dummy/config.ru +4 -0
  261. data/test/dummy/db/migrate/20160307182229_create_products.rb +11 -0
  262. data/test/dummy/db/migrate/20160530160739_create_asset_models.rb +19 -0
  263. data/test/dummy/db/migrate/20161105054746_create_carts.rb +13 -0
  264. data/test/dummy/db/schema.rb +152 -0
  265. data/test/dummy/public/404.html +67 -0
  266. data/test/dummy/public/422.html +67 -0
  267. data/test/dummy/public/500.html +66 -0
  268. data/test/dummy/public/favicon.ico +0 -0
  269. data/test/fixtures/api/widget_store/assets/create_script_tag_js_request.json +6 -0
  270. data/test/fixtures/api/widget_store/assets/create_script_tag_js_response.json +12 -0
  271. data/test/fixtures/api/widget_store/assets/create_script_tag_request.json +6 -0
  272. data/test/fixtures/api/widget_store/assets/create_script_tag_response.json +10 -0
  273. data/test/fixtures/api/widget_store/assets/create_test_js_request.json +6 -0
  274. data/test/fixtures/api/widget_store/assets/create_test_js_response.json +12 -0
  275. data/test/fixtures/api/widget_store/assets/create_widget_js_request.json +6 -0
  276. data/test/fixtures/api/widget_store/assets/create_widget_js_response.json +12 -0
  277. data/test/fixtures/api/widget_store/assets/create_widget_liquid_request.json +6 -0
  278. data/test/fixtures/api/widget_store/assets/create_widget_liquid_response.json +12 -0
  279. data/test/fixtures/api/widget_store/assets/create_widget_scss_request.json +6 -0
  280. data/test/fixtures/api/widget_store/assets/create_widget_scss_response.json +12 -0
  281. data/test/fixtures/api/widget_store/assets/get_script_tags_empty_request.json +1 -0
  282. data/test/fixtures/api/widget_store/assets/get_script_tags_empty_response.json +1 -0
  283. data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_request.json +1 -0
  284. data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_response.json +12 -0
  285. data/test/fixtures/api/widget_store/assets/update_script_tag_request.json +10 -0
  286. data/test/fixtures/api/widget_store/assets/update_script_tag_response.json +10 -0
  287. data/test/fixtures/api/widget_store/carrier_services.json +1 -0
  288. data/test/fixtures/api/widget_store/carrier_services_create.json +8 -0
  289. data/test/fixtures/api/widget_store/charges/activate_application_charge_request.json +16 -0
  290. data/test/fixtures/api/widget_store/charges/activate_application_charge_response.json +1 -0
  291. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_request.json +20 -0
  292. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_response.json +1 -0
  293. data/test/fixtures/api/widget_store/charges/create_application_charge_request.json +9 -0
  294. data/test/fixtures/api/widget_store/charges/create_application_charge_response.json +16 -0
  295. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_request.json +9 -0
  296. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_response.json +20 -0
  297. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_request.json +9 -0
  298. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_response.json +20 -0
  299. data/test/fixtures/api/widget_store/charges/get_accepted_application_charge_response.json +16 -0
  300. data/test/fixtures/api/widget_store/charges/get_accepted_recurring_application_charge_response.json +20 -0
  301. data/test/fixtures/api/widget_store/charges/get_declined_application_charge_response.json +16 -0
  302. data/test/fixtures/api/widget_store/charges/get_declined_recurring_application_charge_response.json +20 -0
  303. data/test/fixtures/api/widget_store/charges/get_pending_application_charge_response.json +16 -0
  304. data/test/fixtures/api/widget_store/charges/get_pending_recurring_application_charge_response.json +20 -0
  305. data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_request.json +31 -0
  306. data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_response.json +1 -0
  307. data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_request.json +19 -0
  308. data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_response.json +1 -0
  309. data/test/fixtures/api/widget_store/shop.json +46 -0
  310. data/test/fixtures/api/widget_store/webhooks.json +1 -0
  311. data/test/fixtures/assets/test.js +1 -0
  312. data/test/fixtures/assets/test.min.js +1 -0
  313. data/test/fixtures/carts.yml +5 -0
  314. data/test/fixtures/disco_app/application_charges.yml +11 -0
  315. data/test/fixtures/disco_app/plan_codes.yml +13 -0
  316. data/test/fixtures/disco_app/plans.yml +37 -0
  317. data/test/fixtures/disco_app/recurring_application_charges.yml +11 -0
  318. data/test/fixtures/disco_app/shops.yml +10 -0
  319. data/test/fixtures/disco_app/subscriptions.yml +22 -0
  320. data/test/fixtures/js_configurations.yml +3 -0
  321. data/test/fixtures/liquid/model.liquid +8 -0
  322. data/test/fixtures/products.yml +4 -0
  323. data/test/fixtures/webhooks/app_uninstalled.json +46 -0
  324. data/test/fixtures/webhooks/cart_updated.json +28 -0
  325. data/test/fixtures/webhooks/product_created.json +167 -0
  326. data/test/fixtures/webhooks/product_deleted.json +3 -0
  327. data/test/fixtures/webhooks/product_updated.json +167 -0
  328. data/test/fixtures/widget_configurations.yml +4 -0
  329. data/test/integration/synchronises_test.rb +62 -0
  330. data/test/jobs/disco_app/app_installed_job_test.rb +57 -0
  331. data/test/jobs/disco_app/app_uninstalled_job_test.rb +30 -0
  332. data/test/jobs/disco_app/synchronise_carrier_service_job_test.rb +25 -0
  333. data/test/jobs/disco_app/synchronise_webhooks_job_test.rb +30 -0
  334. data/test/models/disco_app/can_be_liquified_test.rb +55 -0
  335. data/test/models/disco_app/has_metafields_test.rb +40 -0
  336. data/test/models/disco_app/plan_test.rb +5 -0
  337. data/test/models/disco_app/renders_assets_test.rb +109 -0
  338. data/test/models/disco_app/session_test.rb +31 -0
  339. data/test/models/disco_app/shop_test.rb +43 -0
  340. data/test/models/disco_app/subscription_test.rb +19 -0
  341. data/test/services/disco_app/charges_service_test.rb +112 -0
  342. data/test/services/disco_app/subscription_service_test.rb +60 -0
  343. data/test/support/test_file_fixtures.rb +29 -0
  344. data/test/support/test_shopify_api.rb +16 -0
  345. data/test/test_helper.rb +57 -0
  346. metadata +970 -0
@@ -0,0 +1,167 @@
1
+ {
2
+ "id": 632910392,
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,3 @@
1
+ {
2
+ "id": 632910393
3
+ }
@@ -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,4 @@
1
+ widget_swedish:
2
+ shop: widget_store
3
+ locale: sv
4
+ background_color: '#006AA7'
@@ -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.with_api_context { @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.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
+ ) }
38
+ end
39
+
40
+ end
@@ -0,0 +1,5 @@
1
+ require 'test_helper'
2
+
3
+ class DiscoApp::PlanTest < ActiveSupport::TestCase
4
+
5
+ end