Commit 68daaf43 by Sanford Student

return only username from /me endpoint, with associated test changes

parent 12e52447
...@@ -141,14 +141,8 @@ class UserAPITestCase(APITestCase): ...@@ -141,14 +141,8 @@ class UserAPITestCase(APITestCase):
@ddt.ddt @ddt.ddt
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Account APIs are only supported in LMS') @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Account APIs are only supported in LMS')
@patch('openedx.core.djangoapps.user_api.accounts.image_helpers._PROFILE_IMAGE_SIZES', [50, 10])
@patch.dict(
'openedx.core.djangoapps.user_api.accounts.image_helpers.PROFILE_IMAGE_SIZES_MAP',
{'full': 50, 'small': 10},
clear=True
)
@attr(shard=2) @attr(shard=2)
class TestAccountAPI(CacheIsolationTestCase, UserAPITestCase): class TestOwnUsernameAPI(CacheIsolationTestCase, UserAPITestCase):
""" """
Unit tests for the Accounts API. Unit tests for the Accounts API.
""" """
...@@ -156,47 +150,46 @@ class TestAccountAPI(CacheIsolationTestCase, UserAPITestCase): ...@@ -156,47 +150,46 @@ class TestAccountAPI(CacheIsolationTestCase, UserAPITestCase):
ENABLED_CACHES = ['default'] ENABLED_CACHES = ['default']
def setUp(self): def setUp(self):
super(TestAccountAPI, self).setUp() super(TestOwnUsernameAPI, self).setUp()
self.url = reverse("account_api") self.url = reverse("own_username_api")
def test_get_account_default(self): def _verify_get_own_username(self, queries, expected_status=200):
""" """
Test that a client (logged in) can get her own account information (using default legacy profile information, Internal helper to perform the actual assertion
as created by the test UserFactory).
""" """
def verify_get_own_information(queries): with self.assertNumQueries(queries):
""" response = self.send_get(self.client, expected_status=expected_status)
Internal helper to perform the actual assertions if expected_status == 200:
"""
with self.assertNumQueries(queries):
response = self.send_get(self.client)
data = response.data data = response.data
self.assertEqual(17, len(data)) self.assertEqual(1, len(data))
self.assertEqual(self.user.username, data["username"]) self.assertEqual(self.user.username, data["username"])
self.assertEqual(self.user.first_name + " " + self.user.last_name, data["name"])
for empty_field in ("year_of_birth", "level_of_education", "mailing_address", "bio"):
self.assertIsNone(data[empty_field])
self.assertIsNone(data["country"])
self.assertEqual("m", data["gender"])
self.assertEqual("Learn a lot", data["goals"])
self.assertEqual(self.user.email, data["email"])
self.assertIsNotNone(data["date_joined"])
self.assertEqual(self.user.is_active, data["is_active"])
self._verify_profile_image_data(data, False)
self.assertTrue(data["requires_parental_consent"])
self.assertEqual([], data["language_proficiencies"])
self.assertEqual(PRIVATE_VISIBILITY, data["account_privacy"])
# Badges aren't on by default, so should not be present.
self.assertEqual(False, data["accomplishments_shared"])
def test_get_username(self):
"""
Test that a client (logged in) can get her own username.
"""
self.client.login(username=self.user.username, password=self.test_password) self.client.login(username=self.user.username, password=self.test_password)
verify_get_own_information(17) self._verify_get_own_username(15)
# Now make sure that the user can get the same information, even if not active def test_get_username_inactive(self):
"""
Test that a logged-in client can get their
username, even if inactive.
"""
self.client.login(username=self.user.username, password=self.test_password)
self.user.is_active = False self.user.is_active = False
self.user.save() self.user.save()
verify_get_own_information(11) self._verify_get_own_username(15)
def test_get_username_not_logged_in(self):
"""
Test that a client (not logged in) gets a 401
when trying to retrieve their username.
"""
# verify that the endpoint is inaccessible when not logged in
self._verify_get_own_username(12, expected_status=401)
@ddt.ddt @ddt.ddt
...@@ -366,6 +359,45 @@ class TestAccountsAPI(CacheIsolationTestCase, UserAPITestCase): ...@@ -366,6 +359,45 @@ class TestAccountsAPI(CacheIsolationTestCase, UserAPITestCase):
response = self.send_get(client, query_parameters='view=shared') response = self.send_get(client, query_parameters='view=shared')
verify_fields_visible_to_all_users(response) verify_fields_visible_to_all_users(response)
def test_get_account_default(self):
"""
Test that a client (logged in) can get her own account information (using default legacy profile information,
as created by the test UserFactory).
"""
def verify_get_own_information(queries):
"""
Internal helper to perform the actual assertions
"""
with self.assertNumQueries(queries):
response = self.send_get(self.client)
data = response.data
self.assertEqual(17, len(data))
self.assertEqual(self.user.username, data["username"])
self.assertEqual(self.user.first_name + " " + self.user.last_name, data["name"])
for empty_field in ("year_of_birth", "level_of_education", "mailing_address", "bio"):
self.assertIsNone(data[empty_field])
self.assertIsNone(data["country"])
self.assertEqual("m", data["gender"])
self.assertEqual("Learn a lot", data["goals"])
self.assertEqual(self.user.email, data["email"])
self.assertIsNotNone(data["date_joined"])
self.assertEqual(self.user.is_active, data["is_active"])
self._verify_profile_image_data(data, False)
self.assertTrue(data["requires_parental_consent"])
self.assertEqual([], data["language_proficiencies"])
self.assertEqual(PRIVATE_VISIBILITY, data["account_privacy"])
# Badges aren't on by default, so should not be present.
self.assertEqual(False, data["accomplishments_shared"])
self.client.login(username=self.user.username, password=self.test_password)
verify_get_own_information(17)
# Now make sure that the user can get the same information, even if not active
self.user.is_active = False
self.user.save()
verify_get_own_information(11)
def test_get_account_empty_string(self): def test_get_account_empty_string(self):
""" """
Test the conversion of empty strings to None for certain fields. Test the conversion of empty strings to None for certain fields.
......
...@@ -35,7 +35,16 @@ class AccountViewSet(ViewSet): ...@@ -35,7 +35,16 @@ class AccountViewSet(ViewSet):
PATCH /api/user/v1/accounts/{username}/{"key":"value"} "application/merge-patch+json" PATCH /api/user/v1/accounts/{username}/{"key":"value"} "application/merge-patch+json"
**Response Values for GET** **Response Values for GET requests to the /me endpoint**
If the user is not logged in, an HTTP 401 "Not Authorized" response
is returned.
Otherwise, an HTTP 200 "OK" response is returned. The response
contains the following value:
* username: The username associated with the account.
**Response Values for GET requests to /accounts endpoints**
If no user exists with the specified username, an HTTP 404 "Not If no user exists with the specified username, an HTTP 404 "Not
Found" response is returned. Found" response is returned.
...@@ -152,13 +161,7 @@ class AccountViewSet(ViewSet): ...@@ -152,13 +161,7 @@ class AccountViewSet(ViewSet):
""" """
GET /api/user/v1/me GET /api/user/v1/me
""" """
try: return Response({'username': request.user.username})
account_settings = get_account_settings(
request, [request.user.username], view=request.query_params.get('view'))
except UserNotFound:
return Response(status=status.HTTP_403_FORBIDDEN if request.user.is_staff else status.HTTP_404_NOT_FOUND)
return Response(account_settings[0])
def list(self, request): def list(self, request):
""" """
......
...@@ -25,7 +25,7 @@ ACCOUNT_DETAIL = AccountViewSet.as_view({ ...@@ -25,7 +25,7 @@ ACCOUNT_DETAIL = AccountViewSet.as_view({
urlpatterns = patterns( urlpatterns = patterns(
'', '',
url(r'^v1/me$', ME, name='account_api'), url(r'^v1/me$', ME, name='own_username_api'),
url(r'^v1/accounts/{}$'.format(settings.USERNAME_PATTERN), ACCOUNT_DETAIL, name='accounts_api'), url(r'^v1/accounts/{}$'.format(settings.USERNAME_PATTERN), ACCOUNT_DETAIL, name='accounts_api'),
url(r'^v1/accounts$', ACCOUNT_LIST, name='accounts_detail_api'), url(r'^v1/accounts$', ACCOUNT_LIST, name='accounts_detail_api'),
url( url(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment