tests.py 7.54 KB
Newer Older
1 2 3 4 5
"""
Tests for branding page
"""
import datetime
from django.conf import settings
6
from django.contrib.auth.models import AnonymousUser
7
from django.http import HttpResponseRedirect
8
from django.test.utils import override_settings
9
from django.test.client import RequestFactory
10
from pytz import UTC
11 12
from mock import patch, Mock
from edxmako.shortcuts import render_to_response
13

14
from branding.views import index
15
from xmodule.modulestore.tests.django_utils import TEST_DATA_MOCK_MODULESTORE
16
from edxmako.tests import mako_middleware_process_request
17 18 19
import student.views
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
20

21 22
from django.core.urlresolvers import reverse

23 24 25 26
FEATURES_WITH_STARTDATE = settings.FEATURES.copy()
FEATURES_WITH_STARTDATE['DISABLE_START_DATES'] = False
FEATURES_WO_STARTDATE = settings.FEATURES.copy()
FEATURES_WO_STARTDATE['DISABLE_START_DATES'] = True
27 28


29 30 31 32 33 34 35 36 37
def mock_render_to_response(*args, **kwargs):
    """
    Mock the render_to_response function
    """
    return render_to_response(*args, **kwargs)

RENDER_MOCK = Mock(side_effect=mock_render_to_response)


38
@override_settings(MODULESTORE=TEST_DATA_MOCK_MODULESTORE)
39 40 41 42 43
class AnonymousIndexPageTest(ModuleStoreTestCase):
    """
    Tests that anonymous users can access the '/' page,  Need courses with start date
    """
    def setUp(self):
44
        super(AnonymousIndexPageTest, self).setUp()
45
        self.factory = RequestFactory()
46 47
        self.course = CourseFactory.create(
            days_early_for_beta=5,
48
            enrollment_start=datetime.datetime.now(UTC) + datetime.timedelta(days=3),
49 50
            user_id=self.user.id,
        )
51

52
    @override_settings(FEATURES=FEATURES_WITH_STARTDATE)
53
    def test_none_user_index_access_with_startdate_fails(self):
54
        """
55 56 57
        This is a regression test for a bug where the incoming user is
        anonymous and start dates are being checked.  It replaces a previous
        test as it solves the issue in a different way
58
        """
59 60
        request = self.factory.get('/')
        request.user = AnonymousUser()
61 62

        mako_middleware_process_request(request)
63
        student.views.index(request)
64

65
    @override_settings(FEATURES=FEATURES_WITH_STARTDATE)
66 67 68 69
    def test_anon_user_with_startdate_index(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)

70
    @override_settings(FEATURES=FEATURES_WO_STARTDATE)
71 72 73
    def test_anon_user_no_startdate_index(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92

    def test_allow_x_frame_options(self):
        """
        Check the x-frame-option response header
        """

        # check to see that the default setting is to ALLOW iframing
        resp = self.client.get('/')
        self.assertEquals(resp['X-Frame-Options'], 'ALLOW')

    @override_settings(X_FRAME_OPTIONS='DENY')
    def test_deny_x_frame_options(self):
        """
        Check the x-frame-option response header
        """

        # check to see that the override value is honored
        resp = self.client.get('/')
        self.assertEquals(resp['X-Frame-Options'], 'DENY')
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109

    def test_edge_redirect_to_login(self):
        """
        Test edge homepage redirect to lms login.
        """

        request = self.factory.get('/')
        request.user = AnonymousUser()

        # HTTP Host changed to edge.
        request.META["HTTP_HOST"] = "edge.edx.org"
        response = index(request)

        # Response should be instance of HttpResponseRedirect.
        self.assertIsInstance(response, HttpResponseRedirect)
        # Location should be "/login".
        self.assertEqual(response._headers.get("location")[1], "/login")
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144


@override_settings(MODULESTORE=TEST_DATA_MOCK_MODULESTORE)
class IndexPageCourseCardsSortingTests(ModuleStoreTestCase):
    """
    Test for Index page course cards sorting
    """
    def setUp(self):
        super(IndexPageCourseCardsSortingTests, self).setUp()
        self.starting_later = CourseFactory.create(
            org='MITx',
            number='1000',
            display_name='Starting later, Announced later',
            metadata={
                'start': datetime.datetime.now(UTC) + datetime.timedelta(days=4),
                'announcement': datetime.datetime.now(UTC) + datetime.timedelta(days=3),
            }
        )
        self.starting_earlier = CourseFactory.create(
            org='MITx',
            number='1001',
            display_name='Starting earlier, Announced earlier',
            metadata={
                'start': datetime.datetime.now(UTC) + datetime.timedelta(days=2),
                'announcement': datetime.datetime.now(UTC) + datetime.timedelta(days=1),
            }
        )
        self.course_with_default_start_date = CourseFactory.create(
            org='MITx',
            number='1002',
            display_name='Tech Beta Course',
        )
        self.factory = RequestFactory()

    @patch('student.views.render_to_response', RENDER_MOCK)
145
    @patch('courseware.views.render_to_response', RENDER_MOCK)
146 147 148 149 150 151 152 153 154 155 156
    def test_course_cards_sorted_by_default_sorting(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)
        ((template, context), _) = RENDER_MOCK.call_args
        self.assertEqual(template, 'index.html')

        # Now the courses will be stored in their announcement dates.
        self.assertEqual(context['courses'][0].id, self.starting_later.id)
        self.assertEqual(context['courses'][1].id, self.starting_earlier.id)
        self.assertEqual(context['courses'][2].id, self.course_with_default_start_date.id)

157 158 159 160 161 162 163 164 165 166 167
        # check the /courses view
        response = self.client.get(reverse('branding.views.courses'))
        self.assertEqual(response.status_code, 200)
        ((template, context), _) = RENDER_MOCK.call_args
        self.assertEqual(template, 'courseware/courses.html')

        # Now the courses will be stored in their announcement dates.
        self.assertEqual(context['courses'][0].id, self.starting_later.id)
        self.assertEqual(context['courses'][1].id, self.starting_earlier.id)
        self.assertEqual(context['courses'][2].id, self.course_with_default_start_date.id)

168
    @patch('student.views.render_to_response', RENDER_MOCK)
169
    @patch('courseware.views.render_to_response', RENDER_MOCK)
170 171 172 173 174 175 176 177 178 179 180
    @patch.dict('django.conf.settings.FEATURES', {'ENABLE_COURSE_SORTING_BY_START_DATE': True})
    def test_course_cards_sorted_by_start_date_show_earliest_first(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)
        ((template, context), _) = RENDER_MOCK.call_args
        self.assertEqual(template, 'index.html')

        # now the courses will be sorted by their creation dates, earliest first.
        self.assertEqual(context['courses'][0].id, self.starting_earlier.id)
        self.assertEqual(context['courses'][1].id, self.starting_later.id)
        self.assertEqual(context['courses'][2].id, self.course_with_default_start_date.id)
181 182 183 184 185 186 187 188 189 190 191

        # check the /courses view as well
        response = self.client.get(reverse('branding.views.courses'))
        self.assertEqual(response.status_code, 200)
        ((template, context), _) = RENDER_MOCK.call_args
        self.assertEqual(template, 'courseware/courses.html')

        # now the courses will be sorted by their creation dates, earliest first.
        self.assertEqual(context['courses'][0].id, self.starting_earlier.id)
        self.assertEqual(context['courses'][1].id, self.starting_later.id)
        self.assertEqual(context['courses'][2].id, self.course_with_default_start_date.id)