disco_app 0.9.4
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 +61 -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 +417 -0
- data/app/assets/javascripts/disco_app/components/custom/shop_filter_query.js.jsx +13 -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 +9 -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 +75 -0
- data/app/assets/stylesheets/disco_app/admin/_layout.scss +32 -0
- data/app/assets/stylesheets/disco_app/admin/_nav.scss +184 -0
- data/app/assets/stylesheets/disco_app/admin.scss +11 -0
- data/app/assets/stylesheets/disco_app/disco_app.scss +19 -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 +25 -0
- data/app/assets/stylesheets/disco_app/frame.scss +10 -0
- data/app/assets/stylesheets/disco_app/mixins/_flexbox.scss +400 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-empty-state.scss +121 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-footer-help.scss +28 -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 +5113 -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 +75 -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 +29 -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/render_asset_group_job.rb +8 -0
- data/app/jobs/disco_app/concerns/shop_update_job.rb +13 -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/render_asset_group_job.rb +3 -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/renders_assets.rb +148 -0
- data/app/models/disco_app/concerns/shop.rb +63 -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 +100 -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/db/migrate/20160513140727_add_name_to_disco_app_shops.rb +5 -0
- data/db/migrate/20160521135510_move_shop_to_synchronises.rb +61 -0
- data/lib/disco_app/configuration.rb +39 -0
- data/lib/disco_app/constants.rb +4 -0
- data/lib/disco_app/engine.rb +26 -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 +235 -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/newrelic.yml +26 -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/rollbar.rb +12 -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/CHECKS +4 -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/shops.rake +10 -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/js_configuration.rb +8 -0
- data/test/dummy/app/models/product.rb +6 -0
- data/test/dummy/app/models/widget_configuration.rb +10 -0
- data/test/dummy/app/views/assets/script_tag.js.erb +1 -0
- data/test/dummy/app/views/assets/test.js.erb +1 -0
- data/test/dummy/app/views/assets/widget.js.erb +2 -0
- data/test/dummy/app/views/assets/widget.scss.erb +3 -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.gitlab-ci.yml +24 -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/migrate/20160530160739_create_asset_models.rb +19 -0
- data/test/dummy/db/schema.rb +141 -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/assets/create_script_tag_js_request.json +6 -0
- data/test/fixtures/api/widget_store/assets/create_script_tag_js_response.json +12 -0
- data/test/fixtures/api/widget_store/assets/create_script_tag_request.json +6 -0
- data/test/fixtures/api/widget_store/assets/create_script_tag_response.json +10 -0
- data/test/fixtures/api/widget_store/assets/create_test_js_request.json +6 -0
- data/test/fixtures/api/widget_store/assets/create_test_js_response.json +12 -0
- data/test/fixtures/api/widget_store/assets/create_widget_js_request.json +6 -0
- data/test/fixtures/api/widget_store/assets/create_widget_js_response.json +12 -0
- data/test/fixtures/api/widget_store/assets/create_widget_scss_request.json +6 -0
- data/test/fixtures/api/widget_store/assets/create_widget_scss_response.json +12 -0
- data/test/fixtures/api/widget_store/assets/get_script_tags_empty_request.json +1 -0
- data/test/fixtures/api/widget_store/assets/get_script_tags_empty_response.json +1 -0
- data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_request.json +1 -0
- data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_response.json +12 -0
- data/test/fixtures/api/widget_store/assets/update_script_tag_request.json +10 -0
- data/test/fixtures/api/widget_store/assets/update_script_tag_response.json +10 -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/assets/test.js +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/js_configurations.yml +3 -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/fixtures/widget_configurations.yml +4 -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/renders_assets_test.rb +100 -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 +798 -0
|
@@ -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)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Assert the update shop job was performed.
|
|
27
|
+
@shop.reload
|
|
28
|
+
assert_equal 'United States', @shop.data['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)
|
|
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, '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, {})
|
|
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,100 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class DiscoApp::RendersAssetsTest < ActiveSupport::TestCase
|
|
4
|
+
include ActiveJob::TestHelper
|
|
5
|
+
include DiscoApp::Test::ShopifyAPI
|
|
6
|
+
|
|
7
|
+
def setup
|
|
8
|
+
@shop = disco_app_shops(:widget_store)
|
|
9
|
+
@js_configuration = js_configurations(:js_swedish)
|
|
10
|
+
@widget_configuration = widget_configurations(:widget_swedish)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def teardown
|
|
14
|
+
@shop = nil
|
|
15
|
+
@js_configuration = nil
|
|
16
|
+
@widget_configuration = nil
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# Test queueing behaviour.
|
|
21
|
+
##
|
|
22
|
+
|
|
23
|
+
test 'rendering of javascript asset group queued when locale changed' do
|
|
24
|
+
assert_enqueued_with(job: DiscoApp::RenderAssetGroupJob) do
|
|
25
|
+
@js_configuration.update(locale: :no)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
test 'rendering of javascript asset group not queued when label changed' do
|
|
30
|
+
assert_no_enqueued_jobs do
|
|
31
|
+
@js_configuration.update(label: 'Sample')
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
test 'rendering of widget asset group queued when locale changed' do
|
|
36
|
+
assert_enqueued_with(job: DiscoApp::RenderAssetGroupJob, args: [@widget_configuration.shop, @widget_configuration, 'widget_assets']) do
|
|
37
|
+
@widget_configuration.update(locale: :no)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
test 'rendering of liquid asset group queued when locale changed' do
|
|
42
|
+
assert_enqueued_with(job: DiscoApp::RenderAssetGroupJob, args: [@widget_configuration.shop, @widget_configuration, 'liquid_assets']) do
|
|
43
|
+
@widget_configuration.update(locale: :no)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
test 'rendering of widget asset group queued when background color changed' do
|
|
48
|
+
assert_enqueued_with(job: DiscoApp::RenderAssetGroupJob, args: [@widget_configuration.shop, @widget_configuration, 'widget_assets']) do
|
|
49
|
+
@widget_configuration.update(background_color: '#FF0000')
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
test 'rendering of liquid asset group not queued when background color changed' do
|
|
54
|
+
assert_enqueued_jobs 1 do
|
|
55
|
+
@widget_configuration.update(background_color: '#FF0000')
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
##
|
|
60
|
+
# Test rendering behaviour.
|
|
61
|
+
##
|
|
62
|
+
|
|
63
|
+
test 'individual js asset renders correctly' do
|
|
64
|
+
assert_equal asset_fixture('test.js'), @js_configuration.send('render_asset_group_asset', 'test.js', {})
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
test 'js asset group renders and uploads to shopify' do
|
|
68
|
+
stub_api_request(:put, "#{@shop.admin_url}/assets.json", 'widget_store/assets/create_test_js')
|
|
69
|
+
@js_configuration.render_asset_group(:js_assets)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
test 'widget asset group renders and uploads to shopify' do
|
|
73
|
+
stub_api_request(:put, "#{@shop.admin_url}/assets.json", 'widget_store/assets/create_widget_scss')
|
|
74
|
+
stub_api_request(:put, "#{@shop.admin_url}/assets.json", 'widget_store/assets/create_widget_js')
|
|
75
|
+
@widget_configuration.render_asset_group(:widget_assets)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
test 'script tag asset group renders, uploads to shopify and creates new script tag' do
|
|
79
|
+
stub_api_request(:put, "#{@shop.admin_url}/assets.json", 'widget_store/assets/create_script_tag_js')
|
|
80
|
+
stub_api_request(:get, "#{@shop.admin_url}/script_tags.json", 'widget_store/assets/get_script_tags_empty')
|
|
81
|
+
stub_api_request(:post, "#{@shop.admin_url}/script_tags.json", 'widget_store/assets/create_script_tag')
|
|
82
|
+
@widget_configuration.render_asset_group(:script_tag_assets)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
test 'script tag asset group renders, uploads to shopify and updates existing script tag' do
|
|
86
|
+
stub_api_request(:put, "#{@shop.admin_url}/assets.json", 'widget_store/assets/create_script_tag_js')
|
|
87
|
+
stub_api_request(:get, "#{@shop.admin_url}/script_tags.json", 'widget_store/assets/get_script_tags_preexisting')
|
|
88
|
+
stub_api_request(:put, "#{@shop.admin_url}/script_tags/38138886.json", 'widget_store/assets/update_script_tag')
|
|
89
|
+
@widget_configuration.render_asset_group(:script_tag_assets)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
private
|
|
93
|
+
|
|
94
|
+
# Return an asset fixture as a string.
|
|
95
|
+
def asset_fixture(path)
|
|
96
|
+
filename = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'fixtures', 'assets', "#{path}")
|
|
97
|
+
File.read(filename)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
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 or method == :put
|
|
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
|