def test_single_verse_object_set_verse_by_reference( self: ModelTestCase) -> None: # Given a test single verse object and a verse reference reference = "Genesis 1:1" # Given the verse id associated with that reference test_single_verse_object = TestSingleVerseObject( verse=ANOTHER_VALID_VERSE_ID) verse_id = convert_references_to_verse_ids( get_references(reference))[0] # Given that the current verse associated with the object is not the same as # the given reference self.assertNotEqual(test_single_verse_object.verse, reference) self.assertNotEqual(test_single_verse_object.verse, verse_id) # When we set the verse on the test object to be the reference test_single_verse_object.verse = reference test_single_verse_object.save() # Then the verse associated with the object matches the reference self.assertEqual(test_single_verse_object.verse, reference) # And the verse associated with the object after retrieving it from the DB # again still matches the reference updated_test_single_verse_object: TestSingleVerseObject = ( TestSingleVerseObject.objects.get(id=test_single_verse_object.id)) self.assertEqual(updated_test_single_verse_object.verse, reference)
def get_prep_value(self: VerseField, value: int | str | None) -> int: """Validate and convert the value to a verse id int.""" if isinstance(value, str): validate_verse(value) value = bible.convert_references_to_verse_ids( bible.get_references(value), )[0] elif isinstance(value, int) and not bible.is_valid_verse_id(value): raise ValidationError(f"{value} is not a valid verse id.") return super().get_prep_value(value)
def validate_verse(verse_value: str | None) -> None: """Validate that the given value is a valid string representation of a verse.""" if verse_value is None: return references: list[NormalizedReference] = get_references(verse_value) if not references: raise ValidationError("Not a valid reference.") if len(references) > 1: raise ValidationError("Only single verse references allowed.") verse_ids: list[int] = convert_references_to_verse_ids(references) if len(verse_ids) > 1: raise ValidationError("Only single verse references allowed.")
def test_search_by_text_with_scripture_references( self: SearchTestCase) -> None: # Given test_objects with scripture references and a search text text = ("You should read Psalm 130:4,8, Jeremiah 29:32-30:10,31:12, " "Matthew 1:18 - 2:18, and Luke 3: 5-7.") test_objects = get_test_objects() # When searching for test objects associated with the verses in the search text references = get_references(text) verse_ids = convert_references_to_verse_ids(references) actual_test_objects = TestObject.objects.filter_by_verse_ids(verse_ids) # Then the result is a queryset containing test object 1 and test object 5 self.assertEqual(len(actual_test_objects), 2) for index, test_object in enumerate(test_objects): if index in {1, 5}: self.assertIn(test_object, actual_test_objects) else: self.assertNotIn(test_object, actual_test_objects)
def test_add_verses_from_text_with_scripture_references( self: ModelTestCase, ) -> None: # Given a test_object and a text with scripture references test_object = TestObjectFactory() text = ("You should read Psalm 130:4,8, Jeremiah 29:32-30:10,31:12, " "Matthew 1:18 - 2:18, and Luke 3: 5-7.") # Get the references from the text and convert them to verse ids references = get_references(text) verse_ids = convert_references_to_verse_ids(references) # When we add all of the verse ids to the test object for verse_id in verse_ids: test_object.add_verse(verse_id) # Then the list of verse ids list matches actual_verse_ids = test_object.verse_ids self.assertEqual(actual_verse_ids, verse_ids) self.assertEqual(actual_verse_ids, list(EXPECTED_VERSE_IDS))
def get_test_objects() -> list[TestObject]: test_objects = [] references = [ "Genesis 1:1-10", "Psalm 130", "Matthew 18", "Luke 15", "Exodus 20", "Jeremiah 29", "Psalm 51", "Genesis 1:1", "luke 2", "Genesis 1:1-4", ] for index in range(10): test_object = TestObjectFactory() test_object.set_verses( convert_references_to_verse_ids(get_references( references[index])), ) test_objects.append(test_object) return test_objects
def get_db_prep_save( self: VerseField, value: Any, **kwargs: Any, ) -> int | None: """Validate and convert the value to a verse id int before saving to the DB.""" if not value: return None if isinstance(value, str): references = bible.get_references(value) verse_ids = bible.convert_references_to_verse_ids(references) if not verse_ids: raise ValidationError( f"{value} does not contain a valid Scripture reference.", ) value = verse_ids[0] if not bible.is_valid_verse_id(value): raise ValidationError(f"{value} is not a valid verse id.") return int(value)