Testing with shopify_app
shopify_app is a great Gem to quickly build a Shopify App with Rails. It handles all the verifications, authorizations, webhook, and more; leaving you to focus on developing your app. This post is to serve as a quick tip on how to unit-test your app with the Gem.
Other than the install page, most likely your app will require a shop to be logged in for all routes. shopify_app
, upon installation will create a fixture file in test/fixtures/shops.yml
of your Rails application.
Inspecting it you will see it’s filled with one shop, regular-shop.myshopify.com
, and a simple token. When running bundle exec rake test
(after migrations are done for a test environment of course), it will populate the shop database table with the fixture data in shop.yml
.
Now that we have a shop we can “log into”, let’s create a support module for the unit tests. Create a file called shopify_session_support.rb
inside test/support
.
# test/support/shopify_session_support.rb
module ShopifySessionSupport
# Make this module concernable
extend ActiveSupport::Concern
included do
# On include, tell TestCase to use this setup block
setup do
# Set the shop to the test shop from fixtures
# The key is `:shopify` and `:shopify_domain` which shopify_app needs
# See: https://github.com/Shopify/shopify_app/blob/c7e50247a72a52b1d1e4d9009ba997196a64e7e8/lib/shopify_app/login_protection.rb#L22
session[:shopify] = shops(:regular_shop).id
session[:shopify_domain] = shops(:regular_shop).shopify_domain
end
end
end
Next, include your new support module in test_helper.rb
before class ActiveSupport::TestCase
with:
# Include support modules
Dir[Rails.root.join('test/support/**/*.rb')].each { |f| require f }
Finally, in any of your controller tests where you require an authenticated shop, simply add include ShopifySessionSupport
to your class as such:
# ...
class ImageControllerTest < ActionController::TestCase
include ShopifySessionSupport
# ...
end
Running bundle exec rake test
should now pass your tests with the shop.