mousetrap 0.3.3 → 0.4.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.4.0
@@ -23,12 +23,14 @@ module Mousetrap
23
23
  end
24
24
 
25
25
  def attributes_for_api
26
- a = self.class.attributes_for_api(attributes, new_record?)
27
-
28
- if subscription
29
- a[:subscription] = subscription.attributes_for_api
30
- end
26
+ # TODO: superclass?
27
+ self.class.attributes_for_api(attributes, new_record?)
28
+ end
31
29
 
30
+ def attributes_for_api_with_subscription
31
+ raise "Must have subscription" unless subscription
32
+ a = attributes_for_api
33
+ a[:subscription] = subscription.attributes_for_api
32
34
  a
33
35
  end
34
36
 
@@ -36,12 +38,31 @@ module Mousetrap
36
38
  member_action 'cancel' unless new_record?
37
39
  end
38
40
 
41
+ def new?
42
+ if api_customer = self.class[code]
43
+ self.id = api_customer.id
44
+
45
+ return false
46
+ else
47
+ return true
48
+ end
49
+ end
50
+
39
51
  def save
40
52
  new? ? create : update
41
53
  end
42
54
 
55
+ def switch_to_plan(plan_code)
56
+ raise "Can only call this on an existing CheddarGetter customer." unless exists?
57
+
58
+ attributes = { :planCode => plan_code }
59
+ self.class.put_resource('customers', 'edit-subscription', code, attributes)
60
+
61
+ # TODO: Refresh self with reload here?
62
+ end
63
+
43
64
  def self.all
44
- response = get_resources plural_resource_name
65
+ response = get_resources 'customers'
45
66
 
46
67
  if response['error']
47
68
  if response['error'] == 'Resource not found: No customers found.'
@@ -102,7 +123,7 @@ module Mousetrap
102
123
  end
103
124
 
104
125
  def create
105
- response = self.class.post_resource 'customers', 'new', attributes_for_api
126
+ response = self.class.post_resource 'customers', 'new', attributes_for_api_with_subscription
106
127
 
107
128
  raise response['error'] if response['error']
108
129
 
@@ -112,7 +133,11 @@ module Mousetrap
112
133
  end
113
134
 
114
135
  def update
115
- self.class.put_resource 'customers', 'edit-customer', code, attributes_for_api
136
+ if subscription
137
+ self.class.put_resource 'customers', 'edit', code, attributes_for_api_with_subscription
138
+ else
139
+ self.class.put_resource 'customers', 'edit-customer', code, attributes_for_api
140
+ end
116
141
  end
117
142
  end
118
143
  end
@@ -11,16 +11,22 @@ module Mousetrap
11
11
  end
12
12
 
13
13
  def self.[](code)
14
+ # Example error message:
15
+ #
16
+ # { "error" => "Resource not found: Customer not found for
17
+ # code=cantfindme within productCode=MOUSETRAP_TEST"}
18
+
14
19
  response = get_resource plural_resource_name, code
15
- build_resource_from response
16
- end
17
20
 
18
- def self.create(attributes = {})
19
- raise NotImplementedError, NO_BUSINESS_NEED
20
- end
21
+ if response['error']
22
+ if response['error'] =~ /Resource not found/
23
+ return nil
24
+ else
25
+ raise response['error']
26
+ end
27
+ end
21
28
 
22
- def self.delete(code)
23
- raise NotImplementedError, NO_BUSINESS_NEED
29
+ build_resource_from response
24
30
  end
25
31
 
26
32
  def self.destroy_all
@@ -28,15 +34,19 @@ module Mousetrap
28
34
  end
29
35
 
30
36
  def self.exists?(code)
31
- raise NotImplementedError, NO_BUSINESS_NEED
37
+ !self[code].nil?
38
+ end
39
+
40
+ def self.new_from_api(attributes)
41
+ new(attributes_from_api(attributes))
32
42
  end
33
43
 
34
44
  def destroy
35
45
  member_action 'delete' unless new_record?
36
46
  end
37
47
 
38
- def exists?(code)
39
- raise NotImplementedError, NO_BUSINESS_NEED
48
+ def exists?
49
+ self.class.exists?(code)
40
50
  end
41
51
 
42
52
  def new?
@@ -45,47 +55,36 @@ module Mousetrap
45
55
 
46
56
  alias new_record? new?
47
57
 
48
- def self.new_from_api(attributes)
49
- new(attributes_from_api(attributes))
50
- end
51
-
52
- def save
53
- raise NotImplementedError, NO_BUSINESS_NEED
54
- end
55
-
56
58
 
57
59
  protected
58
60
 
59
- def member_action(action)
60
- self.class.member_action(self.class.plural_resource_name, action, code)
61
- end
62
-
63
- def self.resource_path(resource, action, code = nil)
64
- path = "/xml/#{resource}/#{action}/productCode/#{uri_encode(Mousetrap.product_code)}"
65
- path += "/code/#{uri_encode(code)}" if code
66
- path
61
+ def self.build_resource_from(response)
62
+ resource_attributes = extract_resources(response)
63
+ new_from_api(resource_attributes)
67
64
  end
68
65
 
69
- def self.uri_encode(value)
70
- URI.encode(value.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
71
- end
66
+ def self.build_resources_from(response)
67
+ resources = []
72
68
 
73
- def self.member_action(resource, action, code, attributes = nil)
74
- path = resource_path(resource, action, code)
69
+ response_resources = extract_resources(response)
75
70
 
76
- if attributes
77
- post path, :body => attributes
71
+ if response_resources.is_a?(Array)
72
+ extract_resources(response).each do |resource_attributes|
73
+ resources << new_from_api(resource_attributes)
74
+ end
78
75
  else
79
- post path
76
+ resources << new_from_api(response_resources)
80
77
  end
78
+
79
+ resources
81
80
  end
82
81
 
83
82
  def self.delete_resource(resource, code)
84
83
  member_action(resource, 'delete', code)
85
84
  end
86
85
 
87
- def self.put_resource(resource, action, code, attributes)
88
- member_action(resource, action, code, attributes)
86
+ def self.extract_resources(response)
87
+ response[plural_resource_name][singular_resource_name]
89
88
  end
90
89
 
91
90
  def self.get_resource(resource, code)
@@ -96,42 +95,41 @@ module Mousetrap
96
95
  get resource_path(resource, 'get')
97
96
  end
98
97
 
98
+ def self.member_action(resource, action, code, attributes = nil)
99
+ path = resource_path(resource, action, code)
100
+
101
+ if attributes
102
+ post path, :body => attributes
103
+ else
104
+ post path
105
+ end
106
+ end
107
+
99
108
  def self.post_resource(resource, action, attributes)
100
109
  path = resource_path(resource, action)
101
110
  post path, :body => attributes
102
111
  end
103
112
 
104
- def self.plural_resource_name
105
- raise 'You must implement self.plural_resource_name in your subclass.'
113
+ def self.put_resource(resource, action, code, attributes)
114
+ member_action(resource, action, code, attributes)
106
115
  end
107
116
 
108
- def self.singular_resource_name
109
- raise 'You must implement self.singular_resource_name in your subclass.'
117
+ def self.raise_api_unsupported_error
118
+ raise NotImplementedError, API_UNSUPPORTED
110
119
  end
111
120
 
112
- def self.build_resource_from(response)
113
- resource_attributes = extract_resources(response)
114
- new_from_api(resource_attributes)
121
+ def self.resource_path(resource, action, code = nil)
122
+ path = "/xml/#{resource}/#{action}/productCode/#{uri_encode(Mousetrap.product_code)}"
123
+ path += "/code/#{uri_encode(code)}" if code
124
+ path
115
125
  end
116
126
 
117
- def self.build_resources_from(response)
118
- resources = []
119
-
120
- response_resources = extract_resources(response)
121
-
122
- if response_resources.is_a?(Array)
123
- extract_resources(response).each do |resource_attributes|
124
- resources << new_from_api(resource_attributes)
125
- end
126
- else
127
- resources << new_from_api(response_resources)
128
- end
129
-
130
- resources
127
+ def self.uri_encode(value)
128
+ URI.encode(value.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
131
129
  end
132
130
 
133
- def self.extract_resources(response)
134
- response[plural_resource_name][singular_resource_name]
131
+ def member_action(action)
132
+ self.class.member_action(self.class.plural_resource_name, action, code)
135
133
  end
136
134
  end
137
135
  end
@@ -22,8 +22,22 @@ module Mousetrap
22
22
  :credit_card_last_four_digits,
23
23
  :credit_card_type
24
24
 
25
- # TODO: not sure if .all or .[] will work
26
-
25
+ def self.[](code)
26
+ raise_api_unsupported_error
27
+ end
28
+
29
+ def self.all
30
+ raise_api_unsupported_error
31
+ end
32
+
33
+ def self.destroy_all
34
+ raise_api_unsupported_error
35
+ end
36
+
37
+ def self.exists?(code)
38
+ raise_api_unsupported_error
39
+ end
40
+
27
41
  def attributes
28
42
  {
29
43
  :id => id,
@@ -42,7 +56,7 @@ module Mousetrap
42
56
  end
43
57
 
44
58
  def destroy
45
- raise NotImplementedError, API_UNSUPPORTED
59
+ self.class.raise_api_unsupported_error
46
60
  end
47
61
 
48
62
  def save
@@ -50,6 +64,10 @@ module Mousetrap
50
64
  self.class.put_resource('customers', 'edit-subscription', customer_code, mutated_attributes)
51
65
  end
52
66
 
67
+ def exists?
68
+ self.class.raise_api_unsupported_error
69
+ end
70
+
53
71
  def self.new_from_api(attributes)
54
72
  subscription = new(attributes_from_api(attributes))
55
73
  subscription.plan = Plan.new_from_api(attributes['plans']['plan'])
data/lib/mousetrap.rb CHANGED
@@ -4,7 +4,6 @@ begin; require 'rubygems'; rescue LoadError; end
4
4
  require 'httparty'
5
5
 
6
6
  module Mousetrap
7
- NO_BUSINESS_NEED = "No business need at this time."
8
7
  API_UNSUPPORTED = "CheddarGetter API doesn't support this."
9
8
 
10
9
  autoload :Customer, 'mousetrap/customer'
data/mousetrap.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mousetrap}
8
- s.version = "0.3.3"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jon Larkowski", "Sandro Turriate", "Wolfram Arnold", "Corey Grusden"]
12
- s.date = %q{2009-10-12}
12
+ s.date = %q{2009-10-16}
13
13
  s.description = %q{CheddarGetter API Client in Ruby}
14
14
  s.email = %q{jonlarkowski@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -39,6 +39,7 @@ Gem::Specification.new do |s|
39
39
  "spec/mousetrap_spec.rb",
40
40
  "spec/spec.opts",
41
41
  "spec/spec_helper.rb",
42
+ "spec/support/fixtures.rb",
42
43
  "spec/support/random_data.rb"
43
44
  ]
44
45
  s.homepage = %q{http://github.com/hashrocket/mousetrap}
@@ -56,6 +57,7 @@ Gem::Specification.new do |s|
56
57
  "spec/mousetrap/subscription_spec.rb",
57
58
  "spec/mousetrap_spec.rb",
58
59
  "spec/spec_helper.rb",
60
+ "spec/support/fixtures.rb",
59
61
  "spec/support/random_data.rb"
60
62
  ]
61
63
 
data/spec/factories.rb CHANGED
@@ -20,3 +20,10 @@ Factory.define :subscription, :class => Mousetrap::Subscription, :default_strate
20
20
  f.credit_card_expiration_year '2012'
21
21
  f.billing_zip_code '90210'
22
22
  end
23
+
24
+ Factory.define :alternate_subscription, :parent => :subscription, :default_strategy => :stub do |f|
25
+ f.credit_card_number '5555555555554444'
26
+ f.credit_card_expiration_month '7'
27
+ f.credit_card_expiration_year '2013'
28
+ f.billing_zip_code '12345'
29
+ end
@@ -45,6 +45,41 @@ shared_examples_for "a Customer record from CheddarGetter" do
45
45
  end
46
46
  end
47
47
 
48
+ shared_examples_for "an active Subscription record from CheddarGetter" do
49
+ describe "And I get the subscription" do
50
+ before :all do
51
+ @api_customer = Mousetrap::Customer[@customer.code]
52
+ @api_subscription = @api_customer.subscription
53
+ end
54
+
55
+ it "Then ID is set" do
56
+ @api_subscription.id.should be
57
+ end
58
+
59
+ it "Then canceled_at is not set" do
60
+ @api_subscription.canceled_at.should be_nil
61
+ end
62
+
63
+ it "Then created_at is set" do
64
+ @api_subscription.created_at.should be
65
+ end
66
+
67
+ it "Then I should see the credit card expiration" do
68
+ expiration_date_from_api = Date.parse(@api_subscription.credit_card_expiration_date)
69
+ expiration_date = Date.parse("#{@customer.subscription.credit_card_expiration_year}-#{@customer.subscription.credit_card_expiration_month}-31")
70
+ expiration_date_from_api.should == expiration_date
71
+ end
72
+
73
+ it "Then I should see the credit card last four digits" do
74
+ @api_subscription.credit_card_last_four_digits.should == @customer.subscription.credit_card_number[-4..-1]
75
+ end
76
+
77
+ it "Then I should see the credit card type" do
78
+ @api_subscription.credit_card_type.should == (@credit_card_type || 'visa')
79
+ end
80
+ end
81
+ end
82
+
48
83
  describe "The Wrapper Gem" do
49
84
  describe Mousetrap::Customer do
50
85
  describe ".all" do
@@ -74,6 +109,7 @@ describe "The Wrapper Gem" do
74
109
  end
75
110
 
76
111
  it_should_behave_like "a Customer record from CheddarGetter"
112
+ it_should_behave_like "an active Subscription record from CheddarGetter"
77
113
  end
78
114
  end
79
115
 
@@ -101,8 +137,15 @@ describe "The Wrapper Gem" do
101
137
  describe "Given a customer" do
102
138
  before :all do
103
139
  @customer = Factory :new_customer
104
- @customer.save
105
- @api_customer = Mousetrap::Customer[@customer.code]
140
+ @api_customer = nil
141
+
142
+ if Mousetrap::Customer.all.size == 1
143
+ @api_customer = Mousetrap::Customer.all.first
144
+ @customer = @api_customer
145
+ else
146
+ @customer.save
147
+ @api_customer = Mousetrap::Customer[@customer.code]
148
+ end
106
149
  end
107
150
 
108
151
  describe "When I cancel" do
@@ -115,9 +158,19 @@ describe "The Wrapper Gem" do
115
158
  @api_customer = Mousetrap::Customer[@customer.code]
116
159
  end
117
160
 
118
- it "Then I should see a cancelation date on subscription" do
161
+ it "Then I should see a cancellation date on subscription" do
119
162
  @api_customer.subscription.canceled_at.should be
120
163
  end
164
+
165
+ describe "When I resubscribe them" do
166
+ before :all do
167
+ @customer = Factory :new_customer, :email => @api_customer.email, :code => @api_customer.email
168
+ @customer.save
169
+ end
170
+
171
+ it_should_behave_like "a Customer record from CheddarGetter"
172
+ it_should_behave_like "an active Subscription record from CheddarGetter"
173
+ end
121
174
  end
122
175
  end
123
176
  end
@@ -132,7 +185,7 @@ describe "The Wrapper Gem" do
132
185
 
133
186
  it_should_behave_like "a Customer record from CheddarGetter"
134
187
 
135
- describe "And I save it again, with different attributes" do
188
+ describe "When I save it again, with different attributes" do
136
189
  before :all do
137
190
  attributes = Factory.attributes_for :new_customer
138
191
  @customer.first_name = attributes[:first_name]
@@ -143,6 +196,42 @@ describe "The Wrapper Gem" do
143
196
 
144
197
  it_should_behave_like "a Customer record from CheddarGetter"
145
198
  end
199
+
200
+ context "When I update subscription information" do
201
+ before :all do
202
+ @subscription = Mousetrap::Subscription.new(Factory.attributes_for(:alternate_subscription))
203
+ @credit_card_type = 'mc'
204
+ @customer.subscription = @subscription
205
+ @customer.save
206
+ end
207
+
208
+ it_should_behave_like "an active Subscription record from CheddarGetter"
209
+ end
210
+ end
211
+ end
212
+
213
+ describe '#switch_to_plan' do
214
+ describe "Given an existing CheddarGetter customer" do
215
+ before :all do
216
+ @customer = Factory :new_customer
217
+ @customer.save
218
+ end
219
+
220
+ describe 'When I switch plans' do
221
+ before :all do
222
+ @customer.switch_to_plan('TEST_2')
223
+ end
224
+
225
+ describe "And I get the customer" do
226
+ before :all do
227
+ @api_customer = Mousetrap::Customer[@customer.code]
228
+ end
229
+
230
+ it 'Then they should be on the new plan' do
231
+ @api_customer.subscription.plan.code.should == 'TEST_2'
232
+ end
233
+ end
234
+ end
146
235
  end
147
236
  end
148
237
  end
@@ -37,17 +37,40 @@ end
37
37
  def destroy_all_customers
38
38
  Mousetrap::Customer.destroy_all
39
39
  end
40
+ #create_customer
41
+
42
+ destroy_all_customers
43
+
44
+ #code = "rvhljmvenp@example.com"
45
+ #api_customer = Mousetrap::Customer[code]
46
+ ##puts api_customer.to_yaml
47
+
48
+ #customer = Factory :new_customer
49
+ #customer.save
50
+ #api_customer = Mousetrap::Customer[customer.code]
51
+
52
+ #puts '-' * 80
53
+ #p Mousetrap::Customer[customer.code]
54
+
55
+ #puts '-' * 80
56
+ #p Mousetrap::Customer.exists? customer.code
57
+
58
+ #puts '-' * 80
59
+ #p Mousetrap::Customer['cantfindme']
60
+
61
+ #puts '-' * 80
62
+ #p Mousetrap::Customer.exists? 'cantfindme'
40
63
 
41
64
  # create_customer
42
65
 
43
- code = 'igcuvfehrc@example.com'
44
- api_customer = Mousetrap::Customer[code]
45
- puts api_customer.to_yaml
46
- puts '-' * 80
47
- puts 'cancel'
48
- puts api_customer.cancel
49
- puts '-' * 80
50
- api_customer = Mousetrap::Customer[code]
51
- puts api_customer.to_yaml
66
+ #code = 'igcuvfehrc@example.com'
67
+ #api_customer = Mousetrap::Customer[code]
68
+ #puts api_customer.to_yaml
69
+ #puts '-' * 80
70
+ #puts 'cancel'
71
+ #puts api_customer.cancel
72
+ #puts '-' * 80
73
+ #api_customer = Mousetrap::Customer[code]
74
+ #puts api_customer.to_yaml
52
75
 
53
76
 
@@ -1,50 +1,7 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe Mousetrap::Customer do
4
- # customers:
5
- # customer:
6
- # firstName: nvnawrelyv
7
- # lastName: vklidifvfd
8
- # email: bvvljaeegs@example.com
9
- # code: ablntsorai@example.com
10
- # company:
11
- # gatewayToken:
12
- # id: eac1cf0e-fc5b-102c-a92d-40402145ee8b
13
- # createdDatetime: "2009-09-27T02:16:15+00:00"
14
- # modifiedDatetime: "2009-09-27T02:16:16+00:00"
15
- # subscriptions:
16
- # subscription:
17
- # gatewayToken:
18
- # id: eac26b4e-fc5b-102c-a92d-40402145ee8b
19
- # createdDatetime: "2009-09-27T02:16:15+00:00"
20
- # ccType: visa
21
- # ccLastFour: "1111"
22
- # ccExpirationDate: "2012-12-31T00:00:00+00:00"
23
- # canceledDatetime:
24
- # plans:
25
- # plan:
26
- # name: Test
27
- # setupChargeAmount: "0.00"
28
- # code: TEST
29
- # recurringChargeAmount: "42.00"
30
- # billingFrequencyQuantity: "1"
31
- # trialDays: "0"
32
- # id: 5fbb9a84-e27f-102c-a92d-40402145ee8b
33
- # billingFrequency: monthly
34
- # createdDatetime: "2009-08-25T04:24:34+00:00"
35
- # recurringChargeCode: TEST_RECURRING
36
- # isActive: "1"
37
- # billingFrequencyUnit: months
38
- # description: Test
39
- # billingFrequencyPer: month
40
- # setupChargeCode: TEST_SETUP
41
- # invoices:
42
- # invoice:
43
- # number: "2"
44
- # billingDatetime: "2009-10-27T02:16:15+00:00"
45
- # id: eac74d62-fc5b-102c-a92d-40402145ee8b
46
- # createdDatetime: "2009-09-27T02:16:15+00:00"
47
- # type: subscription
4
+ include Fixtures
48
5
 
49
6
  def customer_attributes_for_api(customer)
50
7
  {
@@ -66,7 +23,7 @@ describe Mousetrap::Customer do
66
23
 
67
24
  describe "when having multiple subscriptions" do
68
25
  it "returns the latest one" do
69
- Mousetrap::Customer.new_from_api(FULL_CUSTOMER).subscription.should_not be_nil
26
+ Mousetrap::Customer.new_from_api(full_customer).subscription.should_not be_nil
70
27
  end
71
28
  end
72
29
 
@@ -180,30 +137,216 @@ describe Mousetrap::Customer do
180
137
  end
181
138
  end
182
139
 
140
+ describe "#new?" do
141
+ it "looks up the customer on CheddarGetter" do
142
+ c = Mousetrap::Customer.new :code => 'some_customer_code'
143
+ Mousetrap::Customer.should_receive(:[]).with('some_customer_code')
144
+ c.new?
145
+ end
146
+
147
+ context "with an existing CheddarGetter record" do
148
+ before do
149
+ Mousetrap::Customer.stub(:[] => stub(:id => 'some_customer_id'))
150
+ end
151
+
152
+ it "grabs the id from CheddarGetter and assigns it locally" do
153
+ c = Mousetrap::Customer.new :code => 'some_customer_code'
154
+ c.should_receive(:id=).with('some_customer_id')
155
+ c.new?
156
+ end
157
+
158
+ it "is false" do
159
+ c = Mousetrap::Customer.new
160
+ c.should_not be_new
161
+ end
162
+ end
163
+
164
+ context "without a CheddarGetter record" do
165
+ before do
166
+ Mousetrap::Customer.stub :[] => nil
167
+ end
168
+
169
+ it "is true" do
170
+ c = Mousetrap::Customer.new
171
+ c.should be_new
172
+ end
173
+ end
174
+ end
175
+
183
176
  describe '#save' do
184
177
  context "for existing records" do
185
178
  before do
186
179
  @customer = Factory :existing_customer
180
+ @customer.stub :new? => false
187
181
  end
188
182
 
189
- it 'posts to edit-customer action' do
190
- attributes_for_api = customer_attributes_for_api(@customer)
183
+ context "with subscription association set up" do
184
+ it 'posts to edit action' do
185
+ attributes_for_api = customer_attributes_for_api(@customer)
191
186
 
192
- # We don't send code for existing API resources.
193
- attributes_for_api.delete(:code)
187
+ # We don't send code for existing API resources.
188
+ attributes_for_api.delete(:code)
194
189
 
195
- @customer.class.should_receive(:put_resource).with(
196
- 'customers', 'edit-customer', @customer.code, attributes_for_api)
197
- @customer.save
190
+ @customer.class.should_receive(:put_resource).with(
191
+ 'customers', 'edit', @customer.code, attributes_for_api)
192
+ @customer.save
193
+ end
194
+ end
195
+
196
+ context "with no subscription association" do
197
+ it 'posts to edit action' do
198
+ attributes_for_api = customer_attributes_for_api(@customer)
199
+
200
+ # We don't send code for existing API resources.
201
+ attributes_for_api.delete(:code)
202
+
203
+ attributes_for_api.delete(:subscription)
204
+ @customer.subscription = nil
205
+
206
+ @customer.class.should_receive(:put_resource).with(
207
+ 'customers', 'edit-customer', @customer.code, attributes_for_api)
208
+ @customer.save
209
+ end
198
210
  end
199
211
  end
200
212
 
201
213
  context "for new records" do
202
214
  it 'calls create' do
203
215
  customer = Factory :new_customer
216
+ customer.stub :new? => true
217
+ Mousetrap::Customer.stub :exists? => false
204
218
  customer.should_receive(:create)
205
219
  customer.save
206
220
  end
207
221
  end
208
222
  end
223
+
224
+ describe "#switch_to_plan" do
225
+ it "raises an error if not existing CheddarGetter customer" do
226
+ c = Mousetrap::Customer.new :code => 'some_customer_code'
227
+ c.stub :exists? => false
228
+ expect { c.switch_to_plan 'some_plan_code' }.to raise_error(/existing/)
229
+ end
230
+
231
+ it "puts a subscription with a plan code" do
232
+ c = Mousetrap::Customer.new :code => 'some_customer_code'
233
+ c.stub :exists? => true
234
+ c.class.should_receive(:put_resource).with(
235
+ 'customers', 'edit-subscription', 'some_customer_code', { :planCode => 'some_plan_code' })
236
+ c.switch_to_plan 'some_plan_code'
237
+ end
238
+ end
239
+
240
+ describe "protected methods" do
241
+ describe "#create" do
242
+ before do
243
+ @customer = Mousetrap::Customer.new
244
+ @customer.stub :attributes_for_api_with_subscription => 'some_attributes'
245
+ end
246
+
247
+ it "posts a new customer" do
248
+ @customer.class.should_receive(:post_resource).with('customers', 'new', 'some_attributes').and_return({:id => 'some_id'})
249
+ @customer.class.stub :build_resource_from
250
+ @customer.send :create
251
+ end
252
+
253
+ it "raises error is CheddarGetter reports one" do
254
+ @customer.class.stub :post_resource => {'error' => 'some error message'}
255
+ expect { @customer.send(:create) }.to raise_error('some error message')
256
+ end
257
+
258
+ it "builds a customer from the CheddarGetter return values" do
259
+ @customer.class.stub :post_resource => 'some response'
260
+ @customer.class.should_receive(:build_resource_from).with('some response').and_return(:id => 'some_id')
261
+ @customer.send :create
262
+ end
263
+
264
+ it "grabs the id from CheddarGetter and assigns it locally" do
265
+ @customer.class.stub :post_resource => {}
266
+ @customer.class.stub :build_resource_from => stub(:id => 'some_id')
267
+ @customer.should_receive(:id=).with('some_id')
268
+ @customer.send :create
269
+ end
270
+
271
+ it "returns the response" do
272
+ @customer.class.stub :post_resource => { :some => :response }
273
+ @customer.class.stub :build_resource_from => stub(:id => 'some_id')
274
+ @customer.send(:create).should == { :some => :response }
275
+ end
276
+ end
277
+ end
209
278
  end
279
+
280
+
281
+ __END__
282
+
283
+ customers:
284
+ customer:
285
+ company:
286
+ lastName: cgejerpkyw
287
+ code: krylmrreef@example.com
288
+ subscriptions:
289
+ subscription:
290
+ plans:
291
+ plan:
292
+ name: Test
293
+ setupChargeAmount: "42.00"
294
+ code: TEST
295
+ recurringChargeAmount: "13.00"
296
+ billingFrequencyQuantity: "1"
297
+ trialDays: "0"
298
+ id: 8e933180-08b5-102d-a92d-40402145ee8b
299
+ billingFrequency: monthly
300
+ createdDatetime: "2009-10-12T19:28:09+00:00"
301
+ recurringChargeCode: TEST_RECURRING
302
+ isActive: "1"
303
+ billingFrequencyUnit: months
304
+ description: This is my test plan. There are many like it, but this one is mine.
305
+ billingFrequencyPer: month
306
+ setupChargeCode: TEST_SETUP
307
+ gatewayToken:
308
+ id: 7ccea6de-0a4d-102d-a92d-40402145ee8b
309
+ createdDatetime: "2009-10-14T20:08:14+00:00"
310
+ ccType: visa
311
+ ccLastFour: "1111"
312
+ ccExpirationDate: "2012-12-31T00:00:00+00:00"
313
+ canceledDatetime:
314
+ invoices:
315
+ invoice:
316
+ - number: "5"
317
+ transactions:
318
+ transaction:
319
+ response: approved
320
+ code: ""
321
+ amount: "42.00"
322
+ memo: This is a simulated transaction
323
+ id: 7ce53c78-0a4d-102d-a92d-40402145ee8b
324
+ createdDatetime: "2009-10-14T20:08:14+00:00"
325
+ transactedDatetime: "2009-10-14T20:08:14+00:00"
326
+ parentId:
327
+ charges:
328
+ charge:
329
+ code: TEST_SETUP
330
+ quantity: "1"
331
+ id: 7ce2cb6e-0a4d-102d-a92d-40402145ee8b
332
+ createdDatetime: "2009-10-14T20:08:14+00:00"
333
+ type: setup
334
+ eachAmount: "42.00"
335
+ description:
336
+ gatewayAccount:
337
+ id: ""
338
+ billingDatetime: "2009-10-14T20:08:14+00:00"
339
+ id: 7cd25072-0a4d-102d-a92d-40402145ee8b
340
+ createdDatetime: "2009-10-14T20:08:14+00:00"
341
+ type: setup
342
+ - number: "6"
343
+ billingDatetime: "2009-11-14T20:08:14+00:00"
344
+ id: 7cd4253c-0a4d-102d-a92d-40402145ee8b
345
+ createdDatetime: "2009-10-14T20:08:14+00:00"
346
+ type: subscription
347
+ gatewayToken:
348
+ id: 7ccd6e5e-0a4d-102d-a92d-40402145ee8b
349
+ createdDatetime: "2009-10-14T20:08:14+00:00"
350
+ modifiedDatetime: "2009-10-14T20:08:14+00:00"
351
+ firstName: wqaqyhjdfg
352
+ email: krylmrreef@example.com
@@ -62,6 +62,22 @@ describe Mousetrap::Resource do
62
62
  it { should_not be_new_record }
63
63
  it { subject.code.should == @code }
64
64
  end
65
+
66
+ context "when there's errors" do
67
+ it "handles kludgy 'Resource not found' response" do
68
+ Mousetrap::Widget.stub :get_resource => {
69
+ 'error' => 'Resource not found: Customer not found for code=cantfindme within productCode=MOUSETRAP_TEST'
70
+ }
71
+ Mousetrap::Widget['cantfindme'].should be_nil
72
+ end
73
+
74
+ it "raises error if response has one" do
75
+ expect do
76
+ Mousetrap::Widget.stub :get_resource => { 'error' => 'some other error' }
77
+ Mousetrap::Widget['some_resource_code'].should be_nil
78
+ end.to raise_error(RuntimeError, 'some other error')
79
+ end
80
+ end
65
81
  end
66
82
 
67
83
  describe ".destroy_all" do
@@ -73,6 +89,23 @@ describe Mousetrap::Resource do
73
89
  end
74
90
  end
75
91
 
92
+ describe ".exists?" do
93
+ it "gets by code" do
94
+ Mousetrap::Widget.should_receive(:[]).with('some_resource_code')
95
+ Mousetrap::Widget.exists? 'some_resource_code'
96
+ end
97
+
98
+ it "returns true when resource exists" do
99
+ Mousetrap::Widget.stub :[] => stub('some_widget')
100
+ Mousetrap::Widget.exists?('some_resource_code').should be_true
101
+ end
102
+
103
+ it "returns false when resource doesn't exist" do
104
+ Mousetrap::Widget.stub :[] => nil
105
+ Mousetrap::Widget.exists?('some_resource_code').should be_false
106
+ end
107
+ end
108
+
76
109
  describe '#destroy' do
77
110
  context "for existing records" do
78
111
  it 'destroys' do
@@ -93,40 +126,63 @@ describe Mousetrap::Resource do
93
126
  end
94
127
  end
95
128
 
96
- describe ".delete_resource" do
97
- it "gets /xml/<resource>/delete/productCode/<my_product_code>/code/<resource_code>" do
98
- subject.should_receive(:post).with('/xml/widgets/delete/productCode/my_product_code/code/some_resource_code')
99
- subject.delete_resource 'widgets', 'some_resource_code'
129
+ describe "#exists?" do
130
+ it "calls .exists? with code" do
131
+ Mousetrap::Widget.should_receive(:exists?).with('some_resource_code')
132
+ r = Mousetrap::Widget.new :code => 'some_resource_code'
133
+ r.exists?
100
134
  end
101
135
  end
102
136
 
103
- describe ".get_resource" do
104
- it "gets /xml/<resource>/get/productCode/<my_product_code>/code/<resource_code>" do
105
- subject.should_receive(:get).with('/xml/widgets/get/productCode/my_product_code/code/some%2Bresource%2Bcode')
106
- subject.get_resource 'widgets', 'some+resource+code'
137
+ describe '#new?' do
138
+ it 'is true if id is nil' do
139
+ s = Mousetrap::Widget.new
140
+ s.should be_new
107
141
  end
108
- end
109
142
 
110
- describe ".get_resources" do
111
- it "gets /xml/<resource>/get/productCode/<my_product_code>" do
112
- subject.should_receive(:get).with('/xml/widgets/get/productCode/my_product_code')
113
- subject.get_resources 'widgets'
143
+ it 'is false if id exists' do
144
+ s = Mousetrap::Widget.new
145
+ s.stub :id => 'some_id'
146
+ s.should_not be_new
114
147
  end
115
148
  end
116
149
 
117
- describe ".post_resource" do
118
- it "posts to /xml/<resource>/<action>/productCode/<product_code>" do
119
- subject.should_receive(:post).with('/xml/widgets/some_action/productCode/my_product_code', :body => 'some_hash')
120
- subject.post_resource 'widgets', 'some_action', 'some_hash'
150
+ describe "protected methods" do
151
+ describe ".delete_resource" do
152
+ it "gets /xml/<resource>/delete/productCode/<my_product_code>/code/<resource_code>" do
153
+ subject.should_receive(:post).with('/xml/widgets/delete/productCode/my_product_code/code/some_resource_code')
154
+ subject.delete_resource 'widgets', 'some_resource_code'
155
+ end
156
+ end
157
+
158
+ describe ".get_resource" do
159
+ it "gets /xml/<resource>/get/productCode/<my_product_code>/code/<resource_code>" do
160
+ subject.should_receive(:get).with('/xml/widgets/get/productCode/my_product_code/code/some%2Bresource%2Bcode')
161
+ subject.get_resource 'widgets', 'some+resource+code'
162
+ end
163
+ end
164
+
165
+ describe ".get_resources" do
166
+ it "gets /xml/<resource>/get/productCode/<my_product_code>" do
167
+ subject.should_receive(:get).with('/xml/widgets/get/productCode/my_product_code')
168
+ subject.get_resources 'widgets'
169
+ end
170
+ end
171
+
172
+ describe ".post_resource" do
173
+ it "posts to /xml/<resource>/<action>/productCode/<product_code>" do
174
+ subject.should_receive(:post).with('/xml/widgets/some_action/productCode/my_product_code', :body => 'some_hash')
175
+ subject.post_resource 'widgets', 'some_action', 'some_hash'
176
+ end
121
177
  end
122
- end
123
178
 
124
- describe ".put_resource" do
125
- it "puts to /xml/<resource>/<action>/productCode/<product_code>/code/<resource_code>" do
126
- subject.should_receive(:post).with(
127
- '/xml/widgets/some_action/productCode/my_product_code/code/some_widget_code',
128
- :body => 'some_hash')
129
- subject.put_resource 'widgets', 'some_action', 'some_widget_code', 'some_hash'
179
+ describe ".put_resource" do
180
+ it "puts to /xml/<resource>/<action>/productCode/<product_code>/code/<resource_code>" do
181
+ subject.should_receive(:post).with(
182
+ '/xml/widgets/some_action/productCode/my_product_code/code/some_widget_code',
183
+ :body => 'some_hash')
184
+ subject.put_resource 'widgets', 'some_action', 'some_widget_code', 'some_hash'
185
+ end
130
186
  end
131
187
  end
132
188
  end
@@ -1,9 +1,5 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- FULL_CUSTOMER ={"company"=>nil, "lastName"=>"LasterName1255024322", "code"=>"1255024322", "gatewayToken"=>nil, "createdDatetime"=>"2009-10-08T17:55:30+00:00", "modifiedDatetime"=>"2009-10-08T17:55:30+00:00", "subscriptions"=>{"subscription"=>[{"ccExpirationDate"=>"2010-01-31T00:00:00+00:00", "plans"=>{"plan"=>{"name"=>"Plus", "billingFrequencyQuantity"=>"1", "code"=>"PLUS", "recurringChargeAmount"=>"49.00", "createdDatetime"=>"2009-10-06T14:54:24+00:00", "id"=>"51a912d0-03d8-102d-a92d-40402145ee8b", "isActive"=>"1", "billingFrequency"=>"monthly", "description"=>nil, "trialDays"=>"0", "setupChargeCode"=>"PLUS_SETUP", "recurringChargeCode"=>"PLUS_RECURRING", "billingFrequencyUnit"=>"months", "setupChargeAmount"=>"49.00", "billingFrequencyPer"=>"month"}}, "gatewayToken"=>nil, "createdDatetime"=>"2009-10-08T17:55:31+00:00", "ccType"=>"visa", "id"=>"f426d5ae-0583-102d-a92d-40402145ee8b", "ccLastFour"=>"2222", "canceledDatetime"=>nil, "invoices"=>{"invoice"=>{"number"=>"12", "createdDatetime"=>"2009-10-08T17:55:30+00:00", "type"=>"subscription", "billingDatetime"=>"2009-11-08T17:55:30+00:00", "id"=>"f3142928-0583-102d-a92d-40402145ee8b"}}}, {"ccExpirationDate"=>"2010-01-31T00:00:00+00:00", "plans"=>{"plan"=>{"name"=>"Basic", "billingFrequencyQuantity"=>"1", "code"=>"BASIC", "recurringChargeAmount"=>"24.00", "createdDatetime"=>"2009-10-06T14:53:49+00:00", "id"=>"3cd2e840-03d8-102d-a92d-40402145ee8b", "isActive"=>"1", "billingFrequency"=>"monthly", "description"=>nil, "trialDays"=>"0", "setupChargeCode"=>"BASIC_SETUP", "recurringChargeCode"=>"BASIC_RECURRING", "billingFrequencyUnit"=>"months", "setupChargeAmount"=>"24.00", "billingFrequencyPer"=>"month"}}, "gatewayToken"=>nil, "createdDatetime"=>"2009-10-08T17:55:30+00:00", "ccType"=>"visa", "id"=>"f30e0e94-0583-102d-a92d-40402145ee8b", "ccLastFour"=>"2222", "canceledDatetime"=>nil, "invoices"=>{"invoice"=>{"number"=>"11", "createdDatetime"=>"2009-10-08T17:55:30+00:00", "transactions"=>{"transaction"=>{"response"=>"approved", "code"=>"", "createdDatetime"=>"2009-10-08T17:55:30+00:00", "memo"=>"This is a simulated transaction", "id"=>"f327b178-0583-102d-a92d-40402145ee8b", "parentId"=>nil, "amount"=>"24.00", "transactedDatetime"=>"2009-10-08T17:55:30+00:00", "gatewayAccount"=>{"id"=>""}, "charges"=>{"charge"=>{"code"=>"BASIC_SETUP", "createdDatetime"=>"2009-10-08T17:55:30+00:00", "type"=>"setup", "quantity"=>"1", "id"=>"f325406e-0583-102d-a92d-40402145ee8b", "description"=>nil, "eachAmount"=>"24.00"}}}}, "type"=>"setup", "billingDatetime"=>"2009-10-08T17:55:30+00:00", "id"=>"f3125468-0583-102d-a92d-40402145ee8b"}}}]}, "id"=>"f30cd614-0583-102d-a92d-40402145ee8b", "firstName"=>"FirsterName1", "email"=>"example1@example.com"}
4
- MULTIPLE_SUBSCRIPTIONS =[{"ccExpirationDate"=>"2010-01-31T00:00:00+00:00", "plans"=>{"plan"=>{"name"=>"Plus", "billingFrequencyQuantity"=>"1", "code"=>"PLUS", "recurringChargeAmount"=>"49.00", "createdDatetime"=>"2009-10-06T14:54:24+00:00", "id"=>"51a912d0-03d8-102d-a92d-40402145ee8b", "isActive"=>"1", "billingFrequency"=>"monthly", "description"=>nil, "trialDays"=>"0", "setupChargeCode"=>"PLUS_SETUP", "recurringChargeCode"=>"PLUS_RECURRING", "billingFrequencyUnit"=>"months", "setupChargeAmount"=>"49.00", "billingFrequencyPer"=>"month"}}, "gatewayToken"=>nil, "createdDatetime"=>"2009-10-08T17:55:31+00:00", "ccType"=>"visa", "id"=>"f426d5ae-0583-102d-a92d-40402145ee8b", "ccLastFour"=>"2222", "canceledDatetime"=>nil, "invoices"=>{"invoice"=>{"number"=>"12", "createdDatetime"=>"2009-10-08T17:55:30+00:00", "type"=>"subscription", "billingDatetime"=>"2009-11-08T17:55:30+00:00", "id"=>"f3142928-0583-102d-a92d-40402145ee8b"}}}, {"ccExpirationDate"=>"2010-01-31T00:00:00+00:00", "plans"=>{"plan"=>{"name"=>"Basic", "billingFrequencyQuantity"=>"1", "code"=>"BASIC", "recurringChargeAmount"=>"24.00", "createdDatetime"=>"2009-10-06T14:53:49+00:00", "id"=>"3cd2e840-03d8-102d-a92d-40402145ee8b", "isActive"=>"1", "billingFrequency"=>"monthly", "description"=>nil, "trialDays"=>"0", "setupChargeCode"=>"BASIC_SETUP", "recurringChargeCode"=>"BASIC_RECURRING", "billingFrequencyUnit"=>"months", "setupChargeAmount"=>"24.00", "billingFrequencyPer"=>"month"}}, "gatewayToken"=>nil, "createdDatetime"=>"2009-10-08T17:55:30+00:00", "ccType"=>"visa", "id"=>"f30e0e94-0583-102d-a92d-40402145ee8b", "ccLastFour"=>"2222", "canceledDatetime"=>nil, "invoices"=>{"invoice"=>{"number"=>"11", "createdDatetime"=>"2009-10-08T17:55:30+00:00", "transactions"=>{"transaction"=>{"response"=>"approved", "code"=>"", "createdDatetime"=>"2009-10-08T17:55:30+00:00", "memo"=>"This is a simulated transaction", "id"=>"f327b178-0583-102d-a92d-40402145ee8b", "parentId"=>nil, "amount"=>"24.00", "transactedDatetime"=>"2009-10-08T17:55:30+00:00", "gatewayAccount"=>{"id"=>""}, "charges"=>{"charge"=>{"code"=>"BASIC_SETUP", "createdDatetime"=>"2009-10-08T17:55:30+00:00", "type"=>"setup", "quantity"=>"1", "id"=>"f325406e-0583-102d-a92d-40402145ee8b", "description"=>nil, "eachAmount"=>"24.00"}}}}, "type"=>"setup", "billingDatetime"=>"2009-10-08T17:55:30+00:00", "id"=>"f3125468-0583-102d-a92d-40402145ee8b"}}}]
5
-
6
-
7
3
  describe Mousetrap::Subscription do
8
4
  # subscription:
9
5
  # ccExpirationDate: "2010-01-31T00:00:00+00:00"
@@ -14,16 +10,50 @@ describe Mousetrap::Subscription do
14
10
  # ccLastFour: "1111"
15
11
  # canceledDatetime:
16
12
 
13
+ include Fixtures
14
+
15
+ describe '.[]' do
16
+ it 'raises NotImplementedError' do
17
+ expect do
18
+ Mousetrap::Subscription['some_code']
19
+ end.to raise_error(NotImplementedError, Mousetrap::API_UNSUPPORTED)
20
+ end
21
+ end
22
+
23
+ describe '.all' do
24
+ it 'raises NotImplementedError' do
25
+ expect do
26
+ Mousetrap::Subscription.all
27
+ end.to raise_error(NotImplementedError, Mousetrap::API_UNSUPPORTED)
28
+ end
29
+ end
30
+
31
+ describe '.destroy_all' do
32
+ it 'raises NotImplementedError' do
33
+ expect do
34
+ Mousetrap::Subscription.destroy_all
35
+ end.to raise_error(NotImplementedError, Mousetrap::API_UNSUPPORTED)
36
+ end
37
+ end
38
+
39
+ describe '.exists?' do
40
+ it 'raises NotImplementedError' do
41
+ expect do
42
+ Mousetrap::Subscription.exists?('some_code')
43
+ end.to raise_error(NotImplementedError, Mousetrap::API_UNSUPPORTED)
44
+ end
45
+ end
17
46
 
18
47
  describe "plan" do
19
48
  it 'has the correct planCode populated' do
20
- Mousetrap::Subscription.new_from_api(MULTIPLE_SUBSCRIPTIONS.first).plan.code.should == "PLUS"
49
+ Mousetrap::Subscription.new_from_api(multiple_subscriptions.first).plan.code.should == "PLUS"
21
50
  end
22
51
 
23
52
  it 'exists' do
24
- Mousetrap::Subscription.new_from_api(MULTIPLE_SUBSCRIPTIONS.first).plan.should_not be_nil
53
+ Mousetrap::Subscription.new_from_api(multiple_subscriptions.first).plan.should_not be_nil
25
54
  end
26
55
  end
56
+
27
57
  describe '#destroy' do
28
58
  it "raises a NotImplementedError" do
29
59
  expect do
@@ -32,11 +62,20 @@ describe Mousetrap::Subscription do
32
62
  end
33
63
  end
34
64
 
35
- describe '::attributes_for_api' do
65
+ describe '.attributes_for_api' do
36
66
  it 'coerces the month to 2 digits' do
37
67
  Mousetrap::Subscription.attributes_for_api(
38
68
  :credit_card_expiration_month => 2
39
69
  )[:ccExpMonth].should == '02'
40
70
  end
41
71
  end
72
+
73
+ describe '#exists?' do
74
+ it 'raises NotImplementedError' do
75
+ expect do
76
+ s = Mousetrap::Subscription.new
77
+ s.exists?
78
+ end.to raise_error(NotImplementedError, Mousetrap::API_UNSUPPORTED)
79
+ end
80
+ end
42
81
  end
@@ -0,0 +1,189 @@
1
+ module Fixtures
2
+ def full_customer
3
+ {
4
+ "company"=>nil,
5
+ "lastName"=>"LasterName1255024322",
6
+ "code"=>"1255024322",
7
+ "gatewayToken"=>nil,
8
+ "createdDatetime"=>"2009-10-08T17:55:30+00:00",
9
+ "modifiedDatetime"=>"2009-10-08T17:55:30+00:00",
10
+ "subscriptions"=> {
11
+ "subscription" => [
12
+ {
13
+ "ccExpirationDate"=>"2010-01-31T00:00:00+00:00",
14
+ "plans"=> {
15
+ "plan"=> {
16
+ "name"=>"Plus",
17
+ "billingFrequencyQuantity"=>"1",
18
+ "code"=>"PLUS",
19
+ "recurringChargeAmount"=>"49.00",
20
+ "createdDatetime"=>"2009-10-06T14:54:24+00:00",
21
+ "id"=>"51a912d0-03d8-102d-a92d-40402145ee8b",
22
+ "isActive"=>"1",
23
+ "billingFrequency"=>"monthly",
24
+ "description"=>nil,
25
+ "trialDays"=>"0",
26
+ "setupChargeCode"=>"PLUS_SETUP",
27
+ "recurringChargeCode"=>"PLUS_RECURRING",
28
+ "billingFrequencyUnit"=>"months",
29
+ "setupChargeAmount"=>"49.00",
30
+ "billingFrequencyPer"=>"month"}},
31
+ "gatewayToken"=>nil,
32
+ "createdDatetime"=>"2009-10-08T17:55:31+00:00",
33
+ "ccType"=>"visa",
34
+ "id"=>"f426d5ae-0583-102d-a92d-40402145ee8b",
35
+ "ccLastFour"=>"2222",
36
+ "canceledDatetime"=>nil,
37
+ "invoices"=>
38
+ {"invoice"=>
39
+ {"number"=>"12",
40
+ "createdDatetime"=>"2009-10-08T17:55:30+00:00",
41
+ "type"=>"subscription",
42
+ "billingDatetime"=>"2009-11-08T17:55:30+00:00",
43
+ "id"=>"f3142928-0583-102d-a92d-40402145ee8b"}}},
44
+
45
+ {"ccExpirationDate"=>"2010-01-31T00:00:00+00:00",
46
+ "plans"=>
47
+ {"plan"=>
48
+ {"name"=>"Basic",
49
+ "billingFrequencyQuantity"=>"1",
50
+ "code"=>"BASIC",
51
+ "recurringChargeAmount"=>"24.00",
52
+ "createdDatetime"=>"2009-10-06T14:53:49+00:00",
53
+ "id"=>"3cd2e840-03d8-102d-a92d-40402145ee8b",
54
+ "isActive"=>"1",
55
+ "billingFrequency"=>"monthly",
56
+ "description"=>nil,
57
+ "trialDays"=>"0",
58
+ "setupChargeCode"=>"BASIC_SETUP",
59
+ "recurringChargeCode"=>"BASIC_RECURRING",
60
+ "billingFrequencyUnit"=>"months",
61
+ "setupChargeAmount"=>"24.00",
62
+ "billingFrequencyPer"=>"month"}},
63
+ "gatewayToken"=>nil,
64
+ "createdDatetime"=>"2009-10-08T17:55:30+00:00",
65
+ "ccType"=>"visa",
66
+ "id"=>"f30e0e94-0583-102d-a92d-40402145ee8b",
67
+ "ccLastFour"=>"2222",
68
+ "canceledDatetime"=>nil,
69
+ "invoices"=>
70
+ {"invoice"=>
71
+ {"number"=>"11",
72
+ "createdDatetime"=>"2009-10-08T17:55:30+00:00",
73
+ "transactions"=>
74
+ {"transaction"=>
75
+ {"response"=>"approved",
76
+ "code"=>"",
77
+ "createdDatetime"=>"2009-10-08T17:55:30+00:00",
78
+ "memo"=>"This is a simulated transaction",
79
+ "id"=>"f327b178-0583-102d-a92d-40402145ee8b",
80
+ "parentId"=>nil,
81
+ "amount"=>"24.00",
82
+ "transactedDatetime"=>"2009-10-08T17:55:30+00:00",
83
+ "gatewayAccount"=>
84
+ {"id"=>""},
85
+ "charges"=>
86
+ {"charge"=>
87
+ {"code"=>"BASIC_SETUP",
88
+ "createdDatetime"=>"2009-10-08T17:55:30+00:00",
89
+ "type"=>"setup",
90
+ "quantity"=>"1",
91
+ "id"=>"f325406e-0583-102d-a92d-40402145ee8b",
92
+ "description"=>nil,
93
+ "eachAmount"=>"24.00"}}}},
94
+ "type"=>"setup",
95
+ "billingDatetime"=>"2009-10-08T17:55:30+00:00",
96
+ "id"=>"f3125468-0583-102d-a92d-40402145ee8b"}}}]},
97
+ "id"=>"f30cd614-0583-102d-a92d-40402145ee8b",
98
+ "firstName"=>"FirsterName1",
99
+ "email"=>"example1@example.com"}
100
+ end
101
+
102
+ def multiple_subscriptions
103
+ [
104
+ {"ccExpirationDate"=>"2010-01-31T00:00:00+00:00",
105
+ "plans"=>
106
+ {"plan"=>
107
+ {"name"=>"Plus",
108
+ "billingFrequencyQuantity"=>"1",
109
+ "code"=>"PLUS",
110
+ "recurringChargeAmount"=>"49.00",
111
+ "createdDatetime"=>"2009-10-06T14:54:24+00:00",
112
+ "id"=>"51a912d0-03d8-102d-a92d-40402145ee8b",
113
+ "isActive"=>"1",
114
+ "billingFrequency"=>"monthly",
115
+ "description"=>nil,
116
+ "trialDays"=>"0",
117
+ "setupChargeCode"=>"PLUS_SETUP",
118
+ "recurringChargeCode"=>"PLUS_RECURRING",
119
+ "billingFrequencyUnit"=>"months",
120
+ "setupChargeAmount"=>"49.00",
121
+ "billingFrequencyPer"=>"month"}},
122
+ "gatewayToken"=>nil,
123
+ "createdDatetime"=>"2009-10-08T17:55:31+00:00",
124
+ "ccType"=>"visa",
125
+ "id"=>"f426d5ae-0583-102d-a92d-40402145ee8b",
126
+ "ccLastFour"=>"2222",
127
+ "canceledDatetime"=>nil,
128
+ "invoices"=>
129
+ {"invoice"=>
130
+ {"number"=>"12",
131
+ "createdDatetime"=>"2009-10-08T17:55:30+00:00",
132
+ "type"=>"subscription",
133
+ "billingDatetime"=>"2009-11-08T17:55:30+00:00",
134
+ "id"=>"f3142928-0583-102d-a92d-40402145ee8b"}}},
135
+
136
+ {"ccExpirationDate"=>"2010-01-31T00:00:00+00:00",
137
+ "plans"=>
138
+ {"plan"=>
139
+ {"name"=>"Basic",
140
+ "billingFrequencyQuantity"=>"1",
141
+ "code"=>"BASIC",
142
+ "recurringChargeAmount"=>"24.00",
143
+ "createdDatetime"=>"2009-10-06T14:53:49+00:00",
144
+ "id"=>"3cd2e840-03d8-102d-a92d-40402145ee8b",
145
+ "isActive"=>"1",
146
+ "billingFrequency"=>"monthly",
147
+ "description"=>nil,
148
+ "trialDays"=>"0",
149
+ "setupChargeCode"=>"BASIC_SETUP",
150
+ "recurringChargeCode"=>"BASIC_RECURRING",
151
+ "billingFrequencyUnit"=>"months",
152
+ "setupChargeAmount"=>"24.00",
153
+ "billingFrequencyPer"=>"month"}},
154
+ "gatewayToken"=>nil,
155
+ "createdDatetime"=>"2009-10-08T17:55:30+00:00",
156
+ "ccType"=>"visa",
157
+ "id"=>"f30e0e94-0583-102d-a92d-40402145ee8b",
158
+ "ccLastFour"=>"2222",
159
+ "canceledDatetime"=>nil,
160
+ "invoices"=>
161
+ {"invoice"=>
162
+ {"number"=>"11",
163
+ "createdDatetime"=>"2009-10-08T17:55:30+00:00",
164
+ "transactions"=>
165
+ {"transaction"=>
166
+ {"response"=>"approved",
167
+ "code"=>"",
168
+ "createdDatetime"=>"2009-10-08T17:55:30+00:00",
169
+ "memo"=>"This is a simulated transaction",
170
+ "id"=>"f327b178-0583-102d-a92d-40402145ee8b",
171
+ "parentId"=>nil,
172
+ "amount"=>"24.00",
173
+ "transactedDatetime"=>"2009-10-08T17:55:30+00:00",
174
+ "gatewayAccount"=>
175
+ {"id"=>""},
176
+ "charges"=>
177
+ {"charge"=>
178
+ {"code"=>"BASIC_SETUP",
179
+ "createdDatetime"=>"2009-10-08T17:55:30+00:00",
180
+ "type"=>"setup",
181
+ "quantity"=>"1",
182
+ "id"=>"f325406e-0583-102d-a92d-40402145ee8b",
183
+ "description"=>nil,
184
+ "eachAmount"=>"24.00"}}}},
185
+ "type"=>"setup",
186
+ "billingDatetime"=>"2009-10-08T17:55:30+00:00",
187
+ "id"=>"f3125468-0583-102d-a92d-40402145ee8b"}}}]
188
+ end
189
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mousetrap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Larkowski
@@ -12,7 +12,7 @@ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
14
 
15
- date: 2009-10-12 00:00:00 -04:00
15
+ date: 2009-10-16 00:00:00 -04:00
16
16
  default_executable:
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
@@ -87,6 +87,7 @@ files:
87
87
  - spec/mousetrap_spec.rb
88
88
  - spec/spec.opts
89
89
  - spec/spec_helper.rb
90
+ - spec/support/fixtures.rb
90
91
  - spec/support/random_data.rb
91
92
  has_rdoc: true
92
93
  homepage: http://github.com/hashrocket/mousetrap
@@ -126,4 +127,5 @@ test_files:
126
127
  - spec/mousetrap/subscription_spec.rb
127
128
  - spec/mousetrap_spec.rb
128
129
  - spec/spec_helper.rb
130
+ - spec/support/fixtures.rb
129
131
  - spec/support/random_data.rb