disco_app 0.10.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 +432 -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-footer.es6.jsx +11 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/cards/card-header.es6.jsx +11 -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 +16 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/cards/cart-section-title.es6.jsx +17 -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 +15 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-checkbox.es6.jsx +30 -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 +45 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-text.es6.jsx +69 -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/forms/input-time.es6.jsx +7 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__element.es6.jsx +17 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__group.es6.jsx +11 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__section.es6.jsx +11 -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/tables/table.es6.jsx +22 -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-layout-item.es6.jsx +11 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-layout-section.es6.jsx +19 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-layout-sections.es6.jsx +11 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-layout.es6.jsx +11 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-page-actions.es6.jsx +13 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-page-actions__buttons.es6.jsx +27 -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 +21 -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-forms.scss +69 -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 +5116 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-layout.scss +15 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-page-actions.scss +23 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-stack.scss +39 -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 +35 -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 +55 -0
- data/app/jobs/disco_app/concerns/synchronise_resources_job.rb +12 -0
- data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +52 -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_resources_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/can_be_liquified.rb +45 -0
- data/app/models/disco_app/concerns/has_metafields.rb +48 -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 +166 -0
- data/app/models/disco_app/concerns/shop.rb +78 -0
- data/app/models/disco_app/concerns/subscription.rb +60 -0
- data/app/models/disco_app/concerns/synchronises.rb +54 -0
- data/app/models/disco_app/concerns/taggable.rb +16 -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 +23 -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 +1 -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 +44 -0
- data/app/views/layouts/embedded_app_modal.html.erb +28 -0
- data/app/views/sessions/new.html.erb +28 -0
- data/config/routes.rb +63 -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 +45 -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 +239 -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 +28 -0
- data/lib/generators/disco_app/templates/initializers/rollbar.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/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/carrier_request_controller.rb +10 -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 +9 -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/app/views/snippets/widget.liquid.erb +1 -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 +28 -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 +11 -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_liquid_request.json +6 -0
- data/test/fixtures/api/widget_store/assets/create_widget_liquid_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/carrier_services.json +1 -0
- data/test/fixtures/api/widget_store/carrier_services_create.json +8 -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/products/write_metafields_multiple_namespaces_request.json +31 -0
- data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_response.json +1 -0
- data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_request.json +19 -0
- data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_response.json +1 -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/assets/test.min.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/liquid/model.liquid +8 -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 +57 -0
- data/test/jobs/disco_app/app_uninstalled_job_test.rb +30 -0
- data/test/jobs/disco_app/synchronise_carrier_service_job_test.rb +25 -0
- data/test/jobs/disco_app/synchronise_webhooks_job_test.rb +30 -0
- data/test/models/disco_app/can_be_liquified_test.rb +55 -0
- data/test/models/disco_app/has_metafields_test.rb +40 -0
- data/test/models/disco_app/plan_test.rb +5 -0
- data/test/models/disco_app/renders_assets_test.rb +109 -0
- data/test/models/disco_app/session_test.rb +31 -0
- data/test/models/disco_app/shop_test.rb +35 -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 +878 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
|
2
|
+
// listed below.
|
|
3
|
+
//
|
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
|
6
|
+
//
|
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
|
8
|
+
// compiled file.
|
|
9
|
+
//
|
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
|
11
|
+
// about supported directives.
|
|
12
|
+
//
|
|
13
|
+
//= require jquery
|
|
14
|
+
//= require jquery_ujs
|
|
15
|
+
//= require turbolinks
|
|
16
|
+
//= require disco_app/disco_app
|
|
17
|
+
//= require_tree .
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
default: &default
|
|
2
|
+
adapter: postgresql
|
|
3
|
+
encoding: unicode
|
|
4
|
+
pool: 5
|
|
5
|
+
timeout: 5000
|
|
6
|
+
|
|
7
|
+
development:
|
|
8
|
+
<<: *default
|
|
9
|
+
host: localhost
|
|
10
|
+
port: 5432
|
|
11
|
+
database: <%= Rails.application.class.parent_name.downcase %>
|
|
12
|
+
|
|
13
|
+
test:
|
|
14
|
+
<<: *default
|
|
15
|
+
host: localhost
|
|
16
|
+
port: 5432
|
|
17
|
+
database: <%= Rails.application.class.parent_name.downcase %>_test
|
|
18
|
+
|
|
19
|
+
production:
|
|
20
|
+
<<: *default
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# This file configures the New Relic Agent.
|
|
2
|
+
#
|
|
3
|
+
# For full documentation of agent configuration options, please refer to
|
|
4
|
+
# https://docs.newrelic.com/docs/agents/ruby-agent/installation-configuration/ruby-agent-configuration
|
|
5
|
+
|
|
6
|
+
common: &default_settings
|
|
7
|
+
license_key: <%= ENV['NEW_RELIC_LICENSE_KEY'] %>
|
|
8
|
+
app_name: <%= ENV['SHOPIFY_APP_NAME'] || 'Unknown App' %>
|
|
9
|
+
|
|
10
|
+
# To disable the agent regardless of other settings, uncomment the following:
|
|
11
|
+
# agent_enabled: false
|
|
12
|
+
|
|
13
|
+
# Logging level for log/newrelic_agent.log
|
|
14
|
+
log_level: info
|
|
15
|
+
|
|
16
|
+
development:
|
|
17
|
+
<<: *default_settings
|
|
18
|
+
app_name: <%= ENV['SHOPIFY_APP_NAME'] || 'Unknown App' %> (Development)
|
|
19
|
+
developer_mode: true
|
|
20
|
+
|
|
21
|
+
test:
|
|
22
|
+
<<: *default_settings
|
|
23
|
+
monitor_mode: false
|
|
24
|
+
|
|
25
|
+
production:
|
|
26
|
+
<<: *default_settings
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
|
|
2
|
+
threads_count = Integer(ENV['MAX_THREADS'] || 5)
|
|
3
|
+
threads threads_count, threads_count
|
|
4
|
+
|
|
5
|
+
preload_app!
|
|
6
|
+
|
|
7
|
+
rackup DefaultRackup
|
|
8
|
+
port ENV['PORT'] || 3000
|
|
9
|
+
environment ENV['RACK_ENV'] || 'development'
|
|
10
|
+
|
|
11
|
+
on_worker_boot do
|
|
12
|
+
# Worker specific setup for Rails 4.1+
|
|
13
|
+
# See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot
|
|
14
|
+
ActiveRecord::Base.establish_connection
|
|
15
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
DiscoApp::Engine.routes.default_url_options[:host] = ENV['DEFAULT_HOST']
|
|
2
|
+
|
|
3
|
+
DiscoApp.configure do |config|
|
|
4
|
+
# Required configuration.
|
|
5
|
+
config.app_name = ENV['SHOPIFY_APP_NAME']
|
|
6
|
+
|
|
7
|
+
# Set a list of webhook topics to listen for.
|
|
8
|
+
# See https://help.shopify.com/api/reference/webhook.
|
|
9
|
+
config.webhook_topics = []
|
|
10
|
+
|
|
11
|
+
# Set the below if using an application proxy.
|
|
12
|
+
config.app_proxy_prefix = ENV['SHOPIFY_APP_PROXY_PREFIX']
|
|
13
|
+
|
|
14
|
+
# Set the below if providing a carrier service endpoint.
|
|
15
|
+
# Note that if using a URL helper to set the endpoint, we use a lambda
|
|
16
|
+
# function to ensure that the URL helper is only evaluated when we need it.
|
|
17
|
+
# config.carrier_service_callback_url = -> { Rails.application.routes.url_helpers.carrier_service_callback_url }
|
|
18
|
+
|
|
19
|
+
# Set the below to create real Shopify charges.
|
|
20
|
+
config.real_charges = ENV['SHOPIFY_REAL_CHARGES'] === 'true'
|
|
21
|
+
|
|
22
|
+
# Optional configuration. These flags are only respected in the development
|
|
23
|
+
# environment and will have no effect in production.
|
|
24
|
+
config.skip_proxy_verification = ENV['SKIP_PROXY_VERIFICATION'] == 'true'
|
|
25
|
+
config.skip_webhook_verification = ENV['SKIP_WEBHOOK_VERIFICATION'] == 'true'
|
|
26
|
+
config.skip_carrier_request_verification = ENV['SKIP_CARRIER_REQUEST_VERIFICATION'] == 'true'
|
|
27
|
+
config.skip_oauth = ENV['SKIP_OAUTH'] == 'true'
|
|
28
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Rollbar.configure do |config|
|
|
2
|
+
# Fetch the access token from the environment.
|
|
3
|
+
config.access_token = ENV['ROLLBAR_ACCESS_TOKEN']
|
|
4
|
+
|
|
5
|
+
# Only use Rollbar in production when there's a token configured.
|
|
6
|
+
unless config.access_token and Rails.env.production?
|
|
7
|
+
config.enabled = false
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Enable delayed reporting (using Sidekiq)
|
|
11
|
+
config.use_sidekiq
|
|
12
|
+
|
|
13
|
+
# Add custom handlers.
|
|
14
|
+
config.before_process << proc do |options|
|
|
15
|
+
if options[:exception].is_a?(ActiveResource::ClientError) and options[:exception].message.include?('Too Many Requests')
|
|
16
|
+
raise Rollbar::Ignore
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
namespace :carrier_service do
|
|
2
|
+
|
|
3
|
+
desc 'Synchronise carrier service across all installed shops.'
|
|
4
|
+
task sync: :environment do
|
|
5
|
+
DiscoApp::Shop.installed.has_active_shopify_plan.each do |shop|
|
|
6
|
+
DiscoApp::SynchroniseCarrierServiceJob.perform_later(shop)
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
namespace :sessions do
|
|
2
|
+
|
|
3
|
+
desc 'Clean out any stale sessions.'
|
|
4
|
+
task clean: [:environment, 'db:load_config'] do
|
|
5
|
+
threshold = (ENV['SESSIONS_CLEAN_THRESHOLD_DAYS'] || 30).to_i.days.ago
|
|
6
|
+
ActiveRecord::Base.connection.execute("DELETE FROM #{ActiveRecord::SessionStore::Session.table_name} WHERE updated_at < '#{threshold}'")
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class DiscoApp::Admin::ShopsControllerTest < ActionController::TestCase
|
|
4
|
+
include ActiveJob::TestHelper
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
ENV['ADMIN_APP_USERNAME'] = 'admin_app_username'
|
|
8
|
+
ENV['ADMIN_APP_PASSWORD'] = 'admin_app_password'
|
|
9
|
+
@routes = DiscoApp::Engine.routes
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def teardown
|
|
13
|
+
ENV['ADMIN_APP_USERNAME'] = nil
|
|
14
|
+
ENV['ADMIN_APP_PASSWORD'] = nil
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
test 'can not access shops list without authorization' do
|
|
18
|
+
get(:index)
|
|
19
|
+
assert_response :unauthorized
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
test 'can not access shops list with incorrect username/password' do
|
|
23
|
+
authenticate('fakeuser', 'blah blah')
|
|
24
|
+
get(:index)
|
|
25
|
+
assert_response :unauthorized
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
test 'can not access shops list with blank username/password' do
|
|
29
|
+
authenticate('', '')
|
|
30
|
+
get(:index)
|
|
31
|
+
assert_response :unauthorized
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
test 'can not access shops list with blank username/password when env variables are blank' do
|
|
35
|
+
ENV['ADMIN_APP_USERNAME'] = ''
|
|
36
|
+
ENV['ADMIN_APP_PASSWORD'] = ''
|
|
37
|
+
authenticate('', '')
|
|
38
|
+
get(:index)
|
|
39
|
+
assert_response :unauthorized
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
test 'can access shops list with correct username/password' do
|
|
43
|
+
authenticate('admin_app_username', 'admin_app_password')
|
|
44
|
+
get(:index)
|
|
45
|
+
assert_response :ok
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
def authenticate(username, password)
|
|
51
|
+
request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(username, password)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class DiscoApp::ChargesControllerTest < ActionController::TestCase
|
|
4
|
+
include ActiveJob::TestHelper
|
|
5
|
+
include DiscoApp::Test::ShopifyAPI
|
|
6
|
+
|
|
7
|
+
def setup
|
|
8
|
+
@shop = disco_app_shops(:widget_store)
|
|
9
|
+
@current_subscription = disco_app_subscriptions(:current_widget_store_subscription)
|
|
10
|
+
@new_charge = disco_app_recurring_application_charges(:new_widget_store_subscription_recurring_charge)
|
|
11
|
+
@routes = DiscoApp::Engine.routes
|
|
12
|
+
log_in_as(@shop)
|
|
13
|
+
@shop.installed!
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def teardown
|
|
17
|
+
@shop = nil
|
|
18
|
+
@current_subscription = nil
|
|
19
|
+
WebMock.reset!
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
test 'non-logged in user is redirected to the login page' do
|
|
23
|
+
log_out
|
|
24
|
+
get(:new, subscription_id: @current_subscription)
|
|
25
|
+
assert_redirected_to ShopifyApp::Engine.routes.url_helpers.login_path
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
test 'logged-in, never installed user is redirected to the install page' do
|
|
29
|
+
@shop.never_installed!
|
|
30
|
+
get(:new, subscription_id: @current_subscription)
|
|
31
|
+
assert_redirected_to DiscoApp::Engine.routes.url_helpers.install_path
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
test 'user with paid-for current subscription can not access page' do
|
|
35
|
+
get(:new, subscription_id: @current_subscription)
|
|
36
|
+
assert_redirected_to Rails.application.routes.url_helpers.root_path
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
test 'user with unpaid current subscription can access page' do
|
|
40
|
+
@current_subscription.active_charge.destroy
|
|
41
|
+
get(:new, subscription_id: @current_subscription)
|
|
42
|
+
assert_response :ok
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
test 'user with unpaid current subscription can create new charge and is redirected to confirmation url' do
|
|
46
|
+
res = { "recurring_application_charge": { "name": "Basic",
|
|
47
|
+
"price": "9.99",
|
|
48
|
+
"trial_days": 14,
|
|
49
|
+
"return_url": /^https:\/\/test\.example\.com\/subscriptions\/304261385\/charges\/53297050(1|2)\/activate$/,
|
|
50
|
+
"test": true
|
|
51
|
+
} }
|
|
52
|
+
stub_request(:post, "#{@shop.admin_url}/recurring_application_charges.json")
|
|
53
|
+
.with(body: res
|
|
54
|
+
).to_return(status: 201, body:api_fixture("widget_store/charges/create_second_recurring_application_charge_response").to_json)
|
|
55
|
+
|
|
56
|
+
@current_subscription.active_charge.destroy
|
|
57
|
+
post(:create, subscription_id: @current_subscription)
|
|
58
|
+
assert_redirected_to 'https://apple.myshopify.com/admin/charges/654381179/confirm_recurring_application_charge?signature=BAhpBHsQASc%3D--b2e90c6e4e94fbae15a464c566a31a1c23e6bffa'
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
test 'user trying to activate charge for invalid gets not found and hence 404' do
|
|
62
|
+
assert_raises ActiveRecord::RecordNotFound do
|
|
63
|
+
get(:activate, subscription_id: '123', id: '456', charge_id: '789')
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
test 'user trying to activate invalid charge for valid subscription gets redirected to new charge page for that subscription' do
|
|
68
|
+
@current_subscription.active_charge.destroy
|
|
69
|
+
get(:activate, subscription_id: @current_subscription, id: '456', charge_id: '789')
|
|
70
|
+
assert_redirected_to DiscoApp::Engine.routes.url_helpers.new_subscription_charge_path(@current_subscription)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
test 'user trying to activate pending charge is redirected back to new charge page' do
|
|
74
|
+
stub_api_request(:get, "#{@shop.admin_url}/recurring_application_charges/654381179.json", 'widget_store/charges/get_pending_recurring_application_charge')
|
|
75
|
+
|
|
76
|
+
@current_subscription.active_charge.destroy
|
|
77
|
+
get(:activate, subscription_id: @current_subscription, id: @new_charge.id, charge_id: @new_charge.shopify_id)
|
|
78
|
+
assert_redirected_to DiscoApp::Engine.routes.url_helpers.new_subscription_charge_path(@current_subscription)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
test 'user trying to activate declined charge is redirected back to new charge page' do
|
|
82
|
+
stub_api_request(:get, "#{@shop.admin_url}/recurring_application_charges/654381179.json", 'widget_store/charges/get_declined_recurring_application_charge')
|
|
83
|
+
|
|
84
|
+
@current_subscription.active_charge.destroy
|
|
85
|
+
get(:activate, subscription_id: @current_subscription, id: @new_charge.id, charge_id: @new_charge.shopify_id)
|
|
86
|
+
assert_redirected_to DiscoApp::Engine.routes.url_helpers.new_subscription_charge_path(@current_subscription)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
test 'user trying to activate accepted charge succeeds and is redirected to the root page' do
|
|
90
|
+
stub_api_request(:get, "#{@shop.admin_url}/recurring_application_charges/654381179.json", 'widget_store/charges/get_accepted_recurring_application_charge')
|
|
91
|
+
stub_api_request(:post, "#{@shop.admin_url}/recurring_application_charges/654381179/activate.json", 'widget_store/charges/activate_recurring_application_charge')
|
|
92
|
+
|
|
93
|
+
@current_subscription.active_charge.destroy
|
|
94
|
+
get(:activate, subscription_id: @current_subscription, id: @new_charge.id, charge_id: @new_charge.shopify_id)
|
|
95
|
+
assert_equal @new_charge, @current_subscription.active_charge
|
|
96
|
+
assert_redirected_to Rails.application.routes.url_helpers.root_path
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class DiscoApp::InstallControllerTest < ActionController::TestCase
|
|
4
|
+
include ActiveJob::TestHelper
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@shop = disco_app_shops(:widget_store)
|
|
8
|
+
@routes = DiscoApp::Engine.routes
|
|
9
|
+
log_in_as(@shop)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def teardown
|
|
13
|
+
@shop = nil
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
test 'logged-in but uninstalled user triggers installation from install page' do
|
|
17
|
+
get(:install)
|
|
18
|
+
assert_redirected_to :installing
|
|
19
|
+
assert_enqueued_jobs 1
|
|
20
|
+
@shop.reload
|
|
21
|
+
assert @shop.awaiting_install?
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
test 'logged-in and installed user is redirected to installing url for install/uninstalling actions' do
|
|
25
|
+
@shop.installed!
|
|
26
|
+
[:install, :uninstalling].each do |action|
|
|
27
|
+
get(:install)
|
|
28
|
+
assert_redirected_to :installing
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test 'logged-in and installed user is redirected to root url for installing' do
|
|
33
|
+
@shop.installed!
|
|
34
|
+
get(:installing)
|
|
35
|
+
assert_redirected_to Rails.application.routes.url_helpers.root_path
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
test 'logged-in and uninstalling user sees uninstalling page' do
|
|
39
|
+
@shop.uninstalling!
|
|
40
|
+
get(:uninstalling)
|
|
41
|
+
assert_response :success
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
test 'logged-in and uninstalled user starts install process again' do
|
|
45
|
+
@shop.uninstalled!
|
|
46
|
+
get(:uninstalling)
|
|
47
|
+
assert_redirected_to :install
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class DiscoApp::SubscriptionsControllerTest < ActionController::TestCase
|
|
4
|
+
include ActiveJob::TestHelper
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@shop = disco_app_shops(:widget_store)
|
|
8
|
+
@current_subscription = disco_app_subscriptions(:current_widget_store_subscription)
|
|
9
|
+
@routes = DiscoApp::Engine.routes
|
|
10
|
+
log_in_as(@shop)
|
|
11
|
+
@shop.installed!
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def teardown
|
|
15
|
+
@shop = nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
test 'non-logged in user is redirected to the login page' do
|
|
19
|
+
log_out
|
|
20
|
+
get(:new)
|
|
21
|
+
assert_redirected_to ShopifyApp::Engine.routes.url_helpers.login_path
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
test 'logged-in, never installed user is redirected to the install page' do
|
|
25
|
+
@shop.never_installed!
|
|
26
|
+
get(:new)
|
|
27
|
+
assert_redirected_to DiscoApp::Engine.routes.url_helpers.install_path
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
test 'logged-in, installed user with no current subscription can access page' do
|
|
31
|
+
@current_subscription.destroy
|
|
32
|
+
get(:new)
|
|
33
|
+
assert_response :ok
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
test 'logged-in, installed user with current subscription can access page' do
|
|
37
|
+
get(:new)
|
|
38
|
+
assert_response :ok
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
test 'logged-in, installed user with current subscription can create new subscription' do
|
|
42
|
+
post(:create, subscription: { plan: disco_app_plans(:premium) })
|
|
43
|
+
assert_redirected_to Rails.application.routes.url_helpers.root_path
|
|
44
|
+
assert_equal disco_app_plans(:premium), @shop.current_plan
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
test 'logged-in, installed user with no subscription can create new subscription for available plan' do
|
|
48
|
+
@current_subscription.destroy
|
|
49
|
+
post(:create, subscription: { plan: disco_app_plans(:premium) })
|
|
50
|
+
assert_redirected_to Rails.application.routes.url_helpers.root_path
|
|
51
|
+
assert_equal disco_app_plans(:premium), @shop.current_plan
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
test 'logged-in, installed user with current subscription can not create new subscription for unavailable plan' do
|
|
55
|
+
post(:create, subscription: { plan: disco_app_plans(:cheapo) })
|
|
56
|
+
assert_redirected_to DiscoApp::Engine.routes.url_helpers.new_subscription_path
|
|
57
|
+
assert_equal @current_subscription, @shop.current_subscription
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
test 'logged-in, installed user with current subscription can create new subscription with valid cookied plan code' do
|
|
61
|
+
@request.cookies[DiscoApp::CODE_COOKIE_KEY] = 'PODCAST'
|
|
62
|
+
post(:create, subscription: { plan: disco_app_plans(:premium) })
|
|
63
|
+
assert_redirected_to Rails.application.routes.url_helpers.root_path
|
|
64
|
+
assert_equal disco_app_plans(:premium), @shop.current_plan
|
|
65
|
+
assert_equal 8999, @shop.current_subscription.amount
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class DiscoApp::WebhooksControllerTest < ActionController::TestCase
|
|
4
|
+
include ActiveJob::TestHelper
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@shop = disco_app_shops(:widget_store)
|
|
8
|
+
@routes = DiscoApp::Engine.routes
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def teardown
|
|
12
|
+
@shop = nil
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
test 'webhook request without authentication information returns unauthorized' do
|
|
16
|
+
body = webhook_fixture('app_uninstalled')
|
|
17
|
+
post(:process_webhook, body)
|
|
18
|
+
assert_response :unauthorized
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
test 'webhook request with no HMAC returns unauthorized' do
|
|
22
|
+
body = webhook_fixture('app_uninstalled')
|
|
23
|
+
@request.headers['HTTP_X_SHOPIFY_TOPIC'] = :'app/uninstalled'
|
|
24
|
+
@request.headers['HTTP_X_SHOPIFY_SHOP_DOMAIN'] = @shop.shopify_domain
|
|
25
|
+
post(:process_webhook, body)
|
|
26
|
+
assert_response :unauthorized
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
test 'webhook request with invalid HMAC returns unauthorized' do
|
|
30
|
+
body = webhook_fixture('app_uninstalled')
|
|
31
|
+
@request.headers['HTTP_X_SHOPIFY_TOPIC'] = :'app/uninstalled'
|
|
32
|
+
@request.headers['HTTP_X_SHOPIFY_SHOP_DOMAIN'] = @shop.shopify_domain
|
|
33
|
+
@request.headers['HTTP_X_SHOPIFY_HMAC_SHA256'] = '0000'
|
|
34
|
+
post(:process_webhook, body)
|
|
35
|
+
assert_response :unauthorized
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
test 'webhook request with valid HMAC returns OK' do
|
|
39
|
+
body = webhook_fixture('app_uninstalled')
|
|
40
|
+
@request.headers['HTTP_X_SHOPIFY_TOPIC'] = :'app/uninstalled'
|
|
41
|
+
@request.headers['HTTP_X_SHOPIFY_SHOP_DOMAIN'] = @shop.shopify_domain
|
|
42
|
+
@request.headers['HTTP_X_SHOPIFY_HMAC_SHA256'] = DiscoApp::WebhookService.calculated_hmac(body, ShopifyApp.configuration.secret)
|
|
43
|
+
post(:process_webhook, body)
|
|
44
|
+
assert_response :ok
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
test 'app uninstalled job queued when app/uninstalled webhook arrives' do
|
|
48
|
+
body = webhook_fixture('app_uninstalled')
|
|
49
|
+
@request.headers['HTTP_X_SHOPIFY_TOPIC'] = :'app/uninstalled'
|
|
50
|
+
@request.headers['HTTP_X_SHOPIFY_SHOP_DOMAIN'] = @shop.shopify_domain
|
|
51
|
+
@request.headers['HTTP_X_SHOPIFY_HMAC_SHA256'] = DiscoApp::WebhookService.calculated_hmac(body, ShopifyApp.configuration.secret)
|
|
52
|
+
|
|
53
|
+
assert_enqueued_with(job: DiscoApp::AppUninstalledJob) do
|
|
54
|
+
post(:process_webhook, body)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|