def test_record_order(self): # Make sure the order gets created, and that its ID matches # that in the payload order1, created1 = record_order(self.json_payload) self.assertTrue(created1) self.assertEqual(order1.id, self.json_payload['id']) # Try to create the order again, make sure we get a reference # instead order2, created2 = record_order(self.json_payload) self.assertFalse(created2) self.assertEqual(order1, order2)
def test_invalid_sku(self): fixup_payload = self.raw_payload.decode('utf-8').replace( "course-v1:org+course+run1", # noqa: E501 "course-v1:org+nosuchcourse+run1") # noqa: E501 fixup_json_payload = json.loads(fixup_payload) order, created = record_order(fixup_json_payload) result = None with requests_mock.Mocker() as m: m.register_uri('POST', self.token_uri, json=self.token_response) m.register_uri('POST', self.enroll_uri, status_code=400) with self.assertRaises(HTTPError): result = process.delay(fixup_json_payload) result.get(5) self.assertEqual(result.state, 'FAILURE') # Even with the exception raised, it's the task failure # handler's job to set the status to ERROR. Given the async # nature of the task, though, the object reference doesn't # learn of the update until we read back the order. This can't # just use refresh_from_db(), because of the FSM-protected # status field. order = Order.objects.get(pk=order.id) self.assertEqual(order.status, Order.ERROR)
def test_valid_order(self): order, created = record_order(self.json_payload) mock_get_course_by_id = Mock(return_value=self.course) mock_get_email_params = Mock(return_value=self.email_params) mock_enroll_email = Mock() with patch.multiple(utils, get_course_by_id=mock_get_course_by_id, get_email_params=mock_get_email_params, enroll_email=mock_enroll_email): process_order(order, self.json_payload) self.assertEqual(order.status, Order.PROCESSED)
def test_order_collision(self): order, created = record_order(self.json_payload) enrollment_response = { 'action': 'enroll', 'courses': { 'course-v1:org+course+run1': { 'action': 'enroll', 'results': [{ 'identifier': '*****@*****.**', 'after': { 'enrollment': False, 'allowed': True, 'user': False, 'auto_enroll': True }, 'before': { 'enrollment': False, 'allowed': False, 'user': False, 'auto_enroll': False } }], 'auto_enroll': True } }, 'email_students': True, 'auto_enroll': True } with requests_mock.Mocker() as m: m.register_uri('POST', self.token_uri, json=self.token_response) m.register_uri('POST', self.enroll_uri, json=enrollment_response) result1 = process.delay(self.json_payload) result2 = process.delay(self.json_payload) result3 = process.delay(self.json_payload) result1.get(5) result2.get(5) result3.get(5) self.assertEqual(result1.state, 'SUCCESS') self.assertEqual(result2.state, 'SUCCESS') self.assertEqual(result3.state, 'SUCCESS') # Read back the order (can't just use refresh_from_db(), # because of the FSM-protected status field) order = Order.objects.get(pk=order.id) self.assertEqual(order.status, Order.PROCESSED)
def test_invalid_sku(self): # Make sure the order gets created, and that its ID matches # that in the payload fixup_payload = self.raw_payload.replace( "course-v1:org+course+run1", "course-v1:org+nosuchcourse+run1") # noqa: E501 fixup_json_payload = json.loads(fixup_payload) order, created = record_order(fixup_json_payload) # Non-existent course should raise a 404 with self.assertRaises(Http404): process_order(order, fixup_json_payload) # At this stage, the order is still PROCESSING -- it's the # task failure handler's job to set the status to ERROR self.assertEqual(order.status, Order.PROCESSING)
def test_invalid_sku(self): fixup_payload = self.raw_payload.decode('utf-8').replace( "course-v1:org+course+run1", # noqa: E501 "course-v1:org+nosuchcourse+run1") # noqa: E501 fixup_json_payload = json.loads(fixup_payload) order, created = record_order(fixup_json_payload) with requests_mock.Mocker() as m: m.register_uri('POST', self.token_uri, json=self.token_response) m.register_uri('POST', self.enroll_uri, status_code=400) # Non-existent course should raise a 400 with self.assertRaises(HTTPError): process_order(order, fixup_json_payload) # At this stage, the order is still PROCESSING -- it's the # task failure handler's job to set the status to ERROR self.assertEqual(order.status, Order.PROCESSING)
def test_invalid_sku(self): fixup_payload = self.raw_payload.replace("course-v1:org+course+run1", "course-v1:org+nosuchcourse+run1") # noqa: E501 fixup_json_payload = json.loads(fixup_payload) order, created = record_order(fixup_json_payload) result = None with self.assertRaises(Http404): result = process.delay(fixup_json_payload) result.get(5) self.assertEqual(result.state, 'FAILURE') # Even with the exception raised, it's the task failure # handler's job to set the status to ERROR. Given the async # nature of the task, though, the object reference doesn't # learn of the update until we refresh from the database. order.refresh_from_db() self.assertEqual(order.status, Order.ERROR)
def test_valid_order(self): order, created = record_order(self.json_payload) enrollment_response = { 'action': 'enroll', 'courses': { 'course-v1:org+course+run1': { 'action': 'enroll', 'results': [{ 'identifier': '*****@*****.**', 'after': { 'enrollment': False, 'allowed': True, 'user': False, 'auto_enroll': True }, 'before': { 'enrollment': False, 'allowed': False, 'user': False, 'auto_enroll': False } }], 'auto_enroll': True } }, 'email_students': True, 'auto_enroll': True } with requests_mock.Mocker() as m: m.register_uri('POST', self.token_uri, json=self.token_response) m.register_uri('POST', self.enroll_uri, json=enrollment_response) process_order(order, self.json_payload) self.assertEqual(order.status, Order.PROCESSED)