disco_app 0.9.0
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.
- checksums.yaml +7 -0
- data/Rakefile +37 -0
- data/app/assets/images/disco_app/icon.svg +1 -0
- data/app/assets/images/disco_app/icons.svg +0 -0
- data/app/assets/javascripts/disco_app/components/custom/filterable_shop_list.js.jsx +60 -0
- data/app/assets/javascripts/disco_app/components/custom/inline-radio-options.es6.jsx +59 -0
- data/app/assets/javascripts/disco_app/components/custom/rules-editor.es6.jsx +360 -0
- data/app/assets/javascripts/disco_app/components/custom/shop_filter_tab.js.jsx +34 -0
- data/app/assets/javascripts/disco_app/components/custom/shop_filter_tabs.js.jsx +21 -0
- data/app/assets/javascripts/disco_app/components/custom/shop_list.js.jsx +142 -0
- data/app/assets/javascripts/disco_app/components/custom/shop_row.js.jsx +43 -0
- data/app/assets/javascripts/disco_app/components/custom/shopify_admin_link.js.jsx +29 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/cards/card-section.es6.jsx +30 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/cards/card.es6.jsx +9 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/cards/cart-section-title.es6.jsx +7 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_form.es6.jsx +72 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_input.es6.jsx +20 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/button.es6.jsx +13 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-radio.es6.jsx +30 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-select.es6.jsx +39 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-text.es6.jsx +59 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-textarea.es6.jsx +48 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/icons/icon-chevron.es6.jsx +33 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/icons/next-icon.es6.jsx +18 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/input_select.es6.jsx +21 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-annotated-section.es6.jsx +29 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-empty-state.es6.jsx +35 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-footer-help.es6.jsx +13 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-page-actions.es6.jsx +39 -0
- data/app/assets/javascripts/disco_app/components.js +2 -0
- data/app/assets/javascripts/disco_app/disco_app.js +10 -0
- data/app/assets/javascripts/disco_app/frame.js +152 -0
- data/app/assets/javascripts/disco_app/shopify-turbolinks.js +7 -0
- data/app/assets/javascripts/disco_app/ui-kit.js +1 -0
- data/app/assets/stylesheets/disco_app/admin/_header.scss +66 -0
- data/app/assets/stylesheets/disco_app/admin/_layout.scss +40 -0
- data/app/assets/stylesheets/disco_app/admin/_nav.scss +172 -0
- data/app/assets/stylesheets/disco_app/admin.scss +11 -0
- data/app/assets/stylesheets/disco_app/disco_app.scss +16 -0
- data/app/assets/stylesheets/disco_app/frame/_buttons.scss +54 -0
- data/app/assets/stylesheets/disco_app/frame/_forms.scss +26 -0
- data/app/assets/stylesheets/disco_app/frame/_layout.scss +77 -0
- data/app/assets/stylesheets/disco_app/frame/_type.scss +32 -0
- data/app/assets/stylesheets/disco_app/frame.scss +9 -0
- data/app/assets/stylesheets/disco_app/mixins/_flexbox.scss +400 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-empty-state.scss +94 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-footer-help.scss +25 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-icons.scss +28 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-kit.scss +5086 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-layout.scss +10 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-page-actions.scss +21 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-tabs.scss +63 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-type.scss +13 -0
- data/app/controllers/disco_app/admin/app_settings_controller.rb +3 -0
- data/app/controllers/disco_app/admin/application_controller.rb +3 -0
- data/app/controllers/disco_app/admin/concerns/app_settings_controller.rb +24 -0
- data/app/controllers/disco_app/admin/concerns/authenticated_controller.rb +20 -0
- data/app/controllers/disco_app/admin/concerns/plans_controller.rb +54 -0
- data/app/controllers/disco_app/admin/concerns/shops_controller.rb +7 -0
- data/app/controllers/disco_app/admin/concerns/subscriptions_controller.rb +32 -0
- data/app/controllers/disco_app/admin/plans_controller.rb +3 -0
- data/app/controllers/disco_app/admin/resources/shops_controller.rb +3 -0
- data/app/controllers/disco_app/admin/shops_controller.rb +3 -0
- data/app/controllers/disco_app/admin/subscriptions_controller.rb +3 -0
- data/app/controllers/disco_app/charges_controller.rb +47 -0
- data/app/controllers/disco_app/concerns/app_proxy_controller.rb +40 -0
- data/app/controllers/disco_app/concerns/authenticated_controller.rb +56 -0
- data/app/controllers/disco_app/concerns/carrier_request_controller.rb +21 -0
- data/app/controllers/disco_app/frame_controller.rb +9 -0
- data/app/controllers/disco_app/install_controller.rb +27 -0
- data/app/controllers/disco_app/subscriptions_controller.rb +32 -0
- data/app/controllers/disco_app/webhooks_controller.rb +46 -0
- data/app/controllers/sessions_controller.rb +28 -0
- data/app/helpers/disco_app/application_helper.rb +50 -0
- data/app/jobs/disco_app/app_installed_job.rb +3 -0
- data/app/jobs/disco_app/app_uninstalled_job.rb +3 -0
- data/app/jobs/disco_app/concerns/app_installed_job.rb +39 -0
- data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +20 -0
- data/app/jobs/disco_app/concerns/shop_update_job.rb +16 -0
- data/app/jobs/disco_app/concerns/subscription_changed_job.rb +7 -0
- data/app/jobs/disco_app/concerns/synchronise_carrier_service_job.rb +52 -0
- data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +61 -0
- data/app/jobs/disco_app/shop_job.rb +27 -0
- data/app/jobs/disco_app/shop_update_job.rb +3 -0
- data/app/jobs/disco_app/subscription_changed_job.rb +3 -0
- data/app/jobs/disco_app/synchronise_carrier_service_job.rb +3 -0
- data/app/jobs/disco_app/synchronise_webhooks_job.rb +3 -0
- data/app/models/disco_app/app_settings.rb +3 -0
- data/app/models/disco_app/application_charge.rb +18 -0
- data/app/models/disco_app/concerns/app_settings.rb +7 -0
- data/app/models/disco_app/concerns/plan.rb +26 -0
- data/app/models/disco_app/concerns/plan_code.rb +15 -0
- data/app/models/disco_app/concerns/shop.rb +76 -0
- data/app/models/disco_app/concerns/subscription.rb +60 -0
- data/app/models/disco_app/concerns/synchronises.rb +39 -0
- data/app/models/disco_app/plan.rb +3 -0
- data/app/models/disco_app/plan_code.rb +3 -0
- data/app/models/disco_app/recurring_application_charge.rb +18 -0
- data/app/models/disco_app/session_storage.rb +18 -0
- data/app/models/disco_app/shop.rb +3 -0
- data/app/models/disco_app/subscription.rb +3 -0
- data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +82 -0
- data/app/resources/disco_app/admin/resources/shop_resource.rb +4 -0
- data/app/services/disco_app/carrier_request_service.rb +15 -0
- data/app/services/disco_app/charges_service.rb +81 -0
- data/app/services/disco_app/proxy_service.rb +17 -0
- data/app/services/disco_app/subscription_service.rb +46 -0
- data/app/services/disco_app/webhook_service.rb +30 -0
- data/app/views/disco_app/admin/app_settings/edit.html.erb +5 -0
- data/app/views/disco_app/admin/plans/_form.html.erb +72 -0
- data/app/views/disco_app/admin/plans/_plan_code_fields.html.erb +15 -0
- data/app/views/disco_app/admin/plans/edit.html.erb +7 -0
- data/app/views/disco_app/admin/plans/index.html.erb +43 -0
- data/app/views/disco_app/admin/plans/new.html.erb +7 -0
- data/app/views/disco_app/admin/shops/index.html.erb +13 -0
- data/app/views/disco_app/admin/subscriptions/edit.html.erb +33 -0
- data/app/views/disco_app/charges/activate.html.erb +1 -0
- data/app/views/disco_app/charges/create.html.erb +1 -0
- data/app/views/disco_app/charges/new.html.erb +12 -0
- data/app/views/disco_app/frame/frame.html.erb +36 -0
- data/app/views/disco_app/install/installing.html.erb +7 -0
- data/app/views/disco_app/install/uninstalling.html.erb +1 -0
- data/app/views/disco_app/proxy_errors/404.html.erb +1 -0
- data/app/views/disco_app/shared/_card.html.erb +14 -0
- data/app/views/disco_app/shared/_icons.html.erb +3 -0
- data/app/views/disco_app/shared/_section.html.erb +17 -0
- data/app/views/disco_app/subscriptions/new.html.erb +25 -0
- data/app/views/layouts/admin/_nav_items.erb +20 -0
- data/app/views/layouts/admin.html.erb +67 -0
- data/app/views/layouts/application.html.erb +18 -0
- data/app/views/layouts/embedded_app.html.erb +43 -0
- data/app/views/layouts/embedded_app_modal.html.erb +28 -0
- data/app/views/sessions/new.html.erb +26 -0
- data/config/routes.rb +48 -0
- data/db/migrate/20150525000000_create_shops_if_not_existent.rb +15 -0
- data/db/migrate/20150525162112_add_status_to_shops.rb +5 -0
- data/db/migrate/20150525171422_add_meta_to_shops.rb +11 -0
- data/db/migrate/20150629210346_add_charge_status_to_shop.rb +5 -0
- data/db/migrate/20150814214025_add_more_meta_to_shops.rb +15 -0
- data/db/migrate/20151017231302_create_disco_app_plans.rb +13 -0
- data/db/migrate/20151017232027_create_disco_app_subscriptions.rb +15 -0
- data/db/migrate/20151017234409_move_shop_to_disco_app_engine.rb +5 -0
- data/db/migrate/20160112233706_create_disco_app_sessions.rb +12 -0
- data/db/migrate/20160113194418_add_shop_id_to_disco_app_sessions.rb +6 -0
- data/db/migrate/20160223111044_create_disco_app_settings.rb +8 -0
- data/db/migrate/20160301223215_update_plans.rb +22 -0
- data/db/migrate/20160301224558_update_subscriptions.rb +13 -0
- data/db/migrate/20160302104816_create_disco_app_recurring_application_charges.rb +14 -0
- data/db/migrate/20160302105259_create_disco_app_application_charges.rb +14 -0
- data/db/migrate/20160302134728_drop_charge_status_from_shops.rb +5 -0
- data/db/migrate/20160302142941_add_shopify_attributes_to_charges.rb +8 -0
- data/db/migrate/20160331093148_create_disco_app_plan_codes.rb +14 -0
- data/db/migrate/20160401044420_add_status_to_plan_codes.rb +5 -0
- data/db/migrate/20160401045551_add_amount_and_plan_code_to_disco_app_subscriptions.rb +7 -0
- data/db/migrate/20160425205211_add_source_to_disco_app_subscriptions.rb +5 -0
- data/db/migrate/20160426033520_add_trial_period_days_to_disco_app_subscriptions.rb +5 -0
- data/lib/disco_app/configuration.rb +39 -0
- data/lib/disco_app/constants.rb +4 -0
- data/lib/disco_app/engine.rb +27 -0
- data/lib/disco_app/session.rb +14 -0
- data/lib/disco_app/support/file_fixtures.rb +23 -0
- data/lib/disco_app/test_help.rb +11 -0
- data/lib/disco_app/version.rb +3 -0
- data/lib/disco_app.rb +7 -0
- data/lib/generators/disco_app/USAGE +5 -0
- data/lib/generators/disco_app/disco_app_generator.rb +197 -0
- data/lib/generators/disco_app/mailify/mailify_generator.rb +54 -0
- data/lib/generators/disco_app/monitorify/monitorify_generator.rb +28 -0
- data/lib/generators/disco_app/monitorify/templates/config/newrelic.yml +26 -0
- data/lib/generators/disco_app/monitorify/templates/initializers/rollbar.rb +12 -0
- data/lib/generators/disco_app/templates/assets/javascripts/application.js +17 -0
- data/lib/generators/disco_app/templates/assets/javascripts/components.js +3 -0
- data/lib/generators/disco_app/templates/assets/stylesheets/application.scss +5 -0
- data/lib/generators/disco_app/templates/config/database.yml.tt +20 -0
- data/lib/generators/disco_app/templates/config/puma.rb +15 -0
- data/lib/generators/disco_app/templates/controllers/home_controller.rb +7 -0
- data/lib/generators/disco_app/templates/initializers/disco_app.rb +19 -0
- data/lib/generators/disco_app/templates/initializers/session_store.rb +2 -0
- data/lib/generators/disco_app/templates/initializers/shopify_app.rb +7 -0
- data/lib/generators/disco_app/templates/initializers/shopify_session_repository.rb +7 -0
- data/lib/generators/disco_app/templates/root/Procfile +2 -0
- data/lib/generators/disco_app/templates/views/home/index.html.erb +2 -0
- data/lib/tasks/carrier_service.rake +10 -0
- data/lib/tasks/database.rake +8 -0
- data/lib/tasks/sessions.rake +9 -0
- data/lib/tasks/start.rake +3 -0
- data/lib/tasks/webhooks.rake +10 -0
- data/test/controllers/disco_app/admin/shops_controller_test.rb +54 -0
- data/test/controllers/disco_app/charges_controller_test.rb +99 -0
- data/test/controllers/disco_app/install_controller_test.rb +50 -0
- data/test/controllers/disco_app/subscriptions_controller_test.rb +68 -0
- data/test/controllers/disco_app/webhooks_controller_test.rb +58 -0
- data/test/controllers/home_controller_test.rb +92 -0
- data/test/controllers/proxy_controller_test.rb +42 -0
- data/test/disco_app_test.rb +7 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +17 -0
- data/test/dummy/app/assets/stylesheets/application.scss +5 -0
- data/test/dummy/app/controllers/application_controller.rb +6 -0
- data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +8 -0
- data/test/dummy/app/controllers/home_controller.rb +7 -0
- data/test/dummy/app/controllers/proxy_controller.rb +8 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/jobs/disco_app/app_installed_job.rb +16 -0
- data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +11 -0
- data/test/dummy/app/jobs/products_create_job.rb +7 -0
- data/test/dummy/app/jobs/products_delete_job.rb +7 -0
- data/test/dummy/app/jobs/products_update_job.rb +7 -0
- data/test/dummy/app/models/disco_app/shop.rb +15 -0
- data/test/dummy/app/models/product.rb +6 -0
- data/test/dummy/app/views/home/index.html.erb +2 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config/application.rb +38 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.codeship.yml +23 -0
- data/test/dummy/config/database.yml +20 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +85 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/disco_app.rb +19 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/omniauth.rb +9 -0
- data/test/dummy/config/initializers/session_store.rb +2 -0
- data/test/dummy/config/initializers/shopify_app.rb +7 -0
- data/test/dummy/config/initializers/shopify_session_repository.rb +7 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +10 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/migrate/20160307182229_create_products.rb +11 -0
- data/test/dummy/db/schema.rb +140 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/fixtures/api/widget_store/charges/activate_application_charge_request.json +16 -0
- data/test/fixtures/api/widget_store/charges/activate_application_charge_response.json +1 -0
- data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_request.json +20 -0
- data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_response.json +1 -0
- data/test/fixtures/api/widget_store/charges/create_application_charge_request.json +9 -0
- data/test/fixtures/api/widget_store/charges/create_application_charge_response.json +16 -0
- data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_request.json +9 -0
- data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_response.json +20 -0
- data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_request.json +9 -0
- data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_response.json +20 -0
- data/test/fixtures/api/widget_store/charges/get_accepted_application_charge_response.json +16 -0
- data/test/fixtures/api/widget_store/charges/get_accepted_recurring_application_charge_response.json +20 -0
- data/test/fixtures/api/widget_store/charges/get_declined_application_charge_response.json +16 -0
- data/test/fixtures/api/widget_store/charges/get_declined_recurring_application_charge_response.json +20 -0
- data/test/fixtures/api/widget_store/charges/get_pending_application_charge_response.json +16 -0
- data/test/fixtures/api/widget_store/charges/get_pending_recurring_application_charge_response.json +20 -0
- data/test/fixtures/api/widget_store/shop.json +46 -0
- data/test/fixtures/api/widget_store/webhooks.json +1 -0
- data/test/fixtures/disco_app/application_charges.yml +11 -0
- data/test/fixtures/disco_app/plan_codes.yml +13 -0
- data/test/fixtures/disco_app/plans.yml +37 -0
- data/test/fixtures/disco_app/recurring_application_charges.yml +11 -0
- data/test/fixtures/disco_app/shops.yml +10 -0
- data/test/fixtures/disco_app/subscriptions.yml +22 -0
- data/test/fixtures/products.yml +4 -0
- data/test/fixtures/webhooks/app_uninstalled.json +46 -0
- data/test/fixtures/webhooks/product_created.json +167 -0
- data/test/fixtures/webhooks/product_deleted.json +3 -0
- data/test/fixtures/webhooks/product_updated.json +167 -0
- data/test/integration/synchronises_test.rb +55 -0
- data/test/jobs/disco_app/app_installed_job_test.rb +55 -0
- data/test/jobs/disco_app/app_uninstalled_job_test.rb +30 -0
- data/test/models/disco_app/plan_test.rb +5 -0
- data/test/models/disco_app/session_test.rb +31 -0
- data/test/models/disco_app/shop_test.rb +27 -0
- data/test/models/disco_app/subscription_test.rb +19 -0
- data/test/services/disco_app/charges_service_test.rb +112 -0
- data/test/services/disco_app/subscription_service_test.rb +60 -0
- data/test/support/test_file_fixtures.rb +29 -0
- data/test/support/test_shopify_api.rb +16 -0
- data/test/test_helper.rb +55 -0
- 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,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
|
data/test/test_helper.rb
ADDED
|
@@ -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
|