teamsnap_rb 1.3.3 → 2.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +131 -29
  4. data/lib/config/inflecto.rb +13 -0
  5. data/lib/config/oj.rb +5 -0
  6. data/lib/teamsnap.rb +36 -376
  7. data/lib/teamsnap/api.rb +113 -0
  8. data/lib/teamsnap/auth_middleware.rb +62 -0
  9. data/lib/teamsnap/client.rb +51 -0
  10. data/lib/teamsnap/collection.rb +125 -0
  11. data/lib/teamsnap/item.rb +100 -0
  12. data/lib/teamsnap/response.rb +101 -0
  13. data/lib/teamsnap/structure.rb +80 -0
  14. data/lib/teamsnap/version.rb +1 -1
  15. data/spec/cassettes/apiv3-init.yml +756 -124
  16. data/spec/cassettes/client/when_calling_via_s_on_the_client/does_not_raise_an_error_when_the_HTTP_actions_are_called.yml +56 -0
  17. data/spec/cassettes/structure/_create_collection_class/registers_new_classes_via_introspection_of_the_root_collection.yml +110 -0
  18. data/spec/cassettes/structure/_create_collection_class/sets_the_href_attribute_on_the_new_class.yml +57 -0
  19. data/spec/cassettes/structure/_init/has_all_classes_in_schema_loaded_except_for_exceptions_list_endpoints.yml +56 -0
  20. data/spec/cassettes/structure/has_all_classes_in_schema_loaded_except_for_exceptions_list_endpoints.yml +56 -0
  21. data/spec/cassettes/teamsnap__client/when_calling_via_s_on_the_client/does_not_raise_an_error_when_the_HTTP_actions_are_called.yml +69 -0
  22. data/spec/cassettes/teamsnap__client/when_calling_via_s_on_the_client/passes_them_to_the_faraday_client_using_method_missing.yml +69 -0
  23. data/spec/cassettes/teamsnap__collection/adds_find_if_search_is_available.yml +61 -0
  24. data/spec/cassettes/teamsnap__collection/adds_href_to_items.yml +62 -0
  25. data/spec/cassettes/teamsnap__collection/can_follow_plural_links.yml +179 -0
  26. data/spec/cassettes/teamsnap__collection/can_follow_singular_links.yml +120 -0
  27. data/spec/cassettes/teamsnap__collection/can_handle_links_with_no_data.yml +107 -0
  28. data/spec/cassettes/{teamsnap_rb/can_handle_errors_generated_by_command.yml → teamsnap__collection/can_handle_no_argument_errors_generated_by_command.yml} +10 -16
  29. data/spec/cassettes/teamsnap__collection/handles_executing_an_action_via_commands.yml +64 -0
  30. data/spec/cassettes/teamsnap__collection/handles_executing_an_action_via_commands_with_multiple_params.yml +70 -0
  31. data/spec/cassettes/teamsnap__collection/handles_fetching_data_via_queries.yml +61 -0
  32. data/spec/cassettes/teamsnap__collection/handles_queries_with_no_data.yml +57 -0
  33. data/spec/cassettes/teamsnap__collection/raises_an_exception_if_find_returns_nothing.yml +57 -0
  34. data/spec/cassettes/teamsnap__collection/supports_relations_with_expected_behaviors/when_a_plural_relation_is_called/responds_with_an_array_of_objects_when_successful.yml +117 -0
  35. data/spec/cassettes/teamsnap__collection/supports_relations_with_expected_behaviors/when_a_plural_relation_is_called/responds_with_an_empty_array_when_no_objects_exist.yml +111 -0
  36. data/spec/cassettes/teamsnap__collection/supports_relations_with_expected_behaviors/when_a_singular_relation_is_called/responds_with_nil_if_it_does_NOT_exist.yml +111 -0
  37. data/spec/cassettes/teamsnap__collection/supports_relations_with_expected_behaviors/when_a_singular_relation_is_called/responds_with_the_object_if_it_exists.yml +124 -0
  38. data/spec/cassettes/teamsnap__structure/_create_collection_class/registers_new_classes_via_introspection_of_the_root_collection.yml +57 -0
  39. data/spec/cassettes/teamsnap__structure/_create_collection_class/sets_the_href_attribute_on_the_new_class.yml +57 -0
  40. data/spec/cassettes/teamsnap__structure/_init/has_all_classes_in_schema_loaded_except_for_exceptions_list_endpoints.yml +69 -0
  41. data/spec/cassettes/teamsnap_rb/_bulk_load/can_handle_an_empty_bulk_load.yml +55 -0
  42. data/spec/cassettes/teamsnap_rb/{can_handle_an_error_with_bulk_load.yml → _bulk_load/can_handle_an_error_with_bulk_load.yml} +11 -23
  43. data/spec/cassettes/teamsnap_rb/_bulk_load/can_use_bulk_load.yml +121 -0
  44. data/spec/cassettes/teamsnap_rb/_client_send/when_sent_a_known_via_/calls_DELETE_on_the_given_client.yml +2405 -0
  45. data/spec/cassettes/teamsnap_rb/_client_send/when_sent_a_known_via_/calls_GET_on_the_given_client.yml +69 -0
  46. data/spec/cassettes/teamsnap_rb/_client_send/when_sent_a_known_via_/calls_PATCH_on_the_given_client.yml +2404 -0
  47. data/spec/cassettes/teamsnap_rb/_client_send/when_sent_a_known_via_/calls_POST_on_the_given_client.yml +2404 -0
  48. data/spec/cassettes/teamsnap_rb/_run/processes_the_response.yml +267 -0
  49. data/spec/cassettes/teamsnap_rb/adds_find_if_search_is_available.yml +27 -30
  50. data/spec/cassettes/teamsnap_rb/adds_href_to_items.yml +31 -19
  51. data/spec/cassettes/teamsnap_rb/can_follow_plural_links.yml +118 -67
  52. data/spec/cassettes/teamsnap_rb/can_follow_singular_links.yml +59 -56
  53. data/spec/cassettes/teamsnap_rb/can_handle_links_with_no_data.yml +48 -38
  54. data/spec/cassettes/teamsnap_rb/can_handle_no_argument_errors_generated_by_command.yml +42 -0
  55. data/spec/cassettes/teamsnap_rb/handles_executing_an_action_via_commands.yml +32 -20
  56. data/spec/cassettes/teamsnap_rb/handles_executing_an_action_via_commands_with_multiple_params.yml +29 -404
  57. data/spec/cassettes/teamsnap_rb/handles_fetching_data_via_queries.yml +26 -23
  58. data/spec/cassettes/teamsnap_rb/handles_queries_with_no_data.yml +24 -28
  59. data/spec/cassettes/teamsnap_rb/raises_an_exception_if_find_returns_nothing.yml +24 -28
  60. data/spec/cassettes/teamsnap_rb/supports_relations_with_expected_behaviors/when_a_plural_relation_is_called/responds_with_an_array_of_objects_when_successful.yml +53 -45
  61. data/spec/cassettes/teamsnap_rb/supports_relations_with_expected_behaviors/when_a_plural_relation_is_called/responds_with_an_empty_array_when_no_objects_exist.yml +50 -54
  62. data/spec/cassettes/teamsnap_rb/supports_relations_with_expected_behaviors/when_a_singular_relation_is_called/responds_with_nil_if_it_does_NOT_exist.yml +50 -54
  63. data/spec/cassettes/teamsnap_rb/supports_relations_with_expected_behaviors/when_a_singular_relation_is_called/responds_with_the_object_if_it_exists.yml +59 -58
  64. data/spec/spec_helper.rb +2 -0
  65. data/spec/teamsnap/client_spec.rb +75 -0
  66. data/spec/teamsnap/collection_spec.rb +155 -0
  67. data/spec/teamsnap/item_spec.rb +155 -0
  68. data/spec/teamsnap/structure_spec.rb +63 -0
  69. data/spec/teamsnap_spec.rb +169 -157
  70. data/teamsnap_rb.gemspec +1 -1
  71. metadata +92 -15
  72. data/spec/cassettes/teamsnap_rb/can_handle_an_empty_bulk_load.yml +0 -60
  73. data/spec/cassettes/teamsnap_rb/can_use_bulk_load.yml +0 -74
@@ -0,0 +1,155 @@
1
+ require "spec_helper"
2
+ require "teamsnap"
3
+
4
+ RSpec.describe "teamsnap__item", :vcr => true do
5
+ before(:all) do
6
+ VCR.use_cassette("apiv3-init") do
7
+ TeamSnap.init(
8
+ :url => ROOT_TEST_URL,
9
+ :client_id => "classic",
10
+ :client_secret => "dont_tell_the_cops"
11
+ )
12
+ end
13
+ end
14
+
15
+ describe ".load_items" do
16
+ it "returns TeamSnap::Object for the given json item" do
17
+ collection = {
18
+ :items => [
19
+ {
20
+ :href => "http://localhost:3000/teams/10",
21
+ :data => [
22
+ {
23
+ :name => "id",
24
+ :value => 10
25
+ },
26
+ {
27
+ :name => "type",
28
+ :value => "team"
29
+ },
30
+ {
31
+ :name => "division_name",
32
+ :value => nil
33
+ },
34
+ {
35
+ :name => "division_id",
36
+ :value => nil
37
+ },
38
+ {
39
+ :name => "is_archived_season",
40
+ :value => false
41
+ },
42
+ {
43
+ :name => "is_retired",
44
+ :value => false
45
+ },
46
+ {
47
+ :name => "league_name",
48
+ :value => nil
49
+ },
50
+ {
51
+ :name => "league_url",
52
+ :value => nil
53
+ },
54
+ {
55
+ :name => "is_in_league",
56
+ :value => false
57
+ },
58
+ {
59
+ :name => "location_country",
60
+ :value => "United States"
61
+ },
62
+ {
63
+ :name => "location_postal_code",
64
+ :value => "80951"
65
+ },
66
+ {
67
+ :name => "location_latitude",
68
+ :value => nil
69
+ },
70
+ {
71
+ :name => "location_longitude",
72
+ :value => nil
73
+ },
74
+ {
75
+ :name => "name",
76
+ :value => "Cheerleading Team"
77
+ },
78
+ {
79
+ :name => "plan_id",
80
+ :value => 33
81
+ },
82
+ {
83
+ :name => "billed_at",
84
+ :value => "2016-02-08T00:00:00.000+00:00"
85
+ },
86
+ {
87
+ :name => "season_name",
88
+ :value => nil
89
+ },
90
+ {
91
+ :name => "sport_id",
92
+ :value => 31
93
+ },
94
+ {
95
+ :name => "time_zone_description",
96
+ :value => "Mountain Time (US & Canada)"
97
+ },
98
+ {
99
+ :name => "time_zone_iana_name",
100
+ :value => "America/Denver"
101
+ },
102
+ {
103
+ :name => "time_zone_offset",
104
+ :value => "-07:00"
105
+ },
106
+ {
107
+ :name => "updated_at",
108
+ :value => "2016-02-08T20:04:21Z",
109
+ :type => "DateTime"
110
+ },
111
+ {
112
+ :name => "created_at",
113
+ :value => "2016-02-08T20:04:06Z",
114
+ :type => "DateTime"
115
+ },
116
+ {
117
+ :name => "has_reached_roster_limit",
118
+ :value => false
119
+ },
120
+ {
121
+ :name => "roster_limit",
122
+ :value => 4000
123
+ },
124
+ {
125
+ :name => "has_exportable_media",
126
+ :value => false
127
+ },
128
+ {
129
+ :name => "can_export_media",
130
+ :value => false
131
+ },
132
+ {
133
+ :name => "last_accessed_at",
134
+ :value => nil,
135
+ :type => "DateTime"
136
+ },
137
+ {
138
+ :name => "media_storage_used",
139
+ :value => 0
140
+ },
141
+ {
142
+ :name => "humanized_media_storage_used",
143
+ :value => "0 B"
144
+ }
145
+ ]
146
+ }
147
+ ]
148
+ }
149
+
150
+ expect(
151
+ TeamSnap::Item.load_items(TeamSnap.root_client, collection)[0].class
152
+ ).to eq(TeamSnap::Team)
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,63 @@
1
+ require "spec_helper"
2
+ require "teamsnap"
3
+
4
+ RSpec.describe "teamsnap__structure", :vcr => true do
5
+
6
+ describe ".create_collection_class" do
7
+ let(:client) {
8
+ client = TeamSnap::Client.new({
9
+ :url => ROOT_TEST_URL,
10
+ :client_id => "classic",
11
+ :client_secret => "dont_tell_the_cops"
12
+ })
13
+ }
14
+ let(:resp) { TeamSnap.run(client, :get, "/teams", {}) }
15
+
16
+ it "registers new classes via introspection of the root collection" do
17
+ TeamSnap::Structure.send(
18
+ :create_collection_class,
19
+ "teams",
20
+ "http://localhost:3000/teams",
21
+ resp,
22
+ nil
23
+ )
24
+ expect { TeamSnap::Team }.to_not raise_error
25
+ end
26
+
27
+ it "sets the href attribute on the new class" do
28
+ TeamSnap::Structure.send(
29
+ :create_collection_class,
30
+ "teams",
31
+ "http://localhost:3000/teams",
32
+ resp,
33
+ nil
34
+ )
35
+
36
+ expect(TeamSnap::Team.href).to eq("#{ROOT_TEST_URL}/teams")
37
+ end
38
+ end
39
+
40
+ describe ".init" do
41
+ before(:all) do
42
+ VCR.use_cassette("apiv3-init") do
43
+ TeamSnap.init(
44
+ :url => ROOT_TEST_URL,
45
+ :client_id => "classic",
46
+ :client_secret => "dont_tell_the_cops"
47
+ )
48
+ end
49
+ end
50
+
51
+ it "has all classes in schema loaded except for exceptions list endpoints" do
52
+ collection = TeamSnap.run(TeamSnap.root_client, :get, "/", {})
53
+ links = collection.fetch(:links) { [] }
54
+ .select{|l| !TeamSnap::EXCLUDED_RELS.include?(l[:rel]) }
55
+
56
+ links.each do |obj|
57
+ expect {
58
+ Object.const_get("TeamSnap::" + Inflecto.classify(obj[:rel]))
59
+ }.to_not raise_error
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,12 +1,16 @@
1
1
  require "spec_helper"
2
2
  require "teamsnap"
3
3
 
4
- RSpec.describe "teamsnap_rb" do
4
+ RSpec.describe "teamsnap_rb", :vcr => true do
5
5
  let(:default_url) { TeamSnap::DEFAULT_URL }
6
6
  let(:specified_url) { "https://url-fun-zone.com" }
7
7
  let(:response) { Typhoeus::Response.new(
8
- code: 200, body: { :collection => { :links => [] } }.to_json
8
+ code: 200,
9
+ headers: { "content-type" => "application/json" },
10
+ body: { :collection => { :links => [] } }.to_json
9
11
  ) }
12
+ let(:client_id) { "classic" }
13
+ let(:client_secret) { "dont_tell_the_cops" }
10
14
 
11
15
  describe ".init" do
12
16
  it "requires token or client id and client secret" do
@@ -18,7 +22,7 @@ RSpec.describe "teamsnap_rb" do
18
22
  it "initializes with default url and token auth" do
19
23
  Typhoeus.stub(%r(#{default_url})).and_return(response)
20
24
 
21
- TeamSnap.init(:token => "mytoken", :backup_cache => false)
25
+ TeamSnap.init(:token => "mytoken")
22
26
  end
23
27
 
24
28
  it "requires client secret when given client id" do
@@ -31,7 +35,7 @@ RSpec.describe "teamsnap_rb" do
31
35
  Typhoeus.stub(/#{default_url}/).and_return(response)
32
36
 
33
37
  TeamSnap.init(
34
- :client_id => "myclient", :client_secret => "mysecret", :backup_cache => false
38
+ :client_id => "myclient", :client_secret => "mysecret"
35
39
  )
36
40
  end
37
41
 
@@ -39,190 +43,198 @@ RSpec.describe "teamsnap_rb" do
39
43
  Typhoeus.stub(/#{specified_url}/).and_return(response)
40
44
 
41
45
  TeamSnap.init(
42
- :client_id => "myclient", :client_secret => "mysecret", :backup_cache => false,
46
+ :client_id => "myclient", :client_secret => "mysecret",
43
47
  :url => specified_url
44
48
  )
45
49
  end
46
50
  end
47
- end
48
-
49
- RSpec.describe "teamsnap_rb", :vcr => true do
50
- before(:all) do
51
- VCR.use_cassette("apiv3-init") do
52
- TeamSnap.init(
53
- :url => ROOT_TEST_URL,
54
- :backup_cache => false,
55
- :client_id => "classic",
56
- :client_secret => "dont_tell_the_cops"
57
- )
58
- end
59
- end
60
-
61
- it "registers new classes via introspection of the root collection" do
62
- expect { TeamSnap::Team }.to_not raise_error
63
- end
64
-
65
- it "handles fetching data via queries" do
66
- ts = TeamSnap::Team.search(:id => 1)
67
-
68
- expect(ts).to_not be_empty
69
- expect(ts[0].id).to eq(1)
70
- end
71
-
72
- it "handles queries with no data" do
73
- ts = TeamSnap::Team.search(:id => 0)
74
-
75
- expect(ts).to be_empty
76
- end
77
51
 
78
- it "raises an exception when a query is invalid" do
79
- expect {
80
- TeamSnap::Team.search(:foo => :bar)
81
- }.to raise_error(
82
- ArgumentError,
83
- "Invalid argument(s). Valid argument(s) are [:id, :team_id, :user_id, :division_id]"
84
- )
85
- end
86
-
87
- it "handles executing an action via commands" do
88
- ms = TeamSnap::Member.disable_member(:member_id => 1)
52
+ describe ".run" do
53
+ context "works when" do
54
+ after(:each) do
55
+ VCR.use_cassette("apiv3-init") do
56
+ TeamSnap.init(
57
+ :url => ROOT_TEST_URL,
58
+ :client_id => client_id,
59
+ :client_secret => client_secret
60
+ )
61
+ end
62
+ end
89
63
 
90
- expect(ms).to_not be_empty
91
- expect(ms[0].id).to eq(1)
92
- end
64
+ it "calls client_send with the given attributes" do
65
+ expect(TeamSnap).to receive("client_send").with(any_args).and_call_original
66
+ end
93
67
 
94
- it "handles executing an action via commands with multiple params" do
95
- TeamSnap.init(
96
- :url => ROOT_TEST_URL,
97
- :backup_cache => false,
98
- :token => "6-classic-dont_tell_the_cops"
99
- )
100
-
101
- ms = TeamSnap::Team.invite(
102
- :team_id => 1, :member_id => [9, 11], :notify_as_member_id => 3,
103
- :introduction => "Welcome! This is our team\n ...the superstars!"
104
- )
105
-
106
- expect(ms.size).to eq(2)
107
- expect(ms.map(&:id)).to eq([9, 11])
108
- expect(ms.map(&:is_invited)).to eq([true, true])
109
- end
68
+ it "the API responds and loads the collection" do
69
+ expect(TeamSnap::Response).to receive("load_collection").with(any_args).and_call_original
70
+ end
71
+ end
110
72
 
111
- it "raises and exception when a command is invalid" do
112
- expect {
113
- TeamSnap::Member.disable_member(:foo => :bar)
114
- }.to raise_error(
115
- ArgumentError,
116
- "Invalid argument(s). Valid argument(s) are [:member_id]"
117
- )
118
- end
73
+ it "processes the response" do
74
+ VCR.use_cassette("apiv3-init") do
75
+ TeamSnap.init(
76
+ :url => ROOT_TEST_URL,
77
+ :client_id => client_id,
78
+ :client_secret => client_secret
79
+ )
80
+ end
119
81
 
120
- it "can handle errors generated by command" do
121
- expect {
122
- TeamSnap::Member.disable_member
123
- }.to raise_error(
124
- TeamSnap::Error,
125
- "You must provide the member_id."
126
- )
82
+ client = TeamSnap::Client.new({
83
+ :url => ROOT_TEST_URL,
84
+ :client_id => client_id,
85
+ :client_secret => client_secret
86
+ })
87
+ via = :get
88
+ href = "/"
89
+ args = {}
90
+
91
+ expect(TeamSnap.run(client, via, href, args).fetch(:links)).to_not be_empty
92
+ expect(TeamSnap.run(client, via, href, args).fetch(:queries)).to_not be_empty
93
+ expect(TeamSnap.run(client, via, href, args).fetch(:commands)).to_not be_empty
94
+ expect(TeamSnap.run(client, via, href, args).fetch(:href)).to eq(ROOT_TEST_URL + href)
95
+ end
127
96
  end
128
97
 
129
- it "adds .find if .search is available" do
130
- t = TeamSnap::Team.find(1)
98
+ describe ".client_send" do
99
+ let(:client) {
100
+ TeamSnap::Client.new({
101
+ :url => ROOT_TEST_URL,
102
+ :client_id => client_id,
103
+ :client_secret => client_secret
104
+ })
105
+ }
106
+
107
+ context "when sent a known `via`" do
108
+ it "calls GET on the given client" do
109
+ via = :get
110
+ href = "/"
111
+ args = {}
112
+
113
+ expect(client).to receive(via).with(href, args).and_call_original
114
+ TeamSnap.client_send(client, via, href, args)
115
+ end
131
116
 
132
- expect(t.id).to eq(1)
133
- end
117
+ it "calls DELETE on the given client" do
118
+ via = :delete
119
+ href = "/"
120
+ args = {}
134
121
 
135
- it "raises an exception if .find returns nothing" do
136
- expect {
137
- TeamSnap::Team.find(0)
138
- }.to raise_error(
139
- TeamSnap::NotFound,
140
- "Could not find a TeamSnap::Team with an id of '0'."
141
- )
142
- end
122
+ expect(client).to receive(via).with(href, args).and_call_original
123
+ TeamSnap.client_send(client, via, href, args)
124
+ end
143
125
 
144
- it "can follow singular links" do
145
- m = TeamSnap::Member.find(3)
146
- t = m.team
126
+ it "calls POST on the given client" do
127
+ via = :post
128
+ href = "/"
129
+ args = {}
147
130
 
148
- expect(t.id).to eq(1)
149
- end
131
+ expect(client).to receive(via).with(href).and_call_original
132
+ TeamSnap.client_send(client, via, href, args)
133
+ end
150
134
 
151
- it "can handle links with no data" do
152
- m = TeamSnap::Member.find(1)
153
- as = m.assignments
135
+ it "calls PATCH on the given client" do
136
+ via = :patch
137
+ href = "/"
138
+ args = {}
154
139
 
155
- expect(as).to be_empty
156
- end
140
+ expect(client).to receive(via).with(href).and_call_original
141
+ TeamSnap.client_send(client, via, href, args)
142
+ end
143
+ end
157
144
 
158
- it "can follow plural links" do
159
- t = TeamSnap::Team.find(1)
160
- ms = t.members
145
+ context "when sent unknown `via`" do
146
+ it "responds with an error" do
147
+ expect {
148
+ TeamSnap.client_send(client, :unknown, "/", {})
149
+ }.to raise_error(
150
+ TeamSnap::Error,
151
+ "Don't know how to run `unknown`"
152
+ )
153
+ end
161
154
 
162
- expect(ms.size).to eq(16)
163
- end
155
+ it "responds with an error" do
156
+ expect {
157
+ TeamSnap.client_send(client, :head, "/", {})
158
+ }.to raise_error(
159
+ TeamSnap::Error,
160
+ "Don't know how to run `head`"
161
+ )
162
+ end
164
163
 
165
- it "can use bulk load" do
166
- cs = TeamSnap.bulk_load(:team_id => 1, :types => "team,member")
164
+ it "responds with an error" do
165
+ expect {
166
+ TeamSnap.client_send(client, :options, "/", {})
167
+ }.to raise_error(
168
+ TeamSnap::Error,
169
+ "Don't know how to run `options`"
170
+ )
171
+ end
167
172
 
168
- expect(cs).to_not be_empty
169
- expect(cs.size).to eq(17)
170
- expect(cs[0]).to be_a(TeamSnap::Team)
171
- expect(cs[0].id).to eq(1)
172
- cs[3..17].each.with_index(5) do |c, idx|
173
- expect(c).to be_a(TeamSnap::Member)
174
- expect(c.id).to eq(idx)
173
+ it "responds with an error" do
174
+ expect {
175
+ TeamSnap.client_send(client, :trace, "/", {})
176
+ }.to raise_error(
177
+ TeamSnap::Error,
178
+ "Don't know how to run `trace`"
179
+ )
180
+ end
175
181
  end
176
182
  end
177
183
 
178
- it "can handle an empty bulk load" do
179
- cs = TeamSnap.bulk_load(:team_id => 0, :types => "team,member")
180
-
181
- expect(cs).to be_empty
182
- end
183
-
184
- it "can handle an error with bulk load" do
185
- expect {
186
- TeamSnap.bulk_load
187
- }.to raise_error(
188
- TeamSnap::Error,
189
- "You must include a team_id parameter"
190
- )
191
- end
192
-
193
- it "adds href to items" do
194
- m = TeamSnap::Member.find(1)
195
-
196
- expect(m.href).to eq("#{ROOT_TEST_URL}/members/1")
197
- end
184
+ describe ".bulk_load" do
185
+ before(:all) do
186
+ VCR.use_cassette("apiv3-init") do
187
+ TeamSnap.init(
188
+ :url => ROOT_TEST_URL,
189
+ :client_id => "classic",
190
+ :client_secret => "dont_tell_the_cops"
191
+ )
192
+ end
193
+ end
198
194
 
199
- context "supports relations with expected behaviors" do
200
- let(:event) { TeamSnap::Event.find(1) }
195
+ it "can use bulk load" do
196
+ cs = TeamSnap.bulk_load(
197
+ TeamSnap.root_client,
198
+ :team_id => 1,
199
+ :types => "team,member"
200
+ )
201
201
 
202
- context "when a plural relation is called" do
203
- it "responds with an array of objects when successful" do
204
- a = event.availabilities
205
- expect(a.size).to be > 0
206
- expect(a).to be_an(Array)
202
+ expect(cs).to_not be_empty
203
+ expect(cs.size).to eq(18)
204
+ expect(cs[0]).to be_a(TeamSnap::Team)
205
+ expect(cs[0].id).to eq(1)
206
+ cs[3..17].each.with_index(4) do |c, idx|
207
+ expect(c).to be_a(TeamSnap::Member)
208
+ expect(c.id).to eq(idx)
207
209
  end
210
+ end
208
211
 
209
- it "responds with an empty array when no objects exist" do
210
- a = event.assignments
211
- expect(a.size).to eq(0)
212
- expect(a).to be_an(Array)
213
- end
212
+ it "can handle an empty bulk load" do
213
+ cs = TeamSnap.bulk_load(
214
+ TeamSnap.root_client,
215
+ :team_id => 0,
216
+ :types => "team,member"
217
+ )
218
+
219
+ expect(cs).to be_empty
214
220
  end
215
221
 
216
- context "when a singular relation is called" do
217
- it "responds with the object if it exists" do
218
- a = event.team
219
- expect(a).to be_a(TeamSnap::Team)
220
- end
222
+ it "expects a client as the first parameter" do
223
+ expect {
224
+ TeamSnap.bulk_load
225
+ }.to raise_error(
226
+ ArgumentError,
227
+ "wrong number of arguments (0 for 1+)"
228
+ )
229
+ end
221
230
 
222
- it "responds with nil if it does NOT exist" do
223
- a = event.division_location
224
- expect(a).to be_a(NilClass)
225
- end
231
+ it "can handle an error with bulk load" do
232
+ expect {
233
+ TeamSnap.bulk_load(TeamSnap.root_client)
234
+ }.to raise_error(
235
+ TeamSnap::Error,
236
+ "You must include a team_id parameter"
237
+ )
226
238
  end
227
239
  end
228
240
  end