cheddargetter_client_ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ module CheddarGetter
2
+ class ClientException < StandardError
3
+ end
4
+ end
@@ -0,0 +1,333 @@
1
+ module CheddarGetter
2
+ class Response
3
+ SPECIAL_ARRAY_KEYS = {
4
+ :plans => :plan,
5
+ :items => :item,
6
+ :subscriptions => :subscription,
7
+ :customers => :customer,
8
+ :invoices => :invoice,
9
+ :charges => :charge,
10
+ :transactions => :transaction
11
+ }
12
+
13
+ KEY_TO_DATA_TYPE = {
14
+ :isActive => :boolean,
15
+ :isFree => :boolean,
16
+ :trialDays => :integer,
17
+ :setupChargeAmount => :float,
18
+ :recurringChargeAmount => :float,
19
+ :billingFrequencyQuantity => :integer,
20
+ :createdDatetime => :datetime,
21
+ :quantityIncluded => :float,
22
+ :isPeriodic => :boolean,
23
+ :overageAmount => :float,
24
+ :isVatExempt => :boolean,
25
+ :firstContactDatetime => :datetime,
26
+ :modifiedDatetime => :datetime,
27
+ :canceledDatetime => :datetime,
28
+ :ccExpirationDate => :date,
29
+ :quantity => :float,
30
+ :billingDatetime => :datetime,
31
+ :eachAmount => :float,
32
+ :number => :integer,
33
+ :amount => :float,
34
+ :transactedDatetime => :datetime,
35
+ :vatRate => :float
36
+ }
37
+
38
+ attr_accessor :raw_response, :clean_response
39
+
40
+ def initialize(response) #:nodoc:
41
+ self.raw_response = response
42
+ create_clean_response
43
+ end
44
+
45
+ [:error, :plans, :customers].each do |key|
46
+ define_method key.to_s do
47
+ self[key]
48
+ end
49
+ end
50
+
51
+ #true if the response from CheddarGetter was valid
52
+ def valid?
53
+ !self.error && self.raw_response.code < 400
54
+ end
55
+
56
+ #the error message (if there was one) if the CheddarGetter response was invalid
57
+ def error_message
58
+ e = self.error
59
+ msg = nil
60
+ if e
61
+ msg = e[:text]
62
+ msg += ": #{e[:fieldName]}" unless e[:fieldName].blank?
63
+ end
64
+ msg
65
+ end
66
+
67
+ #Returns the given plan.
68
+ #
69
+ #code must be provided if this response contains more than one plan.
70
+ def plan(code = nil)
71
+ retrieve_item(self, :plans, code)
72
+ end
73
+
74
+ #Returns the items for the given plan.
75
+ #
76
+ #code must be provided if this response contains more than one plan.
77
+ def plan_items(code = nil)
78
+ (plan(code) || { })[:items]
79
+ end
80
+
81
+ #Returns the given item for the given plan.
82
+ #
83
+ #item_code must be provided if the plan has more than one item.
84
+ #
85
+ #code must be provided if this response contains more than one plan.
86
+ def plan_item(item_code = nil, code = nil)
87
+ retrieve_item(plan(code), :items, item_code)
88
+ end
89
+
90
+ #Returns the given customer.
91
+ #
92
+ #code must be provided if this response contains more than one customer.
93
+ def customer(code = nil)
94
+ retrieve_item(self, :customers, code)
95
+ end
96
+
97
+ #Returns the current subscription for the given customer.
98
+ #
99
+ #code must be provided if this response contains more than one customer.
100
+ def customer_subscription(code = nil)
101
+ #current subscription is always the first one
102
+ (customer_subscriptions(code) || []).first
103
+ end
104
+
105
+ #Returns all the subscriptions for the given customer.
106
+ #Only the first one is active, the rest is historical.
107
+ #
108
+ #code must be provided if this response contains more than one customer.
109
+ def customer_subscriptions(code = nil)
110
+ (customer(code) || { })[:subscriptions]
111
+ end
112
+
113
+ #Returns the current plan for the given customer
114
+ #
115
+ #code must be provided if this response contains more than one customer.
116
+ def customer_plan(code = nil)
117
+ ((customer_subscription(code) || { })[:plans] || []).first
118
+ end
119
+
120
+ #Returns the current open invoice for the given customer.
121
+ #
122
+ #code must be provided if this response contains more than one customer.
123
+ def customer_invoice(code = nil)
124
+ #current invoice is always the first one
125
+ ((customer_subscription(code) || { })[:invoices] || []).first
126
+ end
127
+
128
+ #Returns all of the invoices for the given customer.
129
+ #
130
+ #code must be provided if this response contains more than one customer.
131
+ def customer_invoices(code = nil)
132
+ (customer_subscriptions(code) || []).map{ |s| s[:invoices] || [] }.flatten
133
+ end
134
+
135
+ #Returns the last billed invoice for the given customer.
136
+ #This is not the same as the currect active invoice.
137
+ #
138
+ #nil if there is no last billed invoice.
139
+ #
140
+ #code must be provided if this response contains more than one customer.
141
+ def customer_last_billed_invoice(code = nil)
142
+ #last billed invoice is always the second one
143
+ (customer_invoices(code) || [])[1]
144
+ end
145
+
146
+ #Returns all of the transactions for the given customer.
147
+ #
148
+ #code must be provided if this response contains more than one customer.
149
+ def customer_transactions(code = nil)
150
+ customer_invoices(code).map{ |s| s[:transactions] || [] }.flatten
151
+ end
152
+
153
+ #Returns the last transaction for the given customer.
154
+ #
155
+ #nil if there are no transactions.
156
+ #
157
+ #code must be provided if this response contains more than one customer.
158
+ def customer_last_transaction(code = nil)
159
+ invoice = customer_last_billed_invoice(code) || { }
160
+ (invoice[:transactions] || []).first
161
+ end
162
+
163
+ #Returns an array of any currently outstanding invoices for the given customer.
164
+ #
165
+ #code must be provided if this response contains more than one customer.
166
+ def customer_outstanding_invoices(code = nil)
167
+ now = DateTime.now
168
+ customer_invoices(code).reject do |i|
169
+ i[:paidTransactionId] || i[:billingDatetime] > now
170
+ end
171
+ end
172
+
173
+ #Info about the given item for the given customer.
174
+ #Merges the plan item info with the subscription item info.
175
+ #
176
+ #item_code must be provided if the customer is on a plan with more than one item.
177
+ #
178
+ #code must be provided if this response contains more than one customer.
179
+ def customer_item(item_code = nil, code = nil)
180
+ sub = customer_subscription(code)
181
+ return nil unless sub
182
+ sub_item = retrieve_item(sub, :items, item_code)
183
+ plan_item = retrieve_item(retrieve_item(sub, :plans), :items, item_code)
184
+ return nil unless sub_item && plan_item
185
+ item = plan_item.dup
186
+ item[:quantity] = sub_item[:quantity]
187
+ item
188
+ end
189
+
190
+ #The amount remaining for a given item for a given customer.
191
+ #
192
+ #item_code must be provided if the customer is on a plan with more than one item.
193
+ #
194
+ #code must be provided if this response contains more than one customer.
195
+ def customer_item_quantity_remaining(item_code = nil, code = nil)
196
+ item = customer_item(item_code, code)
197
+ item ? item[:quantityIncluded] - item[:quantity] : 0
198
+ end
199
+
200
+ #The overage amount for the given item for the given customer. 0 if they are still under their limit.
201
+ #
202
+ #item_code must be provided if the customer is on a plan with more than one item.
203
+ #
204
+ #code must be provided if this response contains more than one customer.
205
+ def customer_item_quantity_overage(item_code = nil, code = nil)
206
+ over = -customer_item_quantity_remaining(item_code, code)
207
+ over = 0 if over <= 0
208
+ over
209
+ end
210
+
211
+ #The current overage cost for the given item for the given customer.
212
+ #
213
+ #item_code must be provided if the customer is on a plan with more than one item.
214
+ #
215
+ #code must be provided if this response contains more than one customer.
216
+ def customer_item_quantity_overage_cost(item_code = nil, code = nil)
217
+ item = customer_item(item_code, code)
218
+ return 0 unless item
219
+ overage = customer_item_quantity_overage(item_code, code)
220
+ item[:overageAmount] * overage
221
+ end
222
+
223
+ #true if the customer is canceled
224
+ #
225
+ #code must be provided if this reponse contains more than one customer
226
+ def customer_canceled?(code = nil)
227
+ sub = customer_subscription(code)
228
+ sub ? !!sub[:canceledDatetime] : nil
229
+ end
230
+
231
+ #access the root keys of the response directly, such as
232
+ #:customers, :plans, or :error
233
+ def [](value)
234
+ self.clean_response[value]
235
+ end
236
+
237
+
238
+ private
239
+ def deep_fix_array_keys!(data)
240
+ if data.is_a?(Array)
241
+ data.each do |v|
242
+ deep_fix_array_keys!(v)
243
+ end
244
+ elsif data.is_a?(Hash)
245
+ data.each do |k, v|
246
+ deep_fix_array_keys!(v)
247
+ sub_key = SPECIAL_ARRAY_KEYS[k]
248
+ if sub_key && v.is_a?(Hash) && v.keys.size == 1 && v[sub_key]
249
+ data[k] = v = [v[sub_key]].flatten
250
+ end
251
+ end
252
+ end
253
+ end
254
+
255
+ def deep_symbolize_keys!(data)
256
+ if data.is_a?(Array)
257
+ data.each do |v|
258
+ deep_symbolize_keys!(v)
259
+ end
260
+ elsif data.is_a?(Hash)
261
+ data.keys.each do |key|
262
+ deep_symbolize_keys!(data[key])
263
+ data[(key.to_sym rescue key) || key] = data.delete(key)
264
+ end
265
+ end
266
+ end
267
+
268
+ def deep_fix_data_types!(data)
269
+ if data.is_a?(Array)
270
+ data.each do |v|
271
+ deep_fix_data_types!(v)
272
+ end
273
+ elsif data.is_a?(Hash)
274
+ data.each do |k, v|
275
+ deep_fix_data_types!(v)
276
+ type = KEY_TO_DATA_TYPE[k]
277
+ if type && v.is_a?(String)
278
+ data[k] = case type
279
+ when :integer then v.to_i
280
+ when :float then v.to_f
281
+ when :datetime then DateTime.parse(v) rescue v
282
+ when :date then Date.parse(v) rescue v
283
+ when :boolean then v.to_i != 0
284
+ else v
285
+ end
286
+ end
287
+ end
288
+ end
289
+ end
290
+
291
+ def create_clean_response
292
+ data = self.raw_response.parsed_response.is_a?(Hash) ? self.raw_response.parsed_response : { }
293
+ deep_symbolize_keys!(data)
294
+ deep_fix_array_keys!(data)
295
+ deep_fix_data_types!(data)
296
+ self.clean_response = data
297
+
298
+ #because Crack can:t get attributes and text at the same time. grrrr
299
+ unless self.valid?
300
+ data = Crack::XML.parse(self.raw_response.body.gsub(/<error(.*)>(.*)<\/error>/,
301
+ '<error\1><text>\2</text></error>'))
302
+ deep_symbolize_keys!(data)
303
+ deep_fix_array_keys!(data)
304
+ deep_fix_data_types!(data)
305
+ self.clean_response = data
306
+
307
+ aux_code = (self.error[:auxCode] || "")
308
+ if aux_code[":"]
309
+ split_aux_code = aux_code.split(':')
310
+ self.error[:fieldName] = split_aux_code.first
311
+ self.error[:errorType] = split_aux_code.last
312
+ end
313
+ end
314
+
315
+ end
316
+
317
+ def retrieve_item(hash, type, code = nil)
318
+ array = hash[type]
319
+ if !array
320
+ raise CheddarGetter::ResponseException.new(
321
+ "Can:t get #{type} from a response that doesn:t contain #{type}")
322
+ elsif code
323
+ code = code.to_s
324
+ array.detect{ |p| p[:code].to_s == code }
325
+ elsif array.size <= 1
326
+ array.first
327
+ else
328
+ raise CheddarGetter::ResponseException.new(
329
+ "This response contains multiple #{type} so you need to provide the code for the one you wish to get")
330
+ end
331
+ end
332
+ end
333
+ end
@@ -0,0 +1,4 @@
1
+ module CheddarGetter
2
+ class ResponseException < StandardError
3
+ end
4
+ end
@@ -0,0 +1,9 @@
1
+ require 'httparty'
2
+ require 'CGI' unless Object.const_defined?("CGI")
3
+
4
+ module CheddarGetter
5
+ autoload :Client, "cheddar_getter/client"
6
+ autoload :ClientException, "cheddar_getter/client_exception"
7
+ autoload :Response, "cheddar_getter/response"
8
+ autoload :ResponseException, "cheddar_getter/response_exception"
9
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+ require 'ruby-debug'
13
+
14
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
15
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
16
+ require 'cheddargetter_client_ruby'
17
+
18
+ class Test::Unit::TestCase
19
+ end
20
+
21
+ CG = CheddarGetter::Client.new(:product_code => "GEM_TEST",
22
+ :username => "michael@expectedbehavior.com",
23
+ :password => "DROlOAeQpWey6J2cqTyEzH")
24
+
@@ -0,0 +1,852 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ class TestCheddargetterClientRuby < Test::Unit::TestCase
4
+ ERROR_CODES = {
5
+ 1000 => "An unexpected error occured. Please try again later.",
6
+ 1001 => "The record already exists",
7
+ 1002 => "An unexpected error occured. Please try again later.",
8
+ 1003 => "An unexpected error occured. Please try again later.",
9
+ 2000 => "The local gateway configuration is incompatible",
10
+ 2001 => "The configuration at the gateway is incompatible",
11
+ 2002 => "Authentication to the gateway failed",
12
+ 2003 => "The gateway has denied access",
13
+ 3000 => "The response from the gateway was not recognized",
14
+ 4000 => "The connection to the gateway failed. Please try again later.",
15
+ 5000 => "There was an error processing the transaction",
16
+ 5001 => "Credit card number is invalid",
17
+ 5002 => "Expiration date is invalid",
18
+ 5003 => "Credit card type is not accepted",
19
+ 6000 => "The transaction was declined",
20
+ 6001 => "The transaction was declined due to AVS mismatch",
21
+ 6002 => "The transaction was declined due to card code verification failure",
22
+ 7000 => "The transaction failed for an unknown reason"
23
+ }
24
+
25
+ def free_new_user_hash(id)
26
+ {
27
+ :code => id,
28
+ :firstName => "First",
29
+ :lastName => "Last",
30
+ :email => "email@example.com",
31
+ :subscription => {
32
+ :planCode => "FREE_PLAN_TEST",
33
+ },
34
+ }
35
+ end
36
+
37
+ def paid_new_user_hash(id, cc_error = nil)
38
+ {
39
+ :code => id,
40
+ :firstName => "First",
41
+ :lastName => "Last",
42
+ :email => "email@example.com",
43
+ :subscription => {
44
+ :planCode => "TEST_PLAN_2",
45
+ :ccNumber => "4111111111111111",
46
+ :ccExpiration => Date.parse("08/2012"),
47
+ :ccCardCode => "123",
48
+ :ccFirstName => "ccFirst",
49
+ :ccLastName => "ccLast",
50
+ :ccZip => cc_error ? cc_error : "11361"
51
+ },
52
+ }
53
+ end
54
+
55
+ should "check various client init exceptions" do
56
+ assert_raises(CheddarGetter::ClientException) do
57
+ CheddarGetter::Client.new(:product_code => "code", :password => "password")
58
+ end
59
+
60
+ assert_raises(CheddarGetter::ClientException) do
61
+ CheddarGetter::Client.new(:product_code => "code", :username => "username")
62
+ end
63
+
64
+ assert_raises(CheddarGetter::ClientException) do
65
+ CheddarGetter::Client.new(:username => "username", :password => "password")
66
+ end
67
+
68
+ assert_not_nil CheddarGetter::Client.new(:username => "u", :password => "p", :product_code => "c")
69
+ assert_not_nil CheddarGetter::Client.new(:username => "u", :password => "p", :product_id => "i")
70
+
71
+ cg = CheddarGetter::Client.new(:username => "username", :password => "password", :product_code => "code")
72
+ cg.product_code = nil
73
+ assert_raises(CheddarGetter::ClientException) { cg.get_plans }
74
+ cg.product_code = "code"
75
+
76
+ result = cg.get_plans
77
+ assert_equal false, result.valid?
78
+ assert_equal "Authentication required", result.error_message
79
+
80
+ cg.username = CG.username
81
+ cg.password = CG.password
82
+ result = cg.get_plans
83
+ assert_equal false, result.valid?
84
+ assert_equal "User michael@expectedbehavior.com does not have access to productCode=code", result.error_message
85
+
86
+ cg.product_code = ""
87
+ result = cg.get_plans
88
+ assert_equal false, result.valid?
89
+ assert_equal "No product selected. Need a productId or productCode.", result.error_message
90
+
91
+ cg.product_code = nil
92
+ cg.product_id = "id"
93
+ result = cg.get_plans
94
+ assert_equal false, result.valid?
95
+ assert_equal "User does not have access to productId=id", result.error_message
96
+ end
97
+
98
+ should "get 3 plans from cheddar getter" do
99
+ result = CG.get_plans
100
+ assert_equal 3, result.plans.size
101
+ assert_equal "Free Plan Test", result.plan("FREE_PLAN_TEST")[:name]
102
+ assert_equal "Test Plan 2", result.plan("TEST_PLAN_2")[:name]
103
+ assert_equal "Test Plan 1", result.plan("TEST_PLAN_1")[:name]
104
+ assert_equal nil, result.plan("NOT_A_PLAN")
105
+ assert_equal 2, result.plan_items("TEST_PLAN_1").count
106
+ assert_equal "Test Item 1", result.plan_item("TEST_ITEM_1", "TEST_PLAN_1")[:name]
107
+ assert_equal "Test Item 2", result.plan_item("TEST_ITEM_2", "TEST_PLAN_1")[:name]
108
+ assert_raises(CheddarGetter::ResponseException){ result.plan }
109
+ assert_raises(CheddarGetter::ResponseException){ result.plan_items }
110
+ assert_raises(CheddarGetter::ResponseException){ result.plan_item }
111
+ assert_raises(CheddarGetter::ResponseException){ result.plan_item("TEST_ITEM_1") }
112
+ assert_raises(CheddarGetter::ResponseException){ result.customer }
113
+ assert_equal true, result.valid?
114
+ end
115
+
116
+ should "get a single plan from cheddar getter" do
117
+ assert_raises(CheddarGetter::ClientException){ CG.get_plan }
118
+ result = CG.get_plan(:code => "FREE_PLAN_TEST")
119
+ assert_equal 1, result.plans.size
120
+ assert_equal "Free Plan Test", result.plan("FREE_PLAN_TEST")[:name]
121
+ assert_equal nil, result.plan("TEST_PLAN_2")
122
+ assert_equal nil, result.plan("TEST_PLAN_1")
123
+ assert_equal nil, result.plan("NOT_A_PLAN")
124
+ assert_equal 2, result.plan_items.count
125
+ assert_equal nil, result.plan_items("TEST_PLAN_1")
126
+ assert_equal "Test Item 1", result.plan_item("TEST_ITEM_1")[:name]
127
+ assert_equal "Test Item 2", result.plan_item("TEST_ITEM_2")[:name]
128
+ assert_raises(CheddarGetter::ResponseException){ result.plan_item }
129
+ assert_raises(CheddarGetter::ResponseException){ result.customer }
130
+ assert_equal true, result.valid?
131
+
132
+ result = CG.get_plan(:id => "fe96b9e6-53a2-102e-b098-40402145ee8b")
133
+ assert_equal 1, result.plans.size
134
+ assert_equal "Free Plan Test", result.plan("FREE_PLAN_TEST")[:name]
135
+ assert_equal true, result.valid?
136
+
137
+ result = CG.get_plan(:code => "NOT_A_PLAN")
138
+ assert_equal false, result.valid?
139
+ assert_equal "Plan not found for code=NOT_A_PLAN within productCode=GEM_TEST", result.error_message
140
+ end
141
+
142
+ should "create a single free customer at cheddar getter" do
143
+ result = CG.delete_all_customers
144
+ assert_equal true, result.valid?
145
+ result = CG.new_customer(free_new_user_hash(1))
146
+ assert_equal 1, result.customers.size
147
+ assert_equal "1", result.customer[:code]
148
+ assert_equal "Free Plan Test", result.customer_plan[:name]
149
+ end
150
+
151
+ should "create a single paid customer at cheddar getter" do
152
+ result = CG.delete_all_customers
153
+ assert_equal true, result.valid?
154
+ result = CG.new_customer(paid_new_user_hash(1))
155
+ assert_equal 1, result.customers.size
156
+ assert_equal "1", result.customer[:code]
157
+ assert_equal "Test Plan 2", result.customer_plan[:name]
158
+ assert_equal 20, result.customer_invoice[:charges].first[:eachAmount]
159
+ end
160
+
161
+ should "try to create a customer with various errors" do
162
+ result = CG.delete_all_customers
163
+ assert_equal true, result.valid?
164
+
165
+ data = paid_new_user_hash(1)
166
+ data[:subscription].delete(:ccCardCode)
167
+ result = CG.new_customer(data)
168
+ assert_equal false, result.valid?
169
+ assert_equal "A value is required: subscription[ccCardCode]", result.error_message
170
+
171
+ data[:subscription][:ccExpiration] = "00/0000"
172
+ result = CG.new_customer(data)
173
+ assert_equal false, result.valid?
174
+ assert_equal("'00/0000' is not a valid date in format MM/YYYY: subscription[ccExpiration]",
175
+ result.error_message)
176
+
177
+ data[:subscription].delete(:ccExpiration)
178
+ result = CG.new_customer(data)
179
+ assert_equal false, result.valid?
180
+ assert_equal "A value is required: subscription[ccExpiration]", result.error_message
181
+
182
+ data[:subscription][:ccNumber] = "1"
183
+ result = CG.new_customer(data)
184
+ assert_equal false, result.valid?
185
+ assert_equal("'1' is not from an allowed institute: subscription[ccNumber]",
186
+ result.error_message)
187
+
188
+ data[:subscription].delete(:ccNumber)
189
+ result = CG.new_customer(data)
190
+ assert_equal false, result.valid?
191
+ assert_equal "A value is required: subscription[ccNumber]", result.error_message
192
+
193
+ data[:subscription].delete(:ccZip)
194
+ result = CG.new_customer(data)
195
+ assert_equal false, result.valid?
196
+ assert_equal "A value is required: subscription[ccZip]", result.error_message
197
+
198
+ data[:subscription].delete(:ccLastName)
199
+ result = CG.new_customer(data)
200
+ assert_equal false, result.valid?
201
+ assert_equal "A value is required: subscription[ccLastName]", result.error_message
202
+
203
+ data[:subscription].delete(:ccFirstName)
204
+ result = CG.new_customer(data)
205
+ assert_equal false, result.valid?
206
+ assert_equal "A value is required: subscription[ccFirstName]", result.error_message
207
+
208
+ data.delete(:email)
209
+ result = CG.new_customer(data)
210
+ assert_equal false, result.valid?
211
+ assert_equal "A value is required: email", result.error_message
212
+
213
+ data.delete(:code)
214
+ result = CG.new_customer(data)
215
+ assert_equal false, result.valid?
216
+ assert_equal "A value is required: code", result.error_message
217
+
218
+ data.delete(:lastName)
219
+ result = CG.new_customer(data)
220
+ assert_equal false, result.valid?
221
+ assert_equal "A value is required: lastName", result.error_message
222
+
223
+ data.delete(:firstName)
224
+ result = CG.new_customer(data)
225
+ assert_equal false, result.valid?
226
+ assert_equal "A value is required: firstName", result.error_message
227
+
228
+ data[:subscription][:planCode] = "NOT_A_PLAN"
229
+ result = CG.new_customer(data)
230
+ assert_equal false, result.valid?
231
+ assert_equal "No plan found with code=NOT_A_PLAN", result.error_message
232
+
233
+ data[:subscription].delete(:planCode)
234
+ result = CG.new_customer(data)
235
+ assert_equal false, result.valid?
236
+ assert_equal "A pricing plan is required", result.error_message
237
+ end
238
+
239
+ should "try to create a customer with direct forced card errors" do
240
+ result = CG.delete_all_customers
241
+ assert_equal true, result.valid?
242
+
243
+ ERROR_CODES.each do |k, v|
244
+ result = CG.new_customer(paid_new_user_hash(1, "0#{k}"))
245
+ assert_equal false, result.valid?
246
+ assert_equal v, result.error_message
247
+ end
248
+
249
+ end
250
+
251
+ should "try to create two customers with same code" do
252
+ result = CG.delete_all_customers
253
+ assert_equal true, result.valid?
254
+
255
+ result = CG.new_customer(paid_new_user_hash(1))
256
+ assert_equal true, result.valid?
257
+
258
+ result = CG.new_customer(paid_new_user_hash(1))
259
+ assert_equal false, result.valid?
260
+ assert_equal "Another customer already exists with code=1: code", result.error_message
261
+ end
262
+
263
+ should "get customers from cheddargetter" do
264
+ result = CG.delete_all_customers
265
+ assert_equal true, result.valid?
266
+
267
+ result = CG.new_customer(paid_new_user_hash(1))
268
+ assert_equal true, result.valid?
269
+
270
+ result = CG.new_customer(paid_new_user_hash(2))
271
+ assert_equal true, result.valid?
272
+
273
+ result = CG.new_customer(free_new_user_hash(3))
274
+ assert_equal true, result.valid?
275
+
276
+ result = CG.get_customers
277
+ assert_equal true, result.valid?
278
+ assert_equal 3, result.customers.count
279
+ assert_equal "1", result.customer(1)[:code]
280
+ assert_equal "2", result.customer(2)[:code]
281
+ assert_equal "3", result.customer(3)[:code]
282
+ assert_equal nil, result.customer(4)
283
+ assert_equal "Free Plan Test", result.customer_plan(3)[:name]
284
+ assert_equal "Test Plan 2", result.customer_plan(2)[:name]
285
+ assert_equal "Test Plan 2", result.customer_plan(1)[:name]
286
+ assert_equal nil, result.customer_plan(0)
287
+
288
+ #fail cause there are no plans in this response
289
+ assert_raises(CheddarGetter::ResponseException){ result.plan }
290
+ assert_raises(CheddarGetter::ResponseException){ result.plan_items }
291
+ assert_raises(CheddarGetter::ResponseException){ result.plan_item }
292
+
293
+ assert_equal "Test Plan 2", result.customer_subscription(1)[:plans][0][:name]
294
+ assert_equal 1, result.customer_subscriptions(1).count
295
+ assert_equal "TEST_PLAN_2_RECURRING", result.customer_invoice(1)[:charges][0][:code]
296
+ assert_equal 1, result.customer_invoices(1).count
297
+ assert_equal nil, result.customer_last_billed_invoice(1)
298
+ assert_equal [], result.customer_transactions(1)
299
+ assert_equal nil, result.customer_last_transaction(1)
300
+ assert_equal [], result.customer_outstanding_invoices(1)
301
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item("TEST_ITEM_1") }
302
+ assert_equal "Test Item 1", result.customer_item("TEST_ITEM_1", 1)[:name]
303
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item_quantity_remaining("TEST_ITEM_1") }
304
+ assert_equal 0, result.customer_item_quantity_remaining("TEST_ITEM_1", 1)
305
+ assert_equal 10, result.customer_item_quantity_remaining("TEST_ITEM_2", 1)
306
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item_quantity_overage("TEST_ITEM_1") }
307
+ assert_equal 0, result.customer_item_quantity_overage("TEST_ITEM_1", 1)
308
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item_quantity_overage_cost("TEST_ITEM_1") }
309
+ assert_equal 0, result.customer_item_quantity_overage_cost("TEST_ITEM_1", 1)
310
+
311
+ assert_equal nil, result.customer_item("NOT_AN_ITEM", 1)
312
+ assert_equal 0, result.customer_item_quantity_remaining("NOT_AN_ITEM", 1)
313
+ assert_equal 0, result.customer_item_quantity_overage("NOT_AN_ITEM", 1)
314
+ assert_equal 0, result.customer_item_quantity_overage_cost("NOT_AN_ITEM", 1)
315
+
316
+ #all fail cause there are multiple customers atm
317
+ assert_raises(CheddarGetter::ResponseException){ result.customer }
318
+ assert_raises(CheddarGetter::ResponseException){ result.customer_subscription }
319
+ assert_raises(CheddarGetter::ResponseException){ result.customer_subscriptions }
320
+ assert_raises(CheddarGetter::ResponseException){ result.customer_plan }
321
+ assert_raises(CheddarGetter::ResponseException){ result.customer_invoice }
322
+ assert_raises(CheddarGetter::ResponseException){ result.customer_invoices }
323
+ assert_raises(CheddarGetter::ResponseException){ result.customer_last_billed_invoice }
324
+ assert_raises(CheddarGetter::ResponseException){ result.customer_transactions }
325
+ assert_raises(CheddarGetter::ResponseException){ result.customer_last_transaction }
326
+ assert_raises(CheddarGetter::ResponseException){ result.customer_outstanding_invoices }
327
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item }
328
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item_quantity_remaining }
329
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item_quantity_overage }
330
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item_quantity_overage_cost }
331
+ end
332
+
333
+ should "get a customer from cheddargetter" do
334
+ result = CG.delete_all_customers
335
+ assert_equal true, result.valid?
336
+
337
+ result = CG.new_customer(paid_new_user_hash(5))
338
+ assert_equal true, result.valid?
339
+
340
+ assert_raises(CheddarGetter::ClientException){ CG.get_customer }
341
+ result = CG.get_customer(:code => 6)
342
+ assert_equal false, result.valid?
343
+ assert_equal "Customer not found", result.error_message
344
+
345
+ result = CG.get_customer(:code => 5)
346
+ assert_equal true, result.valid?
347
+ assert_equal "5", result.customer(5)[:code]
348
+ assert_equal "5", result.customer[:code]
349
+
350
+ assert_equal "Test Plan 2", result.customer_subscription[:plans][0][:name]
351
+ assert_equal 1, result.customer_subscriptions.count
352
+ assert_equal "Test Plan 2", result.customer_plan[:name]
353
+ assert_equal "TEST_PLAN_2_RECURRING", result.customer_invoice[:charges][0][:code]
354
+ assert_equal 1, result.customer_invoices.count
355
+ assert_equal nil, result.customer_last_billed_invoice
356
+ assert_equal [], result.customer_transactions
357
+ assert_equal nil, result.customer_last_transaction
358
+ assert_equal [], result.customer_outstanding_invoices
359
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item }
360
+ assert_equal "Test Item 1", result.customer_item("TEST_ITEM_1")[:name]
361
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item_quantity_remaining }
362
+ assert_equal 0, result.customer_item_quantity_remaining("TEST_ITEM_1")
363
+ assert_equal 10, result.customer_item_quantity_remaining("TEST_ITEM_2")
364
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item_quantity_overage }
365
+ assert_equal 0, result.customer_item_quantity_overage("TEST_ITEM_1")
366
+ assert_raises(CheddarGetter::ResponseException){ result.customer_item_quantity_overage_cost }
367
+ assert_equal 0, result.customer_item_quantity_overage_cost("TEST_ITEM_1")
368
+
369
+ assert_equal nil, result.customer_item("NOT_AN_ITEM")
370
+ assert_equal 0, result.customer_item_quantity_remaining("NOT_AN_ITEM")
371
+ assert_equal 0, result.customer_item_quantity_overage("NOT_AN_ITEM")
372
+ assert_equal 0, result.customer_item_quantity_overage_cost("NOT_AN_ITEM")
373
+
374
+ result = CG.get_customer(:id => result.customer[:id])
375
+ assert_equal true, result.valid?
376
+ assert_equal "5", result.customer[:code]
377
+
378
+ result = CG.get_customer(:id => "bad_id")
379
+ assert_equal false, result.valid?
380
+ assert_equal "Customer not found", result.error_message
381
+ end
382
+
383
+ should "delete a customer from cheddargetter" do
384
+ result = CG.delete_all_customers
385
+ assert_equal true, result.valid?
386
+
387
+ assert_raises(CheddarGetter::ClientException){ CG.delete_customer }
388
+
389
+ customer = CG.new_customer(paid_new_user_hash(1))
390
+ assert_equal true, customer.valid?
391
+
392
+ result = CG.delete_customer(:code => customer.customer[:code])
393
+ assert_equal true, result.valid?
394
+
395
+ result = CG.delete_customer(:code => customer.customer[:code])
396
+ assert_equal false, result.valid?
397
+ assert_equal "Customer not found", result.error_message
398
+
399
+ result = CG.delete_customer(:id => customer.customer[:id])
400
+ assert_equal false, result.valid?
401
+ assert_equal "Customer not found", result.error_message
402
+
403
+ customer = CG.new_customer(paid_new_user_hash(1))
404
+ assert_equal true, customer.valid?
405
+
406
+ result = CG.delete_customer(:id => customer.customer[:id])
407
+ assert_equal true, result.valid?
408
+
409
+ result = CG.delete_customer(:code => customer.customer[:code])
410
+ assert_equal false, result.valid?
411
+ assert_equal "Customer not found", result.error_message
412
+
413
+ result = CG.delete_customer(:id => customer.customer[:id])
414
+ assert_equal false, result.valid?
415
+ assert_equal "Customer not found", result.error_message
416
+ end
417
+
418
+ should "cancel a subscription" do
419
+ result = CG.delete_all_customers
420
+ assert_equal true, result.valid?
421
+
422
+ assert_raises(CheddarGetter::ClientException){ CG.cancel_subscription }
423
+
424
+ customer = CG.new_customer(paid_new_user_hash(1))
425
+ assert_equal true, customer.valid?
426
+ assert_equal false, customer.customer_canceled?
427
+
428
+ result = CG.cancel_subscription(:code => customer.customer[:code])
429
+ assert_equal true, result.valid?
430
+ assert_equal true, result.customer_canceled?
431
+
432
+ customer = CG.new_customer(paid_new_user_hash(2))
433
+ assert_equal true, customer.valid?
434
+ assert_equal false, customer.customer_canceled?
435
+
436
+ result = CG.cancel_subscription(:id => customer.customer[:id])
437
+ assert_equal true, result.valid?
438
+ assert_equal true, result.customer_canceled?
439
+ end
440
+
441
+ should "edit customer and subscription" do
442
+ result = CG.delete_all_customers
443
+ assert_equal true, result.valid?
444
+
445
+ assert_raises(CheddarGetter::ClientException){ CG.edit_customer }
446
+
447
+ result = CG.edit_customer(:code => 1)
448
+ assert_equal false, result.valid?
449
+ assert_equal "Customer not found", result.error_message
450
+
451
+ result = CG.edit_customer(:id => "not_a_valid_id")
452
+ assert_equal false, result.valid?
453
+ assert_equal "Customer not found", result.error_message
454
+
455
+ result = CG.new_customer(free_new_user_hash(1))
456
+ customer = result.customer
457
+ assert_equal true, result.valid?
458
+
459
+ result = CG.edit_customer(:code => customer[:code])
460
+ assert_equal true, result.valid?
461
+ assert_equal customer, result.customer
462
+
463
+ result = CG.edit_customer(:id => customer[:id])
464
+ assert_equal true, result.valid?
465
+ assert_equal customer, result.customer
466
+
467
+ result = CG.edit_customer({:code => customer[:code]}, {:firstName => "New",
468
+ :subscription => { :ccZip => "46268" }})
469
+ assert_equal true, result.valid?
470
+ assert_equal "New", result.customer[:firstName]
471
+ assert_equal "46268", result.customer_subscription[:ccZip]
472
+
473
+ #make them eqiv again, so we can do a full eqiv check
474
+ result.customer[:firstName] = customer[:firstName]
475
+ result.customer[:subscriptions][0][:ccZip] = customer[:subscriptions][0][:ccZip]
476
+ result.customer[:subscriptions][0][:invoices][0][:vatRate] = nil #not sure why this changes from nil to 0
477
+ result.customer[:modifiedDatetime] = customer[:modifiedDatetime]
478
+ assert_equal customer, result.customer
479
+
480
+ result = CG.edit_customer({:code => customer[:code]},
481
+ { :company => "EB", :subscription => paid_new_user_hash(1)[:subscription] })
482
+ assert_equal true, result.valid?
483
+ assert_equal "EB", result.customer[:company]
484
+ assert_equal 2, result.customer_subscriptions.count
485
+ assert_equal "11361", result.customer_subscription[:ccZip]
486
+ assert_equal "Test Plan 2", result.customer_plan[:name]
487
+ end
488
+
489
+ should "edit customer only" do
490
+ result = CG.delete_all_customers
491
+ assert_equal true, result.valid?
492
+
493
+ assert_raises(CheddarGetter::ClientException){ CG.edit_customer_only }
494
+
495
+ result = CG.edit_customer_only(:code => 1)
496
+ assert_equal false, result.valid?
497
+ assert_equal "Customer not found", result.error_message
498
+
499
+ result = CG.edit_customer_only(:id => "not_a_valid_id")
500
+ assert_equal false, result.valid?
501
+ assert_equal "Customer not found", result.error_message
502
+
503
+ result = CG.new_customer(free_new_user_hash(1))
504
+ customer = result.customer
505
+ assert_equal true, result.valid?
506
+
507
+ result = CG.edit_customer_only(:code => customer[:code])
508
+ assert_equal true, result.valid?
509
+ assert_equal customer, result.customer
510
+
511
+ result = CG.edit_customer_only(:id => customer[:id])
512
+ assert_equal true, result.valid?
513
+ assert_equal customer, result.customer
514
+
515
+ result = CG.edit_customer({:code => customer[:code]}, {
516
+ :firstName => "New",
517
+ :company => "EB"})
518
+ assert_equal true, result.valid?
519
+ assert_equal "New", result.customer[:firstName]
520
+ assert_equal "EB", result.customer[:company]
521
+
522
+ #make them eqiv again, so we can do a full eqiv check
523
+ result.customer[:firstName] = customer[:firstName]
524
+ result.customer[:company] = customer[:company]
525
+ result.customer[:modifiedDatetime] = customer[:modifiedDatetime]
526
+ result.customer[:subscriptions][0][:invoices][0][:vatRate] = nil #not sure why this changes from nil to 0
527
+ assert_equal customer, result.customer
528
+ end
529
+
530
+ should "edit subscription only" do
531
+ result = CG.delete_all_customers
532
+ assert_equal true, result.valid?
533
+
534
+ assert_raises(CheddarGetter::ClientException){ CG.edit_subscription }
535
+
536
+ result = CG.edit_subscription(:code => 1)
537
+ assert_equal false, result.valid?
538
+ assert_equal "Customer not found", result.error_message
539
+
540
+ result = CG.edit_subscription(:id => "not_a_valid_id")
541
+ assert_equal false, result.valid?
542
+ assert_equal "Customer not found", result.error_message
543
+
544
+ result = CG.new_customer(free_new_user_hash(1))
545
+ customer = result.customer
546
+ assert_equal true, result.valid?
547
+
548
+ result = CG.edit_subscription(:code => customer[:code])
549
+ assert_equal true, result.valid?
550
+ assert_equal customer, result.customer
551
+
552
+ result = CG.edit_subscription(:id => customer[:id])
553
+ assert_equal true, result.valid?
554
+ assert_equal customer, result.customer
555
+
556
+ result = CG.edit_subscription({:code => customer[:code]}, { :ccZip => "46268" })
557
+ assert_equal true, result.valid?
558
+ assert_equal "46268", result.customer_subscription[:ccZip]
559
+
560
+ #make them eqiv again, so we can do a full eqiv check
561
+ result.customer[:subscriptions][0][:ccZip] = customer[:subscriptions][0][:ccZip]
562
+ result.customer[:subscriptions][0][:invoices][0][:vatRate] = nil #not sure why this changes from nil to 0
563
+ result.customer[:modifiedDatetime] = customer[:modifiedDatetime]
564
+ assert_equal customer, result.customer
565
+
566
+ result = CG.edit_subscription({:code => customer[:code]}, paid_new_user_hash(1)[:subscription] )
567
+ assert_equal true, result.valid?
568
+ assert_equal 2, result.customer_subscriptions.count
569
+ assert_equal "11361", result.customer_subscription[:ccZip]
570
+ assert_equal "Test Plan 2", result.customer_plan[:name]
571
+ end
572
+
573
+ should "test item quantity calls" do
574
+
575
+ result = CG.delete_all_customers
576
+ assert_equal true, result.valid?
577
+
578
+ assert_raises(CheddarGetter::ClientException){ CG.add_item_quantity }
579
+ assert_raises(CheddarGetter::ClientException){ CG.remove_item_quantity }
580
+ assert_raises(CheddarGetter::ClientException){ CG.set_item_quantity }
581
+
582
+ #check that both are required
583
+ assert_raises(CheddarGetter::ClientException){ CG.add_item_quantity(:code => 1) }
584
+ assert_raises(CheddarGetter::ClientException){ CG.remove_item_quantity(:code => 1) }
585
+ assert_raises(CheddarGetter::ClientException){ CG.set_item_quantity(:code => 1) }
586
+ assert_raises(CheddarGetter::ClientException){ CG.add_item_quantity(:item_code => 1) }
587
+ assert_raises(CheddarGetter::ClientException){ CG.remove_item_quantity(:item_code => 1) }
588
+ assert_raises(CheddarGetter::ClientException){ CG.set_item_quantity(:item_code => 1) }
589
+
590
+ result = CG.add_item_quantity(:code => 1, :item_code => "TEST_ITEM_2")
591
+ assert_equal false, result.valid?
592
+ assert_equal "Customer not found", result.error_message
593
+
594
+ result = CG.add_item_quantity(:id => "not_a_valid_id", :item_code => "TEST_ITEM_2")
595
+ assert_equal false, result.valid?
596
+ assert_equal "Customer not found", result.error_message
597
+
598
+ result = CG.remove_item_quantity(:code => 1, :item_code => "TEST_ITEM_2")
599
+ assert_equal false, result.valid?
600
+ assert_equal "Customer not found", result.error_message
601
+
602
+ result = CG.remove_item_quantity(:id => "not_a_valid_id", :item_code => "TEST_ITEM_2")
603
+ assert_equal false, result.valid?
604
+ assert_equal "Customer not found", result.error_message
605
+
606
+ result = CG.set_item_quantity(:code => 1, :item_code => "TEST_ITEM_2")
607
+ assert_equal false, result.valid?
608
+ assert_equal "Customer not found", result.error_message
609
+
610
+ result = CG.set_item_quantity(:id => "not_a_valid_id", :item_code => "TEST_ITEM_2")
611
+ assert_equal false, result.valid?
612
+ assert_equal "Customer not found", result.error_message
613
+
614
+ result = CG.new_customer(paid_new_user_hash(1))
615
+ assert_equal true, result.valid?
616
+ assert_equal 0, result.customer_item("TEST_ITEM_2")[:quantity]
617
+ assert_equal 10, result.customer_item_quantity_remaining("TEST_ITEM_2")
618
+
619
+ result = CG.add_item_quantity(:code => 1, :item_code => "NOT_AN_ITEM")
620
+ assert_equal false, result.valid?
621
+ assert_equal "Item not found (code=NOT_AN_ITEM)", result.error_message
622
+
623
+ result = CG.add_item_quantity(:code => 1, :item_id => "NOT_AN_ITEM")
624
+ assert_equal false, result.valid?
625
+ assert_equal "Item not found (id=NOT_AN_ITEM)", result.error_message
626
+
627
+ result = CG.remove_item_quantity(:code => 1, :item_code => "NOT_AN_ITEM")
628
+ assert_equal false, result.valid?
629
+ assert_equal "Item not found (code=NOT_AN_ITEM)", result.error_message
630
+
631
+ result = CG.remove_item_quantity(:code => 1, :item_id => "NOT_AN_ITEM")
632
+ assert_equal false, result.valid?
633
+ assert_equal "Item not found (id=NOT_AN_ITEM)", result.error_message
634
+
635
+ result = CG.set_item_quantity(:code => 1, :item_code => "NOT_AN_ITEM")
636
+ assert_equal false, result.valid?
637
+ assert_equal "Item not found (code=NOT_AN_ITEM)", result.error_message
638
+
639
+ result = CG.set_item_quantity(:code => 1, :item_id => "NOT_AN_ITEM")
640
+ assert_equal false, result.valid?
641
+ assert_equal "Item not found (id=NOT_AN_ITEM)", result.error_message
642
+
643
+ result = CG.add_item_quantity(:code => 1, :item_code => "TEST_ITEM_2")
644
+ assert_equal true, result.valid?
645
+ assert_equal 1, result.customer_item("TEST_ITEM_2")[:quantity]
646
+ assert_equal 9, result.customer_item_quantity_remaining("TEST_ITEM_2")
647
+
648
+ result = CG.add_item_quantity({:code => 1, :item_code => "TEST_ITEM_2"}, { :quantity => 4 })
649
+ assert_equal true, result.valid?
650
+ assert_equal 5, result.customer_item("TEST_ITEM_2")[:quantity]
651
+ assert_equal 5, result.customer_item_quantity_remaining("TEST_ITEM_2")
652
+
653
+ result = CG.remove_item_quantity({:code => 1, :item_code => "TEST_ITEM_2"})
654
+ assert_equal true, result.valid?
655
+ assert_equal 4, result.customer_item("TEST_ITEM_2")[:quantity]
656
+ assert_equal 6, result.customer_item_quantity_remaining("TEST_ITEM_2")
657
+
658
+ result = CG.remove_item_quantity({:code => 1, :item_code => "TEST_ITEM_2"}, { :quantity => 4 })
659
+ assert_equal true, result.valid?
660
+ assert_equal 0, result.customer_item("TEST_ITEM_2")[:quantity]
661
+ assert_equal 10, result.customer_item_quantity_remaining("TEST_ITEM_2")
662
+
663
+ result = CG.set_item_quantity({:code => 1, :item_code => "TEST_ITEM_2"})
664
+ assert_equal false, result.valid?
665
+ assert_equal "A value is required: quantity", result.error_message
666
+
667
+ result = CG.set_item_quantity({:code => 1, :item_code => "TEST_ITEM_2"}, { :quantity => 6 })
668
+ assert_equal true, result.valid?
669
+ assert_equal 6, result.customer_item("TEST_ITEM_2")[:quantity]
670
+ assert_equal 4, result.customer_item_quantity_remaining("TEST_ITEM_2")
671
+
672
+ result = CG.set_item_quantity({:code => 1, :item_code => "TEST_ITEM_2"}, { :quantity => 0 })
673
+ assert_equal true, result.valid?
674
+ assert_equal 0, result.customer_item("TEST_ITEM_2")[:quantity]
675
+ assert_equal 10, result.customer_item_quantity_remaining("TEST_ITEM_2")
676
+
677
+ result = CG.set_item_quantity({:code => 1, :item_code => "TEST_ITEM_2"}, { :quantity => 15 })
678
+ assert_equal false, result.valid?
679
+ assert_equal "'15' is not less than or equal to '10': quantity", result.error_message
680
+
681
+ result = CG.set_item_quantity({:code => 1, :item_code => "TEST_ITEM_1"}, { :quantity => 15 })
682
+ assert_equal 15, result.customer_item("TEST_ITEM_1")[:quantity]
683
+ assert_equal -15, result.customer_item_quantity_remaining("TEST_ITEM_1")
684
+ assert_equal 15, result.customer_item_quantity_overage("TEST_ITEM_1")
685
+ assert_equal 37.5, result.customer_item_quantity_overage_cost("TEST_ITEM_1")
686
+ end
687
+
688
+ should "create charges against a customer" do
689
+
690
+ result = CG.delete_all_customers
691
+ assert_equal true, result.valid?
692
+
693
+ assert_raises(CheddarGetter::ClientException){ CG.add_charge }
694
+
695
+ result = CG.add_charge(:code => 1)
696
+ assert_equal false, result.valid?
697
+ assert_equal "Customer not found", result.error_message
698
+
699
+ result = CG.add_charge(:id => "not_a_valid_id")
700
+ assert_equal false, result.valid?
701
+ assert_equal "Customer not found", result.error_message
702
+
703
+ result = CG.new_customer(paid_new_user_hash(1))
704
+ assert_equal true, result.valid?
705
+
706
+ result = CG.add_charge(:code => 1)
707
+ assert_equal false, result.valid?
708
+ assert_equal "A value is required: chargeCode", result.error_message
709
+
710
+ result = CG.add_charge({:code => 1}, { :chargeCode => "MY_CHARGE" })
711
+ assert_equal false, result.valid?
712
+ assert_equal "A value is required: quantity", result.error_message
713
+
714
+ result = CG.add_charge({:code => 1}, { :chargeCode => "MY_CHARGE", :quantity => 1 })
715
+ assert_equal false, result.valid?
716
+ assert_equal "A value is required: eachAmount", result.error_message
717
+
718
+ result = CG.add_charge({:code => 1}, { :chargeCode => "MY_CHARGE", :quantity => 1, :eachAmount => 2 })
719
+ assert_equal true, result.valid?
720
+ charge = result.customer_invoice[:charges].detect{ |c| c[:code] == "MY_CHARGE" }
721
+ assert_equal 1, charge[:quantity]
722
+ assert_equal 2, charge[:eachAmount]
723
+ assert_equal nil, charge[:description]
724
+
725
+ result = CG.add_charge({:code => 1},
726
+ { :chargeCode => "MY_CREDIT", :quantity => 1,
727
+ :eachAmount => -2, :description => "Whoops" })
728
+ assert_equal true, result.valid?
729
+ charge = result.customer_invoice[:charges].detect{ |c| c[:code] == "MY_CREDIT" }
730
+ assert_equal 1, charge[:quantity]
731
+ assert_equal -2, charge[:eachAmount]
732
+ assert_equal "Whoops", charge[:description]
733
+
734
+ end
735
+
736
+ should "resubscribe after canceling" do
737
+ result = CG.delete_all_customers
738
+ assert_equal true, result.valid?
739
+
740
+ result = CG.new_customer(free_new_user_hash(1))
741
+ assert_equal true, result.valid?
742
+
743
+ result = CG.cancel_subscription(:code => result.customer[:code])
744
+ assert_equal true, result.valid?
745
+ assert_equal true, result.customer_canceled?
746
+
747
+ result = CG.edit_subscription({ :code => result.customer[:code] }, paid_new_user_hash(1)[:subscription])
748
+ assert_equal true, result.valid?
749
+ assert_equal false, result.customer_canceled?
750
+ assert_equal 2, result.customer_subscriptions.count
751
+ assert_equal "Test Plan 2", result.customer_plan[:name]
752
+ end
753
+
754
+ should "test customer get filtering" do
755
+ result = CG.delete_all_customers
756
+ assert_equal true, result.valid?
757
+
758
+ result = CG.new_customer(free_new_user_hash(1))
759
+ assert_equal true, result.valid?
760
+
761
+ result = CG.new_customer(free_new_user_hash(2))
762
+ assert_equal true, result.valid?
763
+ result = CG.cancel_subscription(:code => 2)
764
+ assert_equal true, result.valid?
765
+ assert_equal true, result.customer_canceled?
766
+
767
+
768
+ result = CG.new_customer(paid_new_user_hash(3))
769
+ assert_equal true, result.valid?
770
+
771
+ result = CG.new_customer(paid_new_user_hash(4))
772
+ assert_equal true, result.valid?
773
+ result = CG.cancel_subscription(:code => 4)
774
+ assert_equal true, result.valid?
775
+ assert_equal true, result.customer_canceled?
776
+
777
+ result = CG.get_customers
778
+ assert_equal true, result.valid?
779
+ assert_equal 4, result.customers.count
780
+ assert_equal "1", result.customer(1)[:code]
781
+ assert_equal "2", result.customer(2)[:code]
782
+ assert_equal "3", result.customer(3)[:code]
783
+ assert_equal "4", result.customer(4)[:code]
784
+
785
+ result = CG.get_customers(:subscriptionStatus => "activeOnly")
786
+ assert_equal true, result.valid?
787
+ assert_equal 2, result.customers.count
788
+ assert_equal "1", result.customer(1)[:code]
789
+ assert_equal nil, result.customer(2)
790
+ assert_equal "3", result.customer(3)[:code]
791
+ assert_equal nil, result.customer(4)
792
+
793
+ result = CG.get_customers(:subscriptionStatus => "canceledOnly")
794
+ assert_equal true, result.valid?
795
+ assert_equal 2, result.customers.count
796
+ assert_equal nil, result.customer(1)
797
+ assert_equal "2", result.customer(2)[:code]
798
+ assert_equal nil, result.customer(3)
799
+ assert_equal "4", result.customer(4)[:code]
800
+
801
+ result = CG.get_customers(:planCode => "TEST_PLAN_1")
802
+ assert_equal false, result.valid?
803
+ assert_equal "No customers found.", result.error_message
804
+
805
+ result = CG.get_customers(:planCode => ["TEST_PLAN_1", "TEST_PLAN_2", "FREE_PLAN_TEST"])
806
+ assert_equal true, result.valid?
807
+ assert_equal 4, result.customers.count
808
+
809
+ result = CG.get_customers(:planCode => "FREE_PLAN_TEST")
810
+ assert_equal true, result.valid?
811
+ assert_equal 2, result.customers.count
812
+
813
+ result = CG.get_customers(:planCode => "FREE_PLAN_TEST", :subscriptionStatus => "canceledOnly")
814
+ assert_equal true, result.valid?
815
+ assert_equal 1, result.customers.count
816
+
817
+ result = CG.get_customers(:canceledAfterDate => Date.today)
818
+ assert_equal true, result.valid?
819
+ assert_equal 2, result.customers.count
820
+
821
+ result = CG.get_customers(:createdAfterDate => Date.today)
822
+ assert_equal true, result.valid?
823
+ assert_equal 4, result.customers.count
824
+
825
+ result = CG.get_customers(:search => "First")
826
+ assert_equal true, result.valid?
827
+ assert_equal 4, result.customers.count
828
+
829
+ result = CG.get_customers(:search => "NotFirst")
830
+ assert_equal false, result.valid?
831
+ assert_equal "No customers found.", result.error_message
832
+ end
833
+
834
+ should "get 100% code coverage :)" do
835
+ result = CG.delete_all_customers
836
+ assert_equal true, result.valid?
837
+
838
+ data = { :test => "string" }
839
+
840
+ CheddarGetter::Client::FIX_UP_KEYS[:test] = :nope
841
+ CG.send(:deep_fix_request_data!, data)
842
+ assert_equal "string", data[:test]
843
+ CheddarGetter::Client::FIX_UP_KEYS.delete(:test)
844
+
845
+ CheddarGetter::Response::KEY_TO_DATA_TYPE[:test] = :nope
846
+ response = CG.get_customers
847
+ response.send(:deep_fix_data_types!, data)
848
+ assert_equal "string", data[:test]
849
+ CheddarGetter::Response::KEY_TO_DATA_TYPE.delete(:test)
850
+ end
851
+
852
+ end