Skip to content

Commit 530a562

Browse files
committed
support email-type usernames for federated users
1 parent 5032ec9 commit 530a562

File tree

2 files changed

+83
-29
lines changed

2 files changed

+83
-29
lines changed

tests/test_functional.py

Lines changed: 74 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -122,43 +122,55 @@ def test_create_user_enterpriseid():
122122

123123

124124
def test_create_user_federatedid():
125-
user = UserAction(id_type=IdentityTypes.federatedID, email="[email protected]")
126-
user.create(first_name="Daniel", last_name="Brotsky", country="US")
127-
assert user.wire_dict() == {"do": [{"createFederatedID": {"email": "[email protected]",
128-
"firstname": "Daniel", "lastname": "Brotsky",
125+
"""
126+
Test federated ID action with email address and no username
127+
"""
128+
user = UserAction(id_type=IdentityTypes.federatedID, email="[email protected]")
129+
user.create(first_name="Example", last_name="User", country="US")
130+
assert user.wire_dict() == {"do": [{"createFederatedID": {"email": "[email protected]",
131+
"firstname": "Example", "lastname": "User",
129132
"country": "US",
130133
"option": "ignoreIfAlreadyExists"}}],
131-
"user": "[email protected]"}
134+
"user": "[email protected]"}
132135

133136

134-
def test_create_user_federated_id_unicode():
135-
user = UserAction(id_type=IdentityTypes.federatedID, email=u"[email protected]")
136-
user.create(first_name="Lech", last_name=u"Wałęsa", country="PL")
137-
assert user.wire_dict() == {"do": [{"createFederatedID": {"email": u"[email protected]",
138-
"firstname": "Lech", "lastname": u"Wałęsa",
137+
def test_create_user_federatedid_unicode():
138+
"""
139+
Test federated ID action with email address and no username and unicode in at least one attribute
140+
"""
141+
user = UserAction(id_type=IdentityTypes.federatedID, email=u"[email protected]")
142+
user.create(first_name=u"Exampłę", last_name="User", country="PL")
143+
assert user.wire_dict() == {"do": [{"createFederatedID": {"email": u"[email protected]",
144+
"firstname": u"Exampłę", "lastname": "User",
139145
"country": "PL",
140146
"option": "ignoreIfAlreadyExists"}}],
141-
"user": u"[email protected]"}
147+
"user": u"[email protected]"}
142148

143149

144150
def test_create_user_federatedid_username():
145-
user = UserAction(id_type=IdentityTypes.federatedID, username="dbrotsky", domain="k.on-the-side.net")
146-
user.create(first_name="Daniel", last_name="Brotsky", country="US", email="[email protected]")
147-
assert user.wire_dict() == {"do": [{"createFederatedID": {"email": "[email protected]",
148-
"firstname": "Daniel", "lastname": "Brotsky",
151+
"""
152+
Test federated ID with a username (non-email format)
153+
"""
154+
user = UserAction(id_type=IdentityTypes.federatedID, username="user", domain="example.com")
155+
user.create(first_name="Example", last_name="User", country="US", email="[email protected]")
156+
assert user.wire_dict() == {"do": [{"createFederatedID": {"email": "[email protected]",
157+
"firstname": "Example", "lastname": "User",
149158
"country": "US",
150159
"option": "ignoreIfAlreadyExists"}}],
151-
"user": "dbrotsky", "domain": "k.on-the-side.net"}
160+
"user": "user", "domain": "example.com"}
152161

153162

154163
def test_create_user_federatedid_username_unicode():
155-
user = UserAction(id_type=IdentityTypes.federatedID, username=u"lwalesa", domain="k.on-the-side.net")
156-
user.create(first_name="Lech", last_name=u"Wałęsa", country="PL", email=u"[email protected]")
157-
assert user.wire_dict() == {"do": [{"createFederatedID": {"email": u"[email protected]",
158-
"firstname": "Lech", "lastname": u"Wałęsa",
164+
"""
165+
Test federated ID with a username and unicode attributes (non-email format)
166+
"""
167+
user = UserAction(id_type=IdentityTypes.federatedID, username=u"user", domain="example.com")
168+
user.create(first_name=u"Exampłę", last_name="User", country="PL", email=u"[email protected]")
169+
assert user.wire_dict() == {"do": [{"createFederatedID": {"email": u"[email protected]",
170+
"firstname": u"Exampłę", "lastname": "User",
159171
"country": "PL",
160172
"option": "ignoreIfAlreadyExists"}}],
161-
"user": u"lwalesa", "domain": "k.on-the-side.net"}
173+
"user": u"user", "domain": "example.com"}
162174

163175

164176
def test_create_user_federatedid_username_email():
@@ -172,11 +184,49 @@ def test_create_user_federatedid_username_email():
172184
"user": "dbrotsky", "domain": "k.on-the-side.net"}
173185

174186

175-
def test_create_user_federatedid_username_mismatch():
187+
def test_create_user_federatedid_email_format_username():
188+
"""
189+
Create federated ID with username in email format (with email address)
190+
:return:
191+
"""
176192
user = UserAction(id_type=IdentityTypes.federatedID, username="dbrotsky", domain="k.on-the-side.net",
177-
193+
194+
user.create(first_name="Daniel", last_name="Brotsky", country="US")
195+
assert user.wire_dict() == {"do": [{"createFederatedID": {"email": "[email protected]",
196+
"firstname": "Daniel", "lastname": "Brotsky",
197+
"country": "US",
198+
"option": "ignoreIfAlreadyExists"}}],
199+
"user": "dbrotsky", "domain": "k.on-the-side.net"}
200+
201+
202+
def test_create_user_federatedid_username_mismatch():
203+
"""
204+
Mismatched email in UserAction constructor vs create()
205+
"""
206+
user = UserAction(id_type=IdentityTypes.federatedID, username="user", domain="example.com",
207+
208+
with pytest.raises(ValueError):
209+
user.create(first_name="Example", last_name="User", country="US", email="[email protected]")
210+
211+
212+
def test_different_email_username():
213+
"""
214+
Update a user record so the email address is different than email-type username (federated only)
215+
"""
216+
user = UserAction(id_type=IdentityTypes.federatedID, email="[email protected]")
217+
user.update(email="[email protected]", username="[email protected]")
218+
assert user.wire_dict() == {"do": [{"update": {"email": "[email protected]",
219+
"username": "[email protected]"}}],
220+
"user": "[email protected]"}
221+
222+
223+
def test_malformed_email_type_username():
224+
"""
225+
Test email-type username with malformed email address
226+
"""
227+
user = UserAction(id_type=IdentityTypes.federatedID, email="[email protected]")
178228
with pytest.raises(ValueError):
179-
user.create(first_name="Daniel", last_name="Brotsky", country="US", email="foo@bar.com")
229+
user.update(username="@user@example.com")
180230

181231

182232
def test_update_user_adobeid():

umapi_client/functional.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ def create(self, first_name=None, last_name=None, country=None, email=None,
176176
if not self.email:
177177
raise ArgumentError("You must specify email when creating a user")
178178
elif self.email is None:
179-
self._validate(email=email)
179+
self._validate_email(email=email)
180180
self.email = email
181181
elif self.email.lower() != email.lower():
182182
raise ArgumentError("Specified email (%s) doesn't match user's email (%s)" % (email, self.email))
@@ -210,14 +210,18 @@ def update(self, email=None, username=None, first_name=None, last_name=None, cou
210210
:return: the User, so you can do User(...).update(...).add_to_groups(...)
211211
"""
212212
if email:
213-
self._validate(email=email)
214-
if username:
215-
self._validate(username=username)
213+
self._validate_email(email=email)
214+
# if username contains @ (federated only), validate as email address
215+
if self.id_type == IdentityTypes.federatedID and username and '@' in username:
216+
self._validate_email(email=username)
217+
elif username:
218+
self._validate_username(username=username)
216219
updates = {}
217220
for k, v in six.iteritems(dict(email=email, username=username,
218221
firstname=first_name, lastname=last_name,
219222
country=country)):
220-
if v: updates[k] = v
223+
if v:
224+
updates[k] = v
221225
return self.append(update=updates)
222226

223227
def add_to_groups(self, groups=None, all_groups=False, group_type=None):

0 commit comments

Comments
 (0)