def test_create_returns_created_status(self): create_url = '/definition_templates' word = self.definition_template.get_word() word_id = word.get_id() definition = self.definition_template.get_definition() filler_lexical_classes = self.definition_template.get_filler_lexical_classes() definition_template_data = { 'word_id': word_id, 'definition': definition, 'filler_lexical_classes': filler_lexical_classes } response = self.post(create_url, data=definition_template_data) self.assertEqual(201, response.status_code) definition_template = json.loads(response.data) self.assertIsNotNone(definition_template.get('id')) self.assertIsNotNone(definition_template.get('date_created')) self.assertIsNotNone(definition_template.get('date_modified')) self.assertEqual(word.serialized, definition_template.get('word')) self.assertEqual(definition, definition_template.get('definition')) self.assertEqual(filler_lexical_classes, definition_template.get('filler_lexical_classes')) self.assertEqual(True, definition_template.get('is_active')) # Make sure the definition_template was actually saved to the database saved_definition_template = DefinitionTemplatesService.get_instance().get(int(definition_template.get('id'))) self.assertEqual(saved_definition_template.get_id(), definition_template.get('id')) self.assertEqual(DefinitionTemplate.dump_datetime(saved_definition_template.get_date_created()), definition_template.get('date_created')) self.assertEqual(DefinitionTemplate.dump_datetime(saved_definition_template.get_date_modified()), definition_template.get('date_modified')) self.assertEqual(saved_definition_template.get_word().get_id(), definition_template.get('word').get('id')) self.assertEqual(saved_definition_template.get_definition(), definition_template.get('definition')) self.assertEqual(saved_definition_template.get_filler_lexical_classes(), definition_template.get('filler_lexical_classes')) self.assertEqual(saved_definition_template.get_is_active(), definition_template.get('is_active'))
def test_delete_deletes_definition_template(self): delete_url = '/definition_templates/{}'.format(self.definition_template.get_id()) self.assertEqual(True, self.definition_template.get_is_active()) response = self.delete(delete_url) self.assertEqual(200, response.status_code) definition_template = json.loads(response.data) self.assertIsNotNone(definition_template.get('id')) self.assertIsNotNone(definition_template.get('date_created')) self.assertIsNotNone(definition_template.get('date_modified')) self.assertIsNotNone(definition_template.get('word')) self.assertIsNotNone(definition_template.get('definition')) self.assertIsNotNone(definition_template.get('filler_lexical_classes')) self.assertEqual(False, definition_template.get('is_active')) # Make sure the definition_template was actually updated in the database saved_definition_template = DefinitionTemplatesService.get_instance().get(int(definition_template.get('id'))) self.assertEqual(saved_definition_template.get_id(), definition_template.get('id')) self.assertEqual(DefinitionTemplate.dump_datetime(saved_definition_template.get_date_created()), definition_template.get('date_created')) self.assertEqual(DefinitionTemplate.dump_datetime(saved_definition_template.get_date_modified()), definition_template.get('date_modified')) self.assertEqual(saved_definition_template.get_word().get_id(), definition_template.get('word').get('id')) self.assertEqual(saved_definition_template.get_definition(), definition_template.get('definition')) self.assertEqual(saved_definition_template.get_filler_lexical_classes(), definition_template.get('filler_lexical_classes')) self.assertEqual(saved_definition_template.get_is_active(), definition_template.get('is_active'))
def test_update_creates_definition_template_and_inactivates_existing_definition_template(self): definition_template_id = self.definition_template.get_id() update_url = '/definition_templates/{}'.format(definition_template_id) self.assertEqual(True, self.definition_template.get_is_active()) word_id = self.definition_template.get_word().get_id() definition = self.definition_template.get_definition() filler_lexical_classes = self.definition_template.get_filler_lexical_classes() definition_template_data = { 'word_id': word_id, 'definition': definition } response = self.put(update_url, data=definition_template_data) self.assertEqual(200, response.status_code) definition_template = json.loads(response.data) self.assertIsNotNone(definition_template.get('id')) self.assertIsNotNone(definition_template.get('date_created')) self.assertIsNotNone(definition_template.get('date_modified')) self.assertEqual(word_id, definition_template.get('word').get('id')) self.assertEqual(definition, definition_template.get('definition')) self.assertEqual(filler_lexical_classes, definition_template.get('filler_lexical_classes')) self.assertNotEqual(definition_template_id, definition_template.get('id')) self.assertIsNotNone(definition_template.get('is_active')) # Make sure the definition_template was actually updated in the database saved_definition_template = DefinitionTemplatesService.get_instance().get(int(definition_template.get('id'))) self.assertEqual(saved_definition_template.get_id(), definition_template.get('id')) self.assertEqual(DefinitionTemplate.dump_datetime(saved_definition_template.get_date_created()), definition_template.get('date_created')) self.assertEqual(DefinitionTemplate.dump_datetime(saved_definition_template.get_date_modified()), definition_template.get('date_modified')) self.assertEqual(saved_definition_template.get_word().get_id(), definition_template.get('word').get('id')) self.assertEqual(saved_definition_template.get_definition(), definition_template.get('definition')) self.assertEqual(saved_definition_template.get_filler_lexical_classes(), definition_template.get('filler_lexical_classes')) self.assertEqual(saved_definition_template.get_is_active(), definition_template.get('is_active')) # Ensure old definition template was marked inactive old_definition_template = DefinitionTemplatesService.get_instance().get(definition_template_id) self.assertEqual(False, old_definition_template.get_is_active())
def insert_dummy_data(self): word = None definition_template = None definition_filler = None for word_data in WORDS: word = Word(word_data.get('lexeme_form'), word_data.get('lexical_class')) word.save() self.NUM_WORDS += 1 for template_data in word_data.get('definition_templates', []): definition_template = DefinitionTemplate( word, template_data.get('definition'), template_data.get('filler_lexical_classes') ) definition_template.save() self.NUM_DEFINITION_TEMPLATES += 1 for filler_data in template_data.get('definition_fillers', []): definition_filler = DefinitionFiller( definition_template, filler_data.get('filler'), filler_data.get('is_dictionary') ) definition_filler.save() self.NUM_DEFINITION_FILLERS += 1 self.word = word self.definition_template = definition_template self.definition_filler = definition_filler
def update(definition_template_id): """ Request: { "word_id": "word_id", "definition": "definition", "filler_lexical_classes": "filler_lexical_classes", "is_active": "is_active" } Response [422] (definition_template with definition_template_id doesn't exist): { "errors": { "DefinitionTemplateNotFound": [ "Unable to find DefinitionTemplate" ] }, "inputs": { "id": "definition_template_id" } } Response [422] (invalid parameters): { "errors": { "name of parameter that failed validation": [ "Reason for validation failure" ], "name of another parameter that failed validation": [ "Reason for validation failure" ], }, "inputs": { "id": "definition_template_id", "word_id": "value passed in. empty string if missing", "definition": "value passed in. empty string if missing", "filler_lexical_classes": "value passed in. empty string if missing", "is_active": "value passed in. empty string if missing" } } Response [422] (word with word_id doesn't exist): { "errors": { "WordNotFound": [ "Unable to find the specified Word" ] }, "inputs": { "id": "definition_template_id", "word_id": "value passed in. empty string if missing", "definition": "value passed in. empty string if missing", "filler_lexical_classes": "value passed in. empty string if missing", "is_active": "value passed in. empty string if missing" } } Response [422] (save failure - invalid filler_lexical_classes length): { "errors": { "AttributeError": [ "There are {} filler lexical classes but {} fillers. These values must be the same." ] }, "inputs": { "id": "definition_template_id", "word_id": "value passed in. empty string if missing", "definition": "value passed in. empty string if missing", "filler_lexical_classes": "value passed in. empty string if missing", "is_active": "value passed in. empty string if missing" } } Response [422] (save failure - invalid filler_lexical_classes value): { "errors": { "AttributeError": [ "Cannot set the filler lexical classes to a value other than one of: {}" ] }, "inputs": { "id": "definition_template_id", "word_id": "value passed in. empty string if missing", "definition": "value passed in. empty string if missing", "filler_lexical_classes": "value passed in. empty string if missing", "is_active": "value passed in. empty string if missing" } } Response [422] (save failure): { "errors": { "IntegrityError": [ "Reason saving to the db failed" ] }, "inputs": { "id": "definition_template_id", "word_id": "value passed in. empty string if missing", "definition": "value passed in. empty string if missing", "filler_lexical_classes": "value passed in. empty string if missing", "is_active": "value passed in. empty string if missing" } } Response [200] (success): { "id": "current value", "date_created": "current value", "date_modified": "current value", "word": "current value", "definition": "current value", "filler_lexical_classes": "current value", "is_active": "current value" } """ # Get the definition_template definition_template = DefinitionTemplatesService.get_instance().get(definition_template_id) # Verify the definition_template creation inputs if definition_template: # Get the input validator inputs = UpdateInputs(get_inputs()) combined_inputs = dict(inputs.serialized().items() + {'id': definition_template_id}.items()) if inputs.validate_on_submit(): # If we're only marking the definition as active or inactive, pass through to the update if inputs.is_active.data and \ not any([inputs.word_id.data, inputs.definition.data, inputs.filler_lexical_classes.data]): try: definition_template.update(**get_mixed_dict_from_multidict(get_inputs(), inputs)) return render_view( 'definition_templates/show', 200, definition_template=definition_template.serialized ) except Exception as e: return render_view('422', 422, errors={e.__class__.__name__: [e.message]}, inputs=combined_inputs) # Otherwise, if we're trying to change the definition, mark the old # definition as inactive and create a new one with the new parameters else: definition_template.update(**{'is_active': False}) word = WordsService.get_instance().get(inputs.word_id.data) \ if inputs.word_id.data else definition_template.get_word() definition = inputs.definition.data if inputs.definition.data else definition_template.get_definition() filler_lexical_classes = inputs.filler_lexical_classes.data \ if inputs.filler_lexical_classes.data else definition_template.get_filler_lexical_classes() is_active = inputs.is_active.data if inputs.is_active.data else definition_template.get_is_active() if word: try: definition_template = DefinitionTemplate(word, definition, filler_lexical_classes) definition_template.set_is_active(is_active) definition_template.save() return render_view( 'definition_templates/show', 200, definition_template=definition_template.serialized ) except Exception as e: return render_view( '422', 422, errors={e.__class__.__name__: [e.message]}, inputs=combined_inputs ) return render_view('422', 422, errors=WORD_NOT_FOUND_ERROR, inputs=inputs.serialized()) return render_view('422', 422, errors=inputs.errors, inputs=combined_inputs) return render_view('422', 422, errors=NOT_FOUND_ERROR, inputs={'id': definition_template_id})
def create(): """ Request: { "word_id": "word_id", "definition": "definition", "filler_lexical_classes": "filler_lexical_classes" } Response [422] (invalid parameters): { "errors": { "name of parameter that failed validation": [ "Reason for validation failure" ], "name of another parameter that failed validation": [ "Reason for validation failure" ], }, "inputs": { "word_id": "value passed in. empty string if missing", "definition": "value passed in. empty string if missing", "filler_lexical_classes": "value passed in. empty string if missing" } } Response [422] (word with word_id doesn't exist): { "errors": { "WordNotFound": [ "Unable to find the specified Word" ] }, "inputs": { "word_id": "value passed in. empty string if missing", "definition": "value passed in. empty string if missing", "filler_lexical_classes": "value passed in. empty string if missing" } } Response [422] (save failure - invalid filler_lexical_classes length): { "errors": { "AttributeError": [ "There are {} filler lexical classes but {} fillers. These values must be the same." ] }, "inputs": { "word_id": "value passed in. empty string if missing", "definition": "value passed in. empty string if missing", "filler_lexical_classes": "value passed in. empty string if missing" } } Response [422] (save failure - invalid filler_lexical_classes value): { "errors": { "AttributeError": [ "Cannot set the filler lexical classes to a value other than one of: {}" ] }, "inputs": { "word_id": "value passed in. empty string if missing", "definition": "value passed in. empty string if missing", "filler_lexical_classes": "value passed in. empty string if missing" } } Response [422] (save failure): { "errors": { "IntegrityError": [ "Reason saving to the db failed" ] }, "inputs": { "word_id": "value passed in. empty string if missing", "definition": "value passed in. empty string if missing", "filler_lexical_classes": "value passed in. empty string if missing" } } Response [200] (success): { "id": "current value", "date_created": "current value", "date_modified": "current value", "word": "current value", "definition": "current value", "filler_lexical_classes": "current value", "is_active": "current value" } """ # Get the input validator inputs = CreateInputs(get_inputs()) # Verify the definition_template creation inputs if inputs.validate_on_submit(): word = WordsService.get_instance().get(inputs.word_id.data) if word: try: definition_template = DefinitionTemplate(word, inputs.definition.data, inputs.filler_lexical_classes.data) definition_template.save() return render_view('definition_templates/show', 201, definition_template=definition_template.serialized) except Exception as e: return render_view('422', 422, errors={e.__class__.__name__: [e.message]}, inputs=inputs.serialized()) return render_view('422', 422, errors=WORD_NOT_FOUND_ERROR, inputs=inputs.serialized()) return render_view('422', 422, errors=inputs.errors, inputs=inputs.serialized())