ticketevolution-ruby 0.5.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/.gitignore +8 -0
- data/.rdebugrc +1 -0
- data/.rspec +2 -0
- data/.travis.yml +6 -0
- data/Gemfile +7 -0
- data/LICENSE +23 -0
- data/README.markdown +237 -0
- data/Rakefile +124 -0
- data/examples/events.rb +64 -0
- data/lib/docs/endpoints.markdown +47 -0
- data/lib/docs/installation.markdown +5 -0
- data/lib/docs/introduction.markdown +16 -0
- data/lib/docs/objects.markdown +40 -0
- data/lib/ticket_evolution/account.rb +4 -0
- data/lib/ticket_evolution/accounts.rb +6 -0
- data/lib/ticket_evolution/address.rb +4 -0
- data/lib/ticket_evolution/brokerage.rb +4 -0
- data/lib/ticket_evolution/brokerages.rb +7 -0
- data/lib/ticket_evolution/categories.rb +7 -0
- data/lib/ticket_evolution/category.rb +4 -0
- data/lib/ticket_evolution/client.rb +4 -0
- data/lib/ticket_evolution/clients/addresses.rb +10 -0
- data/lib/ticket_evolution/clients/credit_cards.rb +8 -0
- data/lib/ticket_evolution/clients/email_addresses.rb +10 -0
- data/lib/ticket_evolution/clients/phone_numbers.rb +10 -0
- data/lib/ticket_evolution/clients.rb +8 -0
- data/lib/ticket_evolution/configuration.rb +4 -0
- data/lib/ticket_evolution/configurations.rb +6 -0
- data/lib/ticket_evolution/core/api_error.rb +11 -0
- data/lib/ticket_evolution/core/base.rb +12 -0
- data/lib/ticket_evolution/core/builder.rb +74 -0
- data/lib/ticket_evolution/core/collection.rb +32 -0
- data/lib/ticket_evolution/core/connection.rb +99 -0
- data/lib/ticket_evolution/core/datum.rb +7 -0
- data/lib/ticket_evolution/core/endpoint/request_handler.rb +46 -0
- data/lib/ticket_evolution/core/endpoint.rb +51 -0
- data/lib/ticket_evolution/core/model.rb +64 -0
- data/lib/ticket_evolution/core/models/samples.rb +8 -0
- data/lib/ticket_evolution/core/samples.rb +6 -0
- data/lib/ticket_evolution/core/singular_class.rb +7 -0
- data/lib/ticket_evolution/core/time.rb +19 -0
- data/lib/ticket_evolution/credit_card.rb +4 -0
- data/lib/ticket_evolution/email_address.rb +4 -0
- data/lib/ticket_evolution/errors/connection_not_found.rb +4 -0
- data/lib/ticket_evolution/errors/endpoint_configuration_error.rb +5 -0
- data/lib/ticket_evolution/errors/invalid_configuration.rb +4 -0
- data/lib/ticket_evolution/errors/method_unavailable_error.rb +4 -0
- data/lib/ticket_evolution/event.rb +4 -0
- data/lib/ticket_evolution/events.rb +7 -0
- data/lib/ticket_evolution/modules/create.rb +18 -0
- data/lib/ticket_evolution/modules/deleted.rb +13 -0
- data/lib/ticket_evolution/modules/list.rb +15 -0
- data/lib/ticket_evolution/modules/search.rb +13 -0
- data/lib/ticket_evolution/modules/show.rb +20 -0
- data/lib/ticket_evolution/modules/update.rb +24 -0
- data/lib/ticket_evolution/office.rb +4 -0
- data/lib/ticket_evolution/offices.rb +7 -0
- data/lib/ticket_evolution/order.rb +15 -0
- data/lib/ticket_evolution/orders.rb +30 -0
- data/lib/ticket_evolution/performer.rb +4 -0
- data/lib/ticket_evolution/performers.rb +8 -0
- data/lib/ticket_evolution/phone_number.rb +4 -0
- data/lib/ticket_evolution/quote.rb +4 -0
- data/lib/ticket_evolution/quotes.rb +7 -0
- data/lib/ticket_evolution/search.rb +22 -0
- data/lib/ticket_evolution/shipment.rb +4 -0
- data/lib/ticket_evolution/shipments.rb +8 -0
- data/lib/ticket_evolution/ticket_group.rb +4 -0
- data/lib/ticket_evolution/ticket_groups.rb +6 -0
- data/lib/ticket_evolution/user.rb +4 -0
- data/lib/ticket_evolution/users.rb +7 -0
- data/lib/ticket_evolution/venue.rb +4 -0
- data/lib/ticket_evolution/venues.rb +8 -0
- data/lib/ticket_evolution/version.rb +3 -0
- data/lib/ticket_evolution.rb +108 -0
- data/spec/fixtures/fake.rb +97 -0
- data/spec/fixtures/net/endpoints/accounts.yml +175 -0
- data/spec/fixtures/net/endpoints/brokerages.yml +257 -0
- data/spec/fixtures/net/endpoints/categories.yml +85 -0
- data/spec/fixtures/net/endpoints/clients.yml +243 -0
- data/spec/fixtures/net/endpoints/search.yml +93 -0
- data/spec/lib/ticket_evolution/account_spec.rb +7 -0
- data/spec/lib/ticket_evolution/accounts_spec.rb +45 -0
- data/spec/lib/ticket_evolution/address_spec.rb +7 -0
- data/spec/lib/ticket_evolution/brokerage_spec.rb +7 -0
- data/spec/lib/ticket_evolution/brokerages_spec.rb +50 -0
- data/spec/lib/ticket_evolution/categories_spec.rb +27 -0
- data/spec/lib/ticket_evolution/category_spec.rb +7 -0
- data/spec/lib/ticket_evolution/client_spec.rb +7 -0
- data/spec/lib/ticket_evolution/clients/addresses_spec.rb +13 -0
- data/spec/lib/ticket_evolution/clients/credit_cards_spec.rb +11 -0
- data/spec/lib/ticket_evolution/clients/email_addresses_spec.rb +13 -0
- data/spec/lib/ticket_evolution/clients/phone_numbers_spec.rb +13 -0
- data/spec/lib/ticket_evolution/clients_spec.rb +37 -0
- data/spec/lib/ticket_evolution/configuration_spec.rb +7 -0
- data/spec/lib/ticket_evolution/configurations_spec.rb +10 -0
- data/spec/lib/ticket_evolution/core/api_error_spec.rb +13 -0
- data/spec/lib/ticket_evolution/core/base_spec.rb +29 -0
- data/spec/lib/ticket_evolution/core/builder_spec.rb +95 -0
- data/spec/lib/ticket_evolution/core/collection_spec.rb +23 -0
- data/spec/lib/ticket_evolution/core/connection_spec.rb +220 -0
- data/spec/lib/ticket_evolution/core/datum_spec.rb +15 -0
- data/spec/lib/ticket_evolution/core/endpoint_spec.rb +12 -0
- data/spec/lib/ticket_evolution/core/model_spec.rb +167 -0
- data/spec/lib/ticket_evolution/core/time_spec.rb +28 -0
- data/spec/lib/ticket_evolution/credit_card_spec.rb +7 -0
- data/spec/lib/ticket_evolution/email_address_spec.rb +7 -0
- data/spec/lib/ticket_evolution/errors/connection_not_found_spec.rb +7 -0
- data/spec/lib/ticket_evolution/errors/endpoint_configuration_error_spec.rb +8 -0
- data/spec/lib/ticket_evolution/errors/invalid_configuration_spec.rb +8 -0
- data/spec/lib/ticket_evolution/errors/method_unavailable_error_spec.rb +7 -0
- data/spec/lib/ticket_evolution/event_spec.rb +7 -0
- data/spec/lib/ticket_evolution/events_spec.rb +11 -0
- data/spec/lib/ticket_evolution/office_spec.rb +7 -0
- data/spec/lib/ticket_evolution/offices_spec.rb +11 -0
- data/spec/lib/ticket_evolution/order_spec.rb +44 -0
- data/spec/lib/ticket_evolution/orders_spec.rb +123 -0
- data/spec/lib/ticket_evolution/performer_spec.rb +7 -0
- data/spec/lib/ticket_evolution/performers_spec.rb +12 -0
- data/spec/lib/ticket_evolution/phone_number_spec.rb +7 -0
- data/spec/lib/ticket_evolution/quote_spec.rb +7 -0
- data/spec/lib/ticket_evolution/quotes_spec.rb +11 -0
- data/spec/lib/ticket_evolution/search_spec.rb +31 -0
- data/spec/lib/ticket_evolution/shipment_spec.rb +7 -0
- data/spec/lib/ticket_evolution/shipments_spec.rb +13 -0
- data/spec/lib/ticket_evolution/ticket_group_spec.rb +7 -0
- data/spec/lib/ticket_evolution/ticket_groups_spec.rb +14 -0
- data/spec/lib/ticket_evolution/user_spec.rb +7 -0
- data/spec/lib/ticket_evolution/users_spec.rb +15 -0
- data/spec/lib/ticket_evolution/venue_spec.rb +7 -0
- data/spec/lib/ticket_evolution/venues_spec.rb +12 -0
- data/spec/lib/ticket_evolution_spec.rb +20 -0
- data/spec/shared_examples/endpoints/class.rb +241 -0
- data/spec/shared_examples/endpoints/create.rb +41 -0
- data/spec/shared_examples/endpoints/deleted.rb +41 -0
- data/spec/shared_examples/endpoints/list.rb +41 -0
- data/spec/shared_examples/endpoints/search.rb +42 -0
- data/spec/shared_examples/endpoints/show.rb +38 -0
- data/spec/shared_examples/endpoints/update.rb +59 -0
- data/spec/shared_examples/errors.rb +5 -0
- data/spec/shared_examples/models.rb +29 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/support/connection.rb +10 -0
- data/spec/support/vcr.rb +12 -0
- data/ticketevolution-ruby.gemspec +33 -0
- metadata +384 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe TicketEvolution do
|
|
4
|
+
subject{ TicketEvolution }
|
|
5
|
+
|
|
6
|
+
it "should specify a version" do
|
|
7
|
+
subject::VERSION.should be
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe ".root" do
|
|
11
|
+
subject { TicketEvolution.root }
|
|
12
|
+
|
|
13
|
+
it { should be_a Pathname }
|
|
14
|
+
|
|
15
|
+
it "should end in 'ticket_evolution'" do
|
|
16
|
+
subject.to_s.should =~ /ticket_evolution$/
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
shared_examples_for "a ticket_evolution endpoint class" do
|
|
4
|
+
let(:connection) { TicketEvolution::Connection.new({:token => Fake.token, :secret => Fake.secret}) }
|
|
5
|
+
let(:sample_parent) { TicketEvolution::Samples.new }
|
|
6
|
+
let(:curl) { double(:curl, :http => nil) }
|
|
7
|
+
let(:instance) { klass.new({:parent => connection}) }
|
|
8
|
+
let(:path) { '/search' }
|
|
9
|
+
let(:full_path) { "#{instance.base_path}#{path}" }
|
|
10
|
+
|
|
11
|
+
describe "#initialize" do
|
|
12
|
+
context "with an options hash for it's first parameter" do
|
|
13
|
+
it "should create accessors for each key value pair" do
|
|
14
|
+
instance = klass.new({
|
|
15
|
+
:parent => connection,
|
|
16
|
+
:test => :one,
|
|
17
|
+
:testing => "two",
|
|
18
|
+
:number => 3,
|
|
19
|
+
:hash => {}
|
|
20
|
+
})
|
|
21
|
+
instance.parent.should == connection
|
|
22
|
+
instance.test.should == :one
|
|
23
|
+
instance.testing.should == "two"
|
|
24
|
+
instance.number.should == 3
|
|
25
|
+
instance.hash.should == {}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context "with a parent k/v pair" do
|
|
29
|
+
context "that does not inherit from TicketEvolution::Base" do
|
|
30
|
+
it "should raise an EndpointConfigurationError" do
|
|
31
|
+
message = "#{klass} instances require a parent which inherits from TicketEvolution::Base"
|
|
32
|
+
expect {
|
|
33
|
+
klass.new({:parent => Object.new})
|
|
34
|
+
}.to raise_error TicketEvolution::EndpointConfigurationError, message
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context "that does inherit from TicketEvolution::Base" do
|
|
39
|
+
context "and is a TicketEvolution::Connection object" do
|
|
40
|
+
it "should not raise" do
|
|
41
|
+
expect { klass.new({:parent => connection}) }.to_not raise_error
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context "and has a TicketEvolution::Connection object in it's parent chain" do
|
|
46
|
+
let(:sample_chain) do
|
|
47
|
+
TicketEvolution::Endpoint.new({
|
|
48
|
+
:parent => TicketEvolution::Endpoint.new({
|
|
49
|
+
:parent => connection
|
|
50
|
+
})
|
|
51
|
+
})
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should not raise" do
|
|
55
|
+
expect { klass.new({:parent => klass.new({:parent => sample_chain})}) }.to_not raise_error
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context "and does not have a TicketEvolution::Connection object in it's parent chain" do
|
|
60
|
+
it "should raise an EndpointConfigurationError" do
|
|
61
|
+
message = "The parent passed in the options hash must be a TicketEvolution::Connection object or have one in it's parent chain"
|
|
62
|
+
expect {
|
|
63
|
+
klass.new({:parent => sample_parent})
|
|
64
|
+
}.to raise_error TicketEvolution::EndpointConfigurationError, message
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
context "without a parent k/v pair" do
|
|
71
|
+
it "should raise an EndpointConfigurationError" do
|
|
72
|
+
message = "The options hash must include a parent key / value pair"
|
|
73
|
+
expect {
|
|
74
|
+
klass.new({})
|
|
75
|
+
}.to raise_error TicketEvolution::EndpointConfigurationError, message
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "with no first parameter or a non hash object" do
|
|
81
|
+
it "should raise an EndpointConfigurationError" do
|
|
82
|
+
message = "#{klass} instances require a hash as their first parameter"
|
|
83
|
+
expect { klass.new }.to raise_error TicketEvolution::EndpointConfigurationError, message
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
describe "#base_path" do
|
|
89
|
+
let(:endpoint_name) { klass.name.demodulize.underscore }
|
|
90
|
+
|
|
91
|
+
context "when #parent is a TicketEvolution::Connection object" do
|
|
92
|
+
let(:path) { "/#{endpoint_name}" }
|
|
93
|
+
|
|
94
|
+
it "should be generated based on its class name" do
|
|
95
|
+
klass.new({:parent => connection}).base_path.should == path
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
context "when #parent is not a TicketEvolution::Connection object" do
|
|
100
|
+
let(:instance) { klass.new({:parent => connection, :id => 1}) }
|
|
101
|
+
let(:path) { "/#{instance.endpoint_name}/#{instance.id}/#{endpoint_name}" }
|
|
102
|
+
it "should be generated based on its class name and the class names of its parents" do
|
|
103
|
+
klass.new({:parent => instance}).base_path.should == path
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
describe "#connection" do
|
|
109
|
+
context "the connection object is the parent" do
|
|
110
|
+
subject { klass.new({:parent => connection}) }
|
|
111
|
+
|
|
112
|
+
its(:connection) { should == connection }
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context "the connection object is not the parent" do
|
|
116
|
+
subject { klass.new({:parent => TicketEvolution::Endpoint.new({:parent => connection})}) }
|
|
117
|
+
|
|
118
|
+
its(:connection) { should == connection }
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
describe "#build_request" do
|
|
123
|
+
|
|
124
|
+
context "which is valid" do
|
|
125
|
+
context "with params" do
|
|
126
|
+
let(:params) do
|
|
127
|
+
{
|
|
128
|
+
:page => 1,
|
|
129
|
+
:per_page => 10,
|
|
130
|
+
:name => "test"
|
|
131
|
+
}
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
[:GET, :POST, :PUT, :DELETE].each do |method|
|
|
135
|
+
it "should accept an http '#{method}' method, a url path for the call and a list of parameters as a hash and pass them to connection" do
|
|
136
|
+
connection.should_receive(:build_request).with(method, full_path, params).and_return(curl)
|
|
137
|
+
|
|
138
|
+
instance.build_request(method, path, params)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
context "without params" do
|
|
144
|
+
[:GET, :POST, :PUT, :DELETE].each do |method|
|
|
145
|
+
it "should accept an http '#{method}' method and a url path for the call and pass them to connection" do
|
|
146
|
+
connection.should_receive(:build_request).with(method, full_path, nil).and_return(curl)
|
|
147
|
+
|
|
148
|
+
instance.build_request(method, path)
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
context "given an invalid http method" do
|
|
155
|
+
it "should raise a EndpointConfigurationError" do
|
|
156
|
+
message = "#{klass.to_s}#request requires it's first parameter to be a valid HTTP method"
|
|
157
|
+
|
|
158
|
+
expect { instance.request('BAD', path) }.to raise_error TicketEvolution::EndpointConfigurationError, message
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
describe "#request" do
|
|
164
|
+
subject { instance.request method, full_path }
|
|
165
|
+
let(:method) { :GET }
|
|
166
|
+
let(:response) { Fake.response }
|
|
167
|
+
let(:handler) { Fake.send(:method, :response_handler) }
|
|
168
|
+
|
|
169
|
+
before do
|
|
170
|
+
connection.should_receive(:build_request).and_return(curl)
|
|
171
|
+
instance.should_receive(:naturalize_response).and_return(response)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
it "calls http on the return Curl object with the method for the request" do
|
|
175
|
+
curl.should_receive(:http).with(method)
|
|
176
|
+
|
|
177
|
+
instance.request(method, path, nil, &handler).should == Fake.response_handler(true)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
context "when there is an error from the api" do
|
|
181
|
+
let(:response) { Fake.error_response }
|
|
182
|
+
|
|
183
|
+
before { curl.should_receive(:http) }
|
|
184
|
+
|
|
185
|
+
it "should return an instance of TicketEvolution::ApiError" do
|
|
186
|
+
subject.should be_a TicketEvolution::ApiError
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
context "when successful" do
|
|
191
|
+
let(:response) { Fake.response }
|
|
192
|
+
|
|
193
|
+
before { curl.should_receive(:http) }
|
|
194
|
+
|
|
195
|
+
it "should pass the response object to #build_object" do
|
|
196
|
+
instance.request(method, path, nil, &handler).should == Fake.response_handler(true)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
describe "#naturalize_response" do
|
|
202
|
+
let(:path) { '/list' }
|
|
203
|
+
let(:instance) { klass.new({:parent => connection}) }
|
|
204
|
+
let(:full_path) { "#{instance.base_path}#{path}" }
|
|
205
|
+
let(:response_code) { 200 }
|
|
206
|
+
let(:response) { mock(:response, {
|
|
207
|
+
:header_str => "header",
|
|
208
|
+
:response_code => response_code,
|
|
209
|
+
:body_str => body_str
|
|
210
|
+
}) }
|
|
211
|
+
|
|
212
|
+
context "with a valid body" do
|
|
213
|
+
subject { instance.naturalize_response response }
|
|
214
|
+
let(:body_str) { "{\"test\": \"hello\"}" }
|
|
215
|
+
|
|
216
|
+
its(:header) { should == response.header_str }
|
|
217
|
+
its(:body) { should == MultiJson.decode(response.body_str).merge({:connection => connection}) }
|
|
218
|
+
|
|
219
|
+
TicketEvolution::Endpoint::RequestHandler::CODES.each do |code, value|
|
|
220
|
+
context "with response code #{code}" do
|
|
221
|
+
let(:response_code) { code }
|
|
222
|
+
|
|
223
|
+
its(:response_code) { should == code }
|
|
224
|
+
its(:server_message) { should == value.last }
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
context "#endpoint_name" do
|
|
231
|
+
it "returns the demodulized version of the endpoint name" do
|
|
232
|
+
instance.endpoint_name.should == klass.name.demodulize.underscore
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
context "#singular_class" do
|
|
237
|
+
it "returns the singular version of an Endpoint class" do
|
|
238
|
+
instance.singular_class.should == single_klass
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
shared_examples_for "a create endpoint" do
|
|
4
|
+
let(:connection) { TicketEvolution::Connection.new({:token => Fake.token, :secret => Fake.secret}) }
|
|
5
|
+
let(:builder_klass) { "TicketEvolution::#{klass.to_s.split('::').last.singularize.camelize}".constantize }
|
|
6
|
+
let(:instance) { klass.new({:parent => connection}) }
|
|
7
|
+
|
|
8
|
+
describe "#create" do
|
|
9
|
+
context "with params" do
|
|
10
|
+
let(:params) { {:name => "Bob"} }
|
|
11
|
+
|
|
12
|
+
it "should pass call request as a POST, passing params" do
|
|
13
|
+
instance.should_receive(:request).with(:POST, nil, instance.endpoint_name.to_sym => [params])
|
|
14
|
+
|
|
15
|
+
instance.create(params)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context "without params" do
|
|
20
|
+
it "should pass call request as a POST, without params" do
|
|
21
|
+
instance.should_receive(:request).with(:POST, nil, nil)
|
|
22
|
+
|
|
23
|
+
instance.create
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "#build_for_create" do
|
|
29
|
+
let(:response) { Fake.create_response instance.endpoint_name, connection }
|
|
30
|
+
|
|
31
|
+
it "should invoke an instance of its builder class" do
|
|
32
|
+
builder_klass.should_receive(:new).with(response.body[instance.endpoint_name].first.merge({
|
|
33
|
+
:status_code => response.response_code,
|
|
34
|
+
:server_message => response.server_message,
|
|
35
|
+
:connection => connection
|
|
36
|
+
}))
|
|
37
|
+
|
|
38
|
+
instance.build_for_create(response)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
shared_examples_for "a deleted endpoint" do
|
|
4
|
+
let(:connection) { TicketEvolution::Connection.new({:token => Fake.token, :secret => Fake.secret}) }
|
|
5
|
+
let(:instance) { klass.new({:parent => connection}) }
|
|
6
|
+
|
|
7
|
+
describe "#deleted" do
|
|
8
|
+
context "with params" do
|
|
9
|
+
let(:params) { {:page => 2, :per_page => 2} }
|
|
10
|
+
|
|
11
|
+
it "should pass call request as a GET, passing params" do
|
|
12
|
+
instance.should_receive(:request).with(:GET, '/deleted', params)
|
|
13
|
+
|
|
14
|
+
instance.deleted(params)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "without params" do
|
|
19
|
+
it "should pass call request as a GET, passing params" do
|
|
20
|
+
instance.should_receive(:request).with(:GET, '/deleted', nil)
|
|
21
|
+
|
|
22
|
+
instance.deleted
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context "#build_for_deleted" do
|
|
28
|
+
let(:response) { Fake.list_response }
|
|
29
|
+
|
|
30
|
+
it "invokes Collection#build_from_response" do
|
|
31
|
+
TicketEvolution::Collection.
|
|
32
|
+
should_receive(:build_from_response).
|
|
33
|
+
with(response, klass.name.demodulize.underscore, instance.singular_class)
|
|
34
|
+
instance.build_for_deleted(response)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "returns a collection" do
|
|
38
|
+
instance.build_for_deleted(response).should be_a TicketEvolution::Collection
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
shared_examples_for "a list endpoint" do
|
|
4
|
+
let(:connection) { TicketEvolution::Connection.new({:token => Fake.token, :secret => Fake.secret}) }
|
|
5
|
+
let(:instance) { klass.new({:parent => connection}) }
|
|
6
|
+
|
|
7
|
+
describe "#list" do
|
|
8
|
+
context "with params" do
|
|
9
|
+
let(:params) { {:page => 2, :per_page => 2} }
|
|
10
|
+
|
|
11
|
+
it "should pass call request as a GET, passing params" do
|
|
12
|
+
instance.should_receive(:request).with(:GET, nil, params)
|
|
13
|
+
|
|
14
|
+
instance.list(params)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "without params" do
|
|
19
|
+
it "should pass call request as a GET, passing params" do
|
|
20
|
+
instance.should_receive(:request).with(:GET, nil, nil)
|
|
21
|
+
|
|
22
|
+
instance.list
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context "#build_for_list" do
|
|
28
|
+
let(:response) { Fake.list_response }
|
|
29
|
+
|
|
30
|
+
it "invokes Collection#build_from_response" do
|
|
31
|
+
TicketEvolution::Collection.
|
|
32
|
+
should_receive(:build_from_response).
|
|
33
|
+
with(response, klass.name.demodulize.underscore, instance.singular_class)
|
|
34
|
+
instance.build_for_list(response)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "returns a collection" do
|
|
38
|
+
instance.build_for_list(response).should be_a TicketEvolution::Collection
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
shared_examples_for "a search endpoint" do
|
|
4
|
+
let(:connection) { TicketEvolution::Connection.new({:token => Fake.token, :secret => Fake.secret}) }
|
|
5
|
+
let(:instance) { klass.new({:parent => connection}) }
|
|
6
|
+
|
|
7
|
+
describe "#search" do
|
|
8
|
+
context "with params" do
|
|
9
|
+
let(:params) { {:page => 2, :per_page => 2, :q => "test"} }
|
|
10
|
+
|
|
11
|
+
it "should pass call request as a GET, passing params" do
|
|
12
|
+
instance.should_receive(:request).with(:GET, '/search', params)
|
|
13
|
+
|
|
14
|
+
instance.search(params)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "without params" do
|
|
19
|
+
it "should pass call request as a GET, passing params" do
|
|
20
|
+
instance.should_receive(:request).with(:GET, '/search', nil)
|
|
21
|
+
|
|
22
|
+
instance.search
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context "#build_for_search" do
|
|
28
|
+
let(:response) { Fake.list_response }
|
|
29
|
+
|
|
30
|
+
it "invokes Collection#build_from_response" do
|
|
31
|
+
TicketEvolution::Collection.
|
|
32
|
+
should_receive(:build_from_response).
|
|
33
|
+
with(response, klass.name.demodulize.underscore, instance.singular_class)
|
|
34
|
+
instance.build_for_search(response)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "returns a collection" do
|
|
38
|
+
instance.build_for_search(response).should be_a TicketEvolution::Collection
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
shared_examples_for "a show endpoint" do
|
|
4
|
+
let(:connection) { TicketEvolution::Connection.new({:token => Fake.token, :secret => Fake.secret}) }
|
|
5
|
+
let(:builder_klass) { "TicketEvolution::#{klass.to_s.split('::').last.singularize.camelize}".constantize }
|
|
6
|
+
let(:instance) { klass.new({:parent => connection}) }
|
|
7
|
+
|
|
8
|
+
describe "#show" do
|
|
9
|
+
context "with id" do
|
|
10
|
+
let(:id) { 1 }
|
|
11
|
+
|
|
12
|
+
it "should pass call request as a GET, passing the id as a piece of the path" do
|
|
13
|
+
instance.should_receive(:request).with(:GET, "/#{id}")
|
|
14
|
+
|
|
15
|
+
instance.show(id)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context "without id" do
|
|
20
|
+
it "should raise an ArgumentError" do
|
|
21
|
+
expect { instance.show }.to raise_error ArgumentError
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "#build_for_show" do
|
|
27
|
+
let(:response) { Fake.show_response }
|
|
28
|
+
|
|
29
|
+
it "should invoke an instance of its builder class" do
|
|
30
|
+
builder_klass.should_receive(:new).with(response.body.merge({
|
|
31
|
+
:status_code => response.response_code,
|
|
32
|
+
:server_message => response.server_message})
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
instance.build_for_show(response)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
shared_examples_for "an update endpoint" do
|
|
4
|
+
let(:connection) { TicketEvolution::Connection.new({:token => Fake.token, :secret => Fake.secret}) }
|
|
5
|
+
let(:instance) { klass.new({:parent => connection}) }
|
|
6
|
+
|
|
7
|
+
describe "#update" do
|
|
8
|
+
context "with an id" do
|
|
9
|
+
let(:instance) { klass.new({:parent => connection, :id => 1}) }
|
|
10
|
+
|
|
11
|
+
context "with params" do
|
|
12
|
+
let(:params) { {:name => "Bob"} }
|
|
13
|
+
|
|
14
|
+
it "should pass call request as a PUT, passing params" do
|
|
15
|
+
instance.should_receive(:request).with(:PUT, "/#{instance.id}", params)
|
|
16
|
+
|
|
17
|
+
instance.update(params)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context "without params" do
|
|
22
|
+
it "should pass call request as a PUT, passing params" do
|
|
23
|
+
instance.should_receive(:request).with(:PUT, "/#{instance.id}", nil)
|
|
24
|
+
|
|
25
|
+
instance.update
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context "without an id" do
|
|
31
|
+
it "should raise an UnavailableMethodError if there is no id" do
|
|
32
|
+
message = "#{klass.to_s}#update can only be called if there is an id present on this #{klass.to_s} instance"
|
|
33
|
+
expect { instance.update }.to raise_error TicketEvolution::MethodUnavailableError, message
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe ".included" do
|
|
39
|
+
let(:model_klass) { instance.singular_class }
|
|
40
|
+
let(:model_instance) { model_klass.new(attributes.merge({:connection => connection})) }
|
|
41
|
+
let(:attributes) { HashWithIndifferentAccess.new(update_base.merge({:one => 1, :two => "two", :three => nil, :id => 1})) }
|
|
42
|
+
let(:stored_attributes) { attributes.delete_if{|k, v| k == 'id'} }
|
|
43
|
+
let(:updated_attributes) { HashWithIndifferentAccess.new({:one => "one", :three => 3}) }
|
|
44
|
+
let(:merged_attributes) { attributes.merge(updated_attributes) }
|
|
45
|
+
|
|
46
|
+
it "should set an update_attributes method on it's corresponding TE:Model class which adds to it's attributes and calls #update" do
|
|
47
|
+
model_instance.should respond_to :update_attributes
|
|
48
|
+
klass.any_instance.should_receive(:update).with(updated_attributes).and_return(nil)
|
|
49
|
+
model_instance.update_attributes(updated_attributes)
|
|
50
|
+
model_instance.attributes.should == merged_attributes
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should set a save method on it's corresponding TE:Model class which calls #update with it's attributes" do
|
|
54
|
+
model_instance.should respond_to :save
|
|
55
|
+
klass.any_instance.should_receive(:update).with(stored_attributes).and_return(nil)
|
|
56
|
+
model_instance.save
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
shared_examples_for "a ticket_evolution model" do
|
|
4
|
+
let(:klass) { subject }
|
|
5
|
+
let(:instance) { klass.new({:connection => Fake.connection}) }
|
|
6
|
+
|
|
7
|
+
its(:ancestors) { should include TicketEvolution::Model }
|
|
8
|
+
|
|
9
|
+
describe "#attributes" do
|
|
10
|
+
let(:hash) { { "hash" => { "test" => "1.. 2... 3...." } } }
|
|
11
|
+
|
|
12
|
+
it "should return a hash of attribute key/pair values" do
|
|
13
|
+
instance.one = 1
|
|
14
|
+
instance.two = 2
|
|
15
|
+
instance.three = nil
|
|
16
|
+
|
|
17
|
+
instance.attributes.should == {"one" => 1, "two" => 2, "three" => nil}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should return a HashWithIndifferentAccess" do
|
|
21
|
+
instance.attributes.should be_a HashWithIndifferentAccess
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should convert OpenStruct based objects back into hashes recursively" do
|
|
25
|
+
instance.hash = hash
|
|
26
|
+
instance.attributes.should == { "hash" => hash }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require "ap"
|
|
2
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '..', 'lib', 'ticket_evolution.rb')
|
|
3
|
+
require 'active_support/ordered_hash' unless RUBY_VERSION =~ /^1\.9/
|
|
4
|
+
|
|
5
|
+
@spec_path = Pathname.new(File.join(File.dirname(File.expand_path(__FILE__))))
|
|
6
|
+
|
|
7
|
+
Dir[File.join(@spec_path, 'support/*.rb')].each { |file| require(file) }
|
|
8
|
+
|
|
9
|
+
RSpec.configure do |config|
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
require @spec_path + 'fixtures' + 'fake.rb'
|
|
13
|
+
require @spec_path + 'shared_examples' + 'endpoints' + 'class.rb'
|
|
14
|
+
require @spec_path + 'shared_examples' + 'endpoints' + 'create.rb'
|
|
15
|
+
require @spec_path + 'shared_examples' + 'endpoints' + 'deleted.rb'
|
|
16
|
+
require @spec_path + 'shared_examples' + 'endpoints' + 'list.rb'
|
|
17
|
+
require @spec_path + 'shared_examples' + 'endpoints' + 'search.rb'
|
|
18
|
+
require @spec_path + 'shared_examples' + 'endpoints' + 'show.rb'
|
|
19
|
+
require @spec_path + 'shared_examples' + 'endpoints' + 'update.rb'
|
|
20
|
+
require @spec_path + 'shared_examples' + 'errors.rb'
|
|
21
|
+
require @spec_path + 'shared_examples' + 'models.rb'
|
data/spec/support/vcr.rb
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'vcr'
|
|
2
|
+
|
|
3
|
+
VCR.config do |config|
|
|
4
|
+
config.cassette_library_dir = File.join(File.dirname(__FILE__), '..', 'fixtures', 'net')
|
|
5
|
+
config.default_cassette_options = { :record => :none }
|
|
6
|
+
config.ignore_localhost = true
|
|
7
|
+
config.stub_with(:webmock)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
RSpec.configure do |config|
|
|
11
|
+
config.extend(VCR::RSpec::Macros)
|
|
12
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'lib', 'ticket_evolution', 'version')
|
|
3
|
+
|
|
4
|
+
Gem::Specification.new do |s|
|
|
5
|
+
s.name = 'ticketevolution-ruby'
|
|
6
|
+
s.version = TicketEvolution::VERSION
|
|
7
|
+
s.platform = Gem::Platform::RUBY
|
|
8
|
+
s.authors = ['David Malin', 'Ticket Evolution']
|
|
9
|
+
s.email = ['dev@ticketevolution.com']
|
|
10
|
+
s.homepage = 'http://api.ticketevolution.com'
|
|
11
|
+
s.summary = 'Integration gem for Ticket Evolution\'s api'
|
|
12
|
+
s.description = ''
|
|
13
|
+
|
|
14
|
+
s.required_rubygems_version = '>= 1.3.5'
|
|
15
|
+
|
|
16
|
+
s.add_dependency 'activesupport'
|
|
17
|
+
s.add_dependency 'i18n'
|
|
18
|
+
s.add_dependency 'curb'
|
|
19
|
+
s.add_dependency 'yajl-ruby'
|
|
20
|
+
s.add_dependency 'multi_json'
|
|
21
|
+
s.add_dependency 'nokogiri'
|
|
22
|
+
|
|
23
|
+
s.add_development_dependency 'rspec', '>= 2.7.1'
|
|
24
|
+
s.add_development_dependency 'vcr'
|
|
25
|
+
s.add_development_dependency 'webmock'
|
|
26
|
+
s.add_development_dependency 'awesome_print'
|
|
27
|
+
s.add_development_dependency 'rake'
|
|
28
|
+
|
|
29
|
+
s.files = `git ls-files`.split("\n")
|
|
30
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
31
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
32
|
+
s.require_paths = ["lib"]
|
|
33
|
+
end
|