disco_app 0.6.0
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/javascripts/disco_app/disco_app.js +7 -0
- data/app/assets/stylesheets/disco_app/bootstrap/_custom.scss +54 -0
- data/app/assets/stylesheets/disco_app/bootstrap/_variables.scss +872 -0
- data/app/assets/stylesheets/disco_app/disco/_buttons.scss +31 -0
- data/app/assets/stylesheets/disco_app/disco/_cards.scss +43 -0
- data/app/assets/stylesheets/disco_app/disco/_forms.scss +23 -0
- data/app/assets/stylesheets/disco_app/disco/_sections.scss +61 -0
- data/app/assets/stylesheets/disco_app/disco/_type.scss +21 -0
- data/app/assets/stylesheets/disco_app/disco/mixins/_flexbox.scss +394 -0
- data/app/assets/stylesheets/disco_app/disco_app.scss +13 -0
- data/app/controllers/disco_app/app_proxy_controller.rb +41 -0
- data/app/controllers/disco_app/authenticated_controller.rb +44 -0
- data/app/controllers/disco_app/carrier_request_controller.rb +28 -0
- data/app/controllers/disco_app/charges_controller.rb +30 -0
- data/app/controllers/disco_app/install_controller.rb +26 -0
- data/app/controllers/disco_app/webhooks_controller.rb +42 -0
- data/app/helpers/disco_app/application_helper.rb +4 -0
- data/app/jobs/disco_app/app_installed_job.rb +41 -0
- data/app/jobs/disco_app/app_uninstalled_job.rb +3 -0
- data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +19 -0
- data/app/jobs/disco_app/shop_job.rb +29 -0
- data/app/jobs/disco_app/shop_update_job.rb +16 -0
- data/app/models/disco_app/concerns/plan.rb +14 -0
- data/app/models/disco_app/concerns/shop.rb +62 -0
- data/app/models/disco_app/concerns/subscription.rb +14 -0
- data/app/models/disco_app/plan.rb +3 -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/services/disco_app/charges_service.rb +73 -0
- data/app/services/disco_app/subscription_service.rb +25 -0
- data/app/services/disco_app/webhook_service.rb +30 -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 +45 -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 +16 -0
- data/app/views/disco_app/shared/_section.html.erb +17 -0
- data/app/views/layouts/application.html.erb +18 -0
- data/app/views/layouts/embedded_app.html.erb +41 -0
- data/app/views/sessions/new.html.erb +26 -0
- data/config/routes.rb +19 -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/lib/disco_app/engine.rb +11 -0
- data/lib/disco_app/version.rb +3 -0
- data/lib/disco_app.rb +4 -0
- data/lib/generators/disco_app/USAGE +5 -0
- data/lib/generators/disco_app/disco_app_generator.rb +159 -0
- data/lib/generators/disco_app/mailify/mailify_generator.rb +55 -0
- data/lib/generators/disco_app/reactify/reactify_generator.rb +31 -0
- data/lib/generators/disco_app/templates/assets/javascripts/application.js +17 -0
- data/lib/generators/disco_app/templates/assets/stylesheets/application.scss +5 -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 +1 -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/Procfile +2 -0
- data/lib/generators/disco_app/templates/views/home/index.html.erb +2 -0
- data/test/controllers/disco_app/install_controller_test.rb +50 -0
- data/test/controllers/disco_app/webhooks_controller_test.rb +58 -0
- data/test/controllers/home_controller_test.rb +61 -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/home_controller.rb +7 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +11 -0
- data/test/dummy/app/models/disco_app/shop.rb +15 -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 +37 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -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 +1 -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 +3 -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 +8 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/schema.rb +70 -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/shop.json +46 -0
- data/test/fixtures/disco_app/plans.yml +32 -0
- data/test/fixtures/disco_app/shops.yml +10 -0
- data/test/fixtures/disco_app/subscriptions.yml +26 -0
- data/test/fixtures/webhooks/app_uninstalled.json +46 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/jobs/disco_app/app_installed_job_test.rb +29 -0
- data/test/jobs/disco_app/app_uninstalled_job_test.rb +32 -0
- data/test/models/disco_app/plan_test.rb +5 -0
- data/test/models/disco_app/shop_test.rb +26 -0
- data/test/models/disco_app/subscription_test.rb +6 -0
- data/test/services/disco_app/subscription_service_test.rb +28 -0
- data/test/support/test_file_fixtures.rb +29 -0
- data/test/test_helper.rb +51 -0
- metadata +456 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>The page you were looking for doesn't exist (404)</title>
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<style>
|
|
7
|
+
body {
|
|
8
|
+
background-color: #EFEFEF;
|
|
9
|
+
color: #2E2F30;
|
|
10
|
+
text-align: center;
|
|
11
|
+
font-family: arial, sans-serif;
|
|
12
|
+
margin: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
div.dialog {
|
|
16
|
+
width: 95%;
|
|
17
|
+
max-width: 33em;
|
|
18
|
+
margin: 4em auto 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
div.dialog > div {
|
|
22
|
+
border: 1px solid #CCC;
|
|
23
|
+
border-right-color: #999;
|
|
24
|
+
border-left-color: #999;
|
|
25
|
+
border-bottom-color: #BBB;
|
|
26
|
+
border-top: #B00100 solid 4px;
|
|
27
|
+
border-top-left-radius: 9px;
|
|
28
|
+
border-top-right-radius: 9px;
|
|
29
|
+
background-color: white;
|
|
30
|
+
padding: 7px 12% 0;
|
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
h1 {
|
|
35
|
+
font-size: 100%;
|
|
36
|
+
color: #730E15;
|
|
37
|
+
line-height: 1.5em;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
div.dialog > p {
|
|
41
|
+
margin: 0 0 1em;
|
|
42
|
+
padding: 1em;
|
|
43
|
+
background-color: #F7F7F7;
|
|
44
|
+
border: 1px solid #CCC;
|
|
45
|
+
border-right-color: #999;
|
|
46
|
+
border-left-color: #999;
|
|
47
|
+
border-bottom-color: #999;
|
|
48
|
+
border-bottom-left-radius: 4px;
|
|
49
|
+
border-bottom-right-radius: 4px;
|
|
50
|
+
border-top-color: #DADADA;
|
|
51
|
+
color: #666;
|
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
|
|
57
|
+
<body>
|
|
58
|
+
<!-- This file lives in public/404.html -->
|
|
59
|
+
<div class="dialog">
|
|
60
|
+
<div>
|
|
61
|
+
<h1>The page you were looking for doesn't exist.</h1>
|
|
62
|
+
<p>You may have mistyped the address or the page may have moved.</p>
|
|
63
|
+
</div>
|
|
64
|
+
<p>If you are the application owner check the logs for more information.</p>
|
|
65
|
+
</div>
|
|
66
|
+
</body>
|
|
67
|
+
</html>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<style>
|
|
7
|
+
body {
|
|
8
|
+
background-color: #EFEFEF;
|
|
9
|
+
color: #2E2F30;
|
|
10
|
+
text-align: center;
|
|
11
|
+
font-family: arial, sans-serif;
|
|
12
|
+
margin: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
div.dialog {
|
|
16
|
+
width: 95%;
|
|
17
|
+
max-width: 33em;
|
|
18
|
+
margin: 4em auto 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
div.dialog > div {
|
|
22
|
+
border: 1px solid #CCC;
|
|
23
|
+
border-right-color: #999;
|
|
24
|
+
border-left-color: #999;
|
|
25
|
+
border-bottom-color: #BBB;
|
|
26
|
+
border-top: #B00100 solid 4px;
|
|
27
|
+
border-top-left-radius: 9px;
|
|
28
|
+
border-top-right-radius: 9px;
|
|
29
|
+
background-color: white;
|
|
30
|
+
padding: 7px 12% 0;
|
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
h1 {
|
|
35
|
+
font-size: 100%;
|
|
36
|
+
color: #730E15;
|
|
37
|
+
line-height: 1.5em;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
div.dialog > p {
|
|
41
|
+
margin: 0 0 1em;
|
|
42
|
+
padding: 1em;
|
|
43
|
+
background-color: #F7F7F7;
|
|
44
|
+
border: 1px solid #CCC;
|
|
45
|
+
border-right-color: #999;
|
|
46
|
+
border-left-color: #999;
|
|
47
|
+
border-bottom-color: #999;
|
|
48
|
+
border-bottom-left-radius: 4px;
|
|
49
|
+
border-bottom-right-radius: 4px;
|
|
50
|
+
border-top-color: #DADADA;
|
|
51
|
+
color: #666;
|
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
|
|
57
|
+
<body>
|
|
58
|
+
<!-- This file lives in public/422.html -->
|
|
59
|
+
<div class="dialog">
|
|
60
|
+
<div>
|
|
61
|
+
<h1>The change you wanted was rejected.</h1>
|
|
62
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
|
63
|
+
</div>
|
|
64
|
+
<p>If you are the application owner check the logs for more information.</p>
|
|
65
|
+
</div>
|
|
66
|
+
</body>
|
|
67
|
+
</html>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<style>
|
|
7
|
+
body {
|
|
8
|
+
background-color: #EFEFEF;
|
|
9
|
+
color: #2E2F30;
|
|
10
|
+
text-align: center;
|
|
11
|
+
font-family: arial, sans-serif;
|
|
12
|
+
margin: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
div.dialog {
|
|
16
|
+
width: 95%;
|
|
17
|
+
max-width: 33em;
|
|
18
|
+
margin: 4em auto 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
div.dialog > div {
|
|
22
|
+
border: 1px solid #CCC;
|
|
23
|
+
border-right-color: #999;
|
|
24
|
+
border-left-color: #999;
|
|
25
|
+
border-bottom-color: #BBB;
|
|
26
|
+
border-top: #B00100 solid 4px;
|
|
27
|
+
border-top-left-radius: 9px;
|
|
28
|
+
border-top-right-radius: 9px;
|
|
29
|
+
background-color: white;
|
|
30
|
+
padding: 7px 12% 0;
|
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
h1 {
|
|
35
|
+
font-size: 100%;
|
|
36
|
+
color: #730E15;
|
|
37
|
+
line-height: 1.5em;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
div.dialog > p {
|
|
41
|
+
margin: 0 0 1em;
|
|
42
|
+
padding: 1em;
|
|
43
|
+
background-color: #F7F7F7;
|
|
44
|
+
border: 1px solid #CCC;
|
|
45
|
+
border-right-color: #999;
|
|
46
|
+
border-left-color: #999;
|
|
47
|
+
border-bottom-color: #999;
|
|
48
|
+
border-bottom-left-radius: 4px;
|
|
49
|
+
border-bottom-right-radius: 4px;
|
|
50
|
+
border-top-color: #DADADA;
|
|
51
|
+
color: #666;
|
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
|
|
57
|
+
<body>
|
|
58
|
+
<!-- This file lives in public/500.html -->
|
|
59
|
+
<div class="dialog">
|
|
60
|
+
<div>
|
|
61
|
+
<h1>We're sorry, but something went wrong.</h1>
|
|
62
|
+
</div>
|
|
63
|
+
<p>If you are the application owner check the logs for more information.</p>
|
|
64
|
+
</div>
|
|
65
|
+
</body>
|
|
66
|
+
</html>
|
|
File without changes
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"shop": {
|
|
3
|
+
"id": 3788917,
|
|
4
|
+
"name": "ONE INCH ROUND ® ",
|
|
5
|
+
"email": "gavin@gavinballard.com",
|
|
6
|
+
"domain": "one-inch-round-development.myshopify.com",
|
|
7
|
+
"created_at": "2014-02-19T11:50:27-08:00",
|
|
8
|
+
"province": "Oregon",
|
|
9
|
+
"country": "US",
|
|
10
|
+
"address1": "4016 SE Division St. #A",
|
|
11
|
+
"zip": "97202",
|
|
12
|
+
"city": "Portland",
|
|
13
|
+
"source": null,
|
|
14
|
+
"phone": "5032338003",
|
|
15
|
+
"updated_at": "2015-10-07T14:35:47-07:00",
|
|
16
|
+
"customer_email": null,
|
|
17
|
+
"latitude": 45.5048,
|
|
18
|
+
"longitude": -122.621,
|
|
19
|
+
"primary_location_id": null,
|
|
20
|
+
"primary_locale": "en",
|
|
21
|
+
"country_code": "US",
|
|
22
|
+
"country_name": "United States",
|
|
23
|
+
"currency": "USD",
|
|
24
|
+
"timezone": "(GMT-08:00) Pacific Time (US & Canada)",
|
|
25
|
+
"iana_timezone": "America/Los_Angeles",
|
|
26
|
+
"shop_owner": "Gavin Ballard",
|
|
27
|
+
"money_format": "${{amount}}",
|
|
28
|
+
"money_with_currency_format": "${{amount}} USD",
|
|
29
|
+
"province_code": "OR",
|
|
30
|
+
"taxes_included": false,
|
|
31
|
+
"tax_shipping": null,
|
|
32
|
+
"county_taxes": true,
|
|
33
|
+
"plan_display_name": "affiliate",
|
|
34
|
+
"plan_name": "affiliate",
|
|
35
|
+
"myshopify_domain": "one-inch-round-development.myshopify.com",
|
|
36
|
+
"google_apps_domain": null,
|
|
37
|
+
"google_apps_login_enabled": null,
|
|
38
|
+
"money_in_emails_format": "${{amount}}",
|
|
39
|
+
"money_with_currency_in_emails_format": "${{amount}} USD",
|
|
40
|
+
"eligible_for_payments": true,
|
|
41
|
+
"requires_extra_payments_agreement": false,
|
|
42
|
+
"password_enabled": false,
|
|
43
|
+
"has_storefront": true,
|
|
44
|
+
"setup_required": false
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
development:
|
|
2
|
+
status: 2
|
|
3
|
+
name: Development
|
|
4
|
+
charge_type: 0
|
|
5
|
+
default_price: 0.00
|
|
6
|
+
default_trial_days: 14
|
|
7
|
+
|
|
8
|
+
comped:
|
|
9
|
+
status: 2
|
|
10
|
+
name: Comped
|
|
11
|
+
charge_type: 0
|
|
12
|
+
default_price: 0.00
|
|
13
|
+
default_trial_days: 0
|
|
14
|
+
|
|
15
|
+
cheapo:
|
|
16
|
+
status: 1
|
|
17
|
+
name: Cheapo
|
|
18
|
+
charge_type: 0
|
|
19
|
+
default_price: 0.99
|
|
20
|
+
default_trial_days: 14
|
|
21
|
+
|
|
22
|
+
basic:
|
|
23
|
+
name: Basic
|
|
24
|
+
charge_type: 0
|
|
25
|
+
default_price: 9.99
|
|
26
|
+
default_trial_days: 14
|
|
27
|
+
|
|
28
|
+
premium:
|
|
29
|
+
name: Premium
|
|
30
|
+
charge_type: 0
|
|
31
|
+
default_price: 49.99
|
|
32
|
+
default_trial_days: 14
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
widget_store:
|
|
2
|
+
shopify_domain: widgets.myshopify.com
|
|
3
|
+
shopify_token: 00000000000000000000000000000000
|
|
4
|
+
country_name: Australia
|
|
5
|
+
|
|
6
|
+
widget_store_dev:
|
|
7
|
+
shopify_domain: widgets-dev.myshopify.com
|
|
8
|
+
shopify_token: 00000000000000000000000000000000
|
|
9
|
+
status: 3
|
|
10
|
+
country_name: Australia
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
widget_store_old:
|
|
2
|
+
shop: widget_store
|
|
3
|
+
plan: cheapo
|
|
4
|
+
status: <%= DiscoApp::Subscription.statuses[:replaced] %>
|
|
5
|
+
name: Cheapo
|
|
6
|
+
charge_type: 0
|
|
7
|
+
price: 0.99
|
|
8
|
+
trial_days: 14
|
|
9
|
+
|
|
10
|
+
widget_store:
|
|
11
|
+
shop: widget_store
|
|
12
|
+
plan: basic
|
|
13
|
+
status: <%= DiscoApp::Subscription.statuses[:active] %>
|
|
14
|
+
name: Basic
|
|
15
|
+
charge_type: 0
|
|
16
|
+
price: 9.99
|
|
17
|
+
trial_days: 14
|
|
18
|
+
|
|
19
|
+
widget_store_dev:
|
|
20
|
+
shop: widget_store_dev
|
|
21
|
+
plan: development
|
|
22
|
+
status: <%= DiscoApp::Subscription.statuses[:active] %>
|
|
23
|
+
name: Development
|
|
24
|
+
charge_type: 0
|
|
25
|
+
price: 0.00
|
|
26
|
+
trial_days: 0
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"shop": {
|
|
3
|
+
"id": 3788917,
|
|
4
|
+
"name": "ONE INCH ROUND ® ",
|
|
5
|
+
"email": "gavin@gavinballard.com",
|
|
6
|
+
"domain": "one-inch-round-development.myshopify.com",
|
|
7
|
+
"created_at": "2014-02-19T11:50:27-08:00",
|
|
8
|
+
"province": "Oregon",
|
|
9
|
+
"country": "US",
|
|
10
|
+
"address1": "4016 SE Division St. #A",
|
|
11
|
+
"zip": "97202",
|
|
12
|
+
"city": "Portland",
|
|
13
|
+
"source": null,
|
|
14
|
+
"phone": "5032338003",
|
|
15
|
+
"updated_at": "2015-10-07T14:35:47-07:00",
|
|
16
|
+
"customer_email": null,
|
|
17
|
+
"latitude": 45.5048,
|
|
18
|
+
"longitude": -122.621,
|
|
19
|
+
"primary_location_id": null,
|
|
20
|
+
"primary_locale": "en",
|
|
21
|
+
"country_code": "US",
|
|
22
|
+
"country_name": "United States",
|
|
23
|
+
"currency": "USD",
|
|
24
|
+
"timezone": "(GMT-08:00) Pacific Time (US & Canada)",
|
|
25
|
+
"iana_timezone": "America/Los_Angeles",
|
|
26
|
+
"shop_owner": "Gavin Ballard",
|
|
27
|
+
"money_format": "${{amount}}",
|
|
28
|
+
"money_with_currency_format": "${{amount}} USD",
|
|
29
|
+
"province_code": "OR",
|
|
30
|
+
"taxes_included": false,
|
|
31
|
+
"tax_shipping": null,
|
|
32
|
+
"county_taxes": true,
|
|
33
|
+
"plan_display_name": "affiliate",
|
|
34
|
+
"plan_name": "affiliate",
|
|
35
|
+
"myshopify_domain": "one-inch-round-development.myshopify.com",
|
|
36
|
+
"google_apps_domain": null,
|
|
37
|
+
"google_apps_login_enabled": null,
|
|
38
|
+
"money_in_emails_format": "${{amount}}",
|
|
39
|
+
"money_with_currency_in_emails_format": "${{amount}} USD",
|
|
40
|
+
"eligible_for_payments": true,
|
|
41
|
+
"requires_extra_payments_agreement": false,
|
|
42
|
+
"password_enabled": false,
|
|
43
|
+
"has_storefront": true,
|
|
44
|
+
"setup_required": false
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
end
|
|
9
|
+
|
|
10
|
+
def teardown
|
|
11
|
+
@shop = nil
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
test 'app installed job performs shop update job' do
|
|
15
|
+
stub_request(:post, "#{@shop.admin_url}/webhooks.json").to_return(status: 200)
|
|
16
|
+
stub_request(:get, "#{@shop.admin_url}/shop.json").to_return(status: 200, body: api_fixture('widget_store/shop'))
|
|
17
|
+
|
|
18
|
+
# Assert the main install job can be enqueued and performed.
|
|
19
|
+
perform_enqueued_jobs do
|
|
20
|
+
DiscoApp::AppInstalledJob.perform_later(@shop.shopify_domain)
|
|
21
|
+
end
|
|
22
|
+
assert_performed_jobs 1
|
|
23
|
+
|
|
24
|
+
# Assert the update shop job was performed.
|
|
25
|
+
@shop.reload
|
|
26
|
+
assert_equal 'United States', @shop.country_name
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
@shop.charge_active!
|
|
9
|
+
|
|
10
|
+
perform_enqueued_jobs do
|
|
11
|
+
DiscoApp::AppUninstalledJob.perform_later(@shop.shopify_domain, {})
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def teardown
|
|
16
|
+
@shop = nil
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
test 'app uninstalled job changes shop status' do
|
|
20
|
+
assert_performed_jobs 1
|
|
21
|
+
@shop.reload
|
|
22
|
+
assert @shop.uninstalled?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
test 'app uninstalled job can be extended using concerns' do
|
|
26
|
+
assert_performed_jobs 1
|
|
27
|
+
@shop.reload
|
|
28
|
+
assert @shop.charge_cancelled? # Assert base methods still called.
|
|
29
|
+
assert_equal 'Nowhere', @shop.country_name # Assert extended method called.
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
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 active subscription' do
|
|
22
|
+
assert_equal 1, @shop.subscriptions.active.size
|
|
23
|
+
assert_equal disco_app_subscriptions(:widget_store), @shop.subscriptions.active.first
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class DiscoApp::SubscriptionServiceTest < ActiveSupport::TestCase
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
@shop = disco_app_shops(:widget_store)
|
|
7
|
+
@current_subscription = @shop.current_subscription
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def teardown
|
|
11
|
+
@shop = nil
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
test 'subscribing to a new plan deactivates current subscription and swaps to new plan' do
|
|
15
|
+
DiscoApp::SubscriptionService.subscribe(@shop, disco_app_plans(:premium))
|
|
16
|
+
@current_subscription.reload
|
|
17
|
+
assert @current_subscription.replaced?
|
|
18
|
+
assert_equal disco_app_plans(:premium), @shop.current_subscription.plan
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
test 'cancelling a plan works' do
|
|
22
|
+
DiscoApp::SubscriptionService.cancel(@shop)
|
|
23
|
+
@current_subscription.reload
|
|
24
|
+
assert @current_subscription.cancelled?
|
|
25
|
+
assert_not @shop.current_subscription
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
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
|
+
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
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Configure Rails Environment
|
|
2
|
+
ENV['RAILS_ENV'] = 'test'
|
|
3
|
+
ENV['DEFAULT_HOST'] = 'https://test.example.com'
|
|
4
|
+
ENV['SHOPIFY_APP_NAME'] = 'Test Application'
|
|
5
|
+
ENV['SHOPIFY_APP_API_KEY'] = 'f61b26d635309536c3c83c0adc3cb972'
|
|
6
|
+
ENV['SHOPIFY_APP_SECRET'] = 'b607d1f8b992dccb017f9315f07af9c4'
|
|
7
|
+
ENV['SHOPIFY_APP_REDIRECT_URI'] = 'https://test.example.com/shopify/auth/callback'
|
|
8
|
+
ENV['SHOPIFY_APP_SCOPE'] = 'read_products'
|
|
9
|
+
ENV['SHOPIFY_CHARGES_REAL'] = 'false'
|
|
10
|
+
|
|
11
|
+
require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
|
|
12
|
+
ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
|
|
13
|
+
ActiveRecord::Migrator.migrations_paths << File.expand_path('../../db/migrate', __FILE__)
|
|
14
|
+
require "rails/test_help"
|
|
15
|
+
|
|
16
|
+
# Require our additional test support helpers.
|
|
17
|
+
require 'support/test_file_fixtures'
|
|
18
|
+
|
|
19
|
+
# Require WebMock
|
|
20
|
+
require 'webmock/minitest'
|
|
21
|
+
|
|
22
|
+
# Filter out Minitest backtrace while allowing backtrace from other libraries
|
|
23
|
+
# to be shown.
|
|
24
|
+
Minitest.backtrace_filter = Minitest::BacktraceFilter.new
|
|
25
|
+
|
|
26
|
+
# Load support files
|
|
27
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
|
28
|
+
|
|
29
|
+
# Load fixtures from the engine
|
|
30
|
+
if ActiveSupport::TestCase.respond_to?(:fixture_path=)
|
|
31
|
+
ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
|
|
32
|
+
ActiveSupport::TestCase.fixtures :all
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Set up the base test class.
|
|
36
|
+
class ActiveSupport::TestCase
|
|
37
|
+
|
|
38
|
+
# Include helper modules common to all tests.
|
|
39
|
+
include DiscoApp::Test::FileFixtures
|
|
40
|
+
|
|
41
|
+
def log_in_as(shop)
|
|
42
|
+
session[:shopify] = shop.id
|
|
43
|
+
session[:shopify_domain] = shop.shopify_domain
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def log_out
|
|
47
|
+
session[:shopify] = nil
|
|
48
|
+
session[:shopify_domain] = nil
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|