def test_get_peer(self): """Validate that the get_peer() method works correctly.""" cra = RelationshipAssociation(relationship=self.m2m_1, source=self.racks[0], destination=self.vlans[0]) cra.validated_save() self.assertEqual(cra.get_peer(self.racks[0]), self.vlans[0]) self.assertEqual(cra.get_peer(self.vlans[0]), self.racks[0]) self.assertEqual(cra.get_peer(self.vlans[1]), None)
def test_clean_check_quantity_o2m(self): """Validate that one-to-many relationships can't have more than one relationship association per source.""" cra = RelationshipAssociation(relationship=self.o2m_1, source=self.sites[0], destination=self.vlans[0]) cra.validated_save() cra = RelationshipAssociation(relationship=self.o2m_1, source=self.sites[0], destination=self.vlans[1]) cra.validated_save() cra = RelationshipAssociation(relationship=self.o2m_1, source=self.sites[1], destination=self.vlans[2]) cra.validated_save() with self.assertRaises(ValidationError) as handler: cra = RelationshipAssociation(relationship=self.o2m_1, source=self.sites[2], destination=self.vlans[0]) cra.clean() expected_errors = { "destination": [ "Unable to create more than one generic site to vlan association to VLAN A (100) (destination)", ], } self.assertEqual(handler.exception.message_dict, expected_errors) # Shouldn't be possible to create another copy of the same RelationshipAssociation with self.assertRaises(ValidationError) as handler: cra = RelationshipAssociation(relationship=self.o2m_1, source=self.sites[0], destination=self.vlans[0]) cra.validated_save() expected_errors = { "__all__": [ "Relationship association with this Relationship, Source type, Source id, Destination type " "and Destination id already exists." ], "destination": [ "Unable to create more than one generic site to vlan association to VLAN A (100) (destination)", ], } self.assertEqual(handler.exception.message_dict, expected_errors)
def test_clean_check_quantity_m2m(self): """Validate that many-to-many relationship can have many relationship associations.""" cra = RelationshipAssociation(relationship=self.m2m_1, source=self.racks[0], destination=self.vlans[0]) cra.validated_save() cra = RelationshipAssociation(relationship=self.m2m_1, source=self.racks[0], destination=self.vlans[1]) cra.validated_save() cra = RelationshipAssociation(relationship=self.m2m_1, source=self.racks[1], destination=self.vlans[2]) cra.validated_save() cra = RelationshipAssociation(relationship=self.m2m_1, source=self.racks[2], destination=self.vlans[0]) cra.validated_save() # Shouldn't be possible to create another copy of the same RelationshipAssociation with self.assertRaises(ValidationError) as handler: cra = RelationshipAssociation(relationship=self.m2m_1, source=self.racks[0], destination=self.vlans[0]) cra.validated_save() expected_errors = { "__all__": [ "Relationship association with this Relationship, Source type, Source id, Destination type " "and Destination id already exists." ], } self.assertEqual(handler.exception.message_dict, expected_errors) cra = RelationshipAssociation(relationship=self.m2ms_1, source=self.sites[0], destination=self.sites[1]) cra.validated_save() # Shouldn't be possible to create a mirrored copy of the same symmetric RelationshipAssociation with self.assertRaises(ValidationError) as handler: cra = RelationshipAssociation(relationship=self.m2ms_1, source=self.sites[1], destination=self.sites[0]) cra.validated_save() expected_errors = { "__all__": [ "A Related Sites association already exists between Site B and Site A" ] } self.assertEqual(handler.exception.message_dict, expected_errors)
def test_clean_check_quantity_o2o(self): """Validate that one-to-one relationships can't have more than one relationship association per side.""" cra = RelationshipAssociation(relationship=self.o2o_1, source=self.racks[0], destination=self.sites[0]) cra.validated_save() cra = RelationshipAssociation(relationship=self.o2o_1, source=self.racks[1], destination=self.sites[1]) cra.validated_save() cra = RelationshipAssociation(relationship=self.o2os_1, source=self.racks[0], destination=self.racks[1]) cra.validated_save() with self.assertRaises(ValidationError) as handler: cra = RelationshipAssociation(relationship=self.o2o_1, source=self.racks[0], destination=self.sites[2]) cra.clean() expected_errors = { "source": [ "Unable to create more than one Primary Rack per Site association to Rack A (source)" ] } self.assertEqual(handler.exception.message_dict, expected_errors) with self.assertRaises(ValidationError) as handler: cra = RelationshipAssociation(relationship=self.o2o_1, source=self.racks[2], destination=self.sites[0]) cra.clean() expected_errors = { "destination": [ "Unable to create more than one Primary Rack per Site association to Site A (destination)" ] } self.assertEqual(handler.exception.message_dict, expected_errors) with self.assertRaises(ValidationError) as handler: cra = RelationshipAssociation(relationship=self.o2os_1, source=self.racks[0], destination=self.racks[2]) cra.clean() expected_errors = { "source": [ "Unable to create more than one Redundant Rack association to Rack A (source)" ] } self.assertEqual(handler.exception.message_dict, expected_errors) # Slightly tricky case - a symmetric one-to-one relationship where the proposed *source* is already in use # as a *destination* in a different RelationshipAssociation with self.assertRaises(ValidationError) as handler: cra = RelationshipAssociation(relationship=self.o2os_1, source=self.racks[1], destination=self.racks[2]) cra.clean() expected_errors = { "source": [ "Unable to create more than one Redundant Rack association involving Rack B (peer)" ] } self.assertEqual(handler.exception.message_dict, expected_errors)
def test_exception_not_raised_when_updating_instance_with_relationship_type_o2o_or_o2m( self): """Validate 'Unable to create more than one relationship-association...' not raise when updating instance with type one-to-one, symmetric-one-to-one, one-to-many relationship.""" # Assert Exception not raise updating source of RelationshipAssociation with one-to-many relationship type cra_1 = RelationshipAssociation(relationship=self.o2m_1, source=self.sites[0], destination=self.vlans[1]) cra_1.validated_save() cra_1.source = self.sites[1] cra_1.validated_save() self.assertEqual(cra_1.source, self.sites[1]) # Validate Exception not raised when calling .validated_save() on a RelationshipAssociation instance without making any update cra_1.validated_save() # Assert Exception not raise updating source of RelationshipAssociation with one-to-one relationship type cra_2 = RelationshipAssociation(relationship=self.o2o_1, source=self.racks[0], destination=self.sites[0]) cra_2.validated_save() cra_2.source = self.racks[1] cra_2.validated_save() self.assertEqual(cra_2.source, self.racks[1]) # Assert Exception not raise updating destination of RelationshipAssociation with one-to-one relationship type cra_3 = RelationshipAssociation(relationship=self.o2o_1, source=self.racks[2], destination=self.sites[2]) cra_3.validated_save() cra_3.destination = self.sites[4] cra_3.validated_save() self.assertEqual(cra_3.destination, self.sites[4]) # Assert Exception not raise updating destination of RelationshipAssociation with symmetric-one-to-one relationship type cra_4 = RelationshipAssociation(relationship=self.o2os_1, source=self.racks[0], destination=self.racks[2]) cra_4.validated_save() cra_4.destination = self.racks[1] cra_4.validated_save() self.assertEqual(cra_4.destination, self.racks[1])