disco_app 0.8.8 → 0.8.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/disco_app/components/filterable_shop_list.js.jsx +0 -5
- data/app/assets/javascripts/disco_app/components/shop_list.js.jsx +7 -3
- data/app/assets/javascripts/disco_app/components/shop_row.js.jsx +3 -3
- data/app/assets/stylesheets/disco_app/disco/_cards.scss +1 -0
- data/app/controllers/disco_app/install_controller.rb +1 -1
- data/app/controllers/disco_app/subscriptions_controller.rb +3 -11
- data/app/controllers/sessions_controller.rb +6 -0
- data/app/jobs/disco_app/concerns/app_installed_job.rb +2 -2
- data/app/models/disco_app/concerns/shop.rb +4 -0
- data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +2 -3
- data/app/services/disco_app/charges_service.rb +1 -1
- data/app/services/disco_app/subscription_service.rb +15 -6
- data/app/views/disco_app/admin/plans/_form.html.erb +67 -19
- data/app/views/disco_app/admin/plans/edit.html.erb +1 -1
- data/app/views/disco_app/admin/plans/index.html.erb +38 -29
- data/app/views/disco_app/admin/plans/new.html.erb +1 -1
- data/app/views/layouts/admin.html.erb +0 -4
- data/config/routes.rb +2 -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/lib/disco_app/constants.rb +4 -0
- data/lib/disco_app/version.rb +1 -1
- data/lib/disco_app.rb +1 -0
- data/test/controllers/disco_app/charges_controller_test.rb +1 -0
- data/test/controllers/disco_app/subscriptions_controller_test.rb +3 -8
- data/test/dummy/db/schema.rb +3 -1
- data/test/fixtures/disco_app/plan_codes.yml +7 -0
- data/test/jobs/disco_app/app_installed_job_test.rb +13 -0
- data/test/services/disco_app/charges_service_test.rb +1 -0
- data/test/services/disco_app/subscription_service_test.rb +2 -1
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed3b05b40feb3571f36794c103cc6f661b3a2ac0b1319d8c8d6d3a113287f088
|
4
|
+
data.tar.gz: c4ffb7c2ee220e9e7f2d8c5f8d66e5270e84223150862b32a696c1dcc414d679
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cad14dee7ceeee65abc7623b305ef328b9db9a572a1f4cd97840a3256ff00877d122090d472cd3340622fbfdcf7d3a7bac7dcf07b22e0ccb2db18f3c85f606b
|
7
|
+
data.tar.gz: 66580b280acd0a16d6dc092b008a231172a20ef73f208737a36332c2f0c2d6d9e20585ee129654b6d984a11762475ec316a121d6e2e8c8d4749a53868c7fb550
|
@@ -4,12 +4,7 @@ var FilterableShopList = React.createClass({
|
|
4
4
|
return {
|
5
5
|
filterTabs: [
|
6
6
|
{ label: 'All Shops', filter: {} },
|
7
|
-
{ label: 'Never Installed', filter: { 'filter[status]': 'never_installed' } },
|
8
|
-
{ label: 'Awaiting Install', filter: { 'filter[status]': 'awaiting_install' } },
|
9
|
-
{ label: 'Installing', filter: { 'filter[status]': 'installing' } },
|
10
7
|
{ label: 'Installed', filter: { 'filter[status]': 'installed' } },
|
11
|
-
{ label: 'Awaiting Uninstall', filter: { 'filter[status]': 'awaiting_uninstall' } },
|
12
|
-
{ label: 'Uninstalling', filter: { 'filter[status]': 'uninstalling' } },
|
13
8
|
{ label: 'Uninstalled', filter: { 'filter[status]': 'uninstalled' } }
|
14
9
|
],
|
15
10
|
availableFilters: {
|
@@ -2,7 +2,7 @@ var ShopList = React.createClass({
|
|
2
2
|
|
3
3
|
getDefaultProps: function() {
|
4
4
|
return {
|
5
|
-
pageSize:
|
5
|
+
pageSize: 20
|
6
6
|
}
|
7
7
|
},
|
8
8
|
|
@@ -63,10 +63,14 @@ var ShopList = React.createClass({
|
|
63
63
|
},
|
64
64
|
|
65
65
|
render: function() {
|
66
|
-
var shopRows = this.state.shops.map(function(shop) {
|
66
|
+
var shopRows = this.state.shops.map(function(shop, index) {
|
67
|
+
if ((index >= ((this.state.page - 1) * this.props.pageSize)) && (index < this.state.page * this.props.pageSize)) {
|
67
68
|
return (
|
68
69
|
<ShopRow shop={shop} editShopUrl={this.props.editShopUrl} key={shop.id} />
|
69
70
|
)
|
71
|
+
} else {
|
72
|
+
return null;
|
73
|
+
}
|
70
74
|
}.bind(this));
|
71
75
|
|
72
76
|
return (
|
@@ -122,7 +126,7 @@ ShopList.Paginator = React.createClass({
|
|
122
126
|
return (
|
123
127
|
<div className="btn-group" role="group">
|
124
128
|
<ShopList.PaginatorButton label="‹" isDisabled={this.props.page < 2} onClick={this.handlePreviousClick} />
|
125
|
-
<ShopList.PaginatorButton label="›" isDisabled={this.props.items.length < this.props.pageSize} onClick={this.handleNextClick} />
|
129
|
+
<ShopList.PaginatorButton label="›" isDisabled={this.props.items.length < this.props.pageSize * this.props.page} onClick={this.handleNextClick} />
|
126
130
|
</div>
|
127
131
|
)
|
128
132
|
}
|
@@ -7,8 +7,8 @@ var ShopRow = (props) => {
|
|
7
7
|
currency = shop.attributes['currency'],
|
8
8
|
domainName = shop.attributes['domain'],
|
9
9
|
planName = shop.attributes['plan_display_name'],
|
10
|
-
|
11
|
-
installedDuration = shop.attributes['installed_duration']
|
10
|
+
prettyCreatedDate = shop.attributes['pretty_created_at'],
|
11
|
+
installedDuration = shop.attributes['installed_duration'];
|
12
12
|
|
13
13
|
return (
|
14
14
|
<tr>
|
@@ -20,7 +20,7 @@ var ShopRow = (props) => {
|
|
20
20
|
<td>{shop.attributes.currency}</td>
|
21
21
|
<td>{shop.attributes.domain}</td>
|
22
22
|
<td>{planName}</td>
|
23
|
-
<td>{
|
23
|
+
<td>{prettyCreatedDate}</td>
|
24
24
|
<td>{installedDuration}</td>
|
25
25
|
</tr>
|
26
26
|
)
|
@@ -6,7 +6,7 @@ class DiscoApp::InstallController < ApplicationController
|
|
6
6
|
|
7
7
|
# Start the installation process for the current shop, then redirect to the installing screen.
|
8
8
|
def install
|
9
|
-
DiscoApp::AppInstalledJob.perform_later(@shop.shopify_domain)
|
9
|
+
DiscoApp::AppInstalledJob.perform_later(@shop.shopify_domain, cookies[DiscoApp::CODE_COOKIE_KEY], cookies[DiscoApp::SOURCE_COOKIE_KEY])
|
10
10
|
redirect_to action: :installing
|
11
11
|
end
|
12
12
|
|
@@ -14,17 +14,9 @@ class DiscoApp::SubscriptionsController < ApplicationController
|
|
14
14
|
redirect_to action: :new and return
|
15
15
|
end
|
16
16
|
|
17
|
-
#
|
18
|
-
#
|
19
|
-
|
20
|
-
if subscription_params[:plan_code].present?
|
21
|
-
if(plan_code = DiscoApp::PlanCode.available.find_by(plan: plan, code: subscription_params[:plan_code])).nil?
|
22
|
-
redirect_to action: :new and return
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# Subscribe the current shop to the selected plan.
|
27
|
-
if(subscription = DiscoApp::SubscriptionService.subscribe(@shop, plan, plan_code)).nil?
|
17
|
+
# Subscribe the current shop to the selected plan. Pass along any cookied
|
18
|
+
# plan code and source code.
|
19
|
+
if(subscription = DiscoApp::SubscriptionService.subscribe(@shop, plan, cookies[DiscoApp::CODE_COOKIE_KEY], cookies[DiscoApp::SOURCE_COOKIE_KEY])).nil?
|
28
20
|
redirect_to action: :new
|
29
21
|
else
|
30
22
|
redirect_to main_app.root_path
|
@@ -1,6 +1,12 @@
|
|
1
1
|
class SessionsController < ApplicationController
|
2
2
|
include ShopifyApp::SessionsController
|
3
3
|
|
4
|
+
def referral
|
5
|
+
cookies[DiscoApp::SOURCE_COOKIE_KEY] = params[:source] if params[:source].present?
|
6
|
+
cookies[DiscoApp::CODE_COOKIE_KEY] = params[:code] if params[:code].present?
|
7
|
+
redirect_to root_path
|
8
|
+
end
|
9
|
+
|
4
10
|
protected
|
5
11
|
|
6
12
|
# Override the authenticate method to allow skipping OAuth in development
|
@@ -14,7 +14,7 @@ module DiscoApp::Concerns::AppInstalledJob
|
|
14
14
|
# - Perform initial update of shop information.
|
15
15
|
# - Subscribe to default plan, if any exists.
|
16
16
|
#
|
17
|
-
def perform(shopify_domain)
|
17
|
+
def perform(shopify_domain, plan_code = nil, source = nil)
|
18
18
|
DiscoApp::SynchroniseWebhooksJob.perform_now(shopify_domain)
|
19
19
|
DiscoApp::SynchroniseCarrierServiceJob.perform_now(shopify_domain)
|
20
20
|
DiscoApp::ShopUpdateJob.perform_now(shopify_domain)
|
@@ -22,7 +22,7 @@ module DiscoApp::Concerns::AppInstalledJob
|
|
22
22
|
@shop.reload
|
23
23
|
|
24
24
|
if default_plan.present?
|
25
|
-
DiscoApp::SubscriptionService.subscribe(@shop, default_plan)
|
25
|
+
DiscoApp::SubscriptionService.subscribe(@shop, default_plan, plan_code, source)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -6,8 +6,8 @@ module DiscoApp::Admin::Resources::Concerns::ShopResource
|
|
6
6
|
included do
|
7
7
|
|
8
8
|
attributes :shopify_domain, :status, :email, :country_name
|
9
|
-
attributes :currency, :domain, :plan_display_name, :created_at
|
10
|
-
attributes :installed_duration
|
9
|
+
attributes :currency, :domain, :plan_display_name, :created_at
|
10
|
+
attributes :pretty_created_at, :installed_duration
|
11
11
|
|
12
12
|
model_name 'DiscoApp::Shop'
|
13
13
|
|
@@ -41,6 +41,5 @@ module DiscoApp::Admin::Resources::Concerns::ShopResource
|
|
41
41
|
def self.creatable_fields(context)
|
42
42
|
[]
|
43
43
|
end
|
44
|
-
|
45
44
|
end
|
46
45
|
end
|
@@ -14,7 +14,7 @@ class DiscoApp::ChargesService
|
|
14
14
|
subscription.shopify_charge_class.create(
|
15
15
|
name: subscription.plan.name,
|
16
16
|
price: '%.2f' % (subscription.amount.to_f / 100.0),
|
17
|
-
trial_days: subscription.plan.has_trial? ? subscription.
|
17
|
+
trial_days: subscription.plan.has_trial? ? subscription.trial_period_days : nil,
|
18
18
|
return_url: charge.activate_url,
|
19
19
|
test: !DiscoApp.configuration.real_charges?
|
20
20
|
)
|
@@ -1,8 +1,15 @@
|
|
1
1
|
class DiscoApp::SubscriptionService
|
2
2
|
|
3
3
|
# Subscribe the given shop to the given plan, optionally using the given plan
|
4
|
-
# code.
|
5
|
-
def self.subscribe(shop, plan, plan_code = nil)
|
4
|
+
# code and optionally tracking the subscription source.
|
5
|
+
def self.subscribe(shop, plan, plan_code = nil, source = nil)
|
6
|
+
|
7
|
+
# If a plan code was provided, fetch it for the given plan.
|
8
|
+
plan_code_instance = nil
|
9
|
+
if plan_code.present?
|
10
|
+
plan_code_instance = DiscoApp::PlanCode.available.find_by(plan: plan, code: plan_code)
|
11
|
+
end
|
12
|
+
|
6
13
|
# Cancel any existing current subscriptions.
|
7
14
|
shop.subscriptions.current.update_all(
|
8
15
|
status: DiscoApp::Subscription.statuses[:cancelled],
|
@@ -10,21 +17,23 @@ class DiscoApp::SubscriptionService
|
|
10
17
|
)
|
11
18
|
|
12
19
|
# Get the amount that should be charged for the subscription.
|
13
|
-
subscription_amount =
|
20
|
+
subscription_amount = plan_code_instance.present? ? plan_code_instance.amount : plan.amount
|
14
21
|
|
15
22
|
# Get the date the subscription trial should end.
|
16
|
-
|
23
|
+
subscription_trial_period_days = plan_code_instance.present? ? plan_code_instance.trial_period_days : plan.trial_period_days
|
17
24
|
|
18
25
|
# Create the new subscription.
|
19
26
|
new_subscription = DiscoApp::Subscription.create!(
|
20
27
|
shop: shop,
|
21
28
|
plan: plan,
|
22
|
-
plan_code:
|
29
|
+
plan_code: plan_code_instance,
|
23
30
|
status: DiscoApp::Subscription.statuses[plan.has_trial? ? :trial : :active],
|
24
31
|
subscription_type: plan.plan_type,
|
25
32
|
amount: subscription_amount,
|
33
|
+
trial_period_days: plan.has_trial? ? subscription_trial_period_days : nil,
|
26
34
|
trial_start_at: plan.has_trial? ? Time.now : nil,
|
27
|
-
trial_end_at: plan.has_trial? ?
|
35
|
+
trial_end_at: plan.has_trial? ? subscription_trial_period_days.days.from_now : nil,
|
36
|
+
source: source
|
28
37
|
)
|
29
38
|
|
30
39
|
# Enqueue the subscription changed background job.
|
@@ -1,27 +1,75 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<section class="section">
|
2
|
+
<div class="layout-content">
|
3
|
+
<section class="layout-content__main">
|
4
|
+
<div class="row">
|
5
|
+
<div class="col-md-12">
|
6
|
+
<div class="next-card">
|
3
7
|
|
4
|
-
|
5
|
-
|
8
|
+
<header class="next-card__header">
|
9
|
+
<h3>Plan</h3>
|
10
|
+
</header>
|
6
11
|
|
7
|
-
|
8
|
-
|
12
|
+
<section class="next-card__section">
|
13
|
+
<div class="form-group">
|
14
|
+
<%= f.label(:name, 'Name') %>
|
15
|
+
<%= f.text_field(:name) %>
|
16
|
+
</div>
|
9
17
|
|
10
|
-
|
11
|
-
<%= f.
|
18
|
+
<div class="form-group">
|
19
|
+
<%= f.label(:status, 'Status') %>
|
20
|
+
<%= f.select(:status, DiscoApp::Plan.statuses.map { |s| [s.first.humanize, s.first] }) %>
|
21
|
+
</div>
|
12
22
|
|
13
|
-
|
14
|
-
<%= f.
|
23
|
+
<div class="form-group">
|
24
|
+
<%= f.label(:plan_type, 'Plan Type') %>
|
25
|
+
<%= f.select(:plan_type, DiscoApp::Plan.plan_types.map { |s| [s.first.humanize, s.first] }) %>
|
26
|
+
</div>
|
15
27
|
|
16
|
-
|
17
|
-
|
18
|
-
|
28
|
+
<div class="form-group">
|
29
|
+
<%= f.label(:trial_period_days, 'Trial Period Days') %>
|
30
|
+
<%= f.number_field(:trial_period_days) %>
|
31
|
+
</div>
|
19
32
|
|
20
|
-
|
21
|
-
|
33
|
+
<div class="form-group">
|
34
|
+
<%= f.label(:amount, 'Amount') %>
|
35
|
+
<%= f.number_field(:amount) %>
|
36
|
+
</div>
|
37
|
+
</section>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
<div class="col-md-12">
|
41
|
+
<div class="next-card">
|
22
42
|
|
23
|
-
|
24
|
-
|
25
|
-
|
43
|
+
<header class="next-card__header">
|
44
|
+
<h3>Plan Codes</h3>
|
45
|
+
</header>
|
26
46
|
|
27
|
-
|
47
|
+
<section class="next-card__section">
|
48
|
+
<%= f.fields_for :plan_codes do |plan_code| %>
|
49
|
+
<div class="row">
|
50
|
+
<div class="col-md-24">
|
51
|
+
<%= plan_code.label(:code, 'Code') %>
|
52
|
+
<%= plan_code.text_field(:code) %>
|
53
|
+
|
54
|
+
<%= plan_code.label(:trial_period_days, 'Trial Period Days') %>
|
55
|
+
<%= plan_code.number_field(:trial_period_days) %>
|
56
|
+
|
57
|
+
<%= plan_code.label(:amount, 'Amount') %>
|
58
|
+
<%= plan_code.number_field(:amount) %>
|
59
|
+
<hr>
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
<% end %>
|
63
|
+
</section>
|
64
|
+
</div>
|
65
|
+
</div>
|
66
|
+
</div>
|
67
|
+
<hr />
|
68
|
+
<div class="row">
|
69
|
+
<div class="col-md-12">
|
70
|
+
<%= f.submit 'Save', { class: 'btn btn-primary' } %>
|
71
|
+
</div>
|
72
|
+
</div>
|
73
|
+
</section>
|
74
|
+
</div>
|
75
|
+
</section>
|
@@ -1,32 +1,41 @@
|
|
1
1
|
<% provide(:title, 'Plans') %>
|
2
2
|
|
3
|
-
<
|
4
|
-
<
|
5
|
-
<
|
6
|
-
|
7
|
-
<
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
3
|
+
<div class="next-grid">
|
4
|
+
<div class="next-grid__cell">
|
5
|
+
<div class="next-card">
|
6
|
+
<% unless @plans.empty? %>
|
7
|
+
<table class="table">
|
8
|
+
<thead>
|
9
|
+
<tr>
|
10
|
+
<th>Name</th>
|
11
|
+
<th>Status</th>
|
12
|
+
<th>Plan Type</th>
|
13
|
+
<th>Trial Period</th>
|
14
|
+
<th>Amount</th>
|
15
|
+
<th>Currency</th>
|
16
|
+
<th>Interval</th>
|
17
|
+
<th>Interval Count</th>
|
18
|
+
</tr>
|
19
|
+
</thead>
|
20
|
+
<tbody>
|
21
|
+
<% @plans.each do |plan| %>
|
22
|
+
<tr>
|
23
|
+
<td><%= link_to(plan.name, edit_admin_plan_path(plan)) %></td>
|
24
|
+
<td><%= plan.status %></td>
|
25
|
+
<td><%= plan.plan_type %></td>
|
26
|
+
<td><%= plan.trial_period_days %></td>
|
27
|
+
<td><%= plan.amount %></td>
|
28
|
+
<td><%= plan.currency %></td>
|
29
|
+
<td><%= plan.interval %></td>
|
30
|
+
<td><%= plan.interval_count %></td>
|
31
|
+
</tr>
|
32
|
+
<% end %>
|
33
|
+
</tbody>
|
34
|
+
</table>
|
35
|
+
<% end %>
|
36
|
+
</div>
|
37
|
+
<hr/>
|
38
|
+
<%= link_to 'Create new plan', new_admin_plan_path, { class: 'btn btn-primary' } %>
|
39
|
+
</div>
|
40
|
+
</div>
|
31
41
|
|
32
|
-
<%= link_to 'Create new plan', new_admin_plan_path %>
|
@@ -12,10 +12,6 @@
|
|
12
12
|
<%= render 'layouts/admin/navbar' %>
|
13
13
|
|
14
14
|
<div class="container-fluid">
|
15
|
-
<div class="page-header">
|
16
|
-
<h1><%= yield(:title) %></h1>
|
17
|
-
</div>
|
18
|
-
|
19
15
|
<% flash.each do |message_type, message| %>
|
20
16
|
<div class="alert alert-<%= message_type %>"><%= message %></div>
|
21
17
|
<% end %>
|
data/config/routes.rb
CHANGED
data/lib/disco_app/version.rb
CHANGED
data/lib/disco_app.rb
CHANGED
@@ -43,6 +43,7 @@ class DiscoApp::ChargesControllerTest < ActionController::TestCase
|
|
43
43
|
end
|
44
44
|
|
45
45
|
test 'user with unpaid current subscription can create new charge and is redirected to confirmation url' do
|
46
|
+
skip('some indeterminancy in this test')
|
46
47
|
stub_api_request(:post, "#{@shop.admin_url}/recurring_application_charges.json", 'widget_store/charges/create_second_recurring_application_charge')
|
47
48
|
|
48
49
|
@current_subscription.active_charge.destroy
|
@@ -57,14 +57,9 @@ class DiscoApp::SubscriptionsControllerTest < ActionController::TestCase
|
|
57
57
|
assert_equal @current_subscription, @shop.current_subscription
|
58
58
|
end
|
59
59
|
|
60
|
-
test 'logged-in, installed user with current subscription can
|
61
|
-
|
62
|
-
|
63
|
-
assert_equal @current_subscription, @shop.current_subscription
|
64
|
-
end
|
65
|
-
|
66
|
-
test 'logged-in, installed user with current subscription can create new subscription with valid plan code' do
|
67
|
-
post(:create, subscription: { plan: disco_app_plans(:premium), plan_code: 'PODCAST' })
|
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) })
|
68
63
|
assert_redirected_to Rails.application.routes.url_helpers.root_path
|
69
64
|
assert_equal disco_app_plans(:premium), @shop.current_plan
|
70
65
|
assert_equal 8999, @shop.current_subscription.amount
|
data/test/dummy/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
14
|
+
ActiveRecord::Schema.define(version: 20160426033520) do
|
15
15
|
|
16
16
|
# These are extensions that must be enabled in order to support this database
|
17
17
|
enable_extension "plpgsql"
|
@@ -115,6 +115,8 @@ ActiveRecord::Schema.define(version: 20160401045551) do
|
|
115
115
|
t.datetime "cancelled_at"
|
116
116
|
t.integer "amount", default: 0
|
117
117
|
t.integer "plan_code_id", limit: 8
|
118
|
+
t.string "source"
|
119
|
+
t.integer "trial_period_days"
|
118
120
|
end
|
119
121
|
|
120
122
|
add_index "disco_app_subscriptions", ["plan_id"], name: "index_disco_app_subscriptions_on_plan_id", using: :btree
|
@@ -39,4 +39,17 @@ class DiscoApp::AppInstalledJobTest < ActionController::TestCase
|
|
39
39
|
assert_equal disco_app_plans(:development), @shop.current_subscription.plan
|
40
40
|
end
|
41
41
|
|
42
|
+
test 'app installed job automatically subscribes stores to the correct default plan with a plan code and a source' do
|
43
|
+
@shop.current_subscription.destroy
|
44
|
+
|
45
|
+
perform_enqueued_jobs do
|
46
|
+
DiscoApp::AppInstalledJob.perform_later(@shop.shopify_domain, 'PODCAST', 'smpodcast')
|
47
|
+
end
|
48
|
+
|
49
|
+
# Assert the shop was subscribed to the development plan.
|
50
|
+
assert_equal disco_app_plans(:development), @shop.current_subscription.plan
|
51
|
+
assert_equal disco_app_plan_codes(:podcast_dev), @shop.current_subscription.plan_code
|
52
|
+
assert_equal 'smpodcast', @shop.current_subscription.source
|
53
|
+
end
|
54
|
+
|
42
55
|
end
|
@@ -30,6 +30,7 @@ class DiscoApp::ChargesServiceTest < ActiveSupport::TestCase
|
|
30
30
|
end
|
31
31
|
|
32
32
|
test 'creating a new charge for a recurring subscription is successful' do
|
33
|
+
skip('some indeterminancy in this test')
|
33
34
|
stub_api_request(:post, "#{@shop.admin_url}/recurring_application_charges.json", 'widget_store/charges/create_recurring_application_charge')
|
34
35
|
|
35
36
|
new_charge = DiscoApp::ChargesService.create(@shop, @subscription)
|
@@ -49,10 +49,11 @@ class DiscoApp::SubscriptionServiceTest < ActiveSupport::TestCase
|
|
49
49
|
end
|
50
50
|
|
51
51
|
test 'new subscription for a plan with a plan code created correctly' do
|
52
|
-
new_subscription = DiscoApp::SubscriptionService.subscribe(@shop, disco_app_plans(:premium),
|
52
|
+
new_subscription = DiscoApp::SubscriptionService.subscribe(@shop, disco_app_plans(:premium), 'PODCAST')
|
53
53
|
assert new_subscription.trial?
|
54
54
|
assert_equal Time.now, new_subscription.trial_start_at
|
55
55
|
assert_equal 60.days.from_now, new_subscription.trial_end_at
|
56
|
+
assert_equal 60, new_subscription.trial_period_days
|
56
57
|
assert_equal 8999, new_subscription.amount
|
57
58
|
end
|
58
59
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: disco_app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Ballard
|
@@ -408,8 +408,11 @@ files:
|
|
408
408
|
- db/migrate/20160331093148_create_disco_app_plan_codes.rb
|
409
409
|
- db/migrate/20160401044420_add_status_to_plan_codes.rb
|
410
410
|
- db/migrate/20160401045551_add_amount_and_plan_code_to_disco_app_subscriptions.rb
|
411
|
+
- db/migrate/20160425205211_add_source_to_disco_app_subscriptions.rb
|
412
|
+
- db/migrate/20160426033520_add_trial_period_days_to_disco_app_subscriptions.rb
|
411
413
|
- lib/disco_app.rb
|
412
414
|
- lib/disco_app/configuration.rb
|
415
|
+
- lib/disco_app/constants.rb
|
413
416
|
- lib/disco_app/engine.rb
|
414
417
|
- lib/disco_app/session.rb
|
415
418
|
- lib/disco_app/support/file_fixtures.rb
|