helpers.py 4.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
import json

from django.contrib.auth.models import User
from django.core.urlresolvers import reverse

from student.models import Registration

from django.test import TestCase


def check_for_get_code(self, code, url):
        """
        Check that we got the expected code when accessing url via GET.
        Returns the HTTP response.
15 16 17 18 19 20

        `self` is a class that subclasses TestCase.

        `code` is a status code for HTTP responses.

        `url` is a url pattern for which we have to test the response.
21 22 23 24 25 26 27 28 29 30 31 32
        """
        resp = self.client.get(url)
        self.assertEqual(resp.status_code, code,
                         "got code %d for url '%s'. Expected code %d"
                         % (resp.status_code, url, code))
        return resp


def check_for_post_code(self, code, url, data={}):
        """
        Check that we got the expected code when accessing url via POST.
        Returns the HTTP response.
33 34 35 36 37
        `self` is a class that subclasses TestCase.

        `code` is a status code for HTTP responses.

        `url` is a url pattern for which we want to test the response.
38 39 40 41 42 43 44 45 46
        """
        resp = self.client.post(url, data)
        self.assertEqual(resp.status_code, code,
                         "got code %d for url '%s'. Expected code %d"
                         % (resp.status_code, url, code))
        return resp


class LoginEnrollmentTestCase(TestCase):
47 48 49 50
    """
    Provides support for user creation,
    activation, login, and course enrollment.
    """
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
    def setup_user(self):
        """
        Create a user account, activate, and log in.
        """
        self.email = 'foo@test.com'
        self.password = 'bar'
        self.username = 'test'
        self.create_account(self.username,
                            self.email, self.password)
        self.activate_user(self.email)
        self.login(self.email, self.password)

    # ============ User creation and login ==============

    def login(self, email, password):
        """
        Login, check that the corresponding view's response has a 200 status code.
        """
69 70
        resp = self.client.post(reverse('login'),
                                {'email': email, 'password': password})
71 72 73 74 75 76
        self.assertEqual(resp.status_code, 200)
        data = json.loads(resp.content)
        self.assertTrue(data['success'])

    def logout(self):
        """
77 78
        Logout; check that the HTTP response code indicates redirection
        as expected.
79 80
        """
        # should redirect
81
        check_for_get_code(self, 302, reverse('logout'))
82 83 84 85 86

    def create_account(self, username, email, password):
        """
        Create the account and check that it worked.
        """
87
        resp = check_for_post_code(self, 200, reverse('create_account'), {
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
            'username': username,
            'email': email,
            'password': password,
            'name': 'username',
            'terms_of_service': 'true',
            'honor_code': 'true',
        })
        data = json.loads(resp.content)
        self.assertEqual(data['success'], True)
        # Check both that the user is created, and inactive
        self.assertFalse(User.objects.get(email=email).is_active)

    def activate_user(self, email):
        """
        Look up the activation key for the user, then hit the activate view.
        No error checking.
        """
        activation_key = Registration.objects.get(user__email=email).activation_key
        # and now we try to activate
107
        check_for_get_code(self, 200, reverse('activate', kwargs={'key': activation_key}))
108 109 110 111 112 113
        # Now make sure that the user is now actually activated
        self.assertTrue(User.objects.get(email=email).is_active)

    def enroll(self, course, verify=False):
        """
        Try to enroll and return boolean indicating result.
114
        `course` is an instance of CourseDescriptor.
115
        `verify` is an optional boolean parameter specifying whether we
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
        want to verify that the student was successfully enrolled
        in the course.
        """
        resp = self.client.post(reverse('change_enrollment'), {
            'enrollment_action': 'enroll',
            'course_id': course.id,
        })
        result = resp.status_code == 200
        if verify:
            self.assertTrue(result)
        return result

    def unenroll(self, course):
        """
        Unenroll the currently logged-in user, and check that it worked.
131
        `course` is an instance of CourseDescriptor.
132
        """
133 134
        check_for_post_code(self, 200, reverse('change_enrollment'), {'enrollment_action': 'unenroll',
                                                                      'course_id': course.id})