odeon_uk 1.1.5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CHANGELOG.md +8 -1
  4. data/README.md +1 -0
  5. data/Rakefile +13 -9
  6. data/lib/odeon_uk/cinema.rb +14 -42
  7. data/lib/odeon_uk/film.rb +23 -5
  8. data/lib/odeon_uk/internal/film_with_screenings_parser.rb +133 -46
  9. data/lib/odeon_uk/internal/showtimes_page.rb +36 -0
  10. data/lib/odeon_uk/internal/title_sanitizer.rb +49 -0
  11. data/lib/odeon_uk/internal/website.rb +36 -0
  12. data/lib/odeon_uk/screening.rb +56 -22
  13. data/lib/odeon_uk/version.rb +2 -2
  14. data/lib/odeon_uk.rb +4 -2
  15. data/odeon_uk.gemspec +0 -1
  16. data/test/fixture_updater.rb +72 -0
  17. data/test/fixtures/{odeon-bfi-imax.html → cinema/bfi_imax.html} +988 -1130
  18. data/test/fixtures/{odeon-brighton.html → cinema/brighton.html} +1035 -761
  19. data/test/fixtures/{odeon-london-leicester-square.html → cinema/leicester_square.html} +470 -766
  20. data/test/fixtures/showtimes/brighton/film_first.html +92 -0
  21. data/test/fixtures/showtimes/brighton/film_last.html +100 -0
  22. data/test/fixtures/showtimes/brighton.html +2071 -0
  23. data/test/fixtures/showtimes/liverpool_one/film_first_dbox.html +188 -0
  24. data/test/fixtures/showtimes/manchester/film_first_imax.html +182 -0
  25. data/test/fixtures/{odeon-sitemap.html → sitemap.html} +572 -444
  26. data/test/lib/odeon_uk/cinema_test.rb +129 -231
  27. data/test/lib/odeon_uk/film_test.rb +50 -3
  28. data/test/lib/odeon_uk/internal/film_with_screenings_parser_test.rb +79 -123
  29. data/test/lib/odeon_uk/internal/showtimes_page_test.rb +51 -0
  30. data/test/lib/odeon_uk/internal/title_sanitizer_test.rb +105 -0
  31. data/test/lib/odeon_uk/internal/website_test.rb +59 -0
  32. data/test/lib/odeon_uk/screening_test.rb +66 -32
  33. metadata +32 -53
  34. data/test/fixtures/brighton-showtimes/about-time.html +0 -175
  35. data/test/fixtures/brighton-showtimes/autism-friendly-planes.html +0 -75
  36. data/test/fixtures/brighton-showtimes/bolshoi-spartacus-live.html +0 -67
  37. data/test/fixtures/brighton-showtimes/cinemagic-echo-planet.html +0 -67
  38. data/test/fixtures/brighton-showtimes/globe-on-screen-twelfth-night.html +0 -67
  39. data/test/fixtures/brighton-showtimes/met-opera-eugene-onegin.html +0 -67
  40. data/test/fixtures/brighton-showtimes/national-theatre-live-frankenstein.html +0 -78
  41. data/test/fixtures/brighton-showtimes/nt-live-war-horse.html +0 -67
  42. data/test/fixtures/brighton-showtimes/royal-opera-house-turandot.html +0 -66
  43. data/test/fixtures/brighton-showtimes/rsc-richard-ii.html +0 -67
  44. data/test/fixtures/brighton-showtimes/star-trek-into-darkness-2d.html +0 -83
  45. data/test/fixtures/brighton-showtimes/ukjff-from-cable-street-to-brick-lane.html +0 -67
  46. data/test/fixtures/manchester-showtimes/thor-the-dark-world.html +0 -300
  47. data/test/fixtures/odeon-brighton-showtimes.html +0 -1238
@@ -1,358 +1,256 @@
1
1
  require_relative '../../test_helper'
2
2
 
3
3
  describe OdeonUk::Cinema do
4
+ let(:described_class) { OdeonUk::Cinema }
4
5
 
5
- before { WebMock.disable_net_connect! }
6
+ let(:website) { Minitest::Mock.new }
7
+
8
+ before do
9
+ WebMock.disable_net_connect!
10
+ end
6
11
 
7
12
  describe '.all' do
8
- subject { OdeonUk::Cinema.all }
13
+ subject { described_class.all }
9
14
 
10
15
  before do
11
- sitemap_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-sitemap.html') )
12
- stub_request(:get, 'http://www.odeon.co.uk/sitemap/').to_return( status: 200, body: sitemap_body, headers: {} )
16
+ website.expect(:sitemap, sitemap_html)
13
17
  end
14
18
 
15
- it 'returns an Array of Odeon::Cinemas' do
16
- subject.must_be_instance_of(Array)
17
- subject.each do |value|
18
- value.must_be_instance_of(OdeonUk::Cinema)
19
+ it 'returns an Array of OdeonUk::Cinemas' do
20
+ OdeonUk::Internal::Website.stub :new, website do
21
+ subject.must_be_instance_of(Array)
22
+ subject.each do |value|
23
+ value.must_be_instance_of(described_class)
24
+ end
19
25
  end
20
26
  end
21
27
 
22
28
  it 'returns the correctly sized array' do
23
- subject.size.must_equal 114
29
+ OdeonUk::Internal::Website.stub :new, website do
30
+ subject.size.must_equal 115
31
+ end
24
32
  end
25
33
  end
26
34
 
27
35
  describe '.find(id)' do
28
- subject { OdeonUk::Cinema.find(id) }
29
-
30
- before do
31
- sitemap_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-sitemap.html') )
32
- stub_request(:get, 'http://www.odeon.co.uk/sitemap/').to_return( status: 200, body: sitemap_body, headers: {} )
33
- end
36
+ subject { described_class.find(id) }
34
37
 
35
38
  describe 'Brighton' do
36
39
  let(:id) { 71 }
37
40
 
38
- it 'returns a cinema' do
39
- subject.must_be_instance_of(OdeonUk::Cinema)
40
-
41
- subject.id.must_equal 71
42
- subject.brand.must_equal 'Odeon'
43
- subject.name.must_equal 'Brighton'
44
- subject.slug.must_equal 'brighton'
45
- subject.url.must_equal 'http://www.odeon.co.uk/cinemas/brighton/71/'
41
+ before do
42
+ website.expect(:sitemap, sitemap_html)
43
+ # website.expect(:cinemas, cinema_html('brighton'), [71])
46
44
  end
47
- end
48
-
49
- describe 'Leicester Square' do
50
- let(:id) { 105 }
51
45
 
52
- it 'returns a cinema with London prefix removed in the name' do
53
- subject.must_be_instance_of(OdeonUk::Cinema)
54
-
55
- subject.id.must_equal 105
56
- subject.brand.must_equal 'Odeon'
57
- subject.name.must_equal 'Leicester Square'
58
- subject.slug.must_equal 'leicester-square'
59
- subject.url.must_equal 'http://www.odeon.co.uk/cinemas/london_leicester_square/105/'
46
+ it 'returns a cinema' do
47
+ OdeonUk::Internal::Website.stub :new, website do
48
+ subject.must_be_instance_of(described_class)
49
+
50
+ subject.id.must_equal 71
51
+ subject.brand.must_equal 'Odeon'
52
+ subject.name.must_equal 'Brighton'
53
+ subject.slug.must_equal 'brighton'
54
+ subject.url.must_equal 'http://www.odeon.co.uk/cinemas/brighton/71/'
55
+ end
60
56
  end
61
57
  end
62
58
  end
63
59
 
64
- describe '.new id, name, url' do
65
- it 'stores id, name, slug and url' do
66
- cinema = OdeonUk::Cinema.new '23', 'Brighton & Hove', '/cinemas/brighton/71/'
67
- cinema.id.must_equal 23
68
- cinema.brand.must_equal 'Odeon'
69
- cinema.name.must_equal 'Brighton & Hove'
70
- cinema.slug.must_equal 'brighton-hove'
71
- cinema.url.must_equal 'http://www.odeon.co.uk/cinemas/brighton/71/'
60
+ describe '.new' do
61
+ it 'removes "London" name prefix' do
62
+ cinema = OdeonUk::Cinema.new 79, 'London - Leicester Square', '/cinemas/london_leicester_square/105/'
63
+ cinema.id.must_equal 79
64
+ cinema.name.must_equal 'Leicester Square'
65
+ cinema.slug.must_equal 'leicester-square'
66
+ end
67
+
68
+ it 'removes " - " and replaces it with a colon ": "' do
69
+ cinema = OdeonUk::Cinema.new 208, 'Whiteleys - The Lounge', '/cinemas/whiteleys_the_lounge/208/'
70
+ cinema.id.must_equal 208
71
+ cinema.name.must_equal 'Whiteleys: The Lounge'
72
+ cinema.slug.must_equal 'whiteleys-the-lounge'
72
73
  end
73
74
  end
74
75
 
75
76
  describe '#adr' do
76
- describe 'short address' do
77
- let(:cinema) { OdeonUk::Cinema.new('71', 'Brighton', '/cinemas/brighton/71/') }
78
- subject { cinema.adr }
77
+ subject { cinema.adr }
79
78
 
80
- before do
81
- brighton_cinema_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-brighton.html') )
82
- stub_request(:get, 'http://www.odeon.co.uk/cinemas/brighton/71/').to_return( status: 200, body: brighton_cinema_body, headers: {} )
79
+ describe '(brighton)' do
80
+ let(:cinema) do
81
+ described_class.new(71, 'Brighton', '/cinemas/brighton/71/')
83
82
  end
84
83
 
85
- it 'returns a Hash' do
86
- subject.must_be_instance_of Hash
84
+ before do
85
+ website.expect(:cinema, cinema_html('brighton'), [71])
87
86
  end
88
87
 
89
- it 'returns address hash' do
90
- subject.must_equal({
91
- street_address: 'Kingswest',
92
- locality: 'Brighton',
93
- postal_code: 'BN1 2RE',
94
- country: 'United Kingdom'
95
- })
88
+ it 'returns the address hash' do
89
+ OdeonUk::Internal::Website.stub :new, website do
90
+ subject.must_equal(
91
+ street_address: 'Kingswest',
92
+ locality: 'Brighton',
93
+ postal_code: 'BN1 2RE',
94
+ country: 'United Kingdom'
95
+ )
96
+ end
96
97
  end
97
98
  end
98
99
  end
99
100
 
100
101
  describe '#films' do
101
- let(:cinema) { OdeonUk::Cinema.new('71', 'Brighton & Hove', '/cinemas/brighton/71/') }
102
102
  subject { cinema.films }
103
103
 
104
- before do
105
- brighton_screenings_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-brighton-showtimes.html') )
106
- stub_request(:get, 'http://www.odeon.co.uk/showtimes/week/71?siteId=71').to_return( status: 200, body: brighton_screenings_body, headers: {} )
107
- end
108
-
109
- it 'returns an array of films' do
110
- subject.must_be_instance_of(Array)
111
- subject.each do |item|
112
- item.must_be_instance_of(OdeonUk::Film)
113
- end
114
- end
115
-
116
- it 'returns correct number of films' do
117
- subject.count.must_equal 16
104
+ let(:cinema) do
105
+ described_class.new(71, 'Brighton', '/cinemas/brighton/71/')
118
106
  end
119
107
 
120
- it 'returns uniquely named films' do
121
- subject.each_with_index do |item, index|
122
- subject.each_with_index do |jtem, i|
123
- if index != i
124
- item.name.wont_equal jtem.name
125
- item.wont_equal jtem
126
- end
127
- end
108
+ it 'calls out to Screening object' do
109
+ OdeonUk::Film.stub :at, [:film] do
110
+ subject.must_equal([:film])
128
111
  end
129
112
  end
130
-
131
- it 'returns film objects with correct names' do
132
- subject.first.name.must_equal 'About Time'
133
- subject.last.name.must_equal 'White House Down'
134
- end
135
113
  end
136
114
 
137
115
  describe '#full_name' do
138
116
  subject { cinema.full_name }
139
117
 
140
118
  describe 'simple name (brighton)' do
141
- let(:cinema) { OdeonUk::Cinema.new('71', 'Brighton', '/cinemas/brighton/71/') }
119
+ let(:cinema) do
120
+ OdeonUk::Cinema.new('71', 'Brighton', '/cinemas/brighton/71/')
121
+ end
142
122
 
143
123
  before do
144
- brighton_cinema_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-brighton.html') )
145
- stub_request(:get, 'http://www.odeon.co.uk/cinemas/brighton/71/').to_return( status: 200, body: brighton_cinema_body, headers: {} )
124
+ website.expect(:cinema, cinema_html('brighton'), [71])
146
125
  end
147
126
 
148
127
  it 'returns the brand in the name' do
149
- subject.must_equal 'Odeon Brighton'
128
+ OdeonUk::Internal::Website.stub :new, website do
129
+ subject.must_equal 'Odeon Brighton'
130
+ end
150
131
  end
151
132
  end
152
133
  end
153
134
 
154
135
  describe '#locality' do
155
- describe 'short address' do
156
- let(:cinema) { OdeonUk::Cinema.new('71', 'Brighton', '/cinemas/brighton/71/') }
157
- subject { cinema.locality }
136
+ subject { cinema.locality }
158
137
 
159
- before do
160
- brighton_cinema_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-brighton.html') )
161
- stub_request(:get, 'http://www.odeon.co.uk/cinemas/brighton/71/').to_return( status: 200, body: brighton_cinema_body, headers: {} )
138
+ describe 'short address' do
139
+ let(:cinema) do
140
+ OdeonUk::Cinema.new('71', 'Brighton', '/cinemas/brighton/71/')
162
141
  end
163
142
 
164
- it 'returns a string' do
165
- subject.must_be_instance_of String
143
+ before do
144
+ website.expect(:cinema, cinema_html('brighton'), [71])
166
145
  end
167
146
 
168
147
  it 'returns town name' do
169
- subject.must_equal 'Brighton'
148
+ OdeonUk::Internal::Website.stub :new, website do
149
+ subject.must_equal 'Brighton'
150
+ end
170
151
  end
171
152
  end
172
153
  end
173
154
 
174
155
  describe '#postal_code' do
175
- describe 'short address' do
176
- let(:cinema) { OdeonUk::Cinema.new('71', 'Brighton', '/cinemas/brighton/71/') }
177
- subject { cinema.postal_code }
156
+ subject { cinema.postal_code }
178
157
 
179
- before do
180
- brighton_cinema_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-brighton.html') )
181
- stub_request(:get, 'http://www.odeon.co.uk/cinemas/brighton/71/').to_return( status: 200, body: brighton_cinema_body, headers: {} )
158
+ describe 'short address' do
159
+ let(:cinema) do
160
+ OdeonUk::Cinema.new('71', 'Brighton', '/cinemas/brighton/71/')
182
161
  end
183
162
 
184
- it 'returns a string' do
185
- subject.must_be_instance_of String
163
+ before do
164
+ website.expect(:cinema, cinema_html('brighton'), [71])
186
165
  end
187
166
 
188
167
  it 'returns the postcode' do
189
- subject.must_equal 'BN1 2RE'
168
+ OdeonUk::Internal::Website.stub :new, website do
169
+ subject.must_equal 'BN1 2RE'
170
+ end
190
171
  end
191
172
  end
192
173
 
193
174
  describe 'short address (London)' do
194
- let(:cinema) { OdeonUk::Cinema.new('211', 'BFI Imax', '/cinemas/bfi_imax/211/') }
195
- subject { cinema.postal_code }
175
+ let(:cinema) do
176
+ OdeonUk::Cinema.new('211', 'BFI Imax', '/cinemas/bfi_imax/211/')
177
+ end
196
178
 
197
179
  before do
198
- body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-bfi-imax.html') )
199
- stub_request(:get, 'http://www.odeon.co.uk/cinemas/bfi_imax/211/').to_return( status: 200, body: body, headers: {} )
180
+ website.expect(:cinema, cinema_html('bfi_imax'), [211])
200
181
  end
201
182
 
202
183
  it 'returns the postcode' do
203
- subject.must_equal 'SE1 8XR'
184
+ OdeonUk::Internal::Website.stub :new, website do
185
+ subject.must_equal 'SE1 8XR'
186
+ end
204
187
  end
205
188
  end
206
189
 
207
190
  describe 'short address (extra London Postcode)' do
208
- let(:cinema) { OdeonUk::Cinema.new('105', 'Leicester Square', '/cinemas/london_leicester_square/105/') }
209
- subject { cinema.postal_code }
191
+ let(:cinema) do
192
+ OdeonUk::Cinema.new('105',
193
+ 'Leicester Square',
194
+ '/cinemas/london_leicester_square/105/')
195
+ end
210
196
 
211
197
  before do
212
- body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-london-leicester-square.html') )
213
- stub_request(:get, 'http://www.odeon.co.uk/cinemas/london_leicester_square/105/').to_return( status: 200, body: body, headers: {} )
198
+ website.expect(:cinema, cinema_html('leicester_square'), [105])
214
199
  end
215
200
 
216
201
  it 'returns the postcode' do
217
- subject.must_equal 'WC2H 7LQ'
202
+ OdeonUk::Internal::Website.stub :new, website do
203
+ subject.must_equal 'WC2H 7LQ'
204
+ end
218
205
  end
219
206
  end
220
207
  end
221
208
 
222
209
  describe '#screenings' do
223
- let(:cinema) { OdeonUk::Cinema.new('71', 'Brighton', '/cinemas/brighton/71/') }
224
210
  subject { cinema.screenings }
225
211
 
226
- before do
227
- brighton_screenings_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-brighton-showtimes.html') )
228
- stub_request(:get, 'http://www.odeon.co.uk/showtimes/week/71?siteId=71').to_return( status: 200, body: brighton_screenings_body, headers: {} )
212
+ let(:cinema) do
213
+ described_class.new(71, 'Brighton', '/cinemas/brighton/71/')
229
214
  end
230
215
 
231
- it 'returns an array of screenings' do
232
- subject.must_be_instance_of(Array)
233
- subject.each do |item|
234
- item.must_be_instance_of(OdeonUk::Screening)
216
+ it 'calls out to Screening object' do
217
+ OdeonUk::Screening.stub :at, [:screening] do
218
+ subject.must_equal([:screening])
235
219
  end
236
220
  end
237
-
238
- it 'returns screening objects with correct film names' do
239
- subject.first.film_name.must_equal 'About Time'
240
- subject.last.film_name.must_equal 'White House Down'
241
- end
242
-
243
- it 'returns screening objects with correct cinema name' do
244
- subject.each { |s| s.cinema_name.must_equal 'Brighton' }
245
- end
246
-
247
- it 'returns screening objects with correct UTC times' do
248
- subject.first.when.must_equal Time.utc(2013, 9, 14, 11, 20, 0)
249
- subject.last.when.must_equal Time.utc(2013, 9, 19, 19, 40, 0)
250
- end
251
-
252
- it 'returns screening objects with correct variants' do
253
- subject.each do |screening|
254
- screening.variant.wont_be_nil
255
- screening.variant.must_match /[23]D/
256
- end
257
-
258
- subject.first.variant.must_equal '2D'
259
- subject.last.variant.must_equal '2D'
260
- end
261
-
262
- it 'returns screening objects with booking urls' do
263
- subject.each do |screening|
264
- screening.booking_url.wont_be_nil
265
- screening.booking_url.must_be_instance_of String
266
- end
267
-
268
- subject.first.booking_url.must_equal 'http://www.odeon.co.uk/booking/init/MUZFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/'
269
- subject.last.booking_url.must_equal 'http://www.odeon.co.uk/booking/init/RjhFRjAwMDAwMjNVRFBETVhHIzcxIzEzOTY3/'
270
- end
271
221
  end
272
222
 
273
- describe '#screenings_of(film_or_string)' do
274
- let(:cinema) { OdeonUk::Cinema.new('71', 'Brighton', '/cinemas/brighton/71/') }
275
- subject { cinema.screenings_of(film_or_string) }
276
-
277
- before do
278
- brighton_screenings_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-brighton-showtimes.html') )
279
- stub_request(:get, 'http://www.odeon.co.uk/showtimes/week/71?siteId=71').to_return( status: 200, body: brighton_screenings_body, headers: {} )
280
- end
281
-
282
- describe 'passed string' do
283
- let(:film_or_string) { 'About Time' }
284
-
285
- it 'returns an array of screenings' do
286
- subject.must_be_instance_of(Array)
287
- subject.each do |item|
288
- item.must_be_instance_of(OdeonUk::Screening)
289
- end
290
- end
291
-
292
- it 'returns the correct number of screening objects' do
293
- subject.count.must_equal 21
294
- end
295
-
296
- it 'returns screening objects with correct film names' do
297
- subject.each { |s| s.film_name.must_equal 'About Time' }
298
- end
223
+ describe '#street_address' do
224
+ subject { cinema.street_address }
299
225
 
300
- it 'returns screening objects with correct cinema name' do
301
- subject.each { |s| s.cinema_name.must_equal 'Brighton' }
226
+ describe 'short address' do
227
+ let(:cinema) do
228
+ OdeonUk::Cinema.new('71', 'Brighton', '/cinemas/brighton/71/')
302
229
  end
303
230
 
304
- it 'returns screening objects with correct UTC times' do
305
- subject.first.when.must_equal Time.utc(2013, 9, 14, 11, 20, 0)
306
- subject.last.when.must_equal Time.utc(2013, 9, 19, 19, 30, 0)
231
+ before do
232
+ website.expect(:cinema, cinema_html('brighton'), [71])
307
233
  end
308
- end
309
234
 
310
- describe 'passed OdeonUk::Film' do
311
- let(:film_or_string) { OdeonUk::Film.new 'About Time' }
312
-
313
- it 'returns an array of screenings' do
314
- subject.must_be_instance_of(Array)
315
- subject.each do |item|
316
- item.must_be_instance_of(OdeonUk::Screening)
235
+ it 'returns first line of address' do
236
+ OdeonUk::Internal::Website.stub :new, website do
237
+ subject.must_equal 'Kingswest'
317
238
  end
318
239
  end
319
-
320
- it 'returns the correct number of screening objects' do
321
- subject.count.must_equal 21
322
- end
323
-
324
- it 'returns screening objects with correct film names' do
325
- subject.each { |s| s.film_name.must_equal 'About Time' }
326
- end
327
-
328
- it 'returns screening objects with correct cinema name' do
329
- subject.each { |s| s.cinema_name.must_equal 'Brighton' }
330
- end
331
-
332
- it 'returns screening objects with correct UTC times' do
333
- subject.first.when.must_equal Time.utc(2013, 9, 14, 11, 20, 0)
334
- subject.last.when.must_equal Time.utc(2013, 9, 19, 19, 30, 0)
335
- end
336
240
  end
337
241
  end
338
242
 
339
- describe '#street_address' do
340
- describe 'short address' do
341
- let(:cinema) { OdeonUk::Cinema.new('71', 'Brighton', '/cinemas/brighton/71/') }
342
- subject { cinema.street_address }
243
+ private
343
244
 
344
- before do
345
- brighton_cinema_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'odeon-brighton.html') )
346
- stub_request(:get, 'http://www.odeon.co.uk/cinemas/brighton/71/').to_return( status: 200, body: brighton_cinema_body, headers: {} )
347
- end
245
+ def read_file(filepath)
246
+ File.read(File.expand_path(filepath, __FILE__))
247
+ end
348
248
 
349
- it 'returns a string' do
350
- subject.must_be_instance_of String
351
- end
249
+ def sitemap_html
250
+ read_file('../../../fixtures/sitemap.html')
251
+ end
352
252
 
353
- it 'returns first line of address' do
354
- subject.must_equal 'Kingswest'
355
- end
356
- end
253
+ def cinema_html(filename)
254
+ read_file("../../../fixtures/cinema/#{filename}.html")
357
255
  end
358
256
  end
@@ -11,7 +11,44 @@ describe OdeonUk::Film do
11
11
  end
12
12
  end
13
13
 
14
- describe 'Comparable' do
14
+ describe '.at(cinema_id)' do # integration
15
+ let(:website) { Minitest::Mock.new }
16
+
17
+ subject { OdeonUk::Film.at(71) }
18
+
19
+ before do
20
+ website.expect(:showtimes, showtimes_html('brighton'), [71])
21
+ end
22
+
23
+ it 'returns an array of films' do
24
+ OdeonUk::Internal::Website.stub :new, website do
25
+ subject.must_be_instance_of(Array)
26
+ subject.each do |film|
27
+ film.must_be_instance_of(OdeonUk::Film)
28
+ end
29
+ end
30
+ end
31
+
32
+ it 'returns a decent number of films' do
33
+ OdeonUk::Internal::Website.stub :new, website do
34
+ subject.count.must_be :>, 15
35
+ end
36
+ end
37
+
38
+ it 'returns uniquely named films' do
39
+ OdeonUk::Internal::Website.stub :new, website do
40
+ subject.each_with_index do |item, index|
41
+ subject.each_with_index do |jtem, i|
42
+ next if index == i
43
+ item.name.wont_equal jtem.name
44
+ item.wont_equal jtem
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ describe 'comparable' do
15
52
  it 'includes comparable methods' do
16
53
  film = OdeonUk::Film.new 'AAAA'
17
54
  film.methods.must_include :<
@@ -47,7 +84,7 @@ describe OdeonUk::Film do
47
84
  it 'retuns only one' do
48
85
  result = [film, otherfilm].uniq
49
86
  result.count.must_equal 1
50
- result.must_equal [ OdeonUk::Film.new('AAAA') ]
87
+ result.must_equal [OdeonUk::Film.new('AAAA')]
51
88
  end
52
89
  end
53
90
  end
@@ -60,7 +97,7 @@ describe OdeonUk::Film do
60
97
  let(:otherfilm) { OdeonUk::Film.new 'BBBB' }
61
98
 
62
99
  it 'retuns -1' do
63
- subject.must_equal -1
100
+ subject.must_equal(-1)
64
101
  end
65
102
  end
66
103
 
@@ -92,4 +129,14 @@ describe OdeonUk::Film do
92
129
  end
93
130
  end
94
131
  end
132
+
133
+ private
134
+
135
+ def read_file(filepath)
136
+ File.read(File.expand_path(filepath, __FILE__))
137
+ end
138
+
139
+ def showtimes_html(filename)
140
+ read_file("../../../fixtures/showtimes/#{filename}.html")
141
+ end
95
142
  end