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.
@@ -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