From e77166c2b0c98befbe931ab1edc6ed035489c62e Mon Sep 17 00:00:00 2001 From: Renzo Lucioni Date: Thu, 26 May 2016 12:16:52 -0400 Subject: [PATCH] Adjust program detail page URL routing The new URL pattern expects a program ID and allows a program name to be included, if desired. It will match paths like 'programs/123/' and 'programs/123/foo/', but not 'programs/123/foo/bar/'. The given ID is passed to the view, where it will be used to retrieve program data. Part of ECOM-4415. --- common/test/acceptance/pages/lms/programs.py | 2 +- .../learner_dashboard/tests/test_programs.py | 26 ++++++++++++++++--- lms/djangoapps/learner_dashboard/urls.py | 10 +++---- lms/djangoapps/learner_dashboard/views.py | 6 ++--- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/common/test/acceptance/pages/lms/programs.py b/common/test/acceptance/pages/lms/programs.py index 884063d500..4b6b72528d 100644 --- a/common/test/acceptance/pages/lms/programs.py +++ b/common/test/acceptance/pages/lms/programs.py @@ -24,7 +24,7 @@ class ProgramListingPage(PageObject): class ProgramDetailsPage(PageObject): """Program details page.""" - url = BASE_URL + '/dashboard/programs/123' + url = BASE_URL + '/dashboard/programs/123/program-name/' def is_browser_on_page(self): return self.q(css='.js-program-details-wrapper').present diff --git a/lms/djangoapps/learner_dashboard/tests/test_programs.py b/lms/djangoapps/learner_dashboard/tests/test_programs.py index 016e42d82c..ad98aed18a 100644 --- a/lms/djangoapps/learner_dashboard/tests/test_programs.py +++ b/lms/djangoapps/learner_dashboard/tests/test_programs.py @@ -1,8 +1,7 @@ """ -Tests for viewing the programs enrolled by a learner. +Unit tests covering the program listing and detail pages. """ import datetime -import httpretty import unittest from urlparse import urljoin @@ -10,6 +9,7 @@ from django.conf import settings from django.core.urlresolvers import reverse from django.test import override_settings, TestCase from edx_oauth2_provider.tests.factories import ClientFactory +import httpretty from opaque_keys.edx import locator from provider.constants import CONFIDENTIAL @@ -234,14 +234,20 @@ class TestProgramDetails(ProgramsApiConfigMixin, TestCase): """ def setUp(self): super(TestProgramDetails, self).setUp() + self.user = UserFactory() self.details_page = reverse('program_details_view', args=['123']) + self.client.login(username=self.user.username, password='test') + def test_login_required(self): """ Verify that login is required to access the page. """ self.create_programs_config() + + self.client.logout() + response = self.client.get(self.details_page) self.assertRedirects( response, @@ -249,6 +255,7 @@ class TestProgramDetails(ProgramsApiConfigMixin, TestCase): ) self.client.login(username=self.user.username, password='test') + response = self.client.get(self.details_page) self.assertEquals(response.status_code, 200) @@ -257,6 +264,19 @@ class TestProgramDetails(ProgramsApiConfigMixin, TestCase): Verify that the page 404s if disabled. """ self.create_programs_config(program_details_enabled=False) - self.client.login(username=self.user.username, password='test') + response = self.client.get(self.details_page) self.assertEquals(response.status_code, 404) + + def test_page_routing(self): + """Verify that the page can be hit with or without a program name in the URL.""" + self.create_programs_config() + + response = self.client.get(self.details_page) + self.assertEquals(response.status_code, 200) + + response = self.client.get(self.details_page + 'program_name/') + self.assertEquals(response.status_code, 200) + + response = self.client.get(self.details_page + 'program_name/invalid/') + self.assertEquals(response.status_code, 404) diff --git a/lms/djangoapps/learner_dashboard/urls.py b/lms/djangoapps/learner_dashboard/urls.py index 3a004b0251..91f9555c3e 100644 --- a/lms/djangoapps/learner_dashboard/urls.py +++ b/lms/djangoapps/learner_dashboard/urls.py @@ -1,11 +1,11 @@ -""" -Learner's Dashboard urls -""" - +"""Learner dashboard URL routing configuration""" from django.conf.urls import url + from . import views + urlpatterns = [ - url(r'^programs/(?P[0-9a-f-]+)/$', views.program_details, name='program_details_view'), url(r'^programs/$', views.view_programs, name='program_listing_view'), + # Matches paths like 'programs/123/' and 'programs/123/foo/', but not 'programs/123/foo/bar/'. + url(r'^programs/(?P\d+)/[\w\-]*/?$', views.program_details, name='program_details_view'), ] diff --git a/lms/djangoapps/learner_dashboard/views.py b/lms/djangoapps/learner_dashboard/views.py index 9562a5025c..0735934687 100644 --- a/lms/djangoapps/learner_dashboard/views.py +++ b/lms/djangoapps/learner_dashboard/views.py @@ -1,4 +1,4 @@ -"""New learner dashboard views.""" +"""Learner dashboard views""" from urlparse import urljoin from django.conf import settings @@ -50,8 +50,8 @@ def view_programs(request): @login_required @require_GET -def program_details(request, program_uuid): # pylint: disable=unused-argument - """View programs in which the user is engaged.""" +def program_details(request, program_id): # pylint: disable=unused-argument + """View details about a specific program.""" show_program_details = ProgramsApiConfig.current().show_program_details if not show_program_details: raise Http404