def test_clean_access_success(self): rule = {"if_before": now()} fre = models.FlowRuleException(flow_id=factories.DEFAULT_FLOW_ID, participation=self.participation, kind=constants.flow_rule_kind.access, rule=rule, expiration=now()) fre.clean() self.assertEqual(self.mock_get_course_repo.call_count, 1) self.assertEqual(self.mock_get_flow_desc.call_count, 1) self.assertEqual(self.mock_validate_session_access_rule.call_count, 1)
def test_clean_grading_success(self): rule = {"if_completed_before": now(), "credit_percent": 100} fre = models.FlowRuleException(flow_id=factories.DEFAULT_FLOW_ID, participation=self.participation, kind=constants.flow_rule_kind.grading, rule=rule, expiration=None) fre.clean() self.assertEqual(self.mock_get_course_repo.call_count, 1) self.assertEqual(self.mock_get_flow_desc.call_count, 1) self.assertEqual(self.mock_validate_session_grading_rule.call_count, 1)
def test_clean_success_null_exception_rule(self): rule = dict() fre = models.FlowRuleException(flow_id=factories.DEFAULT_FLOW_ID, participation=self.participation, kind=constants.flow_rule_kind.start, rule=rule, expiration=None) fre.clean() self.assertEqual(self.mock_get_course_repo.call_count, 1) self.assertEqual(self.mock_get_flow_desc.call_count, 1) self.assertEqual(self.mock_validate_session_start_rule.call_count, 1)
def test_clean_success_no_existing_rules(self): self.mock_get_flow_desc.return_value = dict_to_struct( {"id": "no_existing_flow"}) rule = dict() fre = models.FlowRuleException(flow_id=factories.DEFAULT_FLOW_ID, participation=self.participation, kind=constants.flow_rule_kind.start, rule=rule, expiration=None) fre.clean() self.assertEqual(self.mock_get_course_repo.call_count, 1) self.assertEqual(self.mock_get_flow_desc.call_count, 1) self.assertEqual(self.mock_validate_session_start_rule.call_count, 1)
def test_clean_failure_with_invalid_existing_session_rules(self): rule = dict() fre = models.FlowRuleException(flow_id=factories.DEFAULT_FLOW_ID, participation=self.participation, kind=constants.flow_rule_kind.start, rule=rule, expiration=None) from course import validation my_custom_error = "my custom error" self.mock_validate_session_start_rule.side_effect = ( validation.ValidationError(my_custom_error)) with self.assertRaises(ValidationError) as cm: fre.clean() expected_error_msg = "invalid existing_session_rules: %s" % my_custom_error self.assertIn(expected_error_msg, str(cm.exception)) self.assertEqual(self.mock_get_course_repo.call_count, 1) self.assertEqual(self.mock_get_flow_desc.call_count, 1) self.assertEqual(self.mock_validate_session_start_rule.call_count, 1)
def test_clean_unknown_exception_rule(self): unknown_flow_rule_kind = "unknown_kind" rule = {"if_before": now()} fre = models.FlowRuleException(flow_id=factories.DEFAULT_FLOW_ID, participation=self.participation, kind=unknown_flow_rule_kind, rule=rule, expiration=now()) with self.assertRaises(ValidationError) as cm: fre.clean() expected_error_msg = "invalid exception rule kind" self.assertIn(expected_error_msg, str(cm.exception)) for call in (self.mock_get_course_repo, self.mock_get_flow_desc, self.mock_validate_session_access_rule, self.mock_validate_session_access_rule, self.mock_validate_session_access_rule, self.mock_validate_session_access_rule): self.assertEqual( call.call_count, 0, "The expensive operation should be skipped in this case")
def test_clean_grading_no_expire_failure(self): rule = {"if_completed_before": now(), "credit_percent": 100} expected_error_msg = "grading rules may not expire" with self.assertRaises(ValidationError) as cm: fre = models.FlowRuleException( flow_id=factories.DEFAULT_FLOW_ID, participation=self.participation, kind=constants.flow_rule_kind.grading, rule=rule, expiration=now()) fre.clean() self.assertIn(expected_error_msg, str(cm.exception)) self.assertEqual( self.mock_get_course_repo.call_count, 0, "The expensive operation should be skipped in this case") self.assertEqual( self.mock_get_flow_desc.call_count, 0, "The expensive operation should be skipped in this case") self.assertEqual( self.mock_validate_session_grading_rule.call_count, 0, "The expensive operation should be skipped in this case")