mousetrap 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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