Skip to content

Commit b89dfc7

Browse files
committed
Don't require identifiers when there is an email address
1 parent b91e065 commit b89dfc7

3 files changed

Lines changed: 65 additions & 23 deletions

File tree

pyproject.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@
22
name = "userlist-python"
33
version = "0.1.0"
44
description = "Official UserList SDK for Python"
5-
authors = ["Maksym Sugonyaka <maksym@newscatcherapi.com>"]
5+
authors = ["Maksym Sugonyaka <maksym@newscatcherapi.com>", "Benedikt Deicke <benedikt@userlist.com>"]
66
readme = "README.md"
77

88
homepage = "https://userlist.com/"
99
license = "MIT"
1010
keywords = ["Emailing", "Userlist", "marketing"]
1111

1212
[tool.poetry.dependencies]
13-
python = ">=3.6.0"
13+
python = "^3.7"
1414
pendulum = "^1.4"
15-
15+
requests = "^2.24.0"
1616

1717
[tool.poetry.dev-dependencies]
1818
pytest = "^5.2"
19-
requests="^2.24.0"
19+
responses = "^0.18.0"
2020

2121
[build-system]
2222
requires = ["poetry-core>=1.0.0"]

tests/test_userlist.py

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,62 @@
11
from userlist_python.userlist_auth import UserlistApiAuth
2+
from userlist_python.userlist_client import UserlistApiClient
23

34
import os
45
import unittest
5-
from userlist_python.userlist_client import UserlistApiClient
6+
import responses
67

78
class UserlistApiTest(unittest.TestCase):
89
def setUp(self):
910
self.key = "push_key"
10-
self.api = UserlistApiClient(self.key)
11-
12-
# def test_headers_auth(self):
13-
# userlist = UserlistApiClient(self.key)
14-
# try:
15-
# request = userlist.push_companies('123456')
16-
# except:
17-
# pass
18-
# assert userlist.request_method['Content-Type'] == 'application/json; charset=utf-8'
19-
# assert userlist.request_method['Accept'] == 'application/json'
20-
# assert userlist.request_method['Authorization'] == 'Push ' + self.key
11+
self.client = UserlistApiClient(self.key)
12+
13+
responses.add(responses.POST, 'https://push.userlist.com/users', status=201)
14+
responses.add(responses.POST, 'https://push.userlist.com/companies', status=201)
15+
16+
17+
def test_users_missing_identifier_and_email(self):
18+
with self.assertRaises(ValueError) as context:
19+
self.client.push_users(properties={ 'name': 'Testing' })
20+
21+
self.assertEqual(str(context.exception), 'Missing required parameter identifier or email')
22+
23+
@responses.activate
24+
def test_user_missing_identifier_with_email(self):
25+
try:
26+
self.client.push_users(email='test@example.com')
27+
except ValueError:
28+
self.self.fail('Unexpected ValueError')
29+
30+
@responses.activate
31+
def test_user_missing_email_with_identifier(self):
32+
try:
33+
self.client.push_users(identifier='user-identifier')
34+
except ValueError:
35+
self.self.fail('Unexpected ValueError')
36+
37+
@responses.activate
38+
def test_user_valid_request(self):
39+
self.client.push_users(email='test@example.com', identifier='user-identifier', properties={ 'name': 'Testing' })
40+
41+
self.assertEqual(len(responses.calls), 1)
42+
self.assertEqual(responses.calls[0].request.url, 'https://push.userlist.com/users')
43+
self.assertEqual(responses.calls[0].request.method, 'POST')
44+
self.assertEqual(responses.calls[0].request.headers['Authorization'], f'Push {self.key}')
45+
self.assertEqual(responses.calls[0].request.body, b'{"identifier": "user-identifier", "email": "test@example.com", "properties": {"name": "Testing"}}')
46+
47+
48+
def test_companies_missing_identifier(self):
49+
with self.assertRaises(TypeError) as context:
50+
self.client.push_companies(properties={ 'name': 'Testing' })
51+
52+
self.assertEqual(str(context.exception), "push_companies() missing 1 required positional argument: 'identifier'")
53+
54+
@responses.activate
55+
def test_company_valid_request(self):
56+
self.client.push_companies(identifier='company-identifier', properties={ 'name': 'Testing' })
57+
58+
self.assertEqual(len(responses.calls), 1)
59+
self.assertEqual(responses.calls[0].request.url, 'https://push.userlist.com/companies')
60+
self.assertEqual(responses.calls[0].request.method, 'POST')
61+
self.assertEqual(responses.calls[0].request.headers['Authorization'], f'Push {self.key}')
62+
self.assertEqual(responses.calls[0].request.body, b'{"identifier": "company-identifier", "properties": {"name": "Testing"}}')

userlist_python/userlist_client.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,24 +38,23 @@ def __init__(self, push_key, session=None):
3838

3939
def push_users(
4040
self,
41-
identifier,
41+
identifier=None,
4242
email=None,
4343
signed_up_at=None,
4444
last_seen_at=None,
4545
properties=None,
4646
company=None,
4747
companies=None,
4848
relationships=None
49-
5049
):
5150

5251
"""Call the `/users` endpoint.
5352
5453
Push users data into Userlist
5554
5655
57-
:param identifier: A unique identifier for that user within your application. (required)
58-
:type identifier: str
56+
:param identifier: A unique identifier for that user within your application.
57+
:type identifier: str or None
5958
6059
:param email: Email of a user
6160
:type email: str or None
@@ -87,9 +86,10 @@ def push_users(
8786

8887

8988
# identifier
90-
if not identifier:
91-
raise ValueError("identifier is a required param. Please fill it in.")
92-
else:
89+
if not identifier and not email:
90+
raise ValueError("Missing required parameter identifier or email")
91+
92+
if identifier is not None:
9393
payload["identifier"] = identifier
9494

9595
if email is not None:

0 commit comments

Comments
 (0)