picturehouse_uk 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +64 -0
- data/Rakefile +20 -0
- data/lib/picturehouse_uk.rb +16 -0
- data/lib/picturehouse_uk/cinema.rb +129 -0
- data/lib/picturehouse_uk/film.rb +52 -0
- data/lib/picturehouse_uk/internal/film_with_screenings_parser.rb +48 -0
- data/lib/picturehouse_uk/screening.rb +33 -0
- data/lib/picturehouse_uk/version.rb +3 -0
- data/picturehouse_uk.gemspec +29 -0
- data/test/fixtures/dukes-at-komedia-cinema.html +7148 -0
- data/test/fixtures/film_node/blue-jasmine-done.html +53 -0
- data/test/fixtures/film_node/blue-jasmine-future.html +55 -0
- data/test/fixtures/film_node/bolshoi-spartacus.html +26 -0
- data/test/fixtures/film_node/captain-phillips-with-silver-screen-and-subtitles.html +103 -0
- data/test/fixtures/film_node/fifth-estate-with-big-scream.html +73 -0
- data/test/fixtures/film_node/london-film-festival-with-toddler-time.html +46 -0
- data/test/fixtures/film_node/met-encore-rusalka-as-live.html +26 -0
- data/test/fixtures/film_node/nt-encore-hamlet.html +26 -0
- data/test/fixtures/film_node/planes-with-kids-club.html +77 -0
- data/test/fixtures/film_node/royal-opera-house-don-quixote.html +26 -0
- data/test/fixtures/film_node/rsc-encore-richard-ii.html +28 -0
- data/test/fixtures/film_node/rsc-live-richard-ii.html +41 -0
- data/test/fixtures/film_node/rsc-live-the-two-gentlemen-of-verona-zero-cert.html +19 -0
- data/test/fixtures/picturehouses-homepage.html +1454 -0
- data/test/lib/picturehouse_uk/cinema_test.rb +129 -0
- data/test/lib/picturehouse_uk/film_test.rb +92 -0
- data/test/lib/picturehouse_uk/internal/film_with_screenings_parser_test.rb +185 -0
- data/test/lib/picturehouse_uk/screening_test.rb +32 -0
- data/test/lib/picturehouse_uk/version_test.rb +7 -0
- data/test/test_helper.rb +6 -0
- metadata +213 -0
@@ -0,0 +1,129 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe PicturehouseUk::Cinema do
|
4
|
+
|
5
|
+
before { WebMock.disable_net_connect! }
|
6
|
+
|
7
|
+
describe '.all' do
|
8
|
+
subject { PicturehouseUk::Cinema.all }
|
9
|
+
|
10
|
+
before do
|
11
|
+
homepage_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'picturehouses-homepage.html') )
|
12
|
+
stub_request(:get, 'http://www.picturehouses.co.uk/').to_return( status: 200, body: homepage_body, headers: {} )
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'returns an Array of PicturehouseUk::Cinemas' do
|
16
|
+
subject.must_be_instance_of(Array)
|
17
|
+
subject.each do |value|
|
18
|
+
value.must_be_instance_of(PicturehouseUk::Cinema)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'returns the correctly sized array' do
|
23
|
+
subject.size.must_equal 21
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'returns the right cinemas' do
|
27
|
+
subject.first.name.must_equal 'Clapham Picturehouse'
|
28
|
+
subject.last.name.must_equal 'City Screen Picturehouse'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '.find(id)' do
|
33
|
+
let(:id) { 'Dukes_At_Komedia' }
|
34
|
+
|
35
|
+
subject { PicturehouseUk::Cinema.find(id) }
|
36
|
+
|
37
|
+
before do
|
38
|
+
homepage_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'picturehouses-homepage.html') )
|
39
|
+
stub_request(:get, 'http://www.picturehouses.co.uk/').to_return( status: 200, body: homepage_body, headers: {} )
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'returns a cinema' do
|
43
|
+
subject.must_be_instance_of(PicturehouseUk::Cinema)
|
44
|
+
|
45
|
+
subject.id.must_equal 'Dukes_At_Komedia'
|
46
|
+
subject.brand.must_equal 'Picturehouse'
|
47
|
+
subject.name.must_equal "Duke's At Komedia"
|
48
|
+
subject.slug.must_equal 'dukes-at-komedia'
|
49
|
+
subject.url.must_equal 'http://www.picturehouses.co.uk/cinema/Dukes_At_Komedia/'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '.new id, name, url' do
|
54
|
+
it 'stores id, name, slug and url' do
|
55
|
+
cinema = PicturehouseUk::Cinema.new 'Dukes_At_Komedia', "Duke's At Komedia", '/cinema/Dukes_At_Komedia/'
|
56
|
+
cinema.id.must_equal 'Dukes_At_Komedia'
|
57
|
+
cinema.brand.must_equal 'Picturehouse'
|
58
|
+
cinema.name.must_equal "Duke's At Komedia"
|
59
|
+
cinema.slug.must_equal 'dukes-at-komedia'
|
60
|
+
cinema.url.must_equal 'http://www.picturehouses.co.uk/cinema/Dukes_At_Komedia/'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#films' do
|
65
|
+
let(:cinema) { PicturehouseUk::Cinema.new 'Dukes_At_Komedia', "Duke's At Komedia", '/cinema/Dukes_At_Komedia/' }
|
66
|
+
subject { cinema.films }
|
67
|
+
|
68
|
+
before do
|
69
|
+
dukes_cinema_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'dukes-at-komedia-cinema.html') )
|
70
|
+
stub_request(:get, 'http://www.picturehouses.co.uk/cinema/Dukes_At_Komedia/').to_return( status: 200, body: dukes_cinema_body, headers: {} )
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'returns an array of films' do
|
74
|
+
subject.must_be_instance_of(Array)
|
75
|
+
subject.each do |item|
|
76
|
+
item.must_be_instance_of(PicturehouseUk::Film)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'returns correct number of films' do
|
81
|
+
subject.count.must_equal 37
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'returns uniquely named films' do
|
85
|
+
first_name = subject.first.name
|
86
|
+
first = subject.first
|
87
|
+
|
88
|
+
subject[1..-1].each { |item| item.name.wont_equal first_name }
|
89
|
+
subject[1..-1].each { |item| item.wont_equal first }
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'returns film objects with correct names' do
|
93
|
+
subject.first.name.must_equal 'Blue Jasmine'
|
94
|
+
subject.last.name.must_equal 'Royal Opera House: Manon Lescaut'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe '#screenings' do
|
99
|
+
let(:cinema) { PicturehouseUk::Cinema.new('Dukes_At_Komedia', "Duke's At Komedia", '/cinema/Dukes_At_Komedia/') }
|
100
|
+
subject { cinema.screenings }
|
101
|
+
|
102
|
+
before do
|
103
|
+
dukes_cinema_body = File.read( File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'dukes-at-komedia-cinema.html') )
|
104
|
+
stub_request(:get, 'http://www.picturehouses.co.uk/cinema/Dukes_At_Komedia/').to_return( status: 200, body: dukes_cinema_body, headers: {} )
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'returns an array of screenings' do
|
108
|
+
subject.must_be_instance_of(Array)
|
109
|
+
subject.each do |item|
|
110
|
+
item.must_be_instance_of(PicturehouseUk::Screening)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'returns screening objects with correct film names' do
|
115
|
+
subject.first.film_name.must_equal 'Blue Jasmine'
|
116
|
+
subject.last.film_name.must_equal 'Royal Opera House: Manon Lescaut'
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'returns screening objects with correct cinema name' do
|
120
|
+
subject.each { |s| s.cinema_name.must_equal "Duke's At Komedia" }
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'returns screening objects with correct UTC times' do
|
124
|
+
subject.first.when.must_equal Time.utc(2013, 10, 14, 20, 0, 0)
|
125
|
+
subject.last.when.must_equal Time.utc(2014, 6, 24, 17, 45, 0)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe PicturehouseUk::Film do
|
4
|
+
describe '.new(name)' do
|
5
|
+
it 'stores name' do
|
6
|
+
film = PicturehouseUk::Film.new 'Iron Man 3'
|
7
|
+
film.name.must_equal 'Iron Man 3'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'Comparable' do
|
12
|
+
it 'includes comparable methods' do
|
13
|
+
film = PicturehouseUk::Film.new 'AAAA'
|
14
|
+
film.methods.must_include :<
|
15
|
+
film.methods.must_include :>
|
16
|
+
film.methods.must_include :==
|
17
|
+
film.methods.must_include :<=>
|
18
|
+
film.methods.must_include :<=
|
19
|
+
film.methods.must_include :>=
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'uniqueness' do
|
23
|
+
it 'defines #hash' do
|
24
|
+
film = PicturehouseUk::Film.new 'AAAA'
|
25
|
+
film.methods.must_include :hash
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#hash' do
|
29
|
+
it 'returns a hash of the slug' do
|
30
|
+
film = PicturehouseUk::Film.new 'AAAA'
|
31
|
+
film.hash == film.slug.hash
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'defines #eql?(other)' do
|
36
|
+
film = PicturehouseUk::Film.new 'AAAA'
|
37
|
+
film.methods.must_include :eql?
|
38
|
+
end
|
39
|
+
|
40
|
+
describe 'two identically named films' do
|
41
|
+
let(:film) { PicturehouseUk::Film.new 'AAAA' }
|
42
|
+
let(:otherfilm) { PicturehouseUk::Film.new 'AAAA' }
|
43
|
+
|
44
|
+
it 'retuns only one' do
|
45
|
+
result = [film, otherfilm].uniq
|
46
|
+
result.count.must_equal 1
|
47
|
+
result.must_equal [ PicturehouseUk::Film.new('AAAA') ]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '<=> (other)' do
|
53
|
+
subject { film <=> otherfilm }
|
54
|
+
|
55
|
+
describe 'film less than other' do
|
56
|
+
let(:film) { PicturehouseUk::Film.new 'AAAA' }
|
57
|
+
let(:otherfilm) { PicturehouseUk::Film.new 'BBBB' }
|
58
|
+
|
59
|
+
it 'retuns -1' do
|
60
|
+
subject.must_equal -1
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe 'film greater than other' do
|
65
|
+
let(:film) { PicturehouseUk::Film.new 'CCCC' }
|
66
|
+
let(:otherfilm) { PicturehouseUk::Film.new 'BBBB' }
|
67
|
+
|
68
|
+
it 'retuns 1' do
|
69
|
+
subject.must_equal 1
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe 'film same as other (exact name)' do
|
74
|
+
let(:film) { PicturehouseUk::Film.new 'AAAA' }
|
75
|
+
let(:otherfilm) { PicturehouseUk::Film.new 'AAAA' }
|
76
|
+
|
77
|
+
it 'retuns 0' do
|
78
|
+
subject.must_equal 0
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe 'film same as other (inexact name)' do
|
83
|
+
let(:film) { PicturehouseUk::Film.new 'blue jasmine' }
|
84
|
+
let(:otherfilm) { PicturehouseUk::Film.new 'Blue Jasmine' }
|
85
|
+
|
86
|
+
it 'retuns 0' do
|
87
|
+
subject.must_equal 0
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
describe PicturehouseUk::Internal::FilmWithScreeningsParser do
|
4
|
+
|
5
|
+
describe '#film_name' do
|
6
|
+
subject { PicturehouseUk::Internal::FilmWithScreeningsParser.new(film_html).film_name }
|
7
|
+
|
8
|
+
describe 'simple name' do
|
9
|
+
let(:film_html) { read_film_html 'blue-jasmine-future'}
|
10
|
+
|
11
|
+
it 'removes certificate' do
|
12
|
+
subject.must_be_instance_of String
|
13
|
+
subject.must_equal 'Blue Jasmine'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'simple name with dimensionality' do
|
18
|
+
let(:film_html) { read_film_html 'planes-with-kids-club'}
|
19
|
+
|
20
|
+
it 'removes version designation' do
|
21
|
+
subject.must_be_instance_of String
|
22
|
+
subject.must_equal 'Planes'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'royal opera house with no cert' do
|
27
|
+
let(:film_html) { read_film_html 'royal-opera-house-don-quixote'}
|
28
|
+
|
29
|
+
it 'removes live designation, certificate and spells out Royal Opera House' do
|
30
|
+
subject.must_be_instance_of String
|
31
|
+
subject.must_equal 'Royal Opera House: Don Quixote'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'bolshoi with no cert' do
|
36
|
+
let(:film_html) { read_film_html 'bolshoi-spartacus'}
|
37
|
+
|
38
|
+
it 'removes certificate' do
|
39
|
+
subject.must_be_instance_of String
|
40
|
+
subject.must_equal 'Bolshoi: Spartacus'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'nt encore with no cert' do
|
45
|
+
let(:film_html) { read_film_html 'nt-encore-hamlet'}
|
46
|
+
|
47
|
+
it 'removes certificate' do
|
48
|
+
subject.must_be_instance_of String
|
49
|
+
subject.must_equal 'National Theatre: Hamlet'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe 'rsc live with no cert' do
|
54
|
+
let(:film_html) { read_film_html 'rsc-live-richard-ii'}
|
55
|
+
|
56
|
+
it 'removes certificate' do
|
57
|
+
subject.must_be_instance_of String
|
58
|
+
subject.must_equal 'Royal Shakespeare Company: Richard II'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe 'rsc encore with no cert' do
|
63
|
+
let(:film_html) { read_film_html 'rsc-encore-richard-ii'}
|
64
|
+
|
65
|
+
it 'removes certificate' do
|
66
|
+
subject.must_be_instance_of String
|
67
|
+
subject.must_equal 'Royal Shakespeare Company: Richard II'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'met encore as live with no cert' do
|
72
|
+
let(:film_html) { read_film_html 'met-encore-rusalka-as-live'}
|
73
|
+
|
74
|
+
it 'removes certificate' do
|
75
|
+
subject.must_be_instance_of String
|
76
|
+
subject.must_equal 'Met Opera: Rusalka'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe 'rsc live with zeroed cert' do
|
81
|
+
let(:film_html) { read_film_html 'rsc-live-the-two-gentlemen-of-verona-zero-cert' }
|
82
|
+
|
83
|
+
it 'removes certificate' do
|
84
|
+
subject.must_be_instance_of String
|
85
|
+
subject.must_equal 'Royal Shakespeare Company: The Two Gentlemen of Verona'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe '#showings' do
|
91
|
+
subject { PicturehouseUk::Internal::FilmWithScreeningsParser.new(film_html).showings }
|
92
|
+
|
93
|
+
describe 'multiple screenings' do
|
94
|
+
let(:film_html) { read_film_html 'blue-jasmine-future'}
|
95
|
+
|
96
|
+
it 'returns a hash keyed by type of performance' do
|
97
|
+
subject.must_be_instance_of Hash
|
98
|
+
subject.keys.each { |key| key.must_be_instance_of String }
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'returns an array of Times for each type of performance' do
|
102
|
+
subject.each do |key, value|
|
103
|
+
value.must_be_instance_of Array
|
104
|
+
value.each do |item|
|
105
|
+
item.must_be_instance_of Time
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'returns the correct number of Times' do
|
111
|
+
subject.keys.must_equal ['2d']
|
112
|
+
subject['2d'].count.must_equal 2
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'returns Times in UTC' do
|
116
|
+
subject['2d'].first.must_equal Time.utc(2013, 10, 15, 9, 30, 0)
|
117
|
+
subject['2d'].last.must_equal Time.utc(2013, 10, 15, 20, 15, 0)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe 'screenings including OAP & subtitled' do
|
122
|
+
let(:film_html) { read_film_html 'captain-phillips-with-silver-screen-and-subtitles'}
|
123
|
+
|
124
|
+
it 'returns an array of Times for each type of performance' do
|
125
|
+
subject.each do |key, value|
|
126
|
+
value.must_be_instance_of Array
|
127
|
+
value.each do |item|
|
128
|
+
item.must_be_instance_of Time
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'returns the correct number of Times' do
|
134
|
+
subject.keys.sort.must_equal ['2d', 'silver', 'subtitled']
|
135
|
+
|
136
|
+
subject['2d'].count.must_equal 1
|
137
|
+
subject['silver'].count.must_equal 2
|
138
|
+
subject['subtitled'].count.must_equal 1
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
describe 'screenings including toddler time' do
|
143
|
+
let(:film_html) { read_film_html 'london-film-festival-with-toddler-time'}
|
144
|
+
|
145
|
+
it 'returns the correct number of Times' do
|
146
|
+
subject.keys.must_equal ['kids']
|
147
|
+
subject['kids'].count.must_equal 1
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe 'screenings including baby' do
|
152
|
+
let(:film_html) { read_film_html 'fifth-estate-with-big-scream'}
|
153
|
+
|
154
|
+
it 'returns the correct number of Times' do
|
155
|
+
subject.keys.sort.must_equal ['2d', 'baby']
|
156
|
+
|
157
|
+
subject['2d'].count.must_equal 4
|
158
|
+
subject['baby'].count.must_equal 1
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe 'screenings including kids' do
|
163
|
+
let(:film_html) { read_film_html 'planes-with-kids-club'}
|
164
|
+
|
165
|
+
it 'returns the correct number of Times' do
|
166
|
+
subject.keys.must_equal ['kids']
|
167
|
+
subject['kids'].count.must_equal 1
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
describe 'expired screenings' do
|
172
|
+
let(:film_html) { read_film_html 'blue-jasmine-done'}
|
173
|
+
|
174
|
+
it 'returns an empty hash' do
|
175
|
+
subject.must_be_instance_of Hash
|
176
|
+
subject.must_be_empty
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def read_film_html(filename)
|
182
|
+
path = "../../../../fixtures/film_node"
|
183
|
+
File.read(File.expand_path("#{path}/#{filename}.html", __FILE__))
|
184
|
+
end
|
185
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe PicturehouseUk::Screening do
|
4
|
+
|
5
|
+
before { WebMock.disable_net_connect! }
|
6
|
+
|
7
|
+
describe '#new film_name, cinema_name, date, time, varient' do
|
8
|
+
it 'stores film_name, cinema_name & when (in UTC)' do
|
9
|
+
screening = PicturehouseUk::Screening.new 'Iron Man 3', "Duke's At Komedia", Time.parse('2013-09-12 11:00')
|
10
|
+
screening.film_name.must_equal 'Iron Man 3'
|
11
|
+
screening.cinema_name.must_equal "Duke's At Komedia"
|
12
|
+
screening.when.must_equal Time.utc(2013, 9, 12, 10, 0)
|
13
|
+
screening.varient.must_equal nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'stores varient if passed' do
|
17
|
+
screening = PicturehouseUk::Screening.new 'Iron Man 3', "Duke's At Komedia", Time.utc(2013, 9, 12, 11, 0), 'baby'
|
18
|
+
screening.film_name.must_equal 'Iron Man 3'
|
19
|
+
screening.cinema_name.must_equal "Duke's At Komedia"
|
20
|
+
screening.when.must_equal Time.utc(2013, 9, 12, 11, 0)
|
21
|
+
screening.varient.must_equal 'baby'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#date' do
|
26
|
+
subject { PicturehouseUk::Screening.new('Iron Man 3', "Duke's At Komedia", Time.utc(2013, 9, 12, 11, 0), '3d').date }
|
27
|
+
it 'should return date of showing' do
|
28
|
+
subject.must_be_instance_of(Date)
|
29
|
+
subject.must_equal Date.new(2013, 9, 12)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|