diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mailman/rest/addresses.py | 10 | ||||
| -rw-r--r-- | src/mailman/rest/tests/test_addresses.py | 21 |
2 files changed, 29 insertions, 2 deletions
diff --git a/src/mailman/rest/addresses.py b/src/mailman/rest/addresses.py index 9dbbf3fc8..c62048b6a 100644 --- a/src/mailman/rest/addresses.py +++ b/src/mailman/rest/addresses.py @@ -211,7 +211,15 @@ class UserAddresses(_AddressBase): except InvalidEmailAddressError: bad_request(response, b'Invalid email address') except ExistingAddressError: - bad_request(response, b'Address already exists') + # Check if the address is not linked to any user, link it to + # the current user and return it. + address = user_manager.get_address(**validator(request)) + if address.user is None: + address.user = self._user + location = self.path_to('addresses/{0}'.format(address.email)) + created(response, location) + else: + bad_request(response, 'Address belongs to other user.') else: # Link the address to the current user and return it. address.user = self._user diff --git a/src/mailman/rest/tests/test_addresses.py b/src/mailman/rest/tests/test_addresses.py index d03dc79d7..02c190c08 100644 --- a/src/mailman/rest/tests/test_addresses.py +++ b/src/mailman/rest/tests/test_addresses.py @@ -168,7 +168,26 @@ class TestAddresses(unittest.TestCase): 'email': 'anne@example.com', }) self.assertEqual(cm.exception.code, 400) - self.assertEqual(cm.exception.reason, b'Address already exists') + self.assertEqual(cm.exception.reason, b'Address belongs to other user.') + + def test_add_unlinked_address_to_user(self): + user_manager = getUtility(IUserManager) + with transaction(): + anne = user_manager.create_user('anne.person@example.com') + user_manager.create_address('anne@example.com') + response, content = call_api( + 'http://localhost:9001/3.0/users/anne.person@example.com/addresses', + { 'email': 'anne@example.com'}) + + self.assertIn('anne@example.com', + [addr.email for addr in anne.addresses]) + self.assertEqual(content['status'], '201') + self.assertEqual( + content['location'], + 'http://localhost:9001/3.0/addresses/anne@example.com') + # The address has no display name. + anne_person = user_manager.get_address('anne@example.com') + self.assertEqual(anne_person.display_name, '') def test_invalid_address_bad_request(self): # Trying to add an invalid address string returns 400. |
