enceladus 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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