/// <summary> /// Тест наличия каскадной зависимости для ссылок на другие сущьности в класе. /// </summary> public virtual void CascadeDependenceRuleExisitForNHMappedEntityRelationTest(PersistentClass mapping, Property prop, IDeleteRule related) { if (IgnoreProperties.ContainsKey(mapping.MappedClass) && IgnoreProperties[mapping.MappedClass].Any(x => x.PropertyName == prop.Name)) { Assert.Ignore(IgnoreProperties[mapping.MappedClass].First(x => x.PropertyName == prop.Name).ReasonForIgnoring); } var info = DeleteConfig.GetDeleteRule(mapping.MappedClass); Assert.That(info.DeleteItems.Any(x => x.ParentPropertyName == prop.Name && x.IsCascade), "Cвойство {0}.{1} не имеет каскадного правила удаления, хотя класс {2} помечен как требующий каскадного удаления.", info.ObjectClass.Name, prop.Name, related.ObjectClass.Name); }
//FIXME Лучше в будущем разделить тест на разные. Сейчас было лень переписывать код. public virtual void NHMappedCollectionsAllInOneTest(PersistentClass mapping, Property prop) { var ignored = IgnoreCollections.FirstOrDefault(x => x.ParentClass == mapping.MappedClass && x.PropertyName == prop.Name); if (ignored != null) { Assert.Ignore(ignored.ReasonForIgnoring); } var collectionMap = (prop.Value as Bag); Type collectionItemType = null; if (collectionMap.Element is OneToMany) { collectionItemType = (collectionMap.Element as OneToMany).AssociatedClass.MappedClass; } else if (collectionMap.Element is ManyToOne) { collectionItemType = (collectionMap.Element as ManyToOne).Type.ReturnedClass; } var collectionItemClassInfo = DeleteConfig.GetDeleteRule(collectionItemType); Assert.That(collectionItemClassInfo, Is.Not.Null, "Класс {0} не имеет правил удаления, но используется в коллекции {1}.{2}.", collectionItemType, mapping.MappedClass.Name, prop.Name); var info = DeleteConfig.GetDeleteRule(mapping.MappedClass); Assert.That(info, Is.Not.Null, "Коллекция {0}.{1} объектов {2} замаплена в ненастроенном классе.", mapping.MappedClass.Name, prop.Name, collectionItemType.Name); if (collectionMap.IsOneToMany) { var deleteDepend = info.DeleteItems.Find(r => r.ObjectClass == collectionItemType && r.CollectionName == prop.Name); Assert.That(deleteDepend, Is.Not.Null, "Для коллекции {0}.{1} не определены зависимости удаления класса {2}", mapping.MappedClass.Name, prop.Name, collectionItemType.Name ); } else { var removeDepend = collectionItemClassInfo.RemoveFromItems.Find(r => r.ObjectClass == info.ObjectClass && r.CollectionName == prop.Name); Assert.That(removeDepend, Is.Not.Null, "Для коллекции {0}.{1} не определены зависимости удаления элементов при удалении класса {2}", mapping.MappedClass.Name, prop.Name, collectionItemType.Name ); } if (collectionItemClassInfo is IHibernateDeleteRule) { Assert.That(info, Is.InstanceOf <IHibernateDeleteRule>(), "Удаление через Hibernate элементов коллекции {0}.{1}, поддерживается только если удаление родительского класса {0} настроено тоже через Hibernate", mapping.MappedClass.Name, prop.Name ); } }