test_refund.py 4.71 KB
Newer Older
1
"""
2 3 4 5 6 7 8
Tests for refunds on the support dashboard

DEPRECATION WARNING:
This test suite is deliberately separate from the other view tests
so we can easily deprecate it once the transition from shoppingcart
to the E-Commerce service is complete.

9
"""
10 11
import datetime

12 13 14
from django.test.client import Client

from course_modes.models import CourseMode
15 16
from shoppingcart.models import CertificateItem, Order
from student.models import CourseEnrollment
17
from student.roles import SupportStaffRole
18 19
from student.tests.factories import UserFactory
from xmodule.modulestore.tests.factories import CourseFactory
20
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
21 22 23 24 25 26 27


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

30 31 32 33 34 35 36 37 38 39
        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'
        )
40
        SupportStaffRole().add_users(self.admin)
41
        self.client.login(username=self.admin.username, password='foo')
42

43 44 45 46
        self.student = UserFactory.create(
            username='student',
            email='student+refund@edx.org'
        )
47 48 49 50 51
        self.course_mode = CourseMode.objects.get_or_create(
            course_id=self.course_id,
            mode_slug='verified',
            min_price=1
        )[0]
52 53 54 55 56 57 58

        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()
59
        super(RefundTests, self).tearDown()
60 61

    def _enroll(self, purchase=True):
62
        # pylint: disable=missing-docstring
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
        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
79
        SupportStaffRole().remove_users(self.admin)
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 108 109 110 111 112 113 114 115 116 117 118
        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)
119
        response = self.client.get(response.get('location'))  # pylint: disable=maybe-no-member
120 121

        self.assertContains(response, "Unenrolled %s from" % self.student)
122
        self.assertContains(response, "Refunded 1.00 for order id")
123 124

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