def test_saving_journeys_thats_still_in_edit_mode(self): sample_journey = { "initial_screen": { "type": "initial_screen", "next_screen": "end_screen", "default_language": "en" }, "end_screen": { "type": "quit_screen", "text": "end screen" } } self.driver.save(name="journey_a", journey=sample_journey, version="0.0.1") self.assertEqual(sample_journey, self.driver.get('journey_a', '0.0.1')) sample_journey_edit_mode = { "initial_screen": { "type": "initial_screen", "next_screen": "end_screen", "default_language": "en" }, } # confirm its invalid is_valid, errors = UssdView.validate_ussd_journey( sample_journey_edit_mode) self.assertFalse(is_valid) # but we can still save it under edit mode self.driver.save(name='journey_a', journey=sample_journey_edit_mode, edit_mode=True) # stills get the valid one that was saved. self.assertEqual(sample_journey, self.driver.get('journey_a')) # getting the one use edit mode self.assertEqual(sample_journey_edit_mode, self.driver.get('journey_a', edit_mode=True)) sample_journey_edit_mode['invalid_screen'] = "invalid_screen" # and we can still save it again self.driver.save(name='journey_a', journey=sample_journey_edit_mode, edit_mode=True) self.assertEqual(sample_journey_edit_mode, self.driver.get('journey_a', edit_mode=True))
def post(self, req): journey = req.data['journey'] if isinstance(journey, str): journey = json.loads(journey) error_type = req.data.get('error_type', 'default') is_valid, errors = UssdView.validate_ussd_journey(journey) if error_type == 'mermaid_txt': errors = convert_error_response_to_mermaid_error(errors) return JsonResponse(errors, safe=False)
def validate_yaml(value): try: journey = read_journey(value['journeys']) is_valid, errors = UssdView.validate_ussd_journey(journey) # validate the existance and form of a custom defined initialize_survey screen # if is_valid: # is_valid, errors = validate_ussd_journey(journey) except Exception as ex: logger.error(ex) raise serializers.ValidationError( {"journeys": ["The yaml file is invalid."]}) if not is_valid: raise serializers.ValidationError({"journeys": [json.dumps(errors)]})
def _test_ussd_validation(self, yaml_to_validate, expected_validation, expected_errors): if self.validate_ussd: namespace = self.namespace + str(expected_validation) file_path = path + '/' + yaml_to_validate load_yaml(file_path, namespace) ussd_screens = staticconf.config. \ get_namespace(namespace). \ get_config_values() is_valid, error_message = UssdView.validate_ussd_journey( ussd_screens) self.assertEqual(is_valid, expected_validation, error_message) self.assertDictEqual(error_message, expected_errors)
def test_saving_journeys_thats_still_in_edit_mode(self): sample_journey = { "initial_screen": { "type": "initial_screen", "next_screen": "end_screen", "default_language": "en" }, "end_screen": { "type": "quit_screen", "text": "end screen" } } self.driver.save(name="journey_a", journey=sample_journey, version="0.0.1") self.assertEqual(sample_journey, self.driver.get('journey_a', '0.0.1')) sample_journey_edit_mode = { "initial_screen": { "type": "initial_screen", "next_screen": "end_screen", "default_language": "en" }, } # confirm its invalid is_valid, errors = UssdView.validate_ussd_journey(sample_journey_edit_mode) self.assertFalse(is_valid) # but we can still save it under edit mode self.driver.save(name='journey_a', journey=sample_journey_edit_mode, edit_mode=True) # stills get the valid one that was saved. self.assertEqual(sample_journey, self.driver.get('journey_a')) # getting the one use edit mode self.assertEqual(sample_journey_edit_mode, self.driver.get('journey_a', edit_mode=True)) sample_journey_edit_mode['invalid_screen'] = "invalid_screen" # and we can still save it again self.driver.save(name='journey_a', journey=sample_journey_edit_mode, edit_mode=True) self.assertEqual(sample_journey_edit_mode, self.driver.get('journey_a', edit_mode=True))
def _test_ussd_validation(self, yaml_to_validate, expected_validation, expected_errors): if self.validate_ussd: namespace = self.namespace + str(expected_validation) staticconf.YamlConfiguration(path + '/' + yaml_to_validate, namespace=namespace, flatten=False) ussd_screens = staticconf.config. \ get_namespace(namespace). \ get_config_values() is_valid, error_message = UssdView.validate_ussd_journey( ussd_screens) self.assertEqual(is_valid, expected_validation, error_message) self.assertDictEqual(error_message, expected_errors)
def handle(self, *args, **options): error_message = {} for ussd_config in options["ussd_configs"]: if not os.path.isfile(ussd_config): raise CommandError( "The file path {} does not exist".format(ussd_config)) namespace = 'validation' load_yaml(ussd_config, namespace) ussd_screens = staticconf.config. \ get_namespace(namespace). \ get_config_values() is_valid, error_ussd_config_message = UssdView.validate_ussd_journey( ussd_screens) error_message[ussd_config] = dict( valid=is_valid, error_message=error_ussd_config_message) if not is_valid: raise CommandError(json.dumps(error_message)) self.stdout.write(json.dumps(error_message))
def save(self, name: str, journey: dict, version=None, edit_mode=False): # version and editor mode should not be false if not (version or edit_mode): raise TypeError("version is required if its not in editor mode") if edit_mode: version = self.edit_mode_version # check if this version already exists if self.get(name, version, propagate_error=False) is not None: if not edit_mode: raise ValidationError("journey already exists") # validate if its not in editing mode. if not edit_mode: is_valid, errors = UssdView.validate_ussd_journey(journey) if not is_valid: raise ValidationError("invalid journey") # now create journey return self._save(name, journey, version)
def handle(self, *args, **options): error_message = {} for ussd_config in options["ussd_configs"]: if not os.path.isfile(ussd_config): raise CommandError("This file path {} does not exist".format(ussd_config)) namespace = 'validation' load_yaml(ussd_config, namespace) ussd_screens = staticconf.config. \ get_namespace(namespace). \ get_config_values() is_valid, error_ussd_config_message = UssdView.validate_ussd_journey( ussd_screens) error_message[ussd_config] = dict( valid=is_valid, error_message=error_ussd_config_message ) if not is_valid: raise CommandError(json.dumps(error_message)) self.stdout.write(json.dumps(error_message))