from datetime import date from django.test import TestCase from reversion import revisions as reversion from RIGS import models from versioning import versioning class RIGSVersionTestCase(TestCase): def setUp(self): models.VatRate.objects.create(rate=0.20, comment="TP V1", start_at="2013-01-01") self.profile = models.Profile.objects.get_or_create( first_name="Test", last_name="TEC User", username="eventauthtest", email="teccie@functional.test", is_superuser=True, # lazily grant all permissions )[0] with reversion.create_revision(): reversion.set_user(self.profile) self.person = models.Person.objects.create(name="Authorisation Test Person") with reversion.create_revision(): reversion.set_user(self.profile) self.organisation = models.Organisation.objects.create(name="Authorisation Test Organisation") with reversion.create_revision(): reversion.set_user(self.profile) self.event = models.Event.objects.create( name="AuthorisationTestCase", person=self.person, start_date=date.today() ) with reversion.create_revision(): reversion.set_user(self.profile) self.event.notes = "A new note on the event" self.event.save() def test_find_parent_version(self): # Find the most recent version current_version = versioning.RIGSVersion.objects.get_for_object(self.event).latest("revision_id") self.assertEqual(current_version._object_version.object.notes, "A new note on the event") # Check the prev version is loaded correctly previousVersion = current_version.parent assert previousVersion._object_version.object.notes == "" # Check that finding the parent of the first version fails gracefully self.assertFalse(previousVersion.parent) def test_changes_since(self): # Find the most recent version currentVersion = versioning.RIGSVersion.objects.get_for_object(self.event).latest("revision_id") changes = currentVersion.changes self.assertEqual(len(changes.field_changes), 1) def test_manager(self): objs = versioning.RIGSVersion.objects.get_for_multiple_models( [models.Event, models.Person, models.Organisation] ) self.assertEqual(len(objs), 4) def test_text_field_types(self): with reversion.create_revision(): reversion.set_user(self.profile) self.event.name = "New event name" # Simple text self.event.description = "hello world" # Long text self.event.save() # Find the most recent version currentVersion = versioning.RIGSVersion.objects.get_for_object(self.event).latest("revision_id") diff = currentVersion.changes # There are two changes self.assertEqual(len(diff.field_changes), 2) self.assertFalse(currentVersion.changes.items_changed) self.assertTrue(currentVersion.changes.fields_changed) self.assertTrue(currentVersion.changes.anything_changed) # Only one has "linebreaks" self.assertEqual(sum([x.linebreaks for x in diff.field_changes]), 1) # None are "long" (email address) self.assertEqual(sum([x.long for x in diff.field_changes]), 0) # Try changing email field in person with reversion.create_revision(): reversion.set_user(self.profile) self.person.email = "hello@world.com" self.person.save() # Find the most recent version currentVersion = versioning.RIGSVersion.objects.get_for_object(self.person).latest("revision_id") diff = currentVersion.changes # Should be declared as long self.assertTrue(diff.field_changes[0].long) def test_text_diff(self): with reversion.create_revision(): reversion.set_user(self.profile) self.event.notes = "An old note on the event" # Simple text self.event.save() # Find the most recent version currentVersion = versioning.RIGSVersion.objects.get_for_object(self.event).latest("revision_id") # Check the diff is correct self.assertEqual( currentVersion.changes.field_changes[0].diff, [ {"type": "equal", "text": "A"}, {"type": "delete", "text": " new"}, {"type": "insert", "text": "n old"}, {"type": "equal", "text": " note on the event"}, ], ) def test_choice_field(self): with reversion.create_revision(): reversion.set_user(self.profile) self.event.status = models.Event.CONFIRMED self.event.save() currentVersion = versioning.RIGSVersion.objects.get_for_object(self.event).latest("revision_id") self.assertEqual(currentVersion.changes.field_changes[0].old, "Provisional") self.assertEqual(currentVersion.changes.field_changes[0].new, "Confirmed") def test_creation_behaviour(self): firstVersion = versioning.RIGSVersion.objects.get_for_object(self.event).latest("revision__date_created").parent diff = firstVersion.changes # Mainly to check for exceptions: self.assertTrue(len(diff.field_changes) > 0) def test_event_items(self): with reversion.create_revision(): reversion.set_user(self.profile) item1 = models.EventItem.objects.create(event=self.event, name="TI I1", quantity=1, cost=1.00, order=1) self.event.save() # Find the most recent version current_version = versioning.RIGSVersion.objects.get_for_object(self.event).latest("revision_id") diffs = current_version.changes.item_changes self.assertEqual(len(diffs), 1) self.assertTrue(current_version.changes.items_changed) self.assertFalse(current_version.changes.fields_changed) self.assertTrue(current_version.changes.anything_changed) self.assertIsNone(diffs[0].old) self.assertEqual(diffs[0].new.name, "TI I1") # Edit the item with reversion.create_revision(): reversion.set_user(self.profile) item1.name = "New Name" item1.save() self.event.save() current_version = versioning.RIGSVersion.objects.get_for_object(self.event).latest("revision_id") diffs = current_version.changes.item_changes self.assertEqual(len(diffs), 1) self.assertEqual(diffs[0].old.name, "TI I1") self.assertEqual(diffs[0].new.name, "New Name") # Check the diff self.assertEqual( current_version.changes.item_changes[0].field_changes[0].diff, [ {"type": "delete", "text": "TI I1"}, {"type": "insert", "text": "New Name"}, ], ) # Delete the item with reversion.create_revision(): item1.delete() self.event.save() # Find the most recent version current_version = versioning.RIGSVersion.objects.get_for_object(self.event).latest("revision_id") diffs = current_version.changes.item_changes self.assertEqual(len(diffs), 1) self.assertTrue(current_version.changes.items_changed) self.assertFalse(current_version.changes.fields_changed) self.assertTrue(current_version.changes.anything_changed) self.assertEqual(diffs[0].old.name, "New Name") self.assertIsNone(diffs[0].new)