ticketevolution-ruby 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. data/.gitignore +8 -0
  2. data/.rdebugrc +1 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +7 -0
  6. data/LICENSE +23 -0
  7. data/README.markdown +237 -0
  8. data/Rakefile +124 -0
  9. data/examples/events.rb +64 -0
  10. data/lib/docs/endpoints.markdown +47 -0
  11. data/lib/docs/installation.markdown +5 -0
  12. data/lib/docs/introduction.markdown +16 -0
  13. data/lib/docs/objects.markdown +40 -0
  14. data/lib/ticket_evolution/account.rb +4 -0
  15. data/lib/ticket_evolution/accounts.rb +6 -0
  16. data/lib/ticket_evolution/address.rb +4 -0
  17. data/lib/ticket_evolution/brokerage.rb +4 -0
  18. data/lib/ticket_evolution/brokerages.rb +7 -0
  19. data/lib/ticket_evolution/categories.rb +7 -0
  20. data/lib/ticket_evolution/category.rb +4 -0
  21. data/lib/ticket_evolution/client.rb +4 -0
  22. data/lib/ticket_evolution/clients/addresses.rb +10 -0
  23. data/lib/ticket_evolution/clients/credit_cards.rb +8 -0
  24. data/lib/ticket_evolution/clients/email_addresses.rb +10 -0
  25. data/lib/ticket_evolution/clients/phone_numbers.rb +10 -0
  26. data/lib/ticket_evolution/clients.rb +8 -0
  27. data/lib/ticket_evolution/configuration.rb +4 -0
  28. data/lib/ticket_evolution/configurations.rb +6 -0
  29. data/lib/ticket_evolution/core/api_error.rb +11 -0
  30. data/lib/ticket_evolution/core/base.rb +12 -0
  31. data/lib/ticket_evolution/core/builder.rb +74 -0
  32. data/lib/ticket_evolution/core/collection.rb +32 -0
  33. data/lib/ticket_evolution/core/connection.rb +99 -0
  34. data/lib/ticket_evolution/core/datum.rb +7 -0
  35. data/lib/ticket_evolution/core/endpoint/request_handler.rb +46 -0
  36. data/lib/ticket_evolution/core/endpoint.rb +51 -0
  37. data/lib/ticket_evolution/core/model.rb +64 -0
  38. data/lib/ticket_evolution/core/models/samples.rb +8 -0
  39. data/lib/ticket_evolution/core/samples.rb +6 -0
  40. data/lib/ticket_evolution/core/singular_class.rb +7 -0
  41. data/lib/ticket_evolution/core/time.rb +19 -0
  42. data/lib/ticket_evolution/credit_card.rb +4 -0
  43. data/lib/ticket_evolution/email_address.rb +4 -0
  44. data/lib/ticket_evolution/errors/connection_not_found.rb +4 -0
  45. data/lib/ticket_evolution/errors/endpoint_configuration_error.rb +5 -0
  46. data/lib/ticket_evolution/errors/invalid_configuration.rb +4 -0
  47. data/lib/ticket_evolution/errors/method_unavailable_error.rb +4 -0
  48. data/lib/ticket_evolution/event.rb +4 -0
  49. data/lib/ticket_evolution/events.rb +7 -0
  50. data/lib/ticket_evolution/modules/create.rb +18 -0
  51. data/lib/ticket_evolution/modules/deleted.rb +13 -0
  52. data/lib/ticket_evolution/modules/list.rb +15 -0
  53. data/lib/ticket_evolution/modules/search.rb +13 -0
  54. data/lib/ticket_evolution/modules/show.rb +20 -0
  55. data/lib/ticket_evolution/modules/update.rb +24 -0
  56. data/lib/ticket_evolution/office.rb +4 -0
  57. data/lib/ticket_evolution/offices.rb +7 -0
  58. data/lib/ticket_evolution/order.rb +15 -0
  59. data/lib/ticket_evolution/orders.rb +30 -0
  60. data/lib/ticket_evolution/performer.rb +4 -0
  61. data/lib/ticket_evolution/performers.rb +8 -0
  62. data/lib/ticket_evolution/phone_number.rb +4 -0
  63. data/lib/ticket_evolution/quote.rb +4 -0
  64. data/lib/ticket_evolution/quotes.rb +7 -0
  65. data/lib/ticket_evolution/search.rb +22 -0
  66. data/lib/ticket_evolution/shipment.rb +4 -0
  67. data/lib/ticket_evolution/shipments.rb +8 -0
  68. data/lib/ticket_evolution/ticket_group.rb +4 -0
  69. data/lib/ticket_evolution/ticket_groups.rb +6 -0
  70. data/lib/ticket_evolution/user.rb +4 -0
  71. data/lib/ticket_evolution/users.rb +7 -0
  72. data/lib/ticket_evolution/venue.rb +4 -0
  73. data/lib/ticket_evolution/venues.rb +8 -0
  74. data/lib/ticket_evolution/version.rb +3 -0
  75. data/lib/ticket_evolution.rb +108 -0
  76. data/spec/fixtures/fake.rb +97 -0
  77. data/spec/fixtures/net/endpoints/accounts.yml +175 -0
  78. data/spec/fixtures/net/endpoints/brokerages.yml +257 -0
  79. data/spec/fixtures/net/endpoints/categories.yml +85 -0
  80. data/spec/fixtures/net/endpoints/clients.yml +243 -0
  81. data/spec/fixtures/net/endpoints/search.yml +93 -0
  82. data/spec/lib/ticket_evolution/account_spec.rb +7 -0
  83. data/spec/lib/ticket_evolution/accounts_spec.rb +45 -0
  84. data/spec/lib/ticket_evolution/address_spec.rb +7 -0
  85. data/spec/lib/ticket_evolution/brokerage_spec.rb +7 -0
  86. data/spec/lib/ticket_evolution/brokerages_spec.rb +50 -0
  87. data/spec/lib/ticket_evolution/categories_spec.rb +27 -0
  88. data/spec/lib/ticket_evolution/category_spec.rb +7 -0
  89. data/spec/lib/ticket_evolution/client_spec.rb +7 -0
  90. data/spec/lib/ticket_evolution/clients/addresses_spec.rb +13 -0
  91. data/spec/lib/ticket_evolution/clients/credit_cards_spec.rb +11 -0
  92. data/spec/lib/ticket_evolution/clients/email_addresses_spec.rb +13 -0
  93. data/spec/lib/ticket_evolution/clients/phone_numbers_spec.rb +13 -0
  94. data/spec/lib/ticket_evolution/clients_spec.rb +37 -0
  95. data/spec/lib/ticket_evolution/configuration_spec.rb +7 -0
  96. data/spec/lib/ticket_evolution/configurations_spec.rb +10 -0
  97. data/spec/lib/ticket_evolution/core/api_error_spec.rb +13 -0
  98. data/spec/lib/ticket_evolution/core/base_spec.rb +29 -0
  99. data/spec/lib/ticket_evolution/core/builder_spec.rb +95 -0
  100. data/spec/lib/ticket_evolution/core/collection_spec.rb +23 -0
  101. data/spec/lib/ticket_evolution/core/connection_spec.rb +220 -0
  102. data/spec/lib/ticket_evolution/core/datum_spec.rb +15 -0
  103. data/spec/lib/ticket_evolution/core/endpoint_spec.rb +12 -0
  104. data/spec/lib/ticket_evolution/core/model_spec.rb +167 -0
  105. data/spec/lib/ticket_evolution/core/time_spec.rb +28 -0
  106. data/spec/lib/ticket_evolution/credit_card_spec.rb +7 -0
  107. data/spec/lib/ticket_evolution/email_address_spec.rb +7 -0
  108. data/spec/lib/ticket_evolution/errors/connection_not_found_spec.rb +7 -0
  109. data/spec/lib/ticket_evolution/errors/endpoint_configuration_error_spec.rb +8 -0
  110. data/spec/lib/ticket_evolution/errors/invalid_configuration_spec.rb +8 -0
  111. data/spec/lib/ticket_evolution/errors/method_unavailable_error_spec.rb +7 -0
  112. data/spec/lib/ticket_evolution/event_spec.rb +7 -0
  113. data/spec/lib/ticket_evolution/events_spec.rb +11 -0
  114. data/spec/lib/ticket_evolution/office_spec.rb +7 -0
  115. data/spec/lib/ticket_evolution/offices_spec.rb +11 -0
  116. data/spec/lib/ticket_evolution/order_spec.rb +44 -0
  117. data/spec/lib/ticket_evolution/orders_spec.rb +123 -0
  118. data/spec/lib/ticket_evolution/performer_spec.rb +7 -0
  119. data/spec/lib/ticket_evolution/performers_spec.rb +12 -0
  120. data/spec/lib/ticket_evolution/phone_number_spec.rb +7 -0
  121. data/spec/lib/ticket_evolution/quote_spec.rb +7 -0
  122. data/spec/lib/ticket_evolution/quotes_spec.rb +11 -0
  123. data/spec/lib/ticket_evolution/search_spec.rb +31 -0
  124. data/spec/lib/ticket_evolution/shipment_spec.rb +7 -0
  125. data/spec/lib/ticket_evolution/shipments_spec.rb +13 -0
  126. data/spec/lib/ticket_evolution/ticket_group_spec.rb +7 -0
  127. data/spec/lib/ticket_evolution/ticket_groups_spec.rb +14 -0
  128. data/spec/lib/ticket_evolution/user_spec.rb +7 -0
  129. data/spec/lib/ticket_evolution/users_spec.rb +15 -0
  130. data/spec/lib/ticket_evolution/venue_spec.rb +7 -0
  131. data/spec/lib/ticket_evolution/venues_spec.rb +12 -0
  132. data/spec/lib/ticket_evolution_spec.rb +20 -0
  133. data/spec/shared_examples/endpoints/class.rb +241 -0
  134. data/spec/shared_examples/endpoints/create.rb +41 -0
  135. data/spec/shared_examples/endpoints/deleted.rb +41 -0
  136. data/spec/shared_examples/endpoints/list.rb +41 -0
  137. data/spec/shared_examples/endpoints/search.rb +42 -0
  138. data/spec/shared_examples/endpoints/show.rb +38 -0
  139. data/spec/shared_examples/endpoints/update.rb +59 -0
  140. data/spec/shared_examples/errors.rb +5 -0
  141. data/spec/shared_examples/models.rb +29 -0
  142. data/spec/spec_helper.rb +21 -0
  143. data/spec/support/connection.rb +10 -0
  144. data/spec/support/vcr.rb +12 -0
  145. data/ticketevolution-ruby.gemspec +33 -0
  146. metadata +384 -0
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Accounts do
4
+ let(:klass) { TicketEvolution::Accounts }
5
+ let(:single_klass) { TicketEvolution::Account }
6
+
7
+ it_behaves_like 'a ticket_evolution endpoint class'
8
+ it_behaves_like 'a list endpoint'
9
+ it_behaves_like 'a show endpoint'
10
+
11
+ context "integration tests" do
12
+ use_vcr_cassette "endpoints/accounts", :record => :new_episodes
13
+
14
+ it "returns an account" do
15
+ id = 62
16
+ account = connection.accounts.show(id)
17
+
18
+ account.url.should == "/accounts/#{id}"
19
+ account.currency.should == "USD"
20
+ account.updated_at.should_not be_nil
21
+ account.balance.should == "9922.71"
22
+ account.id.should == id.to_s
23
+
24
+ account.client.should == TicketEvolution::Client.new({
25
+ :connection => connection,
26
+ "url" => "/clients/3",
27
+ "name" => "Main Office",
28
+ "id" => "3"
29
+ })
30
+ end
31
+
32
+ it "returns a list of accounts" do
33
+ accounts = connection.accounts.list(:per_page => 4, :page => 5)
34
+
35
+ accounts.per_page.should == 4
36
+ accounts.current_page.should == 5
37
+ accounts.total_entries.should == 88
38
+
39
+ accounts.size.should == 4
40
+ accounts.each do |account|
41
+ account.should be_a TicketEvolution::Account
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Address do
4
+ subject { TicketEvolution::Address }
5
+
6
+ it_behaves_like "a ticket_evolution model"
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Brokerage do
4
+ subject { TicketEvolution::Brokerage }
5
+
6
+ it_behaves_like "a ticket_evolution model"
7
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Brokerages do
4
+ let(:klass) { TicketEvolution::Brokerages }
5
+ let(:single_klass) { TicketEvolution::Brokerage }
6
+
7
+ it_behaves_like 'a ticket_evolution endpoint class'
8
+ it_behaves_like 'a list endpoint'
9
+ it_behaves_like 'a search endpoint'
10
+ it_behaves_like 'a show endpoint'
11
+
12
+ context "integration tests" do
13
+ use_vcr_cassette "endpoints/brokerages", :record => :new_episodes
14
+
15
+ it "returns a brokerage" do
16
+ brokerage = connection.brokerages.show(2)
17
+
18
+ brokerage.should be_a TicketEvolution::Brokerage
19
+ brokerage.name.should == "Golden Tickets"
20
+ brokerage.id.should == "2"
21
+ brokerage.url.should == "/brokerages/2"
22
+ end
23
+
24
+ it "returns a list of brokerages" do
25
+ brokerages = connection.brokerages.list(:per_page => 3, :page => 4)
26
+
27
+ brokerages.per_page.should == 3
28
+ brokerages.current_page.should == 4
29
+ brokerages.total_entries.should == 1379
30
+
31
+ brokerages.size.should == 3
32
+ brokerages.each do |brokerage|
33
+ brokerage.should be_a TicketEvolution::Brokerage
34
+ end
35
+ end
36
+
37
+ it "searches for a brokerage" do
38
+ brokerages = connection.brokerages.search(:q => "New York", "page" => 1)
39
+
40
+ # FIXME: The search API doesn't return total entries, yet (due to lack of pagination)...
41
+ brokerages.per_page.should be_nil
42
+ brokerages.current_page.should be_nil
43
+ brokerages.total_entries.should be_nil
44
+
45
+ brokerages.count.should == 2
46
+ brokerages.each { |brokerage| brokerage.should be_an_instance_of TicketEvolution::Brokerage }
47
+ brokerages.first.name.should == "Totally New York"
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Categories do
4
+ let(:klass) { TicketEvolution::Categories }
5
+ let(:single_klass) { TicketEvolution::Category }
6
+
7
+ it_behaves_like 'a ticket_evolution endpoint class'
8
+ it_behaves_like 'a deleted endpoint'
9
+ it_behaves_like 'a list endpoint'
10
+ it_behaves_like 'a show endpoint'
11
+
12
+ describe "integrations" do
13
+ use_vcr_cassette "endpoints/categories", :record => :new_episodes
14
+
15
+ context "#deleted" do
16
+ it "returns a list of deleted categories" do
17
+ categories = connection.categories.deleted(:per_page => 2)
18
+
19
+ categories.size.should == 1
20
+ categories.each do |category|
21
+ category.should be_instance_of TicketEvolution::Category
22
+ end
23
+ categories.first.name.should == "Insult Comedy"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Category do
4
+ subject { TicketEvolution::Category }
5
+
6
+ it_behaves_like "a ticket_evolution model"
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Client do
4
+ subject { TicketEvolution::Client }
5
+
6
+ it_behaves_like "a ticket_evolution model"
7
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Clients::Addresses do
4
+ let(:klass) { TicketEvolution::Clients::Addresses }
5
+ let(:single_klass) { TicketEvolution::Address }
6
+ let(:update_base) { {'url' => '/clients/1/addresses/1'} }
7
+
8
+ it_behaves_like 'a ticket_evolution endpoint class'
9
+ it_behaves_like 'a create endpoint'
10
+ it_behaves_like 'a list endpoint'
11
+ it_behaves_like 'a show endpoint'
12
+ it_behaves_like 'an update endpoint'
13
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Clients::CreditCards do
4
+ let(:klass) { TicketEvolution::Clients::CreditCards }
5
+ let(:single_klass) { TicketEvolution::CreditCard }
6
+ let(:update_base) { {'url' => '/clients/1/credit_cards/1'} }
7
+
8
+ it_behaves_like 'a ticket_evolution endpoint class'
9
+ it_behaves_like 'a create endpoint'
10
+ it_behaves_like 'a list endpoint'
11
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Clients::EmailAddresses do
4
+ let(:klass) { TicketEvolution::Clients::EmailAddresses }
5
+ let(:single_klass) { TicketEvolution::EmailAddress }
6
+ let(:update_base) { {'url' => '/clients/1/email_addresses/1'} }
7
+
8
+ it_behaves_like 'a ticket_evolution endpoint class'
9
+ it_behaves_like 'a create endpoint'
10
+ it_behaves_like 'a list endpoint'
11
+ it_behaves_like 'a show endpoint'
12
+ it_behaves_like 'an update endpoint'
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Clients::PhoneNumbers do
4
+ let(:klass) { TicketEvolution::Clients::PhoneNumbers }
5
+ let(:single_klass) { TicketEvolution::PhoneNumber }
6
+ let(:update_base) { {'url' => '/clients/1/phone_numbers/1'} }
7
+
8
+ it_behaves_like 'a ticket_evolution endpoint class'
9
+ it_behaves_like 'a create endpoint'
10
+ it_behaves_like 'a list endpoint'
11
+ it_behaves_like 'a show endpoint'
12
+ it_behaves_like 'an update endpoint'
13
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Clients do
4
+ let(:klass) { TicketEvolution::Clients }
5
+ let(:single_klass) { TicketEvolution::Client }
6
+ let(:update_base) { {} }
7
+
8
+ it_behaves_like 'a ticket_evolution endpoint class'
9
+ it_behaves_like 'a create endpoint'
10
+ it_behaves_like 'a list endpoint'
11
+ it_behaves_like 'a show endpoint'
12
+ it_behaves_like 'an update endpoint'
13
+
14
+ describe "integrations" do
15
+ use_vcr_cassette "endpoints/clients", :record => :new_episodes, :match_requests_on => [:method, :uri, :body]
16
+
17
+ context "#create" do
18
+ it "returns validation errors" do
19
+ client = connection.clients.create(:name => "")
20
+ client.should be_an_instance_of TicketEvolution::ApiError
21
+ end
22
+
23
+ it "successfully creates a client" do
24
+ name = "Comish Gordon"
25
+ client = connection.clients.create(:name => name)
26
+
27
+ client.should be_instance_of TicketEvolution::Client
28
+ client.id.should be
29
+ client.name.should == name
30
+
31
+ same_client = connection.clients.show(client.id)
32
+ same_client.id.should == client.id
33
+ same_client.name.should == name
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Configuration do
4
+ subject { TicketEvolution::Configuration }
5
+
6
+ it_behaves_like "a ticket_evolution model"
7
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Configurations do
4
+ let(:klass) { TicketEvolution::Configurations }
5
+ let(:single_klass) { TicketEvolution::Configuration }
6
+
7
+ it_behaves_like 'a ticket_evolution endpoint class'
8
+ it_behaves_like 'a list endpoint'
9
+ it_behaves_like 'a show endpoint'
10
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::ApiError do
4
+ let(:klass) { TicketEvolution::ApiError }
5
+ let(:response) { Fake.error_response }
6
+ let(:instance) { klass.new(response) }
7
+
8
+ subject { instance }
9
+
10
+ its(:error) { should == response.body['error'] }
11
+ its(:code) { should == response.response_code }
12
+ its(:message) { should == response.server_message }
13
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Base do
4
+ let(:klass) { TicketEvolution::Base }
5
+ let(:sample_klass) { TicketEvolution::Samples }
6
+ let(:base) { klass.new }
7
+
8
+ describe "#method_missing" do
9
+ it "should attempt to find a class which matches the missing method" do
10
+ TicketEvolution.should_receive(:const_defined?).with(:NoObjects)
11
+ expect { base.no_objects }.to raise_error
12
+ end
13
+
14
+ context "when the missing class is found" do
15
+ it "should instantiate a new instance of the class, passing itself to initialize as :parent" do
16
+ instance = sample_klass.new({:parent => base})
17
+ sample_klass.should_receive(:new).with({:parent => base}).and_return(instance)
18
+ base.samples.should be_a sample_klass
19
+ end
20
+ end
21
+
22
+ context "when the missing class is not found" do
23
+ it "should perform as if the method doesn't exist" do
24
+ message = "undefined method `coconuts' for #{base.inspect}"
25
+ expect { base.coconuts }.to raise_error NoMethodError, message
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Builder do
4
+ let(:klass) { TicketEvolution::Builder }
5
+ let(:instance) { klass.new(params) }
6
+ let(:params) { {} }
7
+
8
+ subject { klass }
9
+
10
+ its(:ancestors) { should include OpenStruct }
11
+
12
+ describe "#initialize" do
13
+ let(:params) do
14
+ {
15
+ "url" => "/brokerages/2",
16
+ "natb_member" => true,
17
+ "name" => "Golden Tickets",
18
+ "id" => "2",
19
+ "abbreviation" => "Golden Tickets"
20
+ }
21
+ end
22
+
23
+ it "should assign each key value pair as attributes" do
24
+ params.keys.each do |key|
25
+ instance.send(key).should == params[key]
26
+ end
27
+ end
28
+
29
+ it "should call #process_datum for each attribute assigned" do
30
+ params.values.each do |v|
31
+ klass.any_instance.should_receive(:process_datum).with(v)
32
+ end
33
+ instance
34
+ end
35
+ end
36
+
37
+ describe "#process_datum" do
38
+ let(:time) { "2011-12-18T17:30:06Z" }
39
+
40
+ context "when dealing with a string" do
41
+ context "formatted as time" do
42
+ it "should convert the string to a TicketEvolution::Time object" do
43
+ instance.send(:process_datum, time).should == TicketEvolution::Time.parse(time)
44
+ end
45
+ end
46
+ end
47
+
48
+ context "when dealing with a hash" do
49
+ it "should instantiate a new TicketEvolution::Datum object" do
50
+ instance.send(:process_datum, {:one => 1}).should be_a TicketEvolution::Datum
51
+ end
52
+ end
53
+
54
+ context "when dealing with an array" do
55
+ it "should map arrays, calling itself on each value" do
56
+ instance.send(:process_datum, [{:one => 1}, time]).should == [
57
+ TicketEvolution::Datum.new({:one => 1}),
58
+ TicketEvolution::Time.parse(time)
59
+ ]
60
+ end
61
+ end
62
+ end
63
+
64
+ describe "#class_name_from_url" do
65
+ it "extracts a TicketEvolution class name from a url, searching segments right to left" do
66
+ {
67
+ '/events' => 'TicketEvolution::Events',
68
+ '/events/12' => 'TicketEvolution::Events',
69
+ '/events/deleted' => 'TicketEvolution::Events',
70
+ '/events/21/venues/12' => 'TicketEvolution::Venues'
71
+ }.each do |given, expected|
72
+ instance.send(:class_name_from_url, given).should == expected
73
+ end
74
+ end
75
+ end
76
+
77
+ describe "#method_missing" do
78
+ let(:params) { {} }
79
+
80
+ describe "with args" do
81
+ it "should invoke #process_datum with the information received" do
82
+ instance.should_receive(:process_datum).with(:ing)
83
+ instance.test = :ing
84
+ instance.should_receive(:process_datum).with([1,2])
85
+ instance.array = [1,2]
86
+ end
87
+ end
88
+
89
+ describe "without args" do
90
+ it "should fall back on the OpenStruct#method_missing functionality" do
91
+ instance.test.should == nil
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Collection do
4
+ subject { TicketEvolution::Collection.build_from_response(response, 'brokerages', TicketEvolution::Brokerage) }
5
+ let(:response) { Fake.list_response }
6
+
7
+ context "#build_from_response" do
8
+ it { should be_instance_of(TicketEvolution::Collection) }
9
+ it { should be_kind_of(Enumerable) }
10
+ its(:per_page) { should == 2 }
11
+ its(:total_entries) { should == 1379 }
12
+ its(:current_page) { should == 1 }
13
+ end
14
+
15
+ context "#each" do
16
+ it "iterates through all the entries" do
17
+ subject.size.should == 2
18
+ subject.each do |entry|
19
+ entry.should be_instance_of TicketEvolution::Brokerage
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,220 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Connection do
4
+ let(:klass) { TicketEvolution::Connection }
5
+ let(:default_options) do
6
+ HashWithIndifferentAccess.new({
7
+ :version => klass.oldest_version_in_service,
8
+ :mode => :sandbox,
9
+ :ssl_verify => true
10
+ })
11
+ end
12
+ let(:basic_options) do
13
+ {
14
+ :token => Fake.token,
15
+ :secret => Fake.secret
16
+ }
17
+ end
18
+ let(:valid_options) { default_options.merge(basic_options) }
19
+
20
+ subject { klass }
21
+
22
+ its(:ancestors) { should include TicketEvolution::Base }
23
+
24
+ describe ".default_options" do
25
+ subject { klass.default_options }
26
+
27
+ it { should == default_options }
28
+ end
29
+
30
+ describe ".expected_options" do
31
+ subject { klass.expected_options }
32
+
33
+ it { should =~ valid_options.keys }
34
+ end
35
+
36
+ describe ".oldest_version_in_service" do
37
+ subject { klass.oldest_version_in_service }
38
+
39
+ it { should be_a Fixnum }
40
+ end
41
+
42
+ describe "#initialize" do
43
+ let(:expected_options) { klass.expected_options }
44
+
45
+ context "with valid options" do
46
+ it "should copy to options passed to the default options" do
47
+ klass.new(basic_options).instance_eval {
48
+ @config
49
+ }.should == valid_options
50
+ end
51
+ end
52
+
53
+ context "with ssl_verify" do
54
+ context "if passed" do
55
+ let(:options) { valid_options.merge(:ssl_verify => false) }
56
+
57
+ it "sets the Curl::Easy to that value" do
58
+ connection = klass.new(options)
59
+ easy = connection.build_request(:GET, '/')
60
+ easy.ssl_verify_host?.should be_false
61
+ easy.ssl_verify_peer?.should be_false
62
+ end
63
+ end
64
+
65
+ context "if not passed" do
66
+ it "does not set anything on the Curl::Easy object" do
67
+ connection = klass.new(valid_options)
68
+ easy = connection.build_request(:GET, '/')
69
+ easy.ssl_verify_host?.should be_true
70
+ easy.ssl_verify_peer?.should be_true
71
+ end
72
+ end
73
+ end
74
+
75
+ context "without any options" do
76
+ it "should raise an error notifying the user of the missing options" do
77
+ message = "Missing: #{(expected_options - default_options.keys).join(', ')}"
78
+ expect {
79
+ klass.new
80
+ }.to raise_error TicketEvolution::InvalidConfiguration, message
81
+ end
82
+ end
83
+
84
+ context "with invalid options" do
85
+ it "should raise an error if the token is not formatted correctly" do
86
+ expect {
87
+ klass.new(valid_options.merge({:token => "invalid"}))
88
+ }.to raise_error TicketEvolution::InvalidConfiguration, "Invalid Token Format"
89
+ end
90
+
91
+ it "should raise an error if the token is not formatted correctly" do
92
+ expect {
93
+ klass.new(valid_options.merge({:secret => "invalid"}))
94
+ }.to raise_error TicketEvolution::InvalidConfiguration, "Invalid Secret Format"
95
+ end
96
+
97
+ it "should raise an error if attempting to use an expired version" do
98
+ oldest_version = klass.oldest_version_in_service - 1
99
+ expect {
100
+ klass.new(valid_options.merge({:version => oldest_version}))
101
+ }.to raise_error TicketEvolution::InvalidConfiguration, "Please Use API Version #{klass.oldest_version_in_service} or Above"
102
+ end
103
+
104
+ it "should not error if bad options are passed in" do
105
+ expect {
106
+ klass.new(valid_options.merge(:invalid => :option))
107
+ }.to_not raise_error
108
+ end
109
+ end
110
+ end
111
+
112
+ describe ".url_base" do
113
+ subject { klass.url_base }
114
+
115
+ it { should == "ticketevolution.com" }
116
+ end
117
+
118
+ describe ".protocol" do
119
+ subject { klass.protocol }
120
+
121
+ it { should == "https" }
122
+ end
123
+
124
+ describe "#url" do
125
+ context "production" do
126
+ subject { klass.new(valid_options.merge({:mode => :production}))}
127
+
128
+ its(:url) { should == "https://api.ticketevolution.com" }
129
+ end
130
+
131
+ context "sandbox" do
132
+ subject { klass.new(valid_options) }
133
+
134
+ its(:url) { should == "https://api.sandbox.ticketevolution.com" }
135
+ end
136
+ end
137
+
138
+ describe "#sign" do
139
+ let(:path) { "/test" }
140
+
141
+ describe "without params" do
142
+ let(:connection) { klass.new(valid_options.merge({:secret => "/3uZ9bXNe/6rxEBmlGLvoRXrcSzRDMfyJSewhlrc"})) }
143
+
144
+ it "should sign a get request" do
145
+ connection.sign(:GET, path).should == "1Ra2c8cbuw1G5Pw8BWaowDlMcxwMte8y/sL+vW2H4mY="
146
+ end
147
+
148
+ it "should sign a post request" do
149
+ connection.sign(:POST, path).should == "pXqUawURysCxiIvPXCgTaQ1k5Nue0bAVHIyhrxJRmI0="
150
+ end
151
+
152
+ it "should sign a put request" do
153
+ connection.sign(:PUT, path).should == "+INyuqXHZv3+ybyGM/mQIJVJ6RslR/xUAmcauZnHWBo="
154
+ end
155
+
156
+ it "should sign a delete request" do
157
+ connection.sign(:DELETE, path).should == "Mwr4Z+hveuo8ITaYwaRQ/QdxYotpw97ZH1JfJmblVQY="
158
+ end
159
+ end
160
+
161
+ describe "with params" do
162
+ let(:params) do
163
+ if RUBY_VERSION =~ /^1\.9/
164
+ {
165
+ :one => 1,
166
+ :two => "two",
167
+ :three => :three
168
+ }
169
+ else
170
+ p = ActiveSupport::OrderedHash.new
171
+ p[:one] = 1
172
+ p[:two] = "two"
173
+ p[:three] = "three"
174
+ p
175
+ end
176
+ end
177
+ let(:connection) { klass.new(valid_options.merge({:secret => "/3uZ9bXNe/6rxEBmlGLvoRXrcSzRDMfyJSewhlrc"})) }
178
+
179
+ it "should sign a get request" do
180
+ connection.sign(:GET, path, params).should == "8eaaqg6d4DJ2SEWkCvkdhc05dITmpNbUrcbN75UBGMA="
181
+ end
182
+
183
+ it "should sign a post request" do
184
+ connection.sign(:POST, path, params).should == "6PMaU8JQ5kH4PZLl8agJrZRZqnn65UGcCUA80E2dTDg="
185
+ end
186
+
187
+ it "should sign a put request" do
188
+ connection.sign(:PUT, path, params).should == "JEwlN3cuRXnb6rQlaorVYtlbGbBQRXs792YGQaH5BoM="
189
+ end
190
+
191
+ it "should sign a delete request" do
192
+ connection.sign(:DELETE, path, params).should == "aHXaOzCmuVttO2qSnaH5Ku4SN2q/ukoxz2FIbCRWmeY="
193
+ end
194
+ end
195
+ end
196
+
197
+ describe "#build_request" do
198
+ let(:headers) do
199
+ {
200
+ "Accept" => "application/vnd.ticketevolution.api+json; version=#{valid_options[:version]}",
201
+ "X-Signature" => "8eaaqg6d4DJ2SEWkCvkdhc05dITmpNbUrcbN75UBGMA=",
202
+ "X-Token" => valid_options[:token]
203
+ }
204
+ end
205
+ let(:params) do
206
+ {
207
+ :one => 1,
208
+ :two => "two",
209
+ :three => :three
210
+ }
211
+ end
212
+ let(:url) { "https://api.sandbox.ticketevolution.com/test?one=1&three=three&two=two" }
213
+
214
+ subject { klass.new(valid_options.merge(:secret => "/3uZ9bXNe/6rxEBmlGLvoRXrcSzRDMfyJSewhlrc")).build_request(:GET, '/test', params) }
215
+
216
+ it { should be_a Curl::Easy }
217
+ its(:headers) { should == headers }
218
+ its(:url) { should == url }
219
+ end
220
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe TicketEvolution::Datum do
4
+ let(:klass) { TicketEvolution::Datum }
5
+ let(:instance) { klass.new }
6
+
7
+ subject { klass }
8
+
9
+ its(:ancestors) { should include TicketEvolution::Builder }
10
+
11
+ it "should respond to []" do
12
+ instance.test = :testing
13
+ instance[:test].should == :testing
14
+ end
15
+ end