webdrivers 3.8.1 → 3.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,62 +5,206 @@ require 'spec_helper'
5
5
  describe Webdrivers::Geckodriver do
6
6
  let(:geckodriver) { described_class }
7
7
 
8
- it 'raises exception if unable to get latest geckodriver and no geckodriver present' do
8
+ before do
9
9
  geckodriver.remove
10
- allow(geckodriver).to receive(:desired_version).and_return(nil)
11
- gd = 'Unable to find the latest version of geckodriver'
12
- msg = /^#{gd}(.exe)?; try downloading manually from (.*)?and place in (.*)?\.webdrivers$/
13
- expect { geckodriver.update }.to raise_exception StandardError, msg
10
+ geckodriver.required_version = nil
14
11
  end
15
12
 
16
- it 'uses found version of geckodriver if latest release unable to be found' do
17
- geckodriver.download
18
- allow(geckodriver).to receive(:desired_version).and_return(nil)
19
- expect(geckodriver.update).to match(%r{\.webdrivers/geckodriver})
13
+ describe '#update' do
14
+ context 'when evaluating #correct_binary?' do
15
+ it 'does not download when latest version and current version match' do
16
+ allow(geckodriver).to receive(:latest_version).and_return(Gem::Version.new('0.3.0'))
17
+ allow(geckodriver).to receive(:current_version).and_return(Gem::Version.new('0.3.0'))
18
+
19
+ geckodriver.update
20
+
21
+ expect(geckodriver.send(:exists?)).to be false
22
+ end
23
+
24
+ it 'does not download when offline, but binary exists' do
25
+ allow(Webdrivers::System).to receive(:call).and_return('geckodriver 0.24.0 ( 2019-01-28)')
26
+ allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
27
+ allow(geckodriver).to receive(:exists?).and_return(true)
28
+
29
+ geckodriver.update
30
+
31
+ expect(File.exist?(geckodriver.driver_path)).to be false
32
+ end
33
+
34
+ it 'raises ConnectionError when offline, and no binary exists' do
35
+ allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
36
+ allow(geckodriver).to receive(:exists?).and_return(false)
37
+
38
+ expect { geckodriver.update }.to raise_error(Webdrivers::ConnectionError)
39
+ end
40
+ end
41
+
42
+ context 'when correct binary is found' do
43
+ before { allow(geckodriver).to receive(:correct_binary?).and_return(true) }
44
+
45
+ it 'does not download' do
46
+ geckodriver.update
47
+
48
+ expect(geckodriver.current_version).to be_nil
49
+ end
50
+
51
+ it 'does not raise exception if offline' do
52
+ allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
53
+
54
+ geckodriver.update
55
+
56
+ expect(geckodriver.current_version).to be_nil
57
+ end
58
+ end
59
+
60
+ context 'when correct binary is not found' do
61
+ before { allow(geckodriver).to receive(:correct_binary?).and_return(false) }
62
+
63
+ it 'downloads binary' do
64
+ geckodriver.update
65
+
66
+ expect(geckodriver.current_version).not_to be_nil
67
+ end
68
+
69
+ it 'raises ConnectionError if offline' do
70
+ allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
71
+
72
+ msg = %r{Can not reach https://github.com/mozilla/geckodriver/releases}
73
+ expect { geckodriver.update }.to raise_error(Webdrivers::ConnectionError, msg)
74
+ end
75
+ end
76
+
77
+ it 'finds the required version from parsed downloads page' do
78
+ base = 'https://github.com/mozilla/geckodriver/releases/download'
79
+ url = %r{#{base}\/v0\.2\.0\/geckodriver-v0\.2\.0-}
80
+
81
+ allow(Webdrivers::System).to receive(:download).with(url, geckodriver.driver_path)
82
+
83
+ geckodriver.required_version = '0.2.0'
84
+ geckodriver.update
85
+
86
+ expect(Webdrivers::System).to have_received(:download).with(url, geckodriver.driver_path)
87
+ end
88
+
89
+ it 'does something when a wrong version is supplied' do
90
+ geckodriver.required_version = '0.2.0'
91
+
92
+ msg = /Net::HTTPServerException: 404 "Not Found"/
93
+ expect { geckodriver.update }.to raise_error(StandardError, msg)
94
+ end
95
+ end
96
+
97
+ describe '#current_version' do
98
+ it 'returns nil if binary does not exist on the system' do
99
+ allow(geckodriver).to receive(:driver_path).and_return('')
100
+
101
+ expect(geckodriver.current_version).to be_nil
102
+ end
103
+
104
+ it 'returns a Gem::Version instance if binary is on the system' do
105
+ allow(geckodriver).to receive(:exists?).and_return(true)
106
+
107
+ return_value = "geckodriver 0.24.0 ( 2019-01-28)
108
+
109
+ The source code of this program is available from
110
+ testing/geckodriver in https://hg.mozilla.org/mozilla-central.
111
+
112
+ This program is subject to the terms of the Mozilla Public License 2.0.
113
+ You can obtain a copy of the license at https://mozilla.org/MPL/2.0/"
114
+
115
+ allow(Webdrivers::System).to receive(:call).with("#{geckodriver.driver_path} --version").and_return return_value
116
+
117
+ expect(geckodriver.current_version).to eq Gem::Version.new('0.24.0')
118
+ end
20
119
  end
21
120
 
22
- it 'finds latest version' do
23
- old_version = Gem::Version.new('0.17')
24
- future_version = Gem::Version.new('0.30')
25
- desired_version = geckodriver.desired_version
121
+ describe '#latest_version' do
122
+ it 'finds the latest version directly' do
123
+ url = 'https://github.com/mozilla/geckodriver/releases/tag/v0.24.0'
124
+ allow(Webdrivers::Network).to receive(:get_url).and_return(url)
125
+
126
+ geckodriver.update
127
+
128
+ expect(geckodriver.latest_version).to eq Gem::Version.new('0.24.0')
129
+ end
130
+
131
+ it 'creates cached file' do
132
+ allow(Webdrivers::Network).to receive(:get).and_return('0.24.0')
133
+
134
+ geckodriver.latest_version
135
+ expect(File.exist?("#{Webdrivers::System.install_dir}/geckodriver.version")).to eq true
136
+ end
137
+
138
+ it 'does not make network call if cache is valid' do
139
+ allow(Webdrivers).to receive(:cache_time).and_return(3600)
140
+ Webdrivers::System.cache_version('geckodriver', '0.23.0')
141
+ allow(Webdrivers::Network).to receive(:get)
142
+
143
+ expect(geckodriver.latest_version).to eq Gem::Version.new('0.23.0')
26
144
 
27
- expect(desired_version).to be > old_version
28
- expect(desired_version).to be < future_version
145
+ expect(Webdrivers::Network).not_to have_received(:get)
146
+ end
147
+
148
+ it 'makes a network call if cache is expired' do
149
+ Webdrivers::System.cache_version('geckodriver', '0.23.0')
150
+ url = 'https://github.com/mozilla/geckodriver/releases/tag/v0.24.0'
151
+ allow(Webdrivers::Network).to receive(:get_url).and_return(url)
152
+ allow(Webdrivers::System).to receive(:valid_cache?)
153
+
154
+ expect(geckodriver.latest_version).to eq Gem::Version.new('0.24.0')
155
+
156
+ expect(Webdrivers::Network).to have_received(:get_url)
157
+ expect(Webdrivers::System).to have_received(:valid_cache?)
158
+ end
29
159
  end
30
160
 
31
- it 'downloads latest version by default' do
32
- geckodriver.download
33
- expect(geckodriver.current_version).to eq geckodriver.desired_version
161
+ describe '#required_version=' do
162
+ it 'returns the version specified as a Float' do
163
+ geckodriver.required_version = 0.12
164
+
165
+ expect(geckodriver.required_version).to eq Gem::Version.new('0.12')
166
+ end
167
+
168
+ it 'returns the version specified as a String' do
169
+ geckodriver.required_version = '0.12.1'
170
+
171
+ expect(geckodriver.required_version).to eq Gem::Version.new('0.12.1')
172
+ end
34
173
  end
35
174
 
36
- it 'downloads specified version' do
37
- begin
175
+ describe '#remove' do
176
+ it 'removes existing geckodriver' do
177
+ geckodriver.update
178
+
38
179
  geckodriver.remove
39
- geckodriver.version = '0.17.0'
40
- geckodriver.download
41
- expect(geckodriver.current_version.version).to eq '0.17.0'
42
- ensure
43
- geckodriver.version = nil
180
+ expect(geckodriver.current_version).to be_nil
44
181
  end
45
- end
46
182
 
47
- it 'removes geckodriver' do
48
- geckodriver.remove
49
- expect(geckodriver.current_version).to be_nil
183
+ it 'does not raise exception if no geckodriver found' do
184
+ expect { geckodriver.remove }.not_to raise_error
185
+ end
50
186
  end
51
187
 
52
- context 'when offline' do
53
- before do
54
- geckodriver.instance_variable_set('@latest_version', nil)
55
- allow(geckodriver).to receive(:site_available?).and_return(false)
188
+ describe '#install_dir' do
189
+ it 'uses ~/.webdrivers as default value' do
190
+ expect(Webdrivers::System.install_dir).to include('.webdriver')
56
191
  end
57
192
 
58
- it 'raises exception finding latest version' do
59
- expect { geckodriver.desired_version }.to raise_error(StandardError, 'Can not reach site')
193
+ it 'uses provided value' do
194
+ begin
195
+ install_dir = File.expand_path(File.join(ENV['HOME'], '.webdrivers2'))
196
+ Webdrivers.install_dir = install_dir
197
+
198
+ expect(Webdrivers::System.install_dir).to eq install_dir
199
+ ensure
200
+ Webdrivers.install_dir = nil
201
+ end
60
202
  end
203
+ end
61
204
 
62
- it 'raises exception downloading' do
63
- expect { geckodriver.download }.to raise_error(StandardError, 'Can not reach site')
205
+ describe '#driver_path' do
206
+ it 'returns full location of binary' do
207
+ expect(geckodriver.driver_path).to match("#{File.join(ENV['HOME'])}/.webdrivers/geckodriver")
64
208
  end
65
209
  end
66
210
  end
@@ -5,37 +5,188 @@ require 'spec_helper'
5
5
  describe Webdrivers::IEdriver do
6
6
  let(:iedriver) { described_class }
7
7
 
8
- it 'finds latest version' do
9
- old_version = Gem::Version.new('3.12.0')
10
- future_version = Gem::Version.new('4.0')
11
- desired_version = iedriver.desired_version
8
+ before do
9
+ iedriver.remove
10
+ iedriver.required_version = nil
11
+ end
12
+
13
+ describe '#update' do
14
+ context 'when evaluating #correct_binary?' do
15
+ it 'does not download when latest version and current version match' do
16
+ allow(iedriver).to receive(:latest_version).and_return(Gem::Version.new('0.3.0'))
17
+ allow(iedriver).to receive(:current_version).and_return(Gem::Version.new('0.3.0'))
18
+
19
+ iedriver.update
20
+
21
+ expect(iedriver.send(:exists?)).to be false
22
+ end
23
+
24
+ it 'does not download when offline, but binary exists' do
25
+ allow(Webdrivers::System).to receive(:call).and_return('something IEDriverServer.exe 3.5.1 something else')
26
+ allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
27
+ allow(iedriver).to receive(:exists?).and_return(true)
28
+
29
+ iedriver.update
30
+
31
+ expect(File.exist?(iedriver.driver_path)).to be false
32
+ end
33
+
34
+ it 'raises ConnectionError when offline, and no binary exists' do
35
+ allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
36
+ allow(iedriver).to receive(:exists?).and_return(false)
37
+
38
+ expect { iedriver.update }.to raise_error(Webdrivers::ConnectionError)
39
+ end
40
+ end
41
+
42
+ context 'when correct binary is found' do
43
+ before { allow(iedriver).to receive(:correct_binary?).and_return(true) }
44
+
45
+ it 'does not download' do
46
+ iedriver.update
47
+
48
+ expect(iedriver.current_version).to be_nil
49
+ end
50
+
51
+ it 'does not raise exception if offline' do
52
+ allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
53
+
54
+ iedriver.update
12
55
 
13
- expect(desired_version).to be > old_version
14
- expect(desired_version).to be < future_version
56
+ expect(iedriver.current_version).to be_nil
57
+ end
58
+ end
59
+
60
+ context 'when correct binary is not found' do
61
+ before { allow(iedriver).to receive(:correct_binary?).and_return(false) }
62
+
63
+ it 'downloads binary' do
64
+ iedriver.update
65
+
66
+ expect(File.exist?(iedriver.driver_path)).to eq true
67
+ end
68
+
69
+ it 'raises ConnectionError if offline' do
70
+ allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
71
+
72
+ msg = %r{Can not reach https://selenium-release.storage.googleapis.com/}
73
+ expect { iedriver.update }.to raise_error(Webdrivers::ConnectionError, msg)
74
+ end
75
+ end
15
76
  end
16
77
 
17
- it 'downloads iedriver' do
18
- iedriver.remove
19
- expect(File.exist?(iedriver.download)).to be true
78
+ describe '#current_version' do
79
+ it 'returns nil if binary does not exist on the system' do
80
+ allow(iedriver).to receive(:driver_path).and_return('')
81
+
82
+ expect(iedriver.current_version).to be_nil
83
+ end
84
+
85
+ it 'returns a Gem::Version instance if binary is on the system' do
86
+ allow(iedriver).to receive(:exists?).and_return(true)
87
+
88
+ return_value = 'something IEDriverServer.exe 3.5.1 something else'
89
+
90
+ allow(Webdrivers::System).to receive(:call).with("#{iedriver.driver_path} --version").and_return return_value
91
+
92
+ expect(iedriver.current_version).to eq Gem::Version.new('3.5.1')
93
+ end
20
94
  end
21
95
 
22
- it 'removes iedriver' do
23
- iedriver.remove
24
- expect(iedriver.current_version).to be_nil
96
+ describe '#latest_version' do
97
+ it 'finds the latest version from parsed hash' do
98
+ base = 'https://selenium-release.storage.googleapis.com/'
99
+ hash = {Gem::Version.new('3.4.0') => "#{base}/3.4/IEDriverServer_Win32_3.4.0.zip",
100
+ Gem::Version.new('3.5.0') => "#{base}/3.5/IEDriverServer_Win32_3.5.0.zip",
101
+ Gem::Version.new('3.5.1') => "#{base}/3.5/IEDriverServer_Win32_3.5.1.zip"}
102
+ allow(iedriver).to receive(:downloads).and_return(hash)
103
+
104
+ expect(iedriver.latest_version).to eq Gem::Version.new('3.5.1')
105
+ end
106
+
107
+ it 'correctly parses the downloads page' do
108
+ expect(iedriver.send(:downloads)).not_to be_empty
109
+ end
110
+
111
+ it 'creates cached file' do
112
+ allow(Webdrivers::Network).to receive(:get).and_return('3.4.0')
113
+
114
+ iedriver.latest_version
115
+ expect(File.exist?("#{Webdrivers::System.install_dir}/IEDriverServer.version")).to eq true
116
+ end
117
+
118
+ it 'does not make network call if cache is valid' do
119
+ allow(Webdrivers).to receive(:cache_time).and_return(3600)
120
+ Webdrivers::System.cache_version('IEDriverServer', '3.4.0')
121
+ allow(Webdrivers::Network).to receive(:get)
122
+
123
+ expect(iedriver.latest_version).to eq Gem::Version.new('3.4.0')
124
+
125
+ expect(Webdrivers::Network).not_to have_received(:get)
126
+ end
127
+
128
+ it 'makes a network call if cache is expired' do
129
+ Webdrivers::System.cache_version('IEDriverServer', '3.4.0')
130
+ base = 'https://selenium-release.storage.googleapis.com/'
131
+ hash = {Gem::Version.new('3.4.0') => "#{base}/3.4/IEDriverServer_Win32_3.4.0.zip",
132
+ Gem::Version.new('3.5.0') => "#{base}/3.5/IEDriverServer_Win32_3.5.0.zip",
133
+ Gem::Version.new('3.5.1') => "#{base}/3.5/IEDriverServer_Win32_3.5.1.zip"}
134
+ allow(iedriver).to receive(:downloads).and_return(hash)
135
+ allow(Webdrivers::System).to receive(:valid_cache?)
136
+
137
+ expect(iedriver.latest_version).to eq Gem::Version.new('3.5.1')
138
+ expect(iedriver).to have_received(:downloads)
139
+ expect(Webdrivers::System).to have_received(:valid_cache?)
140
+ end
25
141
  end
26
142
 
27
- context 'when offline' do
28
- before do
29
- iedriver.instance_variable_set('@latest_version', nil)
30
- allow(iedriver).to receive(:site_available?).and_return(false)
143
+ describe '#required_version=' do
144
+ it 'returns the version specified as a Float' do
145
+ iedriver.required_version = 0.12
146
+
147
+ expect(iedriver.required_version).to eq Gem::Version.new('0.12')
148
+ end
149
+
150
+ it 'returns the version specified as a String' do
151
+ iedriver.required_version = '0.12.1'
152
+
153
+ expect(iedriver.required_version).to eq Gem::Version.new('0.12.1')
154
+ end
155
+ end
156
+
157
+ describe '#remove' do
158
+ it 'removes existing iedriver' do
159
+ iedriver.update
160
+
161
+ iedriver.remove
162
+ expect(iedriver.current_version).to be_nil
31
163
  end
32
164
 
33
- it 'raises exception finding latest version' do
34
- expect { iedriver.latest_version }.to raise_error(StandardError, 'Can not reach site')
165
+ it 'does not raise exception if no iedriver found' do
166
+ expect { iedriver.remove }.not_to raise_error
35
167
  end
168
+ end
169
+
170
+ describe '#install_dir' do
171
+ it 'uses ~/.webdrivers as default value' do
172
+ expect(Webdrivers::System.install_dir).to include('.webdriver')
173
+ end
174
+
175
+ it 'uses provided value' do
176
+ begin
177
+ install_dir = File.expand_path(File.join(ENV['HOME'], '.webdrivers2'))
178
+ Webdrivers.install_dir = install_dir
179
+
180
+ expect(Webdrivers::System.install_dir).to eq install_dir
181
+ ensure
182
+ Webdrivers.install_dir = nil
183
+ end
184
+ end
185
+ end
36
186
 
37
- it 'raises exception downloading' do
38
- expect { iedriver.download }.to raise_error(StandardError, 'Can not reach site')
187
+ describe '#driver_path' do
188
+ it 'returns full location of binary' do
189
+ expect(iedriver.driver_path).to eq("#{File.join(ENV['HOME'])}/.webdrivers/IEDriverServer.exe")
39
190
  end
40
191
  end
41
192
  end