cheddargetter_client_ruby 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +32 -0
- data/LICENSE.txt +21 -0
- data/README.rdoc +68 -0
- data/Rakefile +49 -0
- data/VERSION +1 -0
- data/cheddargetter_client_ruby.gemspec +79 -0
- data/example/README +9 -0
- data/example/example.rb +122 -0
- data/lib/cheddar_getter/client.rb +385 -0
- data/lib/cheddar_getter/client_exception.rb +4 -0
- data/lib/cheddar_getter/response.rb +333 -0
- data/lib/cheddar_getter/response_exception.rb +4 -0
- data/lib/cheddargetter_client_ruby.rb +9 -0
- data/test/helper.rb +24 -0
- data/test/test_cheddargetter_client_ruby.rb +852 -0
- metadata +190 -0
@@ -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,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
|