marvel_api 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.document +1 -1
  3. data/.rspec +2 -1
  4. data/.travis.yml +8 -0
  5. data/Gemfile +11 -4
  6. data/Guardfile +5 -0
  7. data/LICENSE.txt +1 -1
  8. data/README.md +16 -4
  9. data/Rakefile +11 -8
  10. data/lib/marvel/client.rb +6 -14
  11. data/lib/marvel/connection.rb +10 -2
  12. data/lib/marvel/error.rb +16 -0
  13. data/lib/marvel/request.rb +22 -8
  14. data/lib/marvel/response.rb +21 -0
  15. data/lib/marvel/version.rb +14 -0
  16. data/marvel_api.gemspec +75 -18
  17. data/spec/fixtures/characters/character.json +341 -0
  18. data/spec/fixtures/characters/character_comics.json +4975 -0
  19. data/spec/fixtures/characters/character_events.json +1666 -0
  20. data/spec/fixtures/characters/character_series.json +6117 -0
  21. data/spec/fixtures/characters/character_stories.json +1873 -0
  22. data/spec/fixtures/characters/characters.json +3006 -0
  23. data/spec/fixtures/comics/comic.json +359 -0
  24. data/spec/fixtures/comics/comic_characters.json +4649 -0
  25. data/spec/fixtures/comics/comic_creators.json +4387 -0
  26. data/spec/fixtures/comics/comic_events.json +522 -0
  27. data/spec/fixtures/comics/comic_stories.json +1985 -0
  28. data/spec/fixtures/comics/comics.json +2246 -0
  29. data/spec/fixtures/creators/creator.json +340 -0
  30. data/spec/fixtures/creators/creator_comics.json +2856 -0
  31. data/spec/fixtures/creators/creator_events.json +1899 -0
  32. data/spec/fixtures/creators/creator_series.json +4686 -0
  33. data/spec/fixtures/creators/creator_stories.json +1491 -0
  34. data/spec/fixtures/creators/creators.json +1376 -0
  35. data/spec/fixtures/errors/empty_parameter.json +4 -0
  36. data/spec/fixtures/errors/excessive_filter_values.json +4 -0
  37. data/spec/fixtures/errors/invalid_credentials.json +4 -0
  38. data/spec/fixtures/errors/invalid_filter_value.json +4 -0
  39. data/spec/fixtures/errors/invalid_hash_ts_key_combo.json +4 -0
  40. data/spec/fixtures/errors/invalid_ordering.json +4 -0
  41. data/spec/fixtures/errors/invalid_parameter.json +4 -0
  42. data/spec/fixtures/errors/limit_invalid.json +4 -0
  43. data/spec/fixtures/errors/limit_over_100.json +4 -0
  44. data/spec/fixtures/errors/resource_not_found.json +4 -0
  45. data/spec/fixtures/events/event.json +522 -0
  46. data/spec/fixtures/events/event_characters.json +6397 -0
  47. data/spec/fixtures/events/event_comics.json +4718 -0
  48. data/spec/fixtures/events/event_creators.json +5869 -0
  49. data/spec/fixtures/events/event_series.json +2243 -0
  50. data/spec/fixtures/events/event_stories.json +4846 -0
  51. data/spec/fixtures/events/events.json +8613 -0
  52. data/spec/fixtures/series/serie.json +448 -0
  53. data/spec/fixtures/series/series.json +3464 -0
  54. data/spec/fixtures/series/series_characters.json +6029 -0
  55. data/spec/fixtures/series/series_comics.json +2935 -0
  56. data/spec/fixtures/series/series_creators.json +5923 -0
  57. data/spec/fixtures/series/series_events.json +944 -0
  58. data/spec/fixtures/series/series_stories.json +1544 -0
  59. data/spec/fixtures/stories/stories.json +1282 -0
  60. data/spec/fixtures/stories/story.json +117 -0
  61. data/spec/fixtures/stories/story_characters.json +794 -0
  62. data/spec/fixtures/stories/story_comics.json +522 -0
  63. data/spec/fixtures/stories/story_creators.json +1672 -0
  64. data/spec/fixtures/stories/story_events.json +522 -0
  65. data/spec/fixtures/stories/story_series.json +695 -0
  66. data/spec/marvel_api/client/client_character_spec.rb +142 -0
  67. data/spec/marvel_api/client/client_comic_spec.rb +141 -0
  68. data/spec/marvel_api/client/client_creator_spec.rb +139 -0
  69. data/spec/marvel_api/client/client_event_spec.rb +163 -0
  70. data/spec/marvel_api/client/client_series_spec.rb +165 -0
  71. data/spec/marvel_api/client/client_story_spec.rb +162 -0
  72. data/spec/marvel_api/error_spec.rb +192 -0
  73. data/spec/marvel_api_spec.rb +15 -3
  74. data/spec/spec_helper.rb +55 -4
  75. metadata +83 -27
  76. data/VERSION +0 -1
  77. data/spec/marvel_api/client_spec.rb +0 -7
@@ -0,0 +1,165 @@
1
+ require 'spec_helper'
2
+
3
+ describe Marvel::Client do
4
+ let(:client) { marvel_test_client }
5
+
6
+ context 'Series endpoints' do
7
+ let(:id) { 354 }
8
+
9
+ describe '#series' do
10
+ before do
11
+ stub_get('series', returns: 'series/series.json')
12
+ end
13
+
14
+ it 'fetches a list of series' do
15
+ expect(client.series.size).to eq 20
16
+ expect(client.series.map(&:title).take(3))
17
+ .to eq ['100th Anniversary Special (2014 - Present)',
18
+ '15-Love (2011)',
19
+ '15-Love GN-TPB (2013 - Present)']
20
+ end
21
+
22
+ it 'requests public/v1/series successfully' do
23
+ expect(client.series.status).to eq 'Ok'
24
+ end
25
+
26
+ it 'returns an [ Hashie::Mash ]' do
27
+ expect(client.series).to be_an Array
28
+ expect(client.series.sample).to be_a Hashie::Mash
29
+ end
30
+ end
31
+
32
+ describe '#serie' do
33
+ before do
34
+ stub_get("series/#{id}", returns: 'series/serie.json')
35
+ end
36
+
37
+ it 'fetches a single series by id' do
38
+ expect(client.serie(id).size).to eq 1
39
+ expect(client.serie(id).pop.title)
40
+ .to eq 'Avengers (1998 - 2004)'
41
+ end
42
+
43
+ it 'requests public/v1/series/#{id} successfully' do
44
+ expect(client.serie(id).status).to eq 'Ok'
45
+ end
46
+
47
+ it 'returns an [ Hashie::Mash ]' do
48
+ expect(client.serie(id)).to be_an Array
49
+ expect(client.serie(id).sample).to be_a Hashie::Mash
50
+ end
51
+ end
52
+
53
+ describe '#series_characters' do
54
+ before do
55
+ stub_get("series/#{id}/characters",
56
+ returns: 'series/series_characters.json')
57
+ end
58
+
59
+ it 'fetches a list of characters filtered by series id' do
60
+ expect(client.series_characters(id).size).to eq 20
61
+ expect(client.series_characters(id).map(&:name).take(3))
62
+ .to eq ['A.I.M.',
63
+ 'Abomination (Emil Blonsky)',
64
+ 'Archangel']
65
+ end
66
+
67
+ it 'requests public/v1/series/#{id}/characters successfully' do
68
+ expect(client.series_characters(id).status).to eq 'Ok'
69
+ end
70
+
71
+ it 'returns an [ Hashie::Mash ]' do
72
+ expect(client.series_characters(id)).to be_an Array
73
+ expect(client.series_characters(id).sample).to be_a Hashie::Mash
74
+ end
75
+ end
76
+
77
+ describe '#series_comics' do
78
+ before do
79
+ stub_get("series/#{id}/comics",
80
+ returns: 'series/series_comics.json')
81
+ end
82
+
83
+ it 'fetches a list of comics filtered by series id' do
84
+ expect(client.series_comics(id).size).to eq 20
85
+ expect(client.series_comics(id).map(&:id).take(3))
86
+ .to eq [923, 845, 767]
87
+ end
88
+
89
+ it 'requests public/v1/series/#{id}/comics successfully' do
90
+ expect(client.series_comics(id).status).to eq 'Ok'
91
+ end
92
+
93
+ it 'returns an [ Hashie::Mash ]' do
94
+ expect(client.series_comics(id)).to be_an Array
95
+ expect(client.series_comics(id).sample).to be_a Hashie::Mash
96
+ end
97
+ end
98
+
99
+ describe '#series_creators' do
100
+ before do
101
+ stub_get("series/#{id}/creators",
102
+ returns: 'series/series_creators.json')
103
+ end
104
+
105
+ it 'fetches a list of creators filtered by series id' do
106
+ expect(client.series_creators(id).size).to eq 20
107
+ expect(client.series_creators(id).map(&:id).take(3))
108
+ .to eq [807, 5744, 6694]
109
+ end
110
+
111
+ it 'requests public/v1/series/#{id}/creators successfully' do
112
+ expect(client.series_creators(id).status).to eq 'Ok'
113
+ end
114
+
115
+ it 'returns an [ Hashie::Mash ]' do
116
+ expect(client.series_creators(id)).to be_an Array
117
+ expect(client.series_creators(id).sample).to be_a Hashie::Mash
118
+ end
119
+ end
120
+
121
+ describe '#series_events' do
122
+ before do
123
+ stub_get("series/#{id}/events",
124
+ returns: 'series/series_events.json')
125
+ end
126
+
127
+ it 'fetches a list of events filtered by series id' do
128
+ expect(client.series_events(id).size).to eq 2
129
+ expect(client.series_events(id).map(&:title))
130
+ .to eq ['Avengers Disassembled', 'Maximum Security']
131
+ end
132
+
133
+ it 'requests public/v1/series/#{id}/events successfully' do
134
+ expect(client.series_events(id).status).to eq 'Ok'
135
+ end
136
+
137
+ it 'returns an [ Hashie::Mash ]' do
138
+ expect(client.series_events(id)).to be_an Array
139
+ expect(client.series_events(id).sample).to be_a Hashie::Mash
140
+ end
141
+ end
142
+
143
+ describe '#series_stories' do
144
+ before do
145
+ stub_get("series/#{id}/stories",
146
+ returns: 'series/series_stories.json')
147
+ end
148
+
149
+ it 'fetches a list of stories filtered by series id' do
150
+ expect(client.series_stories(id).size).to eq 20
151
+ expect(client.series_stories(id).map(&:id).take(3))
152
+ .to eq [490, 542, 572]
153
+ end
154
+
155
+ it 'requests public/v1/series/#{id}/stories successfully' do
156
+ expect(client.series_stories(id).status).to eq 'Ok'
157
+ end
158
+
159
+ it 'returns an [ Hashie::Mash ]' do
160
+ expect(client.series_stories(id)).to be_an Array
161
+ expect(client.series_stories(id).sample).to be_a Hashie::Mash
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+
3
+ describe Marvel::Client do
4
+ let(:client) { marvel_test_client }
5
+
6
+ context 'Story endpoints' do
7
+ let(:id) { 2209 }
8
+
9
+ describe '#stories' do
10
+ before do
11
+ stub_get('stories', returns: 'stories/stories.json')
12
+ end
13
+
14
+ it 'fetches a list of stories' do
15
+ expect(client.stories.size).to eq 20
16
+ expect(client.stories.map(&:id).take(3))
17
+ .to eq [3, 7, 8]
18
+ end
19
+
20
+ it 'requests public/v1/stories successfully' do
21
+ expect(client.stories.status).to eq 'Ok'
22
+ end
23
+
24
+ it 'returns an [ Hashie::Mash ]' do
25
+ expect(client.stories).to be_an Array
26
+ expect(client.stories.sample).to be_a Hashie::Mash
27
+ end
28
+ end
29
+
30
+ describe '#story' do
31
+ before do
32
+ stub_get("stories/#{id}", returns: 'stories/story.json')
33
+ end
34
+
35
+ it 'fetches a single story by id' do
36
+ expect(client.story(id).size).to eq 1
37
+ expect(client.story(id).pop.title)
38
+ .to eq '1 of 3 - House of M'
39
+ end
40
+
41
+ it 'requests public/v1/stories/#{id} successfully' do
42
+ expect(client.story(id).status).to eq 'Ok'
43
+ end
44
+
45
+ it 'returns an [ Hashie::Mash ]' do
46
+ expect(client.story(id)).to be_an Array
47
+ expect(client.story(id).sample).to be_a Hashie::Mash
48
+ end
49
+ end
50
+
51
+ describe '#story_characters' do
52
+ before do
53
+ stub_get("stories/#{id}/characters",
54
+ returns: 'stories/story_characters.json')
55
+ end
56
+
57
+ it 'fetches a list of characters filtered by story id' do
58
+ expect(client.story_characters(id).size).to eq 2
59
+ expect(client.story_characters(id).map(&:name))
60
+ .to eq ['Iron Man', 'Wolverine']
61
+ end
62
+
63
+ it 'requests public/v1/stories/#{id}/characters successfully' do
64
+ expect(client.story_characters(id).status).to eq 'Ok'
65
+ end
66
+
67
+ it 'returns an [ Hashie::Mash ]' do
68
+ expect(client.story_characters(id)).to be_an Array
69
+ expect(client.story_characters(id).sample).to be_a Hashie::Mash
70
+ end
71
+ end
72
+
73
+ describe '#story_comics' do
74
+ before do
75
+ stub_get("stories/#{id}/comics",
76
+ returns: 'stories/story_comics.json')
77
+ end
78
+
79
+ it 'fetches a list of comics filtered by story id' do
80
+ expect(client.story_comics(id).size).to eq 2
81
+ expect(client.story_comics(id).map(&:title))
82
+ .to eq ['House of M: World of M (Trade Paperback)',
83
+ 'Wolverine (2003) #33']
84
+ end
85
+
86
+ it 'requests public/v1/stories/#{id}/comics successfully' do
87
+ expect(client.story_comics(id).status).to eq 'Ok'
88
+ end
89
+
90
+ it 'returns an [ Hashie::Mash ]' do
91
+ expect(client.story_comics(id)).to be_an Array
92
+ expect(client.story_comics(id).sample).to be_a Hashie::Mash
93
+ end
94
+ end
95
+
96
+ describe '#story_creators' do
97
+ before do
98
+ stub_get("stories/#{id}/creators",
99
+ returns: 'stories/story_creators.json')
100
+ end
101
+
102
+ it 'fetches a list of creators filtered by story id' do
103
+ expect(client.story_creators(id).size).to eq 5
104
+ expect(client.story_creators(id).map(&:fullName).take(3))
105
+ .to eq ['Randy Gentile', 'Paul Mounts', 'Javier Saltares']
106
+ end
107
+
108
+ it 'requests public/v1/stories/#{id}/creators successfully' do
109
+ expect(client.story_creators(id).status).to eq 'Ok'
110
+ end
111
+
112
+ it 'returns an [ Hashie::Mash ]' do
113
+ expect(client.story_creators(id)).to be_an Array
114
+ expect(client.story_creators(id).sample).to be_a Hashie::Mash
115
+ end
116
+ end
117
+
118
+ describe '#story_events' do
119
+ before do
120
+ stub_get("stories/#{id}/events",
121
+ returns: 'stories/story_events.json')
122
+ end
123
+
124
+ it 'fetches a list of events filtered by story id' do
125
+ expect(client.story_events(id).size).to eq 1
126
+ expect(client.story_events(id).map(&:title))
127
+ .to eq ['House of M']
128
+ end
129
+
130
+ it 'requests public/v1/stories/#{id}/events successfully' do
131
+ expect(client.story_events(id).status).to eq 'Ok'
132
+ end
133
+
134
+ it 'returns an [ Hashie::Mash ]' do
135
+ expect(client.story_events(id)).to be_an Array
136
+ expect(client.story_events(id).sample).to be_a Hashie::Mash
137
+ end
138
+ end
139
+
140
+ describe '#story_series' do
141
+ before do
142
+ stub_get("stories/#{id}/series",
143
+ returns: 'stories/story_series.json')
144
+ end
145
+
146
+ it 'fetches a list of series filtered by story id' do
147
+ expect(client.story_series(id).size).to eq 2
148
+ expect(client.story_series(id).map(&:id))
149
+ .to eq [1614, 632]
150
+ end
151
+
152
+ it 'requests public/v1/stories/#{id}/series successfully' do
153
+ expect(client.story_series(id).status).to eq 'Ok'
154
+ end
155
+
156
+ it 'returns an [ Hashie::Mash ]' do
157
+ expect(client.story_series(id)).to be_an Array
158
+ expect(client.story_series(id).sample).to be_a Hashie::Mash
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,192 @@
1
+ require 'spec_helper'
2
+
3
+ describe Marvel::Response::Error do
4
+ let(:client) { marvel_test_client }
5
+
6
+ context 'A request' do
7
+ describe 'for a non-existent resource' do
8
+ before do
9
+ stub_get('characters/1',
10
+ response_code: 404,
11
+ returns: 'errors/resource_not_found.json')
12
+ end
13
+
14
+ it 'returns a 404 not found' do
15
+ expect(client.character(1).to_s)
16
+ .to eq '404 We couldn\'t find that character'
17
+ end
18
+
19
+ it 'returns a Marvel::Response::Error' do
20
+ expect(client.character(1))
21
+ .to be_a Marvel::Response::Error
22
+ end
23
+ end
24
+
25
+ describe 'with a limit parameter greater than 100' do
26
+ before do
27
+ stub_get('characters', limit: 101,
28
+ response_code: 409,
29
+ returns: 'errors/limit_over_100.json')
30
+ end
31
+
32
+ it 'returns a 409 error' do
33
+ expect(client.characters(limit: 101).to_s)
34
+ .to eq '409 You may not request more than 100 items.'
35
+ end
36
+
37
+ it 'returns a Marvel::Response::Error' do
38
+ expect(client.characters(limit: 101))
39
+ .to be_a Marvel::Response::Error
40
+ end
41
+ end
42
+
43
+ describe 'with an invalid limit or less than 1' do
44
+ before do
45
+ stub_get('characters', limit: 0,
46
+ response_code: 409,
47
+ returns: 'errors/limit_invalid.json')
48
+ end
49
+
50
+ it 'returns a 409 error' do
51
+ expect(client.characters(limit: 0).to_s)
52
+ .to eq '409 You must pass an integer limit greater than 0.'
53
+ end
54
+
55
+ it 'returns a Marvel::Response::Error' do
56
+ expect(client.characters(limit: 0))
57
+ .to be_a Marvel::Response::Error
58
+ end
59
+ end
60
+
61
+ describe 'with an invalid paramter' do
62
+ before do
63
+ stub_get('characters', invalid_param: 1,
64
+ response_code: 409,
65
+ returns: 'errors/invalid_parameter.json')
66
+ end
67
+
68
+ it 'returns a 409 error' do
69
+ expect(client.characters(invalid_param: 1).to_s)
70
+ .to eq '409 We don\'t recognize the parameter invalid_param'
71
+ end
72
+
73
+ it 'returns a Marvel::Response::Error' do
74
+ expect(client.characters(invalid_param: 1))
75
+ .to be_a Marvel::Response::Error
76
+ end
77
+ end
78
+
79
+ describe 'with an empty parameter' do
80
+ before do
81
+ stub_get('characters', name: '',
82
+ response_code: 409,
83
+ returns: 'errors/empty_parameter.json')
84
+ end
85
+
86
+ it 'returns a 409 error' do
87
+ expect(client.characters(name: '').to_s)
88
+ .to eq '409 name cannot be blank if it is set'
89
+ end
90
+
91
+ it 'returns a Marvel::Response::Error' do
92
+ expect(client.characters(name: ''))
93
+ .to be_a Marvel::Response::Error
94
+ end
95
+ end
96
+
97
+ describe 'with an invalid ordering parameter' do
98
+ before do
99
+ stub_get('characters', orderBy: 'goofiness',
100
+ response_code: 409,
101
+ returns: 'errors/invalid_ordering.json')
102
+ end
103
+
104
+ it 'returns a 409 error' do
105
+ expect(client.characters(orderBy: 'goofiness').to_s)
106
+ .to eq '409 goofiness is not a valid ordering parameter.'
107
+ end
108
+
109
+ it 'returns a Marvel::Response::Error' do
110
+ expect(client.characters(orderBy: 'goofiness'))
111
+ .to be_a Marvel::Response::Error
112
+ end
113
+ end
114
+
115
+ describe 'with too many values sent to a multi-value list filter' do
116
+ before do
117
+ stub_get('characters', comics: [*1..11] * ',',
118
+ response_code: 409,
119
+ returns: 'errors/excessive_filter_values.json')
120
+ end
121
+
122
+ it 'returns a 409 error' do
123
+ expect(client.characters(comics: [*1..11] * ',').to_s)
124
+ .to eq '409 You may not submit more than 10 issue ids.'
125
+ end
126
+
127
+ it 'returns a Marvel::Response::Error' do
128
+ expect(client.characters(comics: [*1..11] * ','))
129
+ .to be_a Marvel::Response::Error
130
+ end
131
+ end
132
+
133
+ describe 'with an invalid filter value' do
134
+ before do
135
+ stub_get('characters', comics: 'one',
136
+ response_code: 409,
137
+ returns: 'errors/invalid_filter_value.json')
138
+ end
139
+
140
+ it 'returns a 409 error' do
141
+ expect(client.characters(comics: 'one').to_s)
142
+ .to eq '409 You must pass at least one valid '\
143
+ 'issue id if you set the issue filter.'
144
+ end
145
+
146
+ it 'returns a Marvel::Response::Error' do
147
+ expect(client.characters(comics: 'one'))
148
+ .to be_a Marvel::Response::Error
149
+ end
150
+ end
151
+
152
+ context 'with an Etag' do
153
+ let(:id) { 1009652 }
154
+
155
+ describe 'that is valid and up-to-date' do
156
+ let(:etag) { 'd3f102f7c8d0ef375f395733ae2ce06d1899a94f' }
157
+
158
+ before do
159
+ stub_get("characters/#{id}",
160
+ etag: etag,
161
+ response_code: 304,
162
+ returns: nil)
163
+ end
164
+
165
+ it 'returns a 304 error' do
166
+ expect(client.character(id, etag: etag).to_s)
167
+ .to eq '304 Not Modified'
168
+ end
169
+
170
+ it 'returns a Marvel::Response::Error' do
171
+ expect(client.character(1009652, etag: etag))
172
+ .to be_a Marvel::Response::Error
173
+ end
174
+ end
175
+
176
+ describe 'that is invalid or expired' do
177
+ let(:etag) { 'invalid_or_expired_etag' }
178
+
179
+ before do
180
+ stub_get("characters/#{id}",
181
+ etag: etag,
182
+ returns: 'characters/character.json')
183
+ end
184
+
185
+ it 'fetches the requested resource' do
186
+ expect(client.character(id).status).to eq 'Ok'
187
+ expect(client.character(id).pop.name).to eq 'Thanos'
188
+ end
189
+ end
190
+ end
191
+ end
192
+ end