test_support.py 4.49 KB
Newer Older
1 2 3
"""
Tests for support dashboard
"""
4 5 6
import datetime

from django.contrib.auth.models import Permission
7 8 9
from django.test.client import Client

from course_modes.models import CourseMode
10 11
from shoppingcart.models import CertificateItem, Order
from student.models import CourseEnrollment
12 13
from student.tests.factories import UserFactory
from xmodule.modulestore.tests.factories import CourseFactory
14
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
15 16 17 18 19 20 21


class RefundTests(ModuleStoreTestCase):
    """
    Tests for the manual refund page
    """
    def setUp(self):
22 23
        super(RefundTests, self).setUp()

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
        self.course = CourseFactory.create(
            org='testorg', number='run1', display_name='refundable course'
        )
        self.course_id = self.course.location.course_key
        self.client = Client()
        self.admin = UserFactory.create(
            username='test_admin',
            email='test_admin+support@edx.org',
            password='foo'
        )
        self.admin.user_permissions.add(Permission.objects.get(codename='change_courseenrollment'))
        self.client.login(username=self.admin.username, password='foo')
        self.student = UserFactory.create(
            username='student',
            email='student+refund@edx.org'
        )
        self.course_mode = CourseMode.objects.get_or_create(course_id=self.course_id, mode_slug='verified')[0]

        self.order = None
        self.form_pars = {'course_id': str(self.course_id), 'user': self.student.email}

    def tearDown(self):
        self.course_mode.delete()
        Order.objects.filter(user=self.student).delete()
48
        super(RefundTests, self).tearDown()
49 50

    def _enroll(self, purchase=True):
51
        # pylint: disable=missing-docstring
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
        CourseEnrollment.enroll(self.student, self.course_id, self.course_mode.mode_slug)
        if purchase:
            self.order = Order.get_cart_for_user(self.student)
            CertificateItem.add_to_order(self.order, self.course_id, 1, self.course_mode.mode_slug)
            self.order.purchase()
        self.course_mode.expiration_datetime = datetime.datetime(1983, 4, 6)
        self.course_mode.save()

    def test_support_access(self):
        response = self.client.get('/support/')
        self.assertTrue(response.status_code, 200)
        self.assertContains(response, 'Manual Refund')
        response = self.client.get('/support/refund/')
        self.assertTrue(response.status_code, 200)

        # users without the permission can't access support
        self.admin.user_permissions.clear()
        response = self.client.get('/support/')
        self.assertTrue(response.status_code, 302)

        response = self.client.get('/support/refund/')
        self.assertTrue(response.status_code, 302)

    def test_bad_courseid(self):
        response = self.client.post('/support/refund/', {'course_id': 'foo', 'user': self.student.email})
        self.assertContains(response, 'Invalid course id')

    def test_bad_user(self):
        response = self.client.post('/support/refund/', {'course_id': str(self.course_id), 'user': 'unknown@foo.com'})
        self.assertContains(response, 'User not found')

    def test_not_refundable(self):
        self._enroll()
        self.course_mode.expiration_datetime = datetime.datetime(2033, 4, 6)
        self.course_mode.save()
        response = self.client.post('/support/refund/', self.form_pars)
        self.assertContains(response, 'not past the refund window')

    def test_no_order(self):
        self._enroll(purchase=False)
        response = self.client.post('/support/refund/', self.form_pars)
        self.assertContains(response, 'No order found for %s' % self.student.username)

    def test_valid_order(self):
        self._enroll()
        response = self.client.post('/support/refund/', self.form_pars)
        self.assertContains(response, "About to refund this order")
        self.assertContains(response, "enrolled")
        self.assertContains(response, "CertificateItem Status")

    def test_do_refund(self):
        self._enroll()
        pars = self.form_pars
        pars['confirmed'] = 'true'
        response = self.client.post('/support/refund/', pars)
        self.assertTrue(response.status_code, 302)
108
        response = self.client.get(response.get('location'))  # pylint: disable=maybe-no-member
109 110 111 112 113

        self.assertContains(response, "Unenrolled %s from" % self.student)
        self.assertContains(response, "Refunded 1 for order id")

        self.assertFalse(CourseEnrollment.is_enrolled(self.student, self.course_id))