enceladus 0.0.2

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.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.rspec +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +4 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +36 -0
  10. data/Rakefile +2 -0
  11. data/enceladus.gemspec +29 -0
  12. data/lib/enceladus/configuration/api.rb +60 -0
  13. data/lib/enceladus/configuration/image.rb +83 -0
  14. data/lib/enceladus/exceptions.rb +5 -0
  15. data/lib/enceladus/models/account.rb +143 -0
  16. data/lib/enceladus/models/api_paginated_collection.rb +76 -0
  17. data/lib/enceladus/models/api_resource.rb +25 -0
  18. data/lib/enceladus/models/cast.rb +9 -0
  19. data/lib/enceladus/models/genre.rb +4 -0
  20. data/lib/enceladus/models/guest_account.rb +15 -0
  21. data/lib/enceladus/models/movie.rb +162 -0
  22. data/lib/enceladus/models/movie_collection.rb +3 -0
  23. data/lib/enceladus/models/production_company.rb +4 -0
  24. data/lib/enceladus/models/production_country.rb +4 -0
  25. data/lib/enceladus/models/release.rb +4 -0
  26. data/lib/enceladus/models/spoken_language.rb +4 -0
  27. data/lib/enceladus/models/you_tube_trailer.rb +9 -0
  28. data/lib/enceladus/requester.rb +68 -0
  29. data/lib/enceladus/version.rb +3 -0
  30. data/lib/enceladus.rb +43 -0
  31. data/spec/enceladus/configuration/api_spec.rb +59 -0
  32. data/spec/enceladus/configuration/image_spec.rb +200 -0
  33. data/spec/enceladus/enceladus_spec.rb +53 -0
  34. data/spec/enceladus/models/account_spec.rb +176 -0
  35. data/spec/enceladus/models/cast_spec.rb +18 -0
  36. data/spec/enceladus/models/guest_account_spec.rb +19 -0
  37. data/spec/enceladus/models/movie_collection_spec.rb +217 -0
  38. data/spec/enceladus/models/movie_spec.rb +469 -0
  39. data/spec/enceladus/models/you_tube_trailer_spec.rb +16 -0
  40. data/spec/spec_helper.rb +20 -0
  41. data/spec/support/responses/account_response.rb +27 -0
  42. data/spec/support/responses/authentication_response.rb +19 -0
  43. data/spec/support/responses/configuration_response.rb +32 -0
  44. data/spec/support/responses/credits_collection_response.rb +19 -0
  45. data/spec/support/responses/credits_response.rb +29 -0
  46. data/spec/support/responses/error_response.rb +12 -0
  47. data/spec/support/responses/guest_account_response.rb +21 -0
  48. data/spec/support/responses/movie_collection_resource_response.rb +36 -0
  49. data/spec/support/responses/movie_collection_response.rb +20 -0
  50. data/spec/support/responses/movie_response.rb +67 -0
  51. data/spec/support/responses/request_token_response.rb +21 -0
  52. data/spec/support/responses/session_response.rb +19 -0
  53. metadata +239 -0
@@ -0,0 +1,176 @@
1
+ require 'spec_helper'
2
+
3
+ describe Enceladus::Account do
4
+
5
+ let(:request_token_response) { RequestTokenResponse.new }
6
+ let(:authentication_response) { AuthenticationResponse.new }
7
+ let(:session_response) { SessionResponse.new }
8
+ let(:account_response) { AccountResponse.new }
9
+ let(:username) { "ashlynn_brooke" }
10
+ let(:password) { "corinthians" }
11
+
12
+ before do
13
+ stub_request(:get, "https://api.themoviedb.org/3/authentication/token/new?api_key=token").
14
+ to_return(status: 200, body: request_token_response.to_json)
15
+
16
+ stub_request(:get, "https://api.themoviedb.org/3/authentication/token/validate_with_login?api_key=token&password=#{password}&request_token=#{request_token_response.request_token}&username=#{username}").
17
+ to_return(status: 200, body: authentication_response.to_json)
18
+
19
+ stub_request(:get, "https://api.themoviedb.org/3/authentication/session/new?api_key=token&request_token=#{request_token_response.request_token}").
20
+ to_return(status: 200, body: session_response.to_json)
21
+
22
+ stub_request(:get, "https://api.themoviedb.org/3/account?api_key=token&session_id=#{session_response.session_id}").
23
+ to_return(status: 200, body: account_response.to_json)
24
+ end
25
+
26
+ describe "#initialize" do
27
+ subject(:account) { Enceladus::Account.new(username, password) }
28
+
29
+ [:id, :include_adult, :iso_3166_1, :iso_639_1, :name, :username].each do |attr|
30
+ it "should set account #{attr}" do
31
+ expect(account.send(attr)).to eq account_response.send(attr)
32
+ end
33
+ end
34
+
35
+ it "should set account session_id" do
36
+ expect(account.session_id).to eq session_response.session_id
37
+ end
38
+
39
+ it "should nullify account password" do
40
+ expect(account.send(:password)).to be_nil
41
+ end
42
+
43
+ it "should nullify account request token" do
44
+ expect(account.send(:request_token)).to be_nil
45
+ end
46
+ end
47
+
48
+ describe "#favorite_movie!" do
49
+ subject(:make_request) { account.favorite_movie!(movie_id) }
50
+
51
+ let(:account) { Enceladus::Account.new(username, password) }
52
+ let(:movie_id) { 111 }
53
+
54
+ it "should post a request to favorite movie" do
55
+ request = stub_request(:post, "https://api.themoviedb.org/3/account/#{account.id}/favorite?api_key=token&session_id=#{session_response.session_id}").
56
+ with(body: "{\"media_type\":\"movie\",\"media_id\":#{movie_id},\"favorite\":true}").
57
+ to_return(status: 200, body: "{ \"success\": 1 }")
58
+ make_request
59
+ expect(request).to have_been_requested
60
+ end
61
+ end
62
+
63
+ describe "#unfavorite_movie!" do
64
+ subject(:make_request) { account.unfavorite_movie!(movie_id) }
65
+
66
+ let(:account) { Enceladus::Account.new(username, password) }
67
+ let(:movie_id) { 111 }
68
+
69
+ it "should post a request to favorite movie" do
70
+ request = stub_request(:post, "https://api.themoviedb.org/3/account/#{account.id}/favorite?api_key=token&session_id=#{session_response.session_id}").
71
+ with(body: "{\"media_type\":\"movie\",\"media_id\":#{movie_id},\"favorite\":false}").
72
+ to_return(status: 200, body: "{ \"success\": 1 }")
73
+ make_request
74
+ expect(request).to have_been_requested
75
+ end
76
+ end
77
+
78
+ describe "#add_to_watchlist!" do
79
+ subject(:make_request) { account.add_to_watchlist!(movie_id) }
80
+
81
+ let(:account) { Enceladus::Account.new(username, password) }
82
+ let(:movie_id) { 111 }
83
+
84
+ it "should post a request to favorite movie" do
85
+ request = stub_request(:post, "https://api.themoviedb.org/3/account/#{account.id}/watchlist?api_key=token&session_id=#{session_response.session_id}").
86
+ with(body: "{\"media_type\":\"movie\",\"media_id\":#{movie_id},\"watchlist\":true}").
87
+ to_return(status: 200, body: "{ \"success\": 1 }")
88
+ make_request
89
+ expect(request).to have_been_requested
90
+ end
91
+ end
92
+
93
+ describe "#remove_from_watchlist!" do
94
+ subject(:make_request) { account.remove_from_watchlist!(movie_id) }
95
+
96
+ let(:account) { Enceladus::Account.new(username, password) }
97
+ let(:movie_id) { 111 }
98
+
99
+ it "should post a request to favorite movie" do
100
+ request = stub_request(:post, "https://api.themoviedb.org/3/account/#{account.id}/watchlist?api_key=token&session_id=#{session_response.session_id}").
101
+ with(body: "{\"media_type\":\"movie\",\"media_id\":#{movie_id},\"watchlist\":false}").
102
+ to_return(status: 200, body: "{ \"success\": 1 }")
103
+ make_request
104
+ expect(request).to have_been_requested
105
+ end
106
+ end
107
+
108
+ describe "#favorite_movies" do
109
+ subject(:favorite_movies) { account.favorite_movies }
110
+ let(:account) { Enceladus::Account.new(username, password) }
111
+
112
+ let(:collection) { Enceladus::MovieCollection.new(path) }
113
+ let(:movie_1) { MovieCollectionResourceResponse.new }
114
+ let(:movie_2) { MovieCollectionResourceResponse.new }
115
+ let(:response) { MovieCollectionResponse.new }
116
+
117
+ before do
118
+ movie_1.id = 111
119
+ movie_2.id = 222
120
+ response.results = [movie_1, movie_2]
121
+
122
+ stub_request(:get, "https://api.themoviedb.org/3/account/#{account.id}/favorite/movies?api_key=token&page=1&session_id=#{session_response.session_id}").
123
+ to_return(status: 200, body: response.to_json)
124
+ end
125
+
126
+ it "should return all favorite movies" do
127
+ expect(favorite_movies.all.map(&:id)).to include *[movie_1.id, movie_2.id]
128
+ end
129
+ end
130
+
131
+ describe "#rated_movies" do
132
+ subject(:rated_movies) { account.rated_movies }
133
+ let(:account) { Enceladus::Account.new(username, password) }
134
+
135
+ let(:collection) { Enceladus::MovieCollection.new(path) }
136
+ let(:movie_1) { MovieCollectionResourceResponse.new }
137
+ let(:movie_2) { MovieCollectionResourceResponse.new }
138
+ let(:response) { MovieCollectionResponse.new }
139
+
140
+ before do
141
+ movie_1.id = 111
142
+ movie_2.id = 222
143
+ response.results = [movie_1, movie_2]
144
+
145
+ stub_request(:get, "https://api.themoviedb.org/3/account/#{account.id}/rated/movies?api_key=token&page=1&session_id=#{session_response.session_id}").
146
+ to_return(status: 200, body: response.to_json)
147
+ end
148
+
149
+ it "should return all rated movies" do
150
+ expect(rated_movies.all.map(&:id)).to include *[movie_1.id, movie_2.id]
151
+ end
152
+ end
153
+
154
+ describe "#watchlist" do
155
+ subject(:watchlist) { account.watchlist }
156
+ let(:account) { Enceladus::Account.new(username, password) }
157
+
158
+ let(:collection) { Enceladus::MovieCollection.new(path) }
159
+ let(:movie_1) { MovieCollectionResourceResponse.new }
160
+ let(:movie_2) { MovieCollectionResourceResponse.new }
161
+ let(:response) { MovieCollectionResponse.new }
162
+
163
+ before do
164
+ movie_1.id = 111
165
+ movie_2.id = 222
166
+ response.results = [movie_1, movie_2]
167
+
168
+ stub_request(:get, "https://api.themoviedb.org/3/account/#{account.id}/watchlist/movies?api_key=token&page=1&session_id=#{session_response.session_id}").
169
+ to_return(status: 200, body: response.to_json)
170
+ end
171
+
172
+ it "should return all rated movies" do
173
+ expect(watchlist.all.map(&:id)).to include *[movie_1.id, movie_2.id]
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Enceladus::Cast do
4
+ describe "#profile_urls" do
5
+ subject { cast.profile_urls }
6
+ let(:cast) { Enceladus::Cast.new }
7
+
8
+ before do
9
+ cast.profile_path = "/aylar_lie.jpeg"
10
+ stub_request(:get, /api.themoviedb.org\/3\/configuration/).to_return(status: 200, body: ConfigurationResponse.new.to_json)
11
+ Enceladus::Configuration::Image.instance.setup!
12
+ end
13
+
14
+ it "should return profile url" do
15
+ is_expected.to eq(["http://test.com/w45#{cast.profile_path}", "http://test.com/w185#{cast.profile_path}", "http://test.com/h632#{cast.profile_path}", "http://test.com/original#{cast.profile_path}"])
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Enceladus::GuestAccount do
4
+
5
+ let(:guest_account_response) { GuestAccountResponse.new }
6
+
7
+ before do
8
+ stub_request(:get, "https://api.themoviedb.org/3/authentication/guest_session/new?api_key=token").
9
+ to_return(status: 200, body: guest_account_response.to_json)
10
+ end
11
+
12
+ describe "#initialize" do
13
+ subject(:account) { Enceladus::GuestAccount.new }
14
+
15
+ it "should set account guest_session_id" do
16
+ expect(account.session_id).to eq guest_account_response.guest_session_id
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,217 @@
1
+ require 'spec_helper'
2
+
3
+ describe Enceladus::MovieCollection do
4
+ let(:response) { MovieCollectionResponse.new }
5
+ let(:path) { "movie/upcoming" }
6
+ let(:params) { { test: 1 } }
7
+
8
+ describe ".initialize" do
9
+ subject(:collection) { Enceladus::MovieCollection.new(path, params) }
10
+
11
+ before do
12
+ stub_request(:get, /api.themoviedb.org\/3\/movie\/upcoming/).to_return(status: 200, body: response.to_json)
13
+ end
14
+
15
+ it "should set path" do
16
+ expect(collection.path).to eq(path)
17
+ end
18
+
19
+ it "should set params" do
20
+ expect(collection.params).to eq(params)
21
+ end
22
+
23
+ it "should set params[:page] to 1" do
24
+ expect(collection.params[:page]).to eq(1)
25
+ end
26
+
27
+ describe "results_per_page" do
28
+ subject(:movies) { collection.results_per_page }
29
+ let(:movie_from_response) { response.results.first }
30
+
31
+ it "should contain arrays of Enceladus::Movie" do
32
+ is_expected.to be_kind_of(Array)
33
+ expect(movies.flatten.map(&:class)).to eq([Enceladus::Movie])
34
+ end
35
+
36
+ describe "resource" do
37
+ subject(:movie) { movies.flatten.first }
38
+
39
+ it "should set adult" do
40
+ expect(movie.adult).to eq(movie_from_response.adult)
41
+ end
42
+
43
+ it "should set backdrop_path" do
44
+ expect(movie.backdrop_path).to eq(movie_from_response.backdrop_path)
45
+ end
46
+
47
+ it "should set id" do
48
+ expect(movie.id).to eq(movie_from_response.id)
49
+ end
50
+
51
+ it "should set original_title" do
52
+ expect(movie.original_title).to eq(movie_from_response.original_title)
53
+ end
54
+
55
+ it "should set release_date" do
56
+ expect(movie.release_date).to eq(movie_from_response.release_date)
57
+ end
58
+
59
+ it "should set poster_path" do
60
+ expect(movie.poster_path).to eq(movie_from_response.poster_path)
61
+ end
62
+
63
+ it "should set popularity" do
64
+ expect(movie.popularity).to eq(movie_from_response.popularity)
65
+ end
66
+
67
+ it "should set title" do
68
+ expect(movie.title).to eq(movie_from_response.title)
69
+ end
70
+
71
+ it "should set vote_average" do
72
+ expect(movie.vote_average).to eq(movie_from_response.vote_average)
73
+ end
74
+
75
+ it "should set vote_count" do
76
+ expect(movie.vote_count).to eq(movie_from_response.vote_count)
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "#next_page" do
83
+ subject { collection.next_page }
84
+ let(:collection) { Enceladus::MovieCollection.new(path) }
85
+
86
+ before do
87
+ stub_request(:get, /api.themoviedb.org\/3\/movie\/upcoming/).to_return(status: 200, body: response.to_json)
88
+ end
89
+
90
+ it "should increment current_page" do
91
+ subject
92
+ expect(collection.current_page).to eq(2)
93
+ end
94
+
95
+ it "should fetch resources and save into results_per_page properly" do
96
+ subject
97
+ expect(collection.results_per_page.map(&:class)).to eq([Array, Array])
98
+ end
99
+
100
+ it "should return movies for the current_page" do
101
+ expect(subject.map(&:class)).to include(Enceladus::Movie)
102
+ end
103
+ end
104
+
105
+ describe "#previous_page" do
106
+ subject { collection.next_page; collection.previous_page }
107
+ let(:collection) { Enceladus::MovieCollection.new(path) }
108
+
109
+ before do
110
+ stub_request(:get, /api.themoviedb.org\/3\/movie\/upcoming/).to_return(status: 200, body: response.to_json)
111
+ end
112
+
113
+ it "should decrement current_page" do
114
+ subject
115
+ expect(collection.current_page).to eq(1)
116
+ end
117
+
118
+ it "should fetch resources and save into results_per_page properly" do
119
+ subject
120
+ expect(collection.results_per_page.map(&:class)).to eq([Array, Array])
121
+ end
122
+
123
+ it "should return movies for the current_page" do
124
+ expect(subject.map(&:class)).to include(Enceladus::Movie)
125
+ end
126
+ end
127
+
128
+ describe "#current_page" do
129
+ subject { collection.current_page }
130
+ let(:collection) { Enceladus::MovieCollection.new(path) }
131
+
132
+ before do
133
+ stub_request(:get, /api.themoviedb.org\/3\/movie\/upcoming/).to_return(status: 200, body: response.to_json)
134
+ end
135
+
136
+ context "when current page is 1" do
137
+ it "should return 1" do
138
+ is_expected.to eq(1)
139
+ end
140
+ end
141
+
142
+ context "when current page is 2" do
143
+ before { collection.next_page }
144
+ it "should return 2" do
145
+ is_expected.to eq(2)
146
+ end
147
+ end
148
+ end
149
+
150
+ describe "#current_page=" do
151
+ subject { collection.current_page = page }
152
+ let(:collection) { Enceladus::MovieCollection.new(path) }
153
+ let(:page) { 10 }
154
+
155
+ before do
156
+ stub_request(:get, /api.themoviedb.org\/3\/movie\/upcoming/).to_return(status: 200, body: response.to_json)
157
+ end
158
+
159
+ it "should fetch movies and save into results_per_page properly" do
160
+ expect { subject }.to change{ collection.results_per_page[page - 1] }.from(nil)
161
+ end
162
+ end
163
+
164
+ describe "#last" do
165
+ subject { collection.last }
166
+ let(:collection) { Enceladus::MovieCollection.new(path) }
167
+ let(:movie_1) { MovieCollectionResourceResponse.new }
168
+ let(:movie_2) { MovieCollectionResourceResponse.new }
169
+
170
+ before do
171
+ movie_1.id = 111
172
+ movie_2.id = 222
173
+ response.results = [movie_1, movie_2]
174
+ stub_request(:get, /api.themoviedb.org\/3\/movie\/upcoming/).to_return(status: 200, body: response.to_json)
175
+ end
176
+
177
+ it "should return the last movie" do
178
+ expect(subject.id).to eq(movie_2.id)
179
+ end
180
+ end
181
+
182
+ describe "#first" do
183
+ subject { collection.first }
184
+ let(:collection) { Enceladus::MovieCollection.new(path) }
185
+ let(:movie_1) { MovieCollectionResourceResponse.new }
186
+ let(:movie_2) { MovieCollectionResourceResponse.new }
187
+
188
+ before do
189
+ movie_1.id = 111
190
+ movie_2.id = 222
191
+ response.results = [movie_1, movie_2]
192
+ stub_request(:get, /api.themoviedb.org\/3\/movie\/upcoming/).to_return(status: 200, body: response.to_json)
193
+ end
194
+
195
+ it "should return the first movie" do
196
+ expect(subject.id).to eq(movie_1.id)
197
+ end
198
+ end
199
+
200
+ describe "#all" do
201
+ subject { collection.all }
202
+ let(:collection) { Enceladus::MovieCollection.new(path) }
203
+ let(:movie_1) { MovieCollectionResourceResponse.new }
204
+ let(:movie_2) { MovieCollectionResourceResponse.new }
205
+
206
+ before do
207
+ movie_1.id = 111
208
+ movie_2.id = 222
209
+ response.results = [movie_1, movie_2]
210
+ stub_request(:get, /api.themoviedb.org\/3\/movie\/upcoming/).to_return(status: 200, body: response.to_json)
211
+ end
212
+
213
+ it "should return all movies of the current page" do
214
+ expect(subject.map(&:id)).to include *[movie_1.id, movie_2.id]
215
+ end
216
+ end
217
+ end