Skip to content

Commit 09aa42a

Browse files
added e2e tests for bidstream client and sharing client
1 parent 3c41f5b commit 09aa42a

File tree

4 files changed

+217
-3
lines changed

4 files changed

+217
-3
lines changed

tests/test_bidstream_client_e2e.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import os
2+
import unittest
3+
4+
from uid2_client import BidstreamClient, Uid2PublisherClient, TokenGenerateInput, DecryptionStatus
5+
6+
7+
@unittest.skipIf(
8+
os.getenv("UID2_BASE_URL") is None
9+
or os.getenv("UID2_API_KEY") is None
10+
or os.getenv("UID2_SECRET_KEY") is None,
11+
"Environment variables UID2_BASE_URL, UID2_API_KEY, and UID2_SECRET_KEY must be set",
12+
)
13+
class BidstreamClientIntegrationTests(unittest.TestCase):
14+
@classmethod
15+
def setUpClass(cls):
16+
cls.UID2_BASE_URL = os.getenv("UID2_BASE_URL")
17+
cls.UID2_API_KEY = os.getenv("UID2_API_KEY")
18+
cls.UID2_SECRET_KEY = os.getenv("UID2_SECRET_KEY")
19+
20+
if cls.UID2_BASE_URL and cls.UID2_API_KEY and cls.UID2_SECRET_KEY:
21+
cls.bidstream_client = BidstreamClient(cls.UID2_BASE_URL, cls.UID2_API_KEY, cls.UID2_SECRET_KEY)
22+
cls.publisher_client = Uid2PublisherClient(cls.UID2_BASE_URL, cls.UID2_API_KEY, cls.UID2_SECRET_KEY)
23+
else:
24+
raise Exception("set the required UID2_BASE_URL/UID2_API_KEY/UID2_SECRET_KEY environment variables first")
25+
26+
def test_bidstream_client_key_refresh(self):
27+
refresh_response = self.bidstream_client.refresh()
28+
self.assertTrue(refresh_response.success)
29+
30+
def test_bidstream_client_with_generated_token(self):
31+
token_response = self.publisher_client.generate_token(
32+
TokenGenerateInput.from_email("[email protected]").do_not_generate_tokens_for_opted_out()
33+
)
34+
identity = token_response.get_identity()
35+
36+
advertising_token = identity.get_advertising_token()
37+
self.assertIsNotNone(advertising_token)
38+
39+
refresh_response = self.bidstream_client.refresh()
40+
self.assertTrue(refresh_response.success)
41+
42+
decryption_response = self.bidstream_client.decrypt_token_into_raw_uid(
43+
advertising_token, "example.com"
44+
)
45+
46+
self.assertTrue(decryption_response.success)
47+
self.assertIsNotNone(decryption_response.uid)
48+
self.assertIsNotNone(decryption_response.established)
49+
self.assertIsNotNone(decryption_response.site_id)
50+
51+
def test_bidstream_client_with_invalid_token(self):
52+
refresh_response = self.bidstream_client.refresh()
53+
self.assertTrue(refresh_response.success)
54+
55+
invalid_token = "invalid-token"
56+
decryption_response = self.bidstream_client.decrypt_token_into_raw_uid(
57+
invalid_token, "example.com"
58+
)
59+
self.assertFalse(decryption_response.success)
60+
61+
def test_bidstream_client_without_refresh(self):
62+
token_response = self.publisher_client.generate_token(
63+
TokenGenerateInput.from_email("[email protected]").do_not_generate_tokens_for_opted_out()
64+
)
65+
identity = token_response.get_identity()
66+
advertising_token = identity.get_advertising_token()
67+
68+
fresh_client = BidstreamClient(self.UID2_BASE_URL, self.UID2_API_KEY, self.UID2_SECRET_KEY)
69+
70+
decryption_response = fresh_client.decrypt_token_into_raw_uid(
71+
advertising_token, "example.com"
72+
)
73+
self.assertFalse(decryption_response.success)
74+
75+
def test_bidstream_client_error_handling(self):
76+
bad_client = BidstreamClient(self.UID2_BASE_URL, "bad-api-key", self.UID2_SECRET_KEY)
77+
refresh_response = bad_client.refresh()
78+
self.assertFalse(refresh_response.success)
79+
80+
bad_client = BidstreamClient(self.UID2_BASE_URL, self.UID2_API_KEY, "bad-secret-key")
81+
refresh_response = bad_client.refresh()
82+
self.assertFalse(refresh_response.success)
83+
84+
def test_bidstream_client_phone_token_decryption(self):
85+
token_response = self.publisher_client.generate_token(
86+
TokenGenerateInput.from_phone("+12345678901").do_not_generate_tokens_for_opted_out()
87+
)
88+
self.assertFalse(token_response.is_optout())
89+
90+
identity = token_response.get_identity()
91+
advertising_token = identity.get_advertising_token()
92+
93+
refresh_response = self.bidstream_client.refresh()
94+
self.assertTrue(refresh_response.success)
95+
96+
decryption_response = self.bidstream_client.decrypt_token_into_raw_uid(
97+
advertising_token, "example.com"
98+
)
99+
100+
self.assertTrue(decryption_response.success)
101+
self.assertIsNotNone(decryption_response.uid)
102+
103+
104+
if __name__ == '__main__':
105+
unittest.main()

tests/test_publisher_client.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ def setUpClass(cls):
9797
def test_integration_generate_and_refresh(self):
9898

9999
token_generate_response = self.publisher_client.generate_token(
100-
TokenGenerateInput.from_email("[email protected]"))
100+
TokenGenerateInput.from_email("[email protected]").do_not_generate_tokens_for_opted_out()
101+
)
101102

102103
self.assertFalse(token_generate_response.is_optout())
103104

@@ -145,9 +146,9 @@ def test_integration_optout(self):
145146

146147
# this test requires these env vars to be configured: UID2_BASE_URL, UID2_API_KEY, UID2_SECRET_KEY
147148
def test_integration_phone(self):
148-
149149
token_generate_response = self.publisher_client.generate_token(
150-
TokenGenerateInput.from_phone("+12345678901"))
150+
TokenGenerateInput.from_phone("+12345678901").do_not_generate_tokens_for_opted_out()
151+
)
151152

152153
self.assertFalse(token_generate_response.is_optout())
153154
identity = token_generate_response.get_identity()

tests/test_sharing_client_e2e.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import os
2+
import unittest
3+
from urllib.error import HTTPError
4+
5+
from uid2_client import SharingClient, Uid2PublisherClient, TokenGenerateInput, EncryptionStatus, BidstreamClient
6+
7+
8+
@unittest.skipIf(
9+
os.getenv("UID2_BASE_URL") is None
10+
or os.getenv("UID2_API_KEY") is None
11+
or os.getenv("UID2_SECRET_KEY") is None,
12+
"Environment variables UID2_BASE_URL, UID2_API_KEY, and UID2_SECRET_KEY must be set",
13+
)
14+
class SharingClientIntegrationTests(unittest.TestCase):
15+
@classmethod
16+
def setUpClass(cls):
17+
cls.UID2_BASE_URL = os.getenv("UID2_BASE_URL")
18+
cls.UID2_API_KEY = os.getenv("UID2_API_KEY")
19+
cls.UID2_SECRET_KEY = os.getenv("UID2_SECRET_KEY")
20+
21+
if cls.UID2_BASE_URL and cls.UID2_API_KEY and cls.UID2_SECRET_KEY:
22+
cls.sharing_client = SharingClient(cls.UID2_BASE_URL, cls.UID2_API_KEY, cls.UID2_SECRET_KEY)
23+
cls.publisher_client = Uid2PublisherClient(cls.UID2_BASE_URL, cls.UID2_API_KEY, cls.UID2_SECRET_KEY)
24+
cls.bidstream_client = BidstreamClient(cls.UID2_BASE_URL, cls.UID2_API_KEY, cls.UID2_SECRET_KEY)
25+
else:
26+
raise Exception("set the required UID2_BASE_URL/UID2_API_KEY/UID2_SECRET_KEY environment variables first")
27+
28+
def test_sharing_client_key_refresh(self):
29+
refresh_response = self.sharing_client.refresh()
30+
self.assertTrue(refresh_response.success)
31+
32+
def test_sharing_client_encrypt_decrypt_raw_uid(self):
33+
# Get raw uid
34+
token_response = self.publisher_client.generate_token(
35+
TokenGenerateInput.from_email("[email protected]").do_not_generate_tokens_for_opted_out()
36+
)
37+
identity = token_response.get_identity()
38+
39+
self.bidstream_client.refresh()
40+
decrypted_token = self.bidstream_client.decrypt_token_into_raw_uid(identity.get_advertising_token(), "example.com")
41+
self.assertTrue(decrypted_token.success)
42+
raw_uid = decrypted_token.uid
43+
44+
# Refresh keys first
45+
refresh_response = self.sharing_client.refresh()
46+
self.assertTrue(refresh_response.success)
47+
48+
# Encrypt the raw UID
49+
encryption_response = self.sharing_client.encrypt_raw_uid_into_token(raw_uid)
50+
self.assertTrue(encryption_response.success)
51+
self.assertIsNotNone(encryption_response.encrypted_data)
52+
53+
# Now decrypt the encrypted token
54+
decryption_response = self.sharing_client.decrypt_token_into_raw_uid(
55+
encryption_response.encrypted_data
56+
)
57+
self.assertTrue(decryption_response.success)
58+
self.assertEqual(decryption_response.uid, raw_uid)
59+
60+
def test_sharing_client_encrypt_with_invalid_raw_uid(self):
61+
refresh_response = self.sharing_client.refresh()
62+
self.assertTrue(refresh_response.success)
63+
64+
invalid_raw_uid = "invalid_raw_uid"
65+
encryption_response = self.sharing_client.encrypt_raw_uid_into_token(invalid_raw_uid)
66+
67+
self.assertFalse(encryption_response.success)
68+
69+
def test_sharing_client_decrypt_with_invalid_token(self):
70+
refresh_response = self.sharing_client.refresh()
71+
self.assertTrue(refresh_response.success)
72+
73+
invalid_token = "invalid-token"
74+
decryption_response = self.sharing_client.decrypt_token_into_raw_uid(invalid_token)
75+
76+
self.assertFalse(decryption_response.success)
77+
78+
def test_sharing_client_without_refresh(self):
79+
fresh_client = SharingClient(self.UID2_BASE_URL, self.UID2_API_KEY, self.UID2_SECRET_KEY)
80+
81+
token_response = self.publisher_client.generate_token(
82+
TokenGenerateInput.from_email("[email protected]").do_not_generate_tokens_for_opted_out()
83+
)
84+
identity = token_response.get_identity()
85+
self.bidstream_client.refresh()
86+
decrypted_token = self.bidstream_client.decrypt_token_into_raw_uid(identity.get_advertising_token(), "example.com")
87+
self.assertTrue(decrypted_token.success)
88+
raw_uid = decrypted_token.uid
89+
90+
encryption_response = fresh_client.encrypt_raw_uid_into_token(raw_uid)
91+
92+
self.assertFalse(encryption_response.success)
93+
94+
def test_sharing_client_error_handling(self):
95+
bad_client = SharingClient(self.UID2_BASE_URL, "bad-api-key", self.UID2_SECRET_KEY)
96+
refresh_response = bad_client.refresh()
97+
self.assertFalse(refresh_response.success)
98+
99+
bad_client = SharingClient(self.UID2_BASE_URL, self.UID2_API_KEY, "bad-secret-key")
100+
refresh_response = bad_client.refresh()
101+
self.assertFalse(refresh_response.success)
102+
103+
if __name__ == '__main__':
104+
unittest.main()

uid2_client/encryption_data_response.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ def make_success(encrypted_data):
1515
def make_error(encryption_status):
1616
return EncryptionDataResponse(encryption_status, None)
1717

18+
@property
19+
def success(self):
20+
return self._encryption_status == EncryptionStatus.SUCCESS
21+
1822
@property
1923
def encrypted_data(self):
2024
return self._encrypted_data

0 commit comments

Comments
 (0)