Skip to content

Commit 193c399

Browse files
committed
DSLoginBuilder validations
1 parent 477ec14 commit 193c399

File tree

3 files changed

+64
-4
lines changed

3 files changed

+64
-4
lines changed

datashield/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from datashield.utils import DSLoginBuilder

datashield/utils.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,44 @@ class DSLoginBuilder:
1010
def __init__(self):
1111
self.items = list()
1212

13-
def add(self, name: str, url: str, user: str = None, password: str = None, token: str = None, profile: str = 'default'):
13+
def add(self, name: str, url: str, user: str = None, password: str = None, token: str = None, profile: str = 'default', driver: str = 'datashield_opal.OpalDriver'):
14+
"""
15+
Add DataSHIELD login information.
16+
17+
:param name: The name of the server, must be unique
18+
:param url: The URL of the server
19+
:param user: The user name (required if token is None)
20+
:param password: The user password
21+
:param token: The access token (required if user is None)
22+
:param profile: The DataSHIELD profile name to be used
23+
:param driver: The DataSHIELD connection driver class full name
24+
"""
25+
if name is None:
26+
raise ValueError('Server name is missing')
27+
if url is None:
28+
raise ValueError('Server URL is missing')
29+
found = [x for x in self.items if x['name'] == name]
30+
if len(found) > 0:
31+
raise ValueError('Server name must be unique: %s' % name)
32+
if user is None and token is None:
33+
raise ValueError('Either user or token must be provided')
1434
self.items.append({
1535
'name': name,
1636
'url': url,
1737
'user': user,
1838
'password': password,
1939
'token': token,
20-
'profile': profile
40+
'profile': profile if profile is not None else 'default',
41+
'driver': driver if driver is not None else 'datashield_opal.OpalDriver'
2142
})
2243
return self
2344

45+
def remove(self, name: str):
46+
"""
47+
Remove the DataSHIELD login information by its name, if it exists.
48+
"""
49+
self.items = [x for x in self.items if x['name'] != name]
50+
return self
51+
2452
def build(self):
2553
return self.items

tests/test_utils.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datashield.utils import DSLoginBuilder
1+
from datashield import DSLoginBuilder
22

33
def test_logins():
44
builder = DSLoginBuilder().add('server1', 'https://opal-demo.obba.org', 'dsuser', 'P@ssw0rd').add('server2', 'https://demo.datashield.org', token = '1234abcd', profile = 'omics')
@@ -9,8 +9,39 @@ def test_logins():
99
assert logins[0]['password'] is not None
1010
assert logins[0]['token'] is None
1111
assert logins[0]['profile'] == 'default'
12+
assert logins[0]['driver'] == 'datashield_opal.OpalDriver'
1213
assert logins[1]['name'] == 'server2'
1314
assert logins[1]['user'] is None
1415
assert logins[1]['password'] is None
1516
assert logins[1]['token'] is not None
16-
assert logins[1]['profile'] == 'omics'
17+
assert logins[1]['profile'] == 'omics'
18+
builder.remove('server1')
19+
logins = builder.build()
20+
assert len(logins) == 1
21+
assert logins[0]['name'] == 'server2'
22+
23+
def test_login_validations():
24+
# name not missing
25+
try:
26+
DSLoginBuilder().add(None, 'https://opal-demo.obba.org', 'dsuser', 'P@ssw0rd')
27+
assert False
28+
except ValueError as e:
29+
assert True
30+
# url not missing
31+
try:
32+
DSLoginBuilder().add('server1', None, 'dsuser', 'P@ssw0rd')
33+
assert False
34+
except ValueError as e:
35+
assert True
36+
# name is unique
37+
try:
38+
DSLoginBuilder().add('server1', 'https://opal-demo.obba.org', 'dsuser', 'P@ssw0rd').add('server1', 'https://demo.datashield.org', token = '1234abcd')
39+
assert False
40+
except ValueError as e:
41+
assert True
42+
# either user and token is missing
43+
try:
44+
DSLoginBuilder().add('server1', 'https://opal-demo.obba.org').add('server2', 'https://demo.datashield.org')
45+
assert False
46+
except ValueError as e:
47+
assert True

0 commit comments

Comments
 (0)