Skip to content

Commit 3c07dad

Browse files
BeyondEvildavehunt
authored andcommitted
Moved username and key to capabilities + tests (#177)
1 parent bea3f44 commit 3c07dad

File tree

4 files changed

+101
-70
lines changed

4 files changed

+101
-70
lines changed

docs/news.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
Release Notes
22
=============
33

4+
5+
1.14.0 (unreleased)
6+
-------------------
7+
8+
* Move Sauce Labs credentials to capabilities instead of URL.
9+
10+
* Thanks to `@RonnyPfannschmidt <https://github.com/RonnyPfannschmidt>`_ for pointing out the vulnerability
11+
412
1.13.0 (2018-05-25)
513
-------------------
614

pytest_selenium/drivers/saucelabs.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ def auth(self):
2424

2525
@property
2626
def executor(self):
27-
return 'https://{0}:{1}@ondemand.saucelabs.com/wd/hub'.format(
28-
self.username, self.key)
27+
return 'https://ondemand.saucelabs.com/wd/hub'
2928

3029
@property
3130
def username(self):
@@ -95,6 +94,8 @@ def driver_kwargs(request, test, capabilities, **kwargs):
9594
if os.getenv('SAUCELABS_W3C') == 'true':
9695
_capabilities = capabilities.setdefault('sauce:options', {})
9796

97+
_capabilities.setdefault('username', provider.username)
98+
_capabilities.setdefault('accessKey', provider.key)
9899
_capabilities.setdefault('name', test)
99100
tags = _capabilities.get('tags', []) + markers
100101
if tags:

testing/test_capabilities.py

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -64,71 +64,3 @@ def test_capabilities(session_capabilities, capabilities):
6464
assert capabilities['foo'] == 'bar'
6565
""")
6666
testdir.quick_qa(file_test, passed=1)
67-
68-
69-
def test_no_sauce_options(monkeypatch, testdir):
70-
monkeypatch.setenv('SAUCELABS_USERNAME', 'foo')
71-
monkeypatch.setenv('SAUCELABS_API_KEY', 'bar')
72-
73-
capabilities = {'browserName': 'chrome'}
74-
variables = testdir.makefile('.json', '{{"capabilities": {}}}'.format(
75-
json.dumps(capabilities)))
76-
77-
file_test = testdir.makepyfile("""
78-
import pytest
79-
@pytest.mark.nondestructive
80-
def test_sauce_capabilities(driver_kwargs):
81-
try:
82-
driver_kwargs['desired_capabilities']['sauce:options']
83-
raise AssertionError('<sauce:options> should not be present!')
84-
except KeyError:
85-
pass
86-
""")
87-
88-
testdir.quick_qa(
89-
'--driver', 'saucelabs', '--variables',
90-
variables, file_test, passed=1)
91-
92-
93-
def test_empty_sauce_options(monkeypatch, testdir):
94-
capabilities = {'browserName': 'chrome'}
95-
expected = {'name': 'test_empty_sauce_options.test_sauce_capabilities',
96-
'tags': ['nondestructive']}
97-
run_sauce_test(capabilities, expected, monkeypatch, testdir)
98-
99-
100-
def test_merge_sauce_options(monkeypatch, testdir):
101-
version = {'seleniumVersion': '3.8.1'}
102-
capabilities = {'browserName': 'chrome', 'sauce:options': version}
103-
expected = {'name': 'test_merge_sauce_options.test_sauce_capabilities',
104-
'tags': ['nondestructive']}
105-
expected.update(version)
106-
run_sauce_test(capabilities, expected, monkeypatch, testdir)
107-
108-
109-
def test_merge_sauce_options_with_conflict(monkeypatch, testdir):
110-
name = 'conflict'
111-
capabilities = {'browserName': 'chrome', 'sauce:options': {'name': name}}
112-
expected = {'name': name, 'tags': ['nondestructive']}
113-
run_sauce_test(capabilities, expected, monkeypatch, testdir)
114-
115-
116-
def run_sauce_test(capabilities, expected_result, monkeypatch, testdir):
117-
monkeypatch.setenv('SAUCELABS_USERNAME', 'foo')
118-
monkeypatch.setenv('SAUCELABS_API_KEY', 'bar')
119-
monkeypatch.setenv('SAUCELABS_W3C', 'true')
120-
121-
variables = testdir.makefile('.json', '{{"capabilities": {}}}'.format(
122-
json.dumps(capabilities)))
123-
124-
file_test = testdir.makepyfile("""
125-
import pytest
126-
@pytest.mark.nondestructive
127-
def test_sauce_capabilities(driver_kwargs):
128-
actual = driver_kwargs['desired_capabilities']['sauce:options']
129-
assert actual == {}
130-
""".format(expected_result))
131-
132-
testdir.quick_qa(
133-
'--driver', 'saucelabs', '--variables',
134-
variables, file_test, passed=1)

testing/test_saucelabs.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from functools import partial
66
import os
7+
import json
78

89
import pytest
910

@@ -73,6 +74,95 @@ def test_invalid_credentials_file(failure, monkeypatch, tmpdir):
7374
assert any(message in out for message in messages)
7475

7576

77+
def test_credentials_in_capabilities(monkeypatch, testdir):
78+
file_test = testdir.makepyfile("""
79+
import pytest
80+
@pytest.mark.nondestructive
81+
def test_sauce_capabilities(driver_kwargs):
82+
assert driver_kwargs['desired_capabilities']['username'] == 'foo'
83+
assert driver_kwargs['desired_capabilities']['accessKey'] == 'bar'
84+
""")
85+
86+
run_sauce_test(monkeypatch, testdir, file_test)
87+
88+
89+
def test_no_sauce_options(monkeypatch, testdir):
90+
file_test = testdir.makepyfile("""
91+
import pytest
92+
@pytest.mark.nondestructive
93+
def test_sauce_capabilities(driver_kwargs):
94+
try:
95+
driver_kwargs['desired_capabilities']['sauce:options']
96+
raise AssertionError('<sauce:options> should not be present!')
97+
except KeyError:
98+
pass
99+
""")
100+
101+
run_sauce_test(monkeypatch, testdir, file_test)
102+
103+
104+
def run_sauce_test(monkeypatch, testdir, file_test):
105+
monkeypatch.setenv('SAUCELABS_USERNAME', 'foo')
106+
monkeypatch.setenv('SAUCELABS_API_KEY', 'bar')
107+
108+
capabilities = {'browserName': 'chrome'}
109+
variables = testdir.makefile('.json', '{{"capabilities": {}}}'.format(
110+
json.dumps(capabilities)))
111+
112+
testdir.quick_qa(
113+
'--driver', 'saucelabs', '--variables',
114+
variables, file_test, passed=1)
115+
116+
117+
def test_empty_sauce_options(monkeypatch, testdir):
118+
capabilities = {'browserName': 'chrome'}
119+
expected = {'name': 'test_empty_sauce_options.test_sauce_capabilities'}
120+
run_w3c_sauce_test(capabilities, expected, monkeypatch, testdir)
121+
122+
123+
def test_merge_sauce_options(monkeypatch, testdir):
124+
version = {'seleniumVersion': '3.8.1'}
125+
capabilities = {'browserName': 'chrome', 'sauce:options': version}
126+
expected = {'name': 'test_merge_sauce_options.test_sauce_capabilities'}
127+
expected.update(version)
128+
run_w3c_sauce_test(capabilities, expected, monkeypatch, testdir)
129+
130+
131+
def test_merge_sauce_options_with_conflict(monkeypatch, testdir):
132+
name = 'conflict'
133+
capabilities = {'browserName': 'chrome', 'sauce:options': {'name': name}}
134+
expected = {'name': name}
135+
run_w3c_sauce_test(capabilities, expected, monkeypatch, testdir)
136+
137+
138+
def run_w3c_sauce_test(capabilities, expected_result, monkeypatch, testdir):
139+
username = 'foo'
140+
access_key = 'bar'
141+
142+
monkeypatch.setenv('SAUCELABS_USERNAME', username)
143+
monkeypatch.setenv('SAUCELABS_API_KEY', access_key)
144+
monkeypatch.setenv('SAUCELABS_W3C', 'true')
145+
146+
expected_result.update({'username': username,
147+
'accessKey': access_key,
148+
'tags': ['nondestructive']})
149+
150+
variables = testdir.makefile('.json', '{{"capabilities": {}}}'.format(
151+
json.dumps(capabilities)))
152+
153+
file_test = testdir.makepyfile("""
154+
import pytest
155+
@pytest.mark.nondestructive
156+
def test_sauce_capabilities(driver_kwargs):
157+
actual = driver_kwargs['desired_capabilities']['sauce:options']
158+
assert actual == {}
159+
""".format(expected_result))
160+
161+
testdir.quick_qa(
162+
'--driver', 'saucelabs', '--variables',
163+
variables, file_test, passed=1)
164+
165+
76166
def test_auth_type_none(monkeypatch):
77167
from pytest_selenium.drivers.saucelabs import SauceLabs, get_job_url
78168

0 commit comments

Comments
 (0)