saucy 0.2.8.1 → 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -46,6 +46,12 @@ class AccountsController < ApplicationController
46
46
  end
47
47
  end
48
48
 
49
+ def destroy
50
+ current_account.destroy
51
+ flash[:success] = "Your account has been deleted."
52
+ redirect_to root_url
53
+ end
54
+
49
55
  private
50
56
 
51
57
  def current_account
@@ -5,9 +5,8 @@
5
5
  <%= render :partial => 'tab_bar' %>
6
6
 
7
7
  <div class="plan current">
8
- <h3>Your Plan</h3>
8
+ <h3>Your Plan (<%= link_to "Upgrade", edit_account_plan_path(current_account), :id => "upgrade-account" %>)</h3>
9
9
  <%= render @account.plan %>
10
- <%= link_to "Upgrade", edit_account_plan_path(@account) %>
11
10
  </div>
12
11
 
13
12
  <%= content_tag_for :div, @account do -%>
@@ -19,6 +18,12 @@
19
18
 
20
19
  <%= form.buttons do %>
21
20
  <%= form.commit_button "Update" %>
21
+ <li>
22
+ <%= link_to t(".delete", :default => "Delete my account"),
23
+ @account,
24
+ :method => :delete,
25
+ :confirm => "Are you sure? All data will be irreversibly deleted." %>
26
+ </li>
22
27
  <% end %>
23
28
  <% end %>
24
29
  <% end -%>
data/config/routes.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'saucy/routing_extensions'
2
2
 
3
3
  Rails.application.routes.draw do
4
- resources :accounts, :only => [:index, :edit, :update]
4
+ resources :accounts, :only => [:index, :edit, :update, :destroy]
5
5
 
6
6
  through :accounts do
7
7
  resource :billing
@@ -24,3 +24,13 @@ Feature: Manage account
24
24
  Then I should see "Projection"
25
25
  When I follow "Users"
26
26
  Then I should see "captain@awesome.com"
27
+
28
+ Scenario: Delete account
29
+ Given an account exists with a name of "Chocolate"
30
+ And I am signed in as an admin of the "Chocolate" account
31
+ When I go to the settings page for the "Chocolate" account
32
+ And I follow "Delete"
33
+ Then I should see "Your account has been deleted"
34
+ When I go to the dashboard page
35
+ Then I should not see "Chocolate"
36
+
data/lib/saucy/account.rb CHANGED
@@ -38,6 +38,7 @@ module Saucy
38
38
 
39
39
  before_create :create_customer
40
40
  before_create :create_subscription, :if => :billed?
41
+ after_destroy :destroy_customer
41
42
 
42
43
  memoize :customer
43
44
  memoize :subscription
@@ -170,6 +171,10 @@ module Saucy
170
171
  handle_customer_result(result)
171
172
  end
172
173
 
174
+ def destroy_customer
175
+ Braintree::Customer.delete(customer_token)
176
+ end
177
+
173
178
  def handle_customer_result(result)
174
179
  if result.success?
175
180
  self.customer_token = result.customer.id
@@ -84,6 +84,11 @@ ShamRack.at("www.braintreegateway.com", 443).sinatra do
84
84
  end
85
85
  end
86
86
 
87
+ delete "/merchants/:merchant_id/customers/:id" do
88
+ FakeBraintree.customers[params["id"]] = nil
89
+ [200, { "Content-Encoding" => "gzip" }, ActiveSupport::Gzip.compress("")]
90
+ end
91
+
87
92
  post "/merchants/:merchant_id/subscriptions" do
88
93
  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<subscription>\n <plan-id type=\"integer\">2</plan-id>\n <payment-method-token>b22x</payment-method-token>\n</subscription>\n"
89
94
  subscription = Hash.from_xml(request.body).delete("subscription")
@@ -8,6 +8,7 @@ describe AccountsController, "routes" do
8
8
  to(:action => :create, :plan_id => :abc) }
9
9
  it { should route(:put, "/accounts/1").to(:action => :update, :id => 1) }
10
10
  it { should route(:get, "/accounts/1/edit").to(:action => :edit, :id => 1) }
11
+ it { should route(:delete, "/accounts/1").to(:action => :destroy, :id => 1) }
11
12
  end
12
13
 
13
14
  describe AccountsController, "new" do
@@ -183,6 +184,26 @@ describe AccountsController, "edit", :as => :account_admin do
183
184
  end
184
185
  end
185
186
 
187
+ describe AccountsController, "destroy", :as => :account_admin do
188
+ before do
189
+ Account.stubs(:find_by_keyword! => account)
190
+ account.stubs(:destroy)
191
+ delete :destroy, :id => account.to_param
192
+ end
193
+
194
+ it "redirects to the root url" do
195
+ should redirect_to("/")
196
+ end
197
+
198
+ it "sets the flash" do
199
+ should set_the_flash.to(/deleted/i)
200
+ end
201
+
202
+ it "deletes the account" do
203
+ account.should have_received(:destroy)
204
+ end
205
+ end
206
+
186
207
  describe AccountsController, "permissions", :as => :account_member do
187
208
  it { should deny_access.
188
209
  on(:get, :edit, :id => account.to_param).
@@ -180,6 +180,11 @@ describe Account, "with a paid plan" do
180
180
  subject.customer.email.should == "jrobot@example.com"
181
181
  subject.credit_card.cardholder_name.should == "Jim Robot"
182
182
  end
183
+
184
+ it "deletes the customer when deleted" do
185
+ subject.destroy
186
+ FakeBraintree.customers[subject.customer_token].should be_nil
187
+ end
183
188
  end
184
189
 
185
190
  describe Account, "with a free plan" do
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saucy
3
3
  version: !ruby/object:Gem::Version
4
- hash: 125
4
+ hash: 5
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 8
10
- - 1
11
- version: 0.2.8.1
9
+ - 9
10
+ version: 0.2.9
12
11
  platform: ruby
13
12
  authors:
14
13
  - thoughtbot, inc.
@@ -18,13 +17,14 @@ autorequire:
18
17
  bindir: bin
19
18
  cert_chain: []
20
19
 
21
- date: 2011-01-18 00:00:00 -05:00
20
+ date: 2011-01-19 00:00:00 -05:00
22
21
  default_executable:
23
22
  dependencies:
24
23
  - !ruby/object:Gem::Dependency
25
- name: formtastic
24
+ type: :runtime
26
25
  prerelease: false
27
- requirement: &id001 !ruby/object:Gem::Requirement
26
+ name: formtastic
27
+ version_requirements: &id001 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ">="
@@ -34,12 +34,12 @@ dependencies:
34
34
  - 1
35
35
  - 2
36
36
  version: "1.2"
37
- type: :runtime
38
- version_requirements: *id001
37
+ requirement: *id001
39
38
  - !ruby/object:Gem::Dependency
40
- name: railties
39
+ type: :runtime
41
40
  prerelease: false
42
- requirement: &id002 !ruby/object:Gem::Requirement
41
+ name: railties
42
+ version_requirements: &id002 !ruby/object:Gem::Requirement
43
43
  none: false
44
44
  requirements:
45
45
  - - ">="
@@ -50,12 +50,12 @@ dependencies:
50
50
  - 0
51
51
  - 3
52
52
  version: 3.0.3
53
- type: :runtime
54
- version_requirements: *id002
53
+ requirement: *id002
55
54
  - !ruby/object:Gem::Dependency
56
- name: braintree
55
+ type: :runtime
57
56
  prerelease: false
58
- requirement: &id003 !ruby/object:Gem::Requirement
57
+ name: braintree
58
+ version_requirements: &id003 !ruby/object:Gem::Requirement
59
59
  none: false
60
60
  requirements:
61
61
  - - ">="
@@ -66,12 +66,12 @@ dependencies:
66
66
  - 6
67
67
  - 2
68
68
  version: 2.6.2
69
- type: :runtime
70
- version_requirements: *id003
69
+ requirement: *id003
71
70
  - !ruby/object:Gem::Dependency
72
- name: sham_rack
71
+ type: :runtime
73
72
  prerelease: false
74
- requirement: &id004 !ruby/object:Gem::Requirement
73
+ name: sham_rack
74
+ version_requirements: &id004 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
77
  - - "="
@@ -82,12 +82,12 @@ dependencies:
82
82
  - 3
83
83
  - 3
84
84
  version: 1.3.3
85
- type: :runtime
86
- version_requirements: *id004
85
+ requirement: *id004
87
86
  - !ruby/object:Gem::Dependency
88
- name: sinatra
87
+ type: :runtime
89
88
  prerelease: false
90
- requirement: &id005 !ruby/object:Gem::Requirement
89
+ name: sinatra
90
+ version_requirements: &id005 !ruby/object:Gem::Requirement
91
91
  none: false
92
92
  requirements:
93
93
  - - "="
@@ -98,12 +98,12 @@ dependencies:
98
98
  - 1
99
99
  - 2
100
100
  version: 1.1.2
101
- type: :runtime
102
- version_requirements: *id005
101
+ requirement: *id005
103
102
  - !ruby/object:Gem::Dependency
104
- name: aruba
103
+ type: :development
105
104
  prerelease: false
106
- requirement: &id006 !ruby/object:Gem::Requirement
105
+ name: aruba
106
+ version_requirements: &id006 !ruby/object:Gem::Requirement
107
107
  none: false
108
108
  requirements:
109
109
  - - "="
@@ -114,8 +114,7 @@ dependencies:
114
114
  - 2
115
115
  - 6
116
116
  version: 0.2.6
117
- type: :development
118
- version_requirements: *id006
117
+ requirement: *id006
119
118
  description: Clearance-based Rails engine for Software as a Service (Saas) that provides account and project management
120
119
  email: support@thoughtbot.com
121
120
  executables: []