Skip to content

Commit 0400412

Browse files
committed
test(idp): integration and unit tests for adfs, azure, okta
1 parent b4905ee commit 0400412

16 files changed

+1517
-24
lines changed

test/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from test.integration import azure_browser_idp, idp_arg, okta_browser_idp, okta_idp

test/integration/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .conftest import azure_browser_idp, idp_arg, okta_browser_idp, okta_idp

test/integration/conftest.py

+47
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,48 @@ def azure_browser_idp():
103103
return db_connect
104104

105105

106+
@pytest.fixture(scope="class")
107+
def azure_idp():
108+
db_connect = {
109+
"database": conf.get("database", "database"),
110+
"host": conf.get("database", "host"),
111+
"port": conf.getint("database", "port"),
112+
"db_user": conf.get("database", "user"),
113+
"ssl": conf.getboolean("database", "ssl"),
114+
"sslmode": conf.get("database", "sslmode"),
115+
"password": conf.get("azure-idp", "password"),
116+
"iam": conf.getboolean("azure-idp", "iam"),
117+
"user": conf.get("azure-idp", "user"),
118+
"credentials_provider": conf.get("azure-idp", "credentials_provider"),
119+
"region": conf.get("azure-idp", "region"),
120+
"cluster_identifier": conf.get("azure-idp", "cluster_identifier"),
121+
"idp_tenant": conf.get("azure-idp", "idp_tenant"),
122+
"client_id": conf.get("azure-idp", "client_id"),
123+
"client_secret": conf.get("azure-idp", "client_secret"),
124+
}
125+
return db_connect
126+
127+
128+
@pytest.fixture(scope="class")
129+
def adfs_idp():
130+
db_connect = {
131+
"database": conf.get("database", "database"),
132+
"host": conf.get("database", "host"),
133+
"port": conf.getint("database", "port"),
134+
"db_user": conf.get("database", "user"),
135+
"ssl": conf.getboolean("database", "ssl"),
136+
"sslmode": conf.get("database", "sslmode"),
137+
"password": conf.get("adfs-idp", "password"),
138+
"iam": conf.getboolean("adfs-idp", "iam"),
139+
"user": conf.get("adfs-idp", "user"),
140+
"credentials_provider": conf.get("adfs-idp", "credentials_provider"),
141+
"region": conf.get("adfs-idp", "region"),
142+
"cluster_identifier": conf.get("adfs-idp", "cluster_identifier"),
143+
"idp_host": conf.get("adfs-idp", "idp_host"),
144+
}
145+
return db_connect
146+
147+
106148
@pytest.fixture
107149
def con(request, db_kwargs):
108150
conn = redshift_connector.connect(**db_kwargs)
@@ -129,6 +171,11 @@ def fin():
129171
return cursor
130172

131173

174+
@pytest.fixture
175+
def idp_arg(request):
176+
return request.getfixturevalue(request.param)
177+
178+
132179
@pytest.fixture
133180
def is_java():
134181
return "java" in sys.platform.lower()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import configparser
2+
import os
3+
from test import idp_arg
4+
5+
import pytest # type: ignore
6+
7+
import redshift_connector
8+
9+
conf = configparser.ConfigParser()
10+
root_path = os.path.dirname(os.path.dirname(os.path.abspath(os.path.join(__file__, os.pardir))))
11+
conf.read(root_path + "/config.ini")
12+
13+
PROVIDER = ["azure_idp"]
14+
15+
16+
@pytest.mark.parametrize("idp_arg", PROVIDER, indirect=True)
17+
def test_preferred_role_should_use(idp_arg):
18+
idp_arg["preferred_role"] = conf.get("azure-idp", "preferred_role")
19+
with redshift_connector.connect(**idp_arg):
20+
pass

test/integration/plugin/test_credentials_providers.py

+5-22
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import os
33
import sys
44
import typing
5+
from test import idp_arg
56

67
import botocore
78
import pytest # type: ignore
@@ -14,7 +15,6 @@
1415

1516

1617
NON_BROWSER_IDP: typing.List[str] = ["okta_idp"]
17-
1818
ALL_IDP: typing.List[str] = ["okta_browser_idp", "azure_browser_idp"] + NON_BROWSER_IDP
1919

2020

@@ -46,25 +46,12 @@ def getAcceptedIssuers(self):
4646
DEFAULT_CONTEXT = SSLContext.getDefault()
4747

4848

49-
@pytest.fixture
50-
def idp_arg(request):
51-
return request.getfixturevalue(request.param)
52-
53-
5449
@pytest.mark.parametrize("idp_arg", NON_BROWSER_IDP, indirect=True)
5550
def testIdpPassword(idp_arg):
51+
idp_arg = idp_arg
5652
idp_arg["password"] = "wrong_password"
5753

58-
with pytest.raises(redshift_connector.InterfaceError, match="Unauthorized"):
59-
redshift_connector.connect(**idp_arg)
60-
61-
62-
@pytest.mark.parametrize("idp_arg", NON_BROWSER_IDP, indirect=True)
63-
def testIdpHost(idp_arg):
64-
wrong_idp_host = "andrew.okta.com"
65-
idp_arg["idp_host"] = wrong_idp_host
66-
67-
with pytest.raises(redshift_connector.InterfaceError, match="Unauthorized"):
54+
with pytest.raises(redshift_connector.InterfaceError, match=r"(Unauthorized)|(400 Client Error: Bad Request)"):
6855
redshift_connector.connect(**idp_arg)
6956

7057

@@ -96,12 +83,8 @@ def testCredentialsProvider(idp_arg):
9683

9784

9885
@pytest.mark.parametrize("idp_arg", NON_BROWSER_IDP, indirect=True)
99-
def testPreferredRole(idp_arg):
100-
idp_arg["preferred_role"] = conf.get("okta-idp", "preferred_role")
101-
with redshift_connector.connect(**idp_arg):
102-
pass
103-
104-
idp_arg["preferred_role"] = "arn:aws:iam::111111111111:role/Okta-role"
86+
def test_preferred_role_invalid_should_fail(idp_arg):
87+
idp_arg["preferred_role"] = "arn:aws:iam::111111111111:role/Trash-role"
10588
with pytest.raises(redshift_connector.InterfaceError, match="Preferred role not found in SamlAssertion"):
10689
redshift_connector.connect(**idp_arg)
10790

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import configparser
2+
import os
3+
from test import idp_arg
4+
5+
import pytest # type: ignore
6+
7+
import redshift_connector
8+
9+
conf = configparser.ConfigParser()
10+
root_path = os.path.dirname(os.path.dirname(os.path.abspath(os.path.join(__file__, os.pardir))))
11+
conf.read(root_path + "/config.ini")
12+
13+
PROVIDER = ["okta_idp"]
14+
15+
16+
@pytest.mark.parametrize("idp_arg", PROVIDER, indirect=True)
17+
def test_idp_host_invalid_should_fail(idp_arg):
18+
wrong_idp_host: str = "andrew.okta.com"
19+
idp_arg["idp_host"] = wrong_idp_host
20+
21+
with pytest.raises(redshift_connector.InterfaceError, match="Unauthorized"):
22+
redshift_connector.connect(**idp_arg)
23+
24+
25+
@pytest.mark.parametrize("idp_arg", PROVIDER, indirect=True)
26+
def test_preferred_role_should_use(idp_arg):
27+
idp_arg["preferred_role"] = conf.get("okta-idp", "preferred_role")
28+
with redshift_connector.connect(**idp_arg):
29+
pass

test/unit/mocks/mock_socket.py

+3
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,6 @@ def accept(self):
2727

2828
def recv(self, bufsize, flags=...):
2929
return self.mocked_data
30+
31+
def close(self) -> None:
32+
pass
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<html>
2+
<head><title>Working...</title></head>
3+
<body>
4+
<form method="POST" name="hiddenform" action="https://signin.aws.amazon.com:443/saml"><input type="hidden"
5+
name="SAMLResponse"
6+
value="vVdZj9pIEH5faf+DZV7XtPHMZDMWELGgSGg3h4CJon0ZNXYZemV3W93tgeTXb7UP8ME1UZQnoLq66vvqbIbv9klsvYBUTPCRPei7tgU8ECHjm5H9tHrvvLXfjX//bahoEqf+AlQquAILb3Hl58KRnUnuC6qY8jlNQPk68JeTD//4Xt/1Uym0CERsW/PZyH4eeHf3D2/+fPtoW18qp55xOlcqgzlXmnKNItdznYHreIOVd+ffub7r9b2H+39tawZKM051fnOrdap8QhTbcMb7dKf6NKHfBe8HIiEGnW1NDV5j8xLKoFDyM65SCFjEILSRtWVZwxyYLAhfNkKVAmmA2WMDDHEl3xyd4904W6F0H/Y0SWPI0dEwUgQvvLAAFNEyU3pICmel5yLkS011pgpRWzoVIVhfaJzBZWQq1/aXWYC+lG2R0gPpuhhOKhavo9xJ760JbZTBkWYZiZ8RSGMuRPZYJMhTVsUbqqKA0Pxut+vv7vpCbojnui5xHwnqhFhWvSOkmhkI5zwS9ZPycEq54CygMfuel+gH0FsRWpN4IyTT2+SMxwEZuMajA/vACQb3vHfIUcd3TuFmu+59xcRJhISeVNRRW+o9vDntYQERSBwAYD0t5iO7V8toS7u8sJKUq0jIRHXP2ypX8TYiD/wFYpFC6KiKdhfzj3i5Jdp5d1yhZ7zO2Abr8pXpwPj2ziWhYTdv7fHXHEld0sobqSeuUa/kbME2yqnupyWsX/kbvhkz1WB4ZfOUTr8+uI8zqulp3uZ0akZKhF2kK0xt6Qn+p8wOSYn4OAcaDI/iZbb+DwLduPwRp918Zr3H5NMr68NIWOhEuaqfmommNO4T2+Av7DRMl+5wNUXMXDHTtqihK2sq8ddAJchOYE9YNNGwPgr9iX+Sk0iD7Ezhh+MUXuDWS1m+J29ZqqQZ5hPeayFvB3eIeiEzSsrg+wswbnBpRZwh4a1ct67XwDTJQmbaAV8sWrKgAamlYpJ0+N7gdcnIkBxpHIUTjYrrTIPZqZBgQJuoqmPLVMUx1q0gm4STg64iCxFDJ+WH86JRKdYNmvEZTXz/MLXdgedLvE1WSMGY+eO8nkmtg++1FxaCzC98Ln8MSctZM0rV2U1UJYRqyyJ9ie9s/aROFHkLhHkRPIfr50z9eoSTTIupBMzxVZQyg5+J7oZSWeIjD8vS3LsphqrQfzYD57VQa7JuyWOL6S0/yK3858U34eDRw4YvCcx5CPvGq7LV4mgNm1DDXnd7+3g2jfGZivtxfPElG/iB0UPxZ/zYCRli9WucWxDmj4BUSG0mwgm7rZlxAlUpbkUIpdX72fzFIs3/WOP/AQ=="/>
7+
<noscript><p>Script is disabled. Click Submit to continue.</p><input type="submit" value="Submit"/></noscript>
8+
</form>
9+
<script language="javascript">window.setTimeout('document.forms[0].submit()', 0);</script>
10+
</body>
11+
</html>

0 commit comments

Comments
 (0)