cheddargetter_client_ruby 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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