Skip to content

Commit 40f8956

Browse files
authored
Refactor: Class-based views - Enrollment Index (#3073)
2 parents 4ade9d6 + 9f6f404 commit 40f8956

3 files changed

Lines changed: 28 additions & 34 deletions

File tree

benefits/enrollment/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
app_name = "enrollment"
1212
urlpatterns = [
1313
# /enrollment
14-
path("", views.index, name=routes.name(routes.ENROLLMENT_INDEX)),
14+
path("", views.IndexView.as_view(), name=routes.name(routes.ENROLLMENT_INDEX)),
1515
path("error/reenrollment", views.reenrollment_error, name=routes.name(routes.ENROLLMENT_REENROLLMENT_ERROR)),
1616
path("retry", views.retry, name=routes.name(routes.ENROLLMENT_RETRY)),
1717
path("success", views.success, name=routes.name(routes.ENROLLMENT_SUCCESS)),

benefits/enrollment/views.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44

55
import logging
66

7-
from django.shortcuts import redirect
87
from django.template.response import TemplateResponse
98
from django.urls import reverse
109
from django.utils.decorators import decorator_from_middleware
10+
from django.views.generic import RedirectView
1111

1212
from benefits.routes import routes
1313
from benefits.core import session
14-
from benefits.core.middleware import AgencySessionRequired, EligibleSessionRequired, FlowSessionRequired, pageview_decorator
14+
from benefits.core.mixins import AgencySessionRequiredMixin, EligibleSessionRequiredMixin
15+
from benefits.core.middleware import EligibleSessionRequired, FlowSessionRequired, pageview_decorator
1516

1617
from . import analytics
1718

@@ -22,14 +23,15 @@
2223
logger = logging.getLogger(__name__)
2324

2425

25-
@decorator_from_middleware(AgencySessionRequired)
26-
@decorator_from_middleware(EligibleSessionRequired)
27-
def index(request):
28-
"""View handler for the enrollment landing page."""
29-
session.update(request, origin=reverse(routes.ENROLLMENT_INDEX))
26+
class IndexView(AgencySessionRequiredMixin, EligibleSessionRequiredMixin, RedirectView):
27+
"""CBV for the enrollment landing page."""
3028

31-
agency = session.agency(request)
32-
return redirect(agency.enrollment_index_route)
29+
def get_redirect_url(self, *args, **kwargs):
30+
return reverse(self.agency.enrollment_index_route)
31+
32+
def get(self, request, *args, **kwargs):
33+
session.update(request, origin=reverse(routes.ENROLLMENT_INDEX))
34+
return super().get(request, *args, **kwargs)
3335

3436

3537
@decorator_from_middleware(EligibleSessionRequired)

tests/pytest/enrollment/test_views.py

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from django.urls import reverse
33

44
from benefits.routes import routes
5-
import benefits.enrollment.views
5+
import benefits.enrollment.views as views
66
import benefits.enrollment.enrollment
77
from benefits.core.middleware import TEMPLATE_USER_ERROR
88
from benefits.enrollment.views import TEMPLATE_RETRY, system_error
@@ -29,23 +29,25 @@ def mocked_sentry_sdk_module(mocker):
2929

3030

3131
@pytest.mark.django_db
32-
@pytest.mark.usefixtures("mocked_session_agency", "mocked_session_flow", "mocked_session_eligible", "model_LittlepayConfig")
33-
def test_index_eligible_get_littlepay(client):
34-
path = reverse(routes.ENROLLMENT_INDEX)
35-
response = client.get(path)
32+
class TestIndexView:
3633

37-
assert response.status_code == 302
38-
assert response.url == reverse(routes.ENROLLMENT_LITTLEPAY_INDEX)
34+
@pytest.fixture
35+
def view(self, app_request, model_LittlepayConfig):
36+
v = views.IndexView()
37+
v.setup(app_request)
38+
v.agency = model_LittlepayConfig.transit_agency
39+
return v
3940

41+
def test_get_redirect_url(self, view):
4042

41-
@pytest.mark.django_db
42-
@pytest.mark.usefixtures("mocked_session_agency", "mocked_session_flow", "mocked_session_eligible", "model_SwitchioConfig")
43-
def test_index_eligible_get_switchio(client):
44-
path = reverse(routes.ENROLLMENT_INDEX)
45-
response = client.get(path)
43+
assert view.get_redirect_url() == reverse(view.agency.enrollment_index_route)
44+
45+
def test_get(self, view, app_request, mocked_session_update):
4646

47-
assert response.status_code == 302
48-
assert response.url == reverse(routes.ENROLLMENT_SWITCHIO_INDEX)
47+
response = view.get(app_request)
48+
49+
assert response.status_code == 302
50+
mocked_session_update.assert_called_once()
4951

5052

5153
@pytest.mark.django_db
@@ -63,16 +65,6 @@ def test_system_error(
6365
assert {"origin": mocked_session_agency.return_value.index_url} in mock_session.update.call_args
6466

6567

66-
@pytest.mark.django_db
67-
def test_index_ineligible(client):
68-
path = reverse(routes.ENROLLMENT_INDEX)
69-
70-
response = client.get(path)
71-
72-
assert response.status_code == 200
73-
assert response.template_name == TEMPLATE_USER_ERROR
74-
75-
7668
@pytest.mark.django_db
7769
def test_reenrollment_error_ineligible(client):
7870
path = reverse(routes.ENROLLMENT_REENROLLMENT_ERROR)

0 commit comments

Comments
 (0)