Testing with shopify_app

shopify_app is a great Gem to quickly build a Shopify App with Rails. It handles all the verifications, authorizations, webhooking, 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 its filled with one shop, regular-shop.myshopify.com, and a simple token. When running bundle exec rake test (after migrations are done for 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", lets 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.

Show Comments