Commit e77166c2 by Renzo Lucioni

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.
parent 9fa2dc03
...@@ -24,7 +24,7 @@ class ProgramListingPage(PageObject): ...@@ -24,7 +24,7 @@ class ProgramListingPage(PageObject):
class ProgramDetailsPage(PageObject): class ProgramDetailsPage(PageObject):
"""Program details page.""" """Program details page."""
url = BASE_URL + '/dashboard/programs/123' url = BASE_URL + '/dashboard/programs/123/program-name/'
def is_browser_on_page(self): def is_browser_on_page(self):
return self.q(css='.js-program-details-wrapper').present return self.q(css='.js-program-details-wrapper').present
""" """
Tests for viewing the programs enrolled by a learner. Unit tests covering the program listing and detail pages.
""" """
import datetime import datetime
import httpretty
import unittest import unittest
from urlparse import urljoin from urlparse import urljoin
...@@ -10,6 +9,7 @@ from django.conf import settings ...@@ -10,6 +9,7 @@ from django.conf import settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.test import override_settings, TestCase from django.test import override_settings, TestCase
from edx_oauth2_provider.tests.factories import ClientFactory from edx_oauth2_provider.tests.factories import ClientFactory
import httpretty
from opaque_keys.edx import locator from opaque_keys.edx import locator
from provider.constants import CONFIDENTIAL from provider.constants import CONFIDENTIAL
...@@ -234,14 +234,20 @@ class TestProgramDetails(ProgramsApiConfigMixin, TestCase): ...@@ -234,14 +234,20 @@ class TestProgramDetails(ProgramsApiConfigMixin, TestCase):
""" """
def setUp(self): def setUp(self):
super(TestProgramDetails, self).setUp() super(TestProgramDetails, self).setUp()
self.user = UserFactory() self.user = UserFactory()
self.details_page = reverse('program_details_view', args=['123']) self.details_page = reverse('program_details_view', args=['123'])
self.client.login(username=self.user.username, password='test')
def test_login_required(self): def test_login_required(self):
""" """
Verify that login is required to access the page. Verify that login is required to access the page.
""" """
self.create_programs_config() self.create_programs_config()
self.client.logout()
response = self.client.get(self.details_page) response = self.client.get(self.details_page)
self.assertRedirects( self.assertRedirects(
response, response,
...@@ -249,6 +255,7 @@ class TestProgramDetails(ProgramsApiConfigMixin, TestCase): ...@@ -249,6 +255,7 @@ class TestProgramDetails(ProgramsApiConfigMixin, TestCase):
) )
self.client.login(username=self.user.username, password='test') self.client.login(username=self.user.username, password='test')
response = self.client.get(self.details_page) response = self.client.get(self.details_page)
self.assertEquals(response.status_code, 200) self.assertEquals(response.status_code, 200)
...@@ -257,6 +264,19 @@ class TestProgramDetails(ProgramsApiConfigMixin, TestCase): ...@@ -257,6 +264,19 @@ class TestProgramDetails(ProgramsApiConfigMixin, TestCase):
Verify that the page 404s if disabled. Verify that the page 404s if disabled.
""" """
self.create_programs_config(program_details_enabled=False) self.create_programs_config(program_details_enabled=False)
self.client.login(username=self.user.username, password='test')
response = self.client.get(self.details_page) response = self.client.get(self.details_page)
self.assertEquals(response.status_code, 404) 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)
""" """Learner dashboard URL routing configuration"""
Learner's Dashboard urls
"""
from django.conf.urls import url from django.conf.urls import url
from . import views from . import views
urlpatterns = [ urlpatterns = [
url(r'^programs/(?P<program_uuid>[0-9a-f-]+)/$', views.program_details, name='program_details_view'),
url(r'^programs/$', views.view_programs, name='program_listing_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<program_id>\d+)/[\w\-]*/?$', views.program_details, name='program_details_view'),
] ]
"""New learner dashboard views.""" """Learner dashboard views"""
from urlparse import urljoin from urlparse import urljoin
from django.conf import settings from django.conf import settings
...@@ -50,8 +50,8 @@ def view_programs(request): ...@@ -50,8 +50,8 @@ def view_programs(request):
@login_required @login_required
@require_GET @require_GET
def program_details(request, program_uuid): # pylint: disable=unused-argument def program_details(request, program_id): # pylint: disable=unused-argument
"""View programs in which the user is engaged.""" """View details about a specific program."""
show_program_details = ProgramsApiConfig.current().show_program_details show_program_details = ProgramsApiConfig.current().show_program_details
if not show_program_details: if not show_program_details:
raise Http404 raise Http404
......
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