Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions lms/djangoapps/mobile_api/testutils.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,13 @@ def login_and_enroll(self, course_id=None):
self.login()
self.enroll(course_id)

def api_response(self, reverse_args=None, expected_response_code=200, data=None, **kwargs):
def api_response(self, reverse_args=None, expected_response_code=200, data=None, follow=False, **kwargs):
"""
Helper method for calling endpoint, verifying and returning response.
If expected_response_code is None, doesn't verify the response' status_code.
"""
url = self.reverse_url(reverse_args, **kwargs)
response = self.url_method(url, data=data, **kwargs)
response = self.url_method(url, data=data, follow=follow)
if expected_response_code is not None:
self.assertEqual(response.status_code, expected_response_code)
return response
Expand All @@ -100,9 +100,9 @@ def reverse_url(self, reverse_args=None, **kwargs):
reverse_args.update({'api_version': kwargs.get('api_version', self.api_version)})
return reverse(self.REVERSE_INFO['name'], kwargs=reverse_args)

def url_method(self, url, data=None, **kwargs): # pylint: disable=unused-argument
def url_method(self, url, data=None, **kwargs):
"""Base implementation that returns response from the GET method of the URL."""
return self.client.get(url, data=data)
return self.client.get(url, data=data, **kwargs)


class MobileAuthTestMixin(object):
Expand Down
19 changes: 17 additions & 2 deletions lms/djangoapps/mobile_api/users/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,21 @@ def test_success(self, api_version):
self.assertEqual(response.data['username'], self.user.username)
self.assertEqual(response.data['email'], self.user.email)

@ddt.data(API_V05, API_V1)
def test_last_loggedin_updated(self, api_version):
"""Verify that a user's last logged in value updates after hitting the my_user_info endpoint"""
self.login()

self.user.refresh_from_db()
last_login_before = self.user.last_login

# just hit the api endpoint; we don't care about the response here (tested previously)
self.api_response(api_version=api_version)

self.user.refresh_from_db()
last_login_after = self.user.last_login
assert last_login_after > last_login_before


@attr(shard=9)
@ddt.ddt
Expand All @@ -83,8 +98,8 @@ def test_last_loggedin_updated(self, api_version):
self.user.refresh_from_db()
last_login_before = self.user.last_login

# just hit the api endpoint; we don't care about the response here (tested previously)
self.api_response(expected_response_code=302, api_version=api_version)
# just follow the api endpoint; we don't care about the response here (tested previously)
self.api_response(api_version=api_version, follow=True)

self.user.refresh_from_db()
last_login_after = self.user.last_login
Expand Down
9 changes: 6 additions & 3 deletions lms/djangoapps/mobile_api/users/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,12 @@ class UserDetail(generics.RetrieveAPIView):
serializer_class = UserSerializer
lookup_field = 'username'

def get(self, request, *args, **kwargs):
# update user's last logged in from here because
# updating it from the oauth2 related code is too complex
user_logged_in.send(sender=User, user=request.user, request=request)
return super(UserDetail, self).get(request, *args, **kwargs)

def get_serializer_context(self):
context = super(UserDetail, self).get_serializer_context()
context['api_version'] = self.kwargs.get('api_version')
Expand Down Expand Up @@ -380,7 +386,4 @@ def my_user_info(request, api_version):
"""
Redirect to the currently-logged-in user's info page
"""
# update user's last logged in from here because
# updating it from the oauth2 related code is too complex
user_logged_in.send(sender=User, user=request.user, request=request)
return redirect("user-detail", api_version=api_version, username=request.user.username)