shopify_app 6.4.2 → 7.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +13 -0
- data/ISSUE_TEMPLATE.md +14 -0
- data/QUICKSTART.md +6 -7
- data/README.md +38 -16
- data/Rakefile +2 -6
- data/app/controllers/shopify_app/authenticated_controller.rb +7 -0
- data/app/controllers/shopify_app/sessions_controller.rb +5 -0
- data/app/controllers/shopify_app/webhooks_controller.rb +27 -0
- data/app/views/{sessions → shopify_app/sessions}/new.html.erb +0 -0
- data/config/routes.rb +4 -0
- data/lib/generators/shopify_app/add_webhook/add_webhook_generator.rb +61 -0
- data/lib/generators/shopify_app/add_webhook/templates/webhook_job.rb +8 -0
- data/lib/generators/shopify_app/controllers/controllers_generator.rb +1 -1
- data/lib/generators/shopify_app/home_controller/home_controller_generator.rb +0 -1
- data/lib/generators/shopify_app/home_controller/templates/home_controller.rb +1 -1
- data/lib/generators/shopify_app/install/install_generator.rb +13 -19
- data/lib/generators/shopify_app/install/templates/embedded_app.html.erb +2 -2
- data/lib/generators/shopify_app/install/templates/shopify_app.rb +3 -4
- data/lib/generators/shopify_app/install/templates/shopify_provider.rb +0 -1
- data/lib/generators/shopify_app/routes/templates/routes.rb +4 -0
- data/lib/generators/shopify_app/shopify_app_generator.rb +1 -7
- data/lib/shopify_app.rb +2 -3
- data/lib/shopify_app/configuration.rb +0 -1
- data/lib/shopify_app/engine.rb +1 -0
- data/lib/shopify_app/login_protection.rb +53 -5
- data/lib/shopify_app/{sessions_controller.rb → sessions_concern.rb} +5 -5
- data/lib/shopify_app/version.rb +1 -1
- data/lib/shopify_app/webhook_verification.rb +35 -0
- data/shopify_app.gemspec +1 -1
- metadata +11 -43
- data/CONTRIBUTING.md +0 -14
- data/app/controllers/authenticated_controller.rb +0 -5
- data/app/controllers/sessions_controller.rb +0 -3
- data/lib/shopify_app/controller.rb +0 -18
- data/lib/shopify_app/webhooks_controller.rb +0 -35
- data/test/app_templates/app/controllers/application_controller.rb +0 -2
- data/test/app_templates/config/application.rb +0 -24
- data/test/app_templates/config/initializers/shopify_app.rb +0 -6
- data/test/app_templates/config/routes.rb +0 -4
- data/test/controllers/sessions_controller_test.rb +0 -122
- data/test/controllers/sessions_routes_test.rb +0 -27
- data/test/dummy/Rakefile +0 -6
- data/test/dummy/app/controllers/application_controller.rb +0 -3
- data/test/dummy/app/controllers/home_controller.rb +0 -7
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -26
- data/test/dummy/config/boot.rb +0 -5
- data/test/dummy/config/database.yml +0 -25
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/test.rb +0 -42
- data/test/dummy/config/initializers/shopify_app.rb +0 -6
- data/test/dummy/config/routes.rb +0 -10
- data/test/dummy/config/secrets.yml +0 -17
- data/test/generators/controllers_generator_test.rb +0 -16
- data/test/generators/home_controller_generator_test.rb +0 -50
- data/test/generators/install_generator_test.rb +0 -87
- data/test/generators/routes_generator_test.rb +0 -26
- data/test/generators/shop_model_generator_test.rb +0 -39
- data/test/generators/shopify_app_generator.rb +0 -15
- data/test/generators/views_generator_test.rb +0 -15
- data/test/shopify_app/configuration_test.rb +0 -49
- data/test/shopify_app/in_memory_session_store_test.rb +0 -35
- data/test/shopify_app/login_protection_test.rb +0 -100
- data/test/shopify_app/shopify_session_repository_test.rb +0 -73
- data/test/shopify_app/utils_test.rb +0 -30
- data/test/shopify_app/webhooks_controller_test.rb +0 -50
- data/test/shopify_app/webhooks_manager_test.rb +0 -86
- data/test/support/generator_test_helpers.rb +0 -29
- data/test/test_helper.rb +0 -17
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'generators/shopify_app/routes/routes_generator'
|
3
|
-
|
4
|
-
class ControllerGeneratorTest < Rails::Generators::TestCase
|
5
|
-
tests ShopifyApp::Generators::RoutesGenerator
|
6
|
-
destination File.expand_path("../tmp", File.dirname(__FILE__))
|
7
|
-
|
8
|
-
setup do
|
9
|
-
prepare_destination
|
10
|
-
provide_existing_routes_file
|
11
|
-
provide_existing_initializer_file
|
12
|
-
end
|
13
|
-
|
14
|
-
test "copies ShopifyApp routes to the host application" do
|
15
|
-
run_generator
|
16
|
-
|
17
|
-
assert_file "config/routes.rb" do |routes|
|
18
|
-
assert_match "get 'login' => :new, :as => :login", routes
|
19
|
-
assert_match "post 'login' => :create, :as => :authenticate", routes
|
20
|
-
assert_match "get 'auth/shopify/callback' => :callback", routes
|
21
|
-
assert_match "get 'logout' => :destroy, :as => :logout", routes
|
22
|
-
refute_match "mount ShopifyApp::Engine, at: '/'", routes
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'generators/shopify_app/shop_model/shop_model_generator'
|
3
|
-
|
4
|
-
class ShopModelGeneratorTest < Rails::Generators::TestCase
|
5
|
-
tests ShopifyApp::Generators::ShopModelGenerator
|
6
|
-
destination File.expand_path("../tmp", File.dirname(__FILE__))
|
7
|
-
setup :prepare_destination
|
8
|
-
|
9
|
-
test "create the shop model" do
|
10
|
-
run_generator
|
11
|
-
assert_file "app/models/shop.rb" do |shop|
|
12
|
-
assert_match "class Shop < ActiveRecord::Base", shop
|
13
|
-
assert_match "include ShopifyApp::Shop", shop
|
14
|
-
assert_match "include ShopifyApp::SessionStorage", shop
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
test "creates ShopModel migration" do
|
19
|
-
run_generator
|
20
|
-
assert_migration "db/migrate/create_shops.rb" do |migration|
|
21
|
-
assert_match "create_table :shops do |t|", migration
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
test "adds the shopify_session_repository initializer" do
|
26
|
-
run_generator
|
27
|
-
assert_file "config/initializers/shopify_session_repository.rb" do |file|
|
28
|
-
assert_match "ShopifyApp::SessionRepository.storage = Shop", file
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
test "creates default shop fixtures" do
|
33
|
-
run_generator
|
34
|
-
assert_file "test/fixtures/shops.yml" do |file|
|
35
|
-
assert_match "regular_shop:", file
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'generators/shopify_app/shopify_app_generator'
|
3
|
-
|
4
|
-
class ViewsGeneratorTest < Rails::Generators::TestCase
|
5
|
-
tests ShopifyApp::Generators::ViewsGenerator
|
6
|
-
destination File.expand_path("../tmp", File.dirname(__FILE__))
|
7
|
-
setup :prepare_destination
|
8
|
-
|
9
|
-
test "copies ShopifyApp views to the host application" do
|
10
|
-
run_generator
|
11
|
-
assert_directory "app/views"
|
12
|
-
assert_file "app/views/sessions/new.html.erb"
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'generators/shopify_app/views/views_generator'
|
3
|
-
|
4
|
-
class ViewsGeneratorTest < Rails::Generators::TestCase
|
5
|
-
tests ShopifyApp::Generators::ViewsGenerator
|
6
|
-
destination File.expand_path("../tmp", File.dirname(__FILE__))
|
7
|
-
setup :prepare_destination
|
8
|
-
|
9
|
-
test "copies ShopifyApp views to the host application" do
|
10
|
-
run_generator
|
11
|
-
assert_directory "app/views"
|
12
|
-
assert_file "app/views/sessions/new.html.erb"
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ConfigurationTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
setup do
|
6
|
-
ShopifyApp.configuration = nil
|
7
|
-
end
|
8
|
-
|
9
|
-
test "configure" do
|
10
|
-
ShopifyApp.configure do |config|
|
11
|
-
config.embedded_app = true
|
12
|
-
end
|
13
|
-
|
14
|
-
assert_equal true, ShopifyApp.configuration.embedded_app
|
15
|
-
end
|
16
|
-
|
17
|
-
test "defaults to myshopify_domain" do
|
18
|
-
assert_equal "myshopify.com", ShopifyApp.configuration.myshopify_domain
|
19
|
-
end
|
20
|
-
|
21
|
-
test "can set myshopify_domain" do
|
22
|
-
ShopifyApp.configure do |config|
|
23
|
-
config.myshopify_domain = 'myshopify.io'
|
24
|
-
end
|
25
|
-
|
26
|
-
assert_equal "myshopify.io", ShopifyApp.configuration.myshopify_domain
|
27
|
-
end
|
28
|
-
|
29
|
-
test "can configure webhooks for creation" do
|
30
|
-
webhook = {topic: 'carts/update', address: 'example-app.com/webhooks', format: 'json'}
|
31
|
-
|
32
|
-
ShopifyApp.configure do |config|
|
33
|
-
config.webhooks = [webhook]
|
34
|
-
end
|
35
|
-
|
36
|
-
assert_equal webhook, ShopifyApp.configuration.webhooks.first
|
37
|
-
end
|
38
|
-
|
39
|
-
test "has_webhooks? is true if webhooks have been configured" do
|
40
|
-
refute ShopifyApp.configuration.has_webhooks?
|
41
|
-
|
42
|
-
ShopifyApp.configure do |config|
|
43
|
-
config.webhooks = [{topic: 'carts/update', address: 'example-app.com/webhooks', format: 'json'}]
|
44
|
-
end
|
45
|
-
|
46
|
-
assert ShopifyApp.configuration.has_webhooks?
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class InMemorySessionStoreTest < ActiveSupport::TestCase
|
4
|
-
teardown do
|
5
|
-
InMemorySessionStore.clear
|
6
|
-
end
|
7
|
-
|
8
|
-
test "storing a session" do
|
9
|
-
uuid = InMemorySessionStore.store('something')
|
10
|
-
assert_equal 'something', InMemorySessionStore.repo[uuid]
|
11
|
-
end
|
12
|
-
|
13
|
-
test "retrieving a session" do
|
14
|
-
InMemorySessionStore.repo['abra'] = 'something'
|
15
|
-
assert_equal 'something', InMemorySessionStore.retrieve('abra')
|
16
|
-
end
|
17
|
-
|
18
|
-
test "clearing the store" do
|
19
|
-
uuid = InMemorySessionStore.store('data')
|
20
|
-
assert_equal 'data', InMemorySessionStore.retrieve(uuid)
|
21
|
-
InMemorySessionStore.clear
|
22
|
-
assert !InMemorySessionStore.retrieve(uuid), 'The sessions should have been removed'
|
23
|
-
end
|
24
|
-
|
25
|
-
test "it should raise when the environment is not valid" do
|
26
|
-
Rails.env.stubs(:production?).returns(true)
|
27
|
-
assert_raises InMemorySessionStore::EnvironmentError do
|
28
|
-
InMemorySessionStore.store('data')
|
29
|
-
end
|
30
|
-
|
31
|
-
assert_raises InMemorySessionStore::EnvironmentError do
|
32
|
-
InMemorySessionStore.retrieve('abracadabra')
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,100 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'action_controller'
|
3
|
-
require 'action_controller/base'
|
4
|
-
|
5
|
-
class LoginProtectionController < ActionController::Base
|
6
|
-
include ShopifyApp::LoginProtection
|
7
|
-
helper_method :shop_session
|
8
|
-
|
9
|
-
around_action :shopify_session, only: [:index]
|
10
|
-
before_action :login_again_if_different_shop, only: [:second_login]
|
11
|
-
|
12
|
-
def index
|
13
|
-
render nothing: true
|
14
|
-
end
|
15
|
-
|
16
|
-
def second_login
|
17
|
-
render nothing: true
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class LoginProtectionTest < ActionController::TestCase
|
22
|
-
tests LoginProtectionController
|
23
|
-
|
24
|
-
setup do
|
25
|
-
ShopifyApp::SessionRepository.storage = InMemorySessionStore
|
26
|
-
end
|
27
|
-
|
28
|
-
test "calling shop session returns nil when session is nil" do
|
29
|
-
with_application_test_routes do
|
30
|
-
session[:shopify] = nil
|
31
|
-
get :index
|
32
|
-
assert_nil @controller.shop_session
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
test "calling shop session retreives session from storage" do
|
37
|
-
with_application_test_routes do
|
38
|
-
session[:shopify] = "foobar"
|
39
|
-
get :index
|
40
|
-
ShopifyApp::SessionRepository.expects(:retrieve).returns(session).once
|
41
|
-
assert @controller.shop_session
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
test "shop session is memoized and does not retreive session twice" do
|
46
|
-
with_application_test_routes do
|
47
|
-
session[:shopify] = "foobar"
|
48
|
-
get :index
|
49
|
-
ShopifyApp::SessionRepository.expects(:retrieve).returns(session).once
|
50
|
-
assert @controller.shop_session
|
51
|
-
assert @controller.shop_session
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
test "login_again_if_different_shop removes current session and redirects to login path" do
|
56
|
-
with_application_test_routes do
|
57
|
-
session[:shopify] = "foobar"
|
58
|
-
session[:shopify_domain] = "foobar"
|
59
|
-
sess = stub(url: 'https://foobar.myshopify.com')
|
60
|
-
ShopifyApp::SessionRepository.expects(:retrieve).returns(sess).once
|
61
|
-
get :second_login, shop: 'other_shop'
|
62
|
-
assert_redirected_to @controller.send(:login_path, shop: 'other_shop')
|
63
|
-
assert_nil session[:shopify]
|
64
|
-
assert_nil session[:shopify_domain]
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
test '#shopify_session with no Shopify session, redirects to the login path' do
|
69
|
-
with_application_test_routes do
|
70
|
-
get :index, shop: 'foobar'
|
71
|
-
assert_redirected_to @controller.send(:login_path, shop: 'foobar')
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
test '#shopify_session with no Shopify session, sets session[:return_to]' do
|
76
|
-
with_application_test_routes do
|
77
|
-
get :index, shop: 'foobar'
|
78
|
-
assert_equal '/?shop=foobar', session[:return_to]
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
test '#shopify_session with no Shopify session, when the request is an XHR, returns an HTTP 401' do
|
83
|
-
with_application_test_routes do
|
84
|
-
xhr :get, :index, shop: 'foobar'
|
85
|
-
assert_equal 401, response.status
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
private
|
90
|
-
|
91
|
-
def with_application_test_routes
|
92
|
-
with_routing do |set|
|
93
|
-
set.draw do
|
94
|
-
get '/' => 'login_protection#index'
|
95
|
-
get '/second_login' => 'login_protection#second_login'
|
96
|
-
end
|
97
|
-
yield
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class TestSessionStore
|
4
|
-
attr_reader :storage
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
@storage = []
|
8
|
-
end
|
9
|
-
|
10
|
-
def retrieve(id)
|
11
|
-
storage[id]
|
12
|
-
end
|
13
|
-
|
14
|
-
def store(session)
|
15
|
-
id = storage.length
|
16
|
-
storage[id] = session
|
17
|
-
id
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class TestSessionStoreClass
|
22
|
-
def self.store(session)
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.retrieve(id)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class ShopifySessionRepositoryTest < ActiveSupport::TestCase
|
30
|
-
attr_reader :session_store, :session
|
31
|
-
|
32
|
-
setup do
|
33
|
-
@session_store = TestSessionStore.new
|
34
|
-
@session = ShopifyAPI::Session.new('shop.myshopify.com', 'abracadabra')
|
35
|
-
ShopifyApp::SessionRepository.storage = session_store
|
36
|
-
end
|
37
|
-
|
38
|
-
teardown do
|
39
|
-
ShopifyApp::SessionRepository.storage = nil
|
40
|
-
end
|
41
|
-
|
42
|
-
test "adding a session to the repository" do
|
43
|
-
assert_equal 0, ShopifyApp::SessionRepository.store(session)
|
44
|
-
assert_equal session, session_store.retrieve(0)
|
45
|
-
end
|
46
|
-
|
47
|
-
test "retrieving a session from the repository" do
|
48
|
-
session_store.storage[9] = session
|
49
|
-
assert_equal session, ShopifyApp::SessionRepository.retrieve(9)
|
50
|
-
end
|
51
|
-
|
52
|
-
test "retrieving a session for an id that does not exist" do
|
53
|
-
ShopifyApp::SessionRepository.store(session)
|
54
|
-
assert !ShopifyApp::SessionRepository.retrieve(100), "The session with id 100 should not exist in the Repository"
|
55
|
-
end
|
56
|
-
|
57
|
-
test "retrieving a session for a misconfigured shops repository" do
|
58
|
-
ShopifyApp::SessionRepository.storage = nil
|
59
|
-
assert_raises ShopifyApp::SessionRepository::ConfigurationError do
|
60
|
-
ShopifyApp::SessionRepository.retrieve(0)
|
61
|
-
end
|
62
|
-
|
63
|
-
assert_raises ShopifyApp::SessionRepository::ConfigurationError do
|
64
|
-
ShopifyApp::SessionRepository.store(session)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
test "accepts a string and constantizes it" do
|
69
|
-
ShopifyApp::SessionRepository.storage = 'TestSessionStoreClass'
|
70
|
-
assert_equal TestSessionStoreClass, ShopifyApp::SessionRepository.storage
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class UtilsTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
setup do
|
6
|
-
ShopifyApp.configuration = nil
|
7
|
-
end
|
8
|
-
|
9
|
-
['my-shop', 'my-shop.myshopify.com', 'https://my-shop.myshopify.com', 'http://my-shop.myshopify.com'].each do |good_url|
|
10
|
-
test "sanitize_shop_domain for (#{good_url})" do
|
11
|
-
ShopifyApp.configuration.embedded_app = true
|
12
|
-
assert ShopifyApp::Utils.sanitize_shop_domain(good_url)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
['my-shop', 'my-shop.myshopify.io', 'https://my-shop.myshopify.io', 'http://my-shop.myshopify.io'].each do |good_url|
|
17
|
-
test "sanitize_shop_domain URL (#{good_url}) with custom myshopify_domain" do
|
18
|
-
ShopifyApp.configuration.embedded_app = true
|
19
|
-
ShopifyApp.configuration.myshopify_domain = 'myshopify.io'
|
20
|
-
assert ShopifyApp::Utils.sanitize_shop_domain(good_url)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
['myshop.com', 'myshopify.com', 'shopify.com', 'two words', 'store.myshopify.com.evil.com', '/foo/bar'].each do |bad_url|
|
25
|
-
test "sanitize_shop_domain for a non-myshopify URL (#{bad_url})" do
|
26
|
-
assert_nil ShopifyApp::Utils.sanitize_shop_domain(bad_url)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'action_controller'
|
3
|
-
require 'action_controller/base'
|
4
|
-
|
5
|
-
class WebhooksController < ActionController::Base
|
6
|
-
include ShopifyApp::WebhooksController
|
7
|
-
def carts_update
|
8
|
-
head :ok
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class WebhooksControllerTest < ActionController::TestCase
|
13
|
-
tests WebhooksController
|
14
|
-
|
15
|
-
setup do
|
16
|
-
ShopifyApp::SessionRepository.storage = InMemorySessionStore
|
17
|
-
ShopifyApp.configure do |config|
|
18
|
-
config.secret = 'secret'
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
test "#carts_update should verify request" do
|
23
|
-
with_application_test_routes do
|
24
|
-
data = {foo: :bar}.to_json
|
25
|
-
@controller.expects(:validate_hmac).with('secret', data.to_s).returns(true)
|
26
|
-
post :carts_update, data
|
27
|
-
assert_response :ok
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
test "un-verified request returns unauthorized" do
|
32
|
-
with_application_test_routes do
|
33
|
-
data = {foo: :bar}.to_json
|
34
|
-
@controller.expects(:validate_hmac).with('secret', data.to_s).returns(false)
|
35
|
-
post :carts_update, data
|
36
|
-
assert_response :unauthorized
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def with_application_test_routes
|
43
|
-
with_routing do |set|
|
44
|
-
set.draw do
|
45
|
-
get '/carts_update' => 'webhooks#carts_update'
|
46
|
-
end
|
47
|
-
yield
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,86 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ShopifyApp::WebhooksManagerTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
setup do
|
6
|
-
ShopifyApp.configure do |config|
|
7
|
-
config.webhooks = [
|
8
|
-
{topic: 'app/uninstalled', address: "https://example-app.com/webhooks/app_uninstalled"},
|
9
|
-
{topic: 'orders/create', address: "https://example-app.com/webhooks/order_create"},
|
10
|
-
{topic: 'orders/updated', address: "https://example-app.com/webhooks/order_updated"},
|
11
|
-
]
|
12
|
-
end
|
13
|
-
|
14
|
-
@manager = ShopifyApp::WebhooksManager.new("regular-shop.myshopify.com", "token")
|
15
|
-
end
|
16
|
-
|
17
|
-
test "#create_webhooks makes calls to create webhooks" do
|
18
|
-
ShopifyAPI::Webhook.stubs(all: [])
|
19
|
-
|
20
|
-
expect_webhook_creation('app/uninstalled', "https://example-app.com/webhooks/app_uninstalled")
|
21
|
-
expect_webhook_creation('orders/create', "https://example-app.com/webhooks/order_create")
|
22
|
-
expect_webhook_creation('orders/updated', "https://example-app.com/webhooks/order_updated")
|
23
|
-
|
24
|
-
@manager.create_webhooks
|
25
|
-
end
|
26
|
-
|
27
|
-
test "#create_webhooks when creating a webhook fails, raises an error" do
|
28
|
-
ShopifyAPI::Webhook.stubs(all: [])
|
29
|
-
webhook = stub(persisted?: false)
|
30
|
-
ShopifyAPI::Webhook.stubs(create: webhook)
|
31
|
-
|
32
|
-
assert_raise ShopifyApp::WebhooksManager::CreationFailed do
|
33
|
-
@manager.create_webhooks
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
test "#create_webhooks when creating a webhook fails and the webhook exists, do not raise an error" do
|
38
|
-
webhook = stub(persisted?: false)
|
39
|
-
webhooks = all_webhook_topics.map{|t| stub(topic: t)}
|
40
|
-
ShopifyAPI::Webhook.stubs(create: webhook, all: webhooks)
|
41
|
-
|
42
|
-
assert_nothing_raised ShopifyApp::WebhooksManager::CreationFailed do
|
43
|
-
@manager.create_webhooks
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
test "#recreate_webhooks! destroys all webhooks and recreates" do
|
48
|
-
@manager.expects(:destroy_webhooks)
|
49
|
-
@manager.expects(:create_webhooks)
|
50
|
-
|
51
|
-
@manager.recreate_webhooks!
|
52
|
-
end
|
53
|
-
|
54
|
-
test "#destroy_webhooks makes calls to destroy webhooks" do
|
55
|
-
ShopifyAPI::Webhook.stubs(:all).returns(Array.wrap(all_mock_webhooks.first))
|
56
|
-
ShopifyAPI::Webhook.expects(:delete).with(all_mock_webhooks.first.id)
|
57
|
-
|
58
|
-
@manager.destroy_webhooks
|
59
|
-
end
|
60
|
-
|
61
|
-
test "#destroy_webhooks does not destroy webhooks that do not have a matching address" do
|
62
|
-
ShopifyAPI::Webhook.stubs(:all).returns([stub(address: 'http://something-or-the-other.com/webhooks/product_update', id: 7214109)])
|
63
|
-
ShopifyAPI::Webhook.expects(:delete).never
|
64
|
-
|
65
|
-
@manager.destroy_webhooks
|
66
|
-
end
|
67
|
-
|
68
|
-
private
|
69
|
-
|
70
|
-
def expect_webhook_creation(topic, address)
|
71
|
-
stub_webhook = stub(persisted?: true)
|
72
|
-
ShopifyAPI::Webhook.expects(:create).with(topic: topic, address: address, format: 'json').returns(stub_webhook)
|
73
|
-
end
|
74
|
-
|
75
|
-
def all_webhook_topics
|
76
|
-
@webhooks ||= ['app/uninstalled', 'orders/create', 'orders/updated']
|
77
|
-
end
|
78
|
-
|
79
|
-
def all_mock_webhooks
|
80
|
-
[
|
81
|
-
stub(id: 1, address: "https://example-app.com/webhooks/app_uninstalled", topic: 'app/uninstalled'),
|
82
|
-
stub(id: 2, address: "https://example-app.com/webhooks/order_create", topic: 'orders/create'),
|
83
|
-
stub(id: 3, address: "https://example-app.com/webhooks/order_updated", topic: 'orders/updated'),
|
84
|
-
]
|
85
|
-
end
|
86
|
-
end
|