susply 0.0.1 → 0.0.2
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 +4 -4
- data/README.rdoc +1 -0
- data/app/controllers/susply/application_controller.rb +1 -1
- data/app/controllers/susply/change_plans_controller.rb +32 -0
- data/app/controllers/susply/renovations_controller.rb +37 -0
- data/app/models/susply/subscription.rb +8 -0
- data/app/services/susply/renews_subscription.rb +4 -4
- data/config/locales/susply.en.yml +8 -0
- data/config/routes.rb +4 -0
- data/lib/generators/susply/install_generator.rb +11 -0
- data/lib/generators/templates/config/initializers/susply.rb +1 -0
- data/lib/susply.rb +6 -0
- data/lib/susply/version.rb +1 -1
- data/spec/controllers/susply/change_plans_controller_spec.rb +95 -0
- data/spec/controllers/susply/renovations_controller_spec.rb +87 -0
- data/spec/dummy/app/assets/javascripts/companies.js +2 -0
- data/spec/dummy/app/assets/stylesheets/companies.css +4 -0
- data/spec/dummy/app/assets/stylesheets/scaffold.css +56 -0
- data/spec/dummy/app/controllers/companies_controller.rb +58 -0
- data/spec/dummy/app/helpers/companies_helper.rb +2 -0
- data/spec/dummy/app/models/company.rb +2 -0
- data/spec/dummy/app/views/companies/_form.html.erb +21 -0
- data/spec/dummy/app/views/companies/edit.html.erb +6 -0
- data/spec/dummy/app/views/companies/index.html.erb +27 -0
- data/spec/dummy/app/views/companies/new.html.erb +5 -0
- data/spec/dummy/app/views/companies/show.html.erb +9 -0
- data/spec/dummy/config/initializers/susply.rb +1 -0
- data/spec/dummy/config/locales/susply.en.yml +6 -0
- data/spec/dummy/config/routes.rb +2 -2
- data/spec/dummy/db/migrate/20150525181508_create_companies.rb +9 -0
- data/spec/dummy/log/development.log +300 -0
- data/spec/dummy/log/test.log +26916 -0
- data/spec/models/susply/subscription_spec.rb +39 -0
- data/spec/services/susply/renews_subscription_spec.rb +25 -16
- metadata +35 -6
- data/spec/dummy/spec/factories/organizations.rb +0 -8
- data/spec/dummy/spec/models/organization_spec.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d45e6b7802160d8581a0d6a13dd282b9d04fad14
|
4
|
+
data.tar.gz: 2978c1e66d5bb7334cbfe7b7f052e7136056508e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da42b7708ef8a48d7600717c7843906ccda69817b78fccd21101390973610fcb99f5a4cb4ab3c83a201a05196f80159ff2db7abdcac5897df070cd390b7076aa
|
7
|
+
data.tar.gz: 52029ee2fde8fab1b1b0deb44e2f917b5071d2c530dc245fedee9ff2232d392512bbbfcf04a6a2781cca851402b3df1a7ec426554c2373d3406b75d0ddd9ac53
|
data/README.rdoc
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
= Susply
|
2
2
|
|
3
3
|
{<img alt="Status?branch=master" src="https://codeship.com/projects/9749e880-e313-0132-4e7b-0e8782f5ebb8/status?branch=master" />}[https://codeship.com/projects/81636]
|
4
|
+
{<img src="https://badge.fury.io/rb/susply.svg" alt="Gem Version" />}[http://badge.fury.io/rb/susply]
|
4
5
|
{<img src="https://codeclimate.com/github/wcpaez/susply/badges/gpa.svg" />}[https://codeclimate.com/github/wcpaez/susply]
|
5
6
|
{<img src="https://codeclimate.com/github/wcpaez/susply/badges/coverage.svg" />}[https://codeclimate.com/github/wcpaez/susply/coverage]
|
6
7
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_dependency "susply/application_controller"
|
2
|
+
|
3
|
+
module Susply
|
4
|
+
class ChangePlansController < ApplicationController
|
5
|
+
def create
|
6
|
+
plan = Susply::Plan.find(params[:plan_id])
|
7
|
+
if current_owner.can_change_plan?(plan)
|
8
|
+
Susply::ChangeSubscription.call(current_owner, plan)
|
9
|
+
redirect_to after_change_plan_success_path,
|
10
|
+
alert: t('susply.messages.success_changed_plan')
|
11
|
+
else
|
12
|
+
redirect_to after_change_plan_fail_path,
|
13
|
+
alert: t('susply.messages.failed_changed_plan')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def current_owner
|
19
|
+
@current_owner ||= send(Susply.billable_entity)
|
20
|
+
end
|
21
|
+
|
22
|
+
def after_change_plan_fail_path
|
23
|
+
return super(@current_owner) if defined?(super)
|
24
|
+
susply.owner_path(@current_owner)
|
25
|
+
end
|
26
|
+
|
27
|
+
def after_change_plan_success_path
|
28
|
+
return super(@current_owner) if defined?(super)
|
29
|
+
susply.owner_path(@current_owner)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_dependency "susply/application_controller"
|
2
|
+
|
3
|
+
module Susply
|
4
|
+
class RenovationsController < ApplicationController
|
5
|
+
before_filter :load_owner
|
6
|
+
|
7
|
+
def create
|
8
|
+
subscription = Susply::RenewsSubscription.call(@owner)
|
9
|
+
if subscription
|
10
|
+
redirect_to after_renovation_success_path,
|
11
|
+
notice: t('susply.messages.success_renovation')
|
12
|
+
else
|
13
|
+
redirect_to after_renovation_fail_path,
|
14
|
+
alert: t('susply.messages.failed_renovation')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def load_owner
|
20
|
+
unless params[:owner_id].nil?
|
21
|
+
searched_owner = Susply.subscription_owner_class.constantize.
|
22
|
+
find(params[:owner_id])
|
23
|
+
@owner = searched_owner
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def after_renovation_fail_path
|
28
|
+
return super(@owner) if defined?(super)
|
29
|
+
susply.owner_path(@owner)
|
30
|
+
end
|
31
|
+
|
32
|
+
def after_renovation_success_path
|
33
|
+
return super(@owner) if defined?(super)
|
34
|
+
susply.owner_path(@owner)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Susply
|
2
2
|
class RenewsSubscription
|
3
3
|
def self.call(owner)
|
4
|
-
|
5
|
-
|
6
|
-
Susply::CreatePayment.call(
|
7
|
-
calculate_renewed_subscription(
|
4
|
+
active_subscription = owner.active_subscription
|
5
|
+
if active_subscription && active_subscription.expired?
|
6
|
+
Susply::CreatePayment.call(active_subscription, "plan_renovation")
|
7
|
+
calculate_renewed_subscription(active_subscription)
|
8
8
|
else
|
9
9
|
nil
|
10
10
|
end
|
data/config/routes.rb
CHANGED
@@ -9,12 +9,23 @@ module Susply
|
|
9
9
|
@subscription_owner_model.capitalize
|
10
10
|
end
|
11
11
|
|
12
|
+
def billable_entity
|
13
|
+
@subscription_owner_model.downcase
|
14
|
+
end
|
15
|
+
|
12
16
|
def install
|
13
17
|
template "config/initializers/susply.rb"
|
14
18
|
|
15
19
|
inject_into_class "app/models/#{subscription_owner_model.downcase}.rb",
|
16
20
|
subscription_owner_model.downcase.camelize.constantize,
|
17
21
|
"# Added by Susply\n include Susply::OwnerMethods \n\n"
|
22
|
+
|
23
|
+
copy_locales
|
24
|
+
end
|
25
|
+
|
26
|
+
def copy_locales
|
27
|
+
copy_file "../../../config/locales/susply.en.yml",
|
28
|
+
"config/locales/susply.en.yml"
|
18
29
|
end
|
19
30
|
end
|
20
31
|
end
|
data/lib/susply.rb
CHANGED
@@ -3,8 +3,14 @@ require "decorators"
|
|
3
3
|
|
4
4
|
module Susply
|
5
5
|
mattr_accessor :subscription_owner_class
|
6
|
+
mattr_accessor :billable_entity
|
6
7
|
|
7
8
|
def self.setup(&block)
|
8
9
|
yield self
|
9
10
|
end
|
11
|
+
|
12
|
+
#ejm :organizations
|
13
|
+
def self.owner_resource
|
14
|
+
subscription_owner_class.downcase.pluralize.to_sym
|
15
|
+
end
|
10
16
|
end
|
data/lib/susply/version.rb
CHANGED
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Susply
|
4
|
+
describe ChangePlansController, type: :controller do
|
5
|
+
let(:time) { Time.zone.now }
|
6
|
+
|
7
|
+
describe "#create" do
|
8
|
+
before do
|
9
|
+
@routes = Susply::Engine.routes
|
10
|
+
end
|
11
|
+
|
12
|
+
it "raises errors on not found plan" do
|
13
|
+
expect{
|
14
|
+
post :create, plan_id: 1
|
15
|
+
}.to raise_error(ActiveRecord::RecordNotFound)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "raises errors when there is not a current billable entity" do
|
19
|
+
plan = create(:susply_plan)
|
20
|
+
expect{
|
21
|
+
post :create, plan_id: plan.id
|
22
|
+
}.to raise_error(NoMethodError)
|
23
|
+
end
|
24
|
+
|
25
|
+
context "when billable entity cannot change plan" do
|
26
|
+
before do
|
27
|
+
@owner = Organization.create
|
28
|
+
|
29
|
+
allow(@owner).to receive(:can_change_plan?).and_return(false)
|
30
|
+
allow_any_instance_of(ApplicationController).
|
31
|
+
to receive(:current_organization).and_return(@owner)
|
32
|
+
|
33
|
+
@plan = create(:susply_plan, sku: 'new_plan')
|
34
|
+
end
|
35
|
+
|
36
|
+
it "redirects to owner path by default" do
|
37
|
+
post :create, plan_id: @plan.id
|
38
|
+
|
39
|
+
expect(response).to redirect_to owner_path(@owner)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "redirects to provided path when set" do
|
43
|
+
path = "/after_change_plan_fail"
|
44
|
+
allow_any_instance_of(ApplicationController).
|
45
|
+
to receive(:after_change_plan_fail_path).and_return(path)
|
46
|
+
|
47
|
+
post :create, plan_id: @plan.id
|
48
|
+
expect(response).to redirect_to path
|
49
|
+
end
|
50
|
+
|
51
|
+
it "sets the flash alert message" do
|
52
|
+
post :create, plan_id: @plan.id
|
53
|
+
|
54
|
+
expect(flash[:alert]).
|
55
|
+
to eq I18n.t('susply.messages.failed_changed_plan')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "when billable entity change plan" do
|
60
|
+
before do
|
61
|
+
@owner = Organization.create
|
62
|
+
create(:susply_subscription, :active, owner: @owner)
|
63
|
+
|
64
|
+
allow(@owner).to receive(:can_change_plan?).and_return(true)
|
65
|
+
allow_any_instance_of(ApplicationController).
|
66
|
+
to receive(:current_organization).and_return(@owner)
|
67
|
+
|
68
|
+
@plan = create(:susply_plan, sku: 'new_plan')
|
69
|
+
end
|
70
|
+
|
71
|
+
it "redirects to owner path by default" do
|
72
|
+
post :create, plan_id: @plan.id
|
73
|
+
|
74
|
+
expect(response).to redirect_to owner_path(@owner)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "redirects to provided path when set" do
|
78
|
+
path = "/after_change_plan_success"
|
79
|
+
allow_any_instance_of(ApplicationController).
|
80
|
+
to receive(:after_change_plan_success_path).and_return(path)
|
81
|
+
|
82
|
+
post :create, plan_id: @plan.id
|
83
|
+
expect(response).to redirect_to path
|
84
|
+
end
|
85
|
+
|
86
|
+
it "sets the flash alert message" do
|
87
|
+
post :create, plan_id: @plan.id
|
88
|
+
|
89
|
+
expect(flash[:alert]).
|
90
|
+
to eq I18n.t('susply.messages.success_changed_plan')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Susply
|
4
|
+
describe RenovationsController, type: :controller do
|
5
|
+
let(:time) { Time.zone.now }
|
6
|
+
|
7
|
+
describe "#create" do
|
8
|
+
before do
|
9
|
+
@routes = Susply::Engine.routes
|
10
|
+
end
|
11
|
+
|
12
|
+
it "raise an exception when no owner is finded" do
|
13
|
+
expect{
|
14
|
+
post :create, owner_id: 1
|
15
|
+
}.to raise_error()
|
16
|
+
end
|
17
|
+
|
18
|
+
it "sets the owner variable to the searched one" do
|
19
|
+
owner = Susply.subscription_owner_class.constantize.create
|
20
|
+
post :create, owner_id: owner.id
|
21
|
+
|
22
|
+
expect(assigns(:owner)).to eq owner
|
23
|
+
end
|
24
|
+
|
25
|
+
context "success response" do
|
26
|
+
it "redirects to owner path by default" do
|
27
|
+
owner = Susply.subscription_owner_class.constantize.create
|
28
|
+
create(:susply_subscription, :active, owner: owner,
|
29
|
+
current_period_end: time - 1.day)
|
30
|
+
post :create, owner_id: owner.id
|
31
|
+
|
32
|
+
expect(response).to redirect_to owner_path(owner)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "redirects to provided path when set" do
|
36
|
+
path = "/new_after_success_path"
|
37
|
+
allow_any_instance_of(ApplicationController).
|
38
|
+
to receive(:after_renovation_success_path).and_return(path)
|
39
|
+
owner = Susply.subscription_owner_class.constantize.create
|
40
|
+
create(:susply_subscription, :active, owner: owner,
|
41
|
+
current_period_end: time - 1.day)
|
42
|
+
post :create, owner_id: owner.id
|
43
|
+
|
44
|
+
expect(response).to redirect_to path
|
45
|
+
end
|
46
|
+
|
47
|
+
it "sets the notice alert message" do
|
48
|
+
owner = Susply.subscription_owner_class.constantize.create
|
49
|
+
create(:susply_subscription, :active, owner: owner,
|
50
|
+
current_period_end: time - 1.day)
|
51
|
+
post :create, owner_id: owner.id
|
52
|
+
|
53
|
+
expect(flash[:notice]).
|
54
|
+
to eq I18n.t('susply.messages.success_renovation')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "fail response" do
|
59
|
+
it "redirects to owner path by default" do
|
60
|
+
owner = Susply.subscription_owner_class.constantize.create
|
61
|
+
post :create, owner_id: owner.id
|
62
|
+
|
63
|
+
expect(response).to redirect_to owner_path(owner)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "redirects to provided path when set" do
|
67
|
+
path = "/new_after_fail_path"
|
68
|
+
allow_any_instance_of(ApplicationController).
|
69
|
+
to receive(:after_renovation_fail_path).and_return(path)
|
70
|
+
|
71
|
+
owner = Susply.subscription_owner_class.constantize.create
|
72
|
+
post :create, owner_id: owner.id
|
73
|
+
|
74
|
+
expect(response).to redirect_to path
|
75
|
+
end
|
76
|
+
|
77
|
+
it "sets the alert flash message" do
|
78
|
+
owner = Susply.subscription_owner_class.constantize.create
|
79
|
+
post :create, owner_id: owner.id
|
80
|
+
|
81
|
+
expect(flash[:alert]).
|
82
|
+
to eq I18n.t('susply.messages.failed_renovation')
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
body { background-color: #fff; color: #333; }
|
2
|
+
|
3
|
+
body, p, ol, ul, td {
|
4
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
5
|
+
font-size: 13px;
|
6
|
+
line-height: 18px;
|
7
|
+
}
|
8
|
+
|
9
|
+
pre {
|
10
|
+
background-color: #eee;
|
11
|
+
padding: 10px;
|
12
|
+
font-size: 11px;
|
13
|
+
}
|
14
|
+
|
15
|
+
a { color: #000; }
|
16
|
+
a:visited { color: #666; }
|
17
|
+
a:hover { color: #fff; background-color:#000; }
|
18
|
+
|
19
|
+
div.field, div.actions {
|
20
|
+
margin-bottom: 10px;
|
21
|
+
}
|
22
|
+
|
23
|
+
#notice {
|
24
|
+
color: green;
|
25
|
+
}
|
26
|
+
|
27
|
+
.field_with_errors {
|
28
|
+
padding: 2px;
|
29
|
+
background-color: red;
|
30
|
+
display: table;
|
31
|
+
}
|
32
|
+
|
33
|
+
#error_explanation {
|
34
|
+
width: 450px;
|
35
|
+
border: 2px solid red;
|
36
|
+
padding: 7px;
|
37
|
+
padding-bottom: 0;
|
38
|
+
margin-bottom: 20px;
|
39
|
+
background-color: #f0f0f0;
|
40
|
+
}
|
41
|
+
|
42
|
+
#error_explanation h2 {
|
43
|
+
text-align: left;
|
44
|
+
font-weight: bold;
|
45
|
+
padding: 5px 5px 5px 15px;
|
46
|
+
font-size: 12px;
|
47
|
+
margin: -7px;
|
48
|
+
margin-bottom: 0px;
|
49
|
+
background-color: #c00;
|
50
|
+
color: #fff;
|
51
|
+
}
|
52
|
+
|
53
|
+
#error_explanation ul li {
|
54
|
+
font-size: 12px;
|
55
|
+
list-style: square;
|
56
|
+
}
|