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.
- 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
|