percy-selenium 1.1.1 → 1.1.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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +133 -0
- data/lib/cache.rb +49 -0
- data/lib/driver_metadata.rb +57 -0
- data/lib/percy.rb +261 -39
- data/lib/version.rb +1 -1
- data/package.json +1 -1
- data/spec/lib/percy/cache_spec.rb +127 -0
- data/spec/lib/percy/driver_metadata_spec.rb +139 -0
- data/spec/lib/percy/percy_spec.rb +1025 -37
- data/spec/spec_helper.rb +1 -1
- metadata +9 -6
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
# rubocop:disable RSpec/FilePath
|
|
4
|
+
RSpec.describe DriverMetaData do
|
|
5
|
+
let(:session_id) { 'session_id_123' }
|
|
6
|
+
let(:url) { 'http://hub:4444/wd/hub' }
|
|
7
|
+
let(:caps_hash) do
|
|
8
|
+
{'browser' => 'chrome', 'platform' => 'windows', 'browserVersion' => '115.0.1'}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
before(:each) do
|
|
12
|
+
Cache.clear_cache!
|
|
13
|
+
stub_request(:post, 'http://localhost:5338/percy/log')
|
|
14
|
+
.to_return(status: 200, body: '', headers: {})
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe '#session_id' do
|
|
18
|
+
it 'returns the session id from the driver' do
|
|
19
|
+
driver = double('WebDriver', session_id: session_id)
|
|
20
|
+
metadata = DriverMetaData.new(driver)
|
|
21
|
+
expect(metadata.session_id).to eq(session_id)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe '#command_executor_url' do
|
|
26
|
+
let(:http_double) { double('http') }
|
|
27
|
+
let(:bridge_double) { double('bridge', http: http_double) }
|
|
28
|
+
let(:mock_driver) do
|
|
29
|
+
d = double('WebDriver', session_id: session_id)
|
|
30
|
+
allow(d).to receive(:bridge).and_return(bridge_double)
|
|
31
|
+
d
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context 'when bridge.http.server_url succeeds' do
|
|
35
|
+
before(:each) do
|
|
36
|
+
allow(http_double).to receive(:server_url).and_return(URI(url))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'returns the command executor url' do
|
|
40
|
+
metadata = DriverMetaData.new(mock_driver)
|
|
41
|
+
expect(metadata.command_executor_url).to eq(url)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'caches the url and returns it on subsequent calls without re-fetching' do
|
|
45
|
+
expect(mock_driver).to receive(:bridge).once.and_return(bridge_double)
|
|
46
|
+
metadata = DriverMetaData.new(mock_driver)
|
|
47
|
+
metadata.command_executor_url
|
|
48
|
+
metadata.command_executor_url
|
|
49
|
+
expect(Cache.get_cache(session_id, Cache::COMMAND_EXECUTOR_URL)).to eq(url)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context 'when bridge.http.server_url raises but @server_url ivar succeeds' do
|
|
54
|
+
before(:each) do
|
|
55
|
+
allow(http_double).to receive(:server_url).and_raise(StandardError, 'server_url failed')
|
|
56
|
+
allow(http_double).to receive(:instance_variable_get)
|
|
57
|
+
.with(:@server_url).and_return(URI(url))
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'falls back to @server_url instance variable and returns the url' do
|
|
61
|
+
metadata = DriverMetaData.new(mock_driver)
|
|
62
|
+
expect(metadata.command_executor_url).to eq(url)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context 'when both server_url and @server_url ivar raise' do
|
|
67
|
+
before(:each) do
|
|
68
|
+
allow(http_double).to receive(:server_url).and_raise(StandardError)
|
|
69
|
+
allow(http_double).to receive(:instance_variable_get)
|
|
70
|
+
.with(:@server_url).and_raise(StandardError)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'returns an empty string' do
|
|
74
|
+
metadata = DriverMetaData.new(mock_driver)
|
|
75
|
+
expect(metadata.command_executor_url).to eq('')
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
context 'when bridge access itself raises' do
|
|
80
|
+
let(:mock_driver) do
|
|
81
|
+
d = double('WebDriver', session_id: session_id)
|
|
82
|
+
allow(d).to receive(:bridge).and_raise(StandardError, 'bridge not available')
|
|
83
|
+
d
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'returns an empty string' do
|
|
87
|
+
metadata = DriverMetaData.new(mock_driver)
|
|
88
|
+
expect(metadata.command_executor_url).to eq('')
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
describe '#capabilities' do
|
|
94
|
+
let(:caps_double) { double('Capabilities') }
|
|
95
|
+
let(:mock_driver) { double('WebDriver', session_id: session_id, capabilities: caps_double) }
|
|
96
|
+
|
|
97
|
+
context 'when as_json succeeds' do
|
|
98
|
+
before(:each) { allow(caps_double).to receive(:as_json).and_return(caps_hash) }
|
|
99
|
+
|
|
100
|
+
it 'returns capabilities as json' do
|
|
101
|
+
metadata = DriverMetaData.new(mock_driver)
|
|
102
|
+
expect(metadata.capabilities).to eq(caps_hash)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it 'caches capabilities and returns them on subsequent calls without re-fetching' do
|
|
106
|
+
expect(caps_double).to receive(:as_json).once.and_return(caps_hash)
|
|
107
|
+
metadata = DriverMetaData.new(mock_driver)
|
|
108
|
+
metadata.capabilities
|
|
109
|
+
metadata.capabilities
|
|
110
|
+
expect(Cache.get_cache(session_id, Cache::CAPABILITIES)).to eq(caps_hash)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
context 'when as_json raises but to_h succeeds' do
|
|
115
|
+
before(:each) do
|
|
116
|
+
allow(caps_double).to receive(:as_json).and_raise(StandardError)
|
|
117
|
+
allow(caps_double).to receive(:to_h).and_return(caps_hash)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it 'falls back to to_h' do
|
|
121
|
+
metadata = DriverMetaData.new(mock_driver)
|
|
122
|
+
expect(metadata.capabilities).to eq(caps_hash)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
context 'when both as_json and to_h raise' do
|
|
127
|
+
before(:each) do
|
|
128
|
+
allow(caps_double).to receive(:as_json).and_raise(StandardError)
|
|
129
|
+
allow(caps_double).to receive(:to_h).and_raise(StandardError)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it 'returns an empty hash' do
|
|
133
|
+
metadata = DriverMetaData.new(mock_driver)
|
|
134
|
+
expect(metadata.capabilities).to eq({})
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
# rubocop:enable RSpec/FilePath
|