public void Check06SuccessWithWarningsOk() { //SETUP var status = new SuccessOrErrors(); //ATTEMPT status.AddWarning("This is a warning"); status.SetSuccessMessage("This was {0}.", "successful"); //VERIFY status.IsValid.ShouldEqual(true); status.HasWarnings.ShouldEqual(true); status.SuccessMessage.ShouldEqual("This was successful. (has 1 warnings)"); status.Warnings.Count.ShouldEqual(1); status.Warnings[0].ShouldEqual("Warning: This is a warning"); }
public void Test27SuccessWithOtherWarningsOk() { //SETUP var status1 = new SuccessOrErrors <string>(); var status2 = new SuccessOrErrors(); status2.AddWarning("This is a warning"); status1.SetSuccessWithResult("The result", "This was {0}.", "successful"); //ATTEMPT status1.Combine(status2); //VERIFY status1.IsValid.ShouldEqual(true); status1.HasErrors.ShouldEqual(false); status1.HasWarnings.ShouldEqual(true); status1.SuccessMessage.ShouldEqual("This was successful. (has 1 warnings)"); status1.Warnings.Count.ShouldEqual(1); status1.Warnings[0].ShouldEqual("Warning: This is a warning"); }
/// <summary> /// This checks that the EF relationship is mirrored in the SQL /// </summary> /// <param name="tableInfo"></param> /// <param name="relEfCol"></param> /// <returns>returns status with optional name of SQL many-many table. Used to mark that table as having been used</returns> public ISuccessOrErrors <string> CheckEfRelationshipToSql(EfTableInfo tableInfo, EfRelationshipInfo relEfCol) { var status = new SuccessOrErrors <string>(); string manyToManyTableName = null; if (relEfCol.FromToRelationships.FromMultiplicity == EfRelationshipTypes.Many) { //handle from many if (relEfCol.FromToRelationships.ToMultiplicity == EfRelationshipTypes.Many) { //many to many - look for a linking table in the list of _potentialManyToManyTablesDict that has the right foreignKeys var fromEfTable = GetEfTableDataFromClass(tableInfo.ClrClassType); var toEfTable = GetEfTableDataFromCollection(relEfCol); var fromKeys = fromEfTable.NormalCols.Where(x => x.IsPrimaryKey); var toKeys = toEfTable.NormalCols.Where(x => x.IsPrimaryKey); var linkCombinedNames = AllManyToManyTablesThatHaveTheRightForeignKeys(fromKeys, toKeys, fromEfTable.TableName, toEfTable.TableName).ToList(); if (!linkCombinedNames.Any()) { status.AddSingleError( "Missing Link Table: EF has a {0} relationship between {1}.{2} and {3} but we could not find a linking table with the right foreign keys.", relEfCol.FromToRelationships, tableInfo.TableName, relEfCol.ClrColumnName, toEfTable.TableName); } else { //now we check the entries in the linking tab if (linkCombinedNames.Count > 1) { status.AddWarning( "Ambigous Link Table: EF has a {0} relationship between {1}.{2} and {3}. This was ambigous so we may not have fully checked this.", relEfCol.FromToRelationships, tableInfo.TableName, relEfCol.ClrColumnName, toEfTable.TableName); } manyToManyTableName = linkCombinedNames.First(); foreach (var foreignKey in _allSqlInfo.ForeignKeys.Where(x => x.ParentTableNameWithScheme == manyToManyTableName) .Where(foreignKey => !foreignKey.IsCascade)) { status.AddSingleError( "Cascade Delete: The {0} relationship between {1}.{2} and {3} has a foreign key {4} that is not CASCASE DELETE." + " All linking table foreign keys should have CASCASE DELETE.", relEfCol.FromToRelationships, tableInfo.TableName, relEfCol.ClrColumnName, toEfTable.TableName, foreignKey.ConstraintName); } } } else { //many to one var toSqlTableStatus = GetSqlTableDataFromClass(relEfCol.ClrColumnType); if (toSqlTableStatus.HasErrors) { return(status.Combine(toSqlTableStatus)); } var foreignKeys = GetForeignKeys(tableInfo.TableName, toSqlTableStatus.Result); if (!foreignKeys.Any()) { status.AddSingleError( "Missing Foreign Key: EF has a {0} relationship between {1}.{2} and {3} but we don't find that in SQL.", relEfCol.FromToRelationships, tableInfo.TableName, relEfCol.ClrColumnName, toSqlTableStatus.Result.TableName); } else { //Look at cascase deletes foreach (var foreignKey in foreignKeys.Where(foreignKey => relEfCol.FromToRelationships.ToIsCascadeDelete != foreignKey.IsCascade)) { status.AddSingleError( "Cascade Delete: The {0} relationship between {1}.{2} and {3} has different cascase delete value." + " SQL foreign key say {4}, EF setting is {5}.", relEfCol.FromToRelationships, tableInfo.TableName, relEfCol.ClrColumnName, toSqlTableStatus.Result.TableName, foreignKey.DeleteAction, relEfCol.FromToRelationships.ToIsCascadeDelete ? "CASCADE" : "NO_ACTION"); } } } } else { //The parent is single, which implies that the child holds the key if (relEfCol.FromToRelationships.ToMultiplicity == EfRelationshipTypes.Many) { //typical one to many var fromSqlTableStatus = GetSqlTableDataFromCollection(relEfCol); if (fromSqlTableStatus.HasErrors) { return(status.Combine(fromSqlTableStatus)); } var toSqlTable = _sqlInfoDict[tableInfo.CombinedName]; var foreignKeys = GetForeignKeys(fromSqlTableStatus.Result.TableName, toSqlTable); if (!foreignKeys.Any()) { status.AddSingleError( "Missing Foreign Key: EF has a {0} relationship between {1} and {2}.{3} but we don't find that in SQL.", relEfCol.FromToRelationships, fromSqlTableStatus.Result.TableName, tableInfo.TableName, relEfCol.ClrColumnName); } else { //Look at cascase deletes foreach (var foreignKey in foreignKeys.Where(foreignKey => relEfCol.FromToRelationships.FromIsCascadeDelete != foreignKey.IsCascade)) { status.AddSingleError( "Cascade Delete: The {0} relationship between {1}.{2} and {3} has different cascase delete value." + " SQL foreign key say {4}, EF setting is {5}.", relEfCol.FromToRelationships, tableInfo.TableName, relEfCol.ClrColumnName, toSqlTable.TableName, foreignKey.DeleteAction, relEfCol.FromToRelationships.ToIsCascadeDelete ? "CASCADE" : "NO_ACTION"); } } } else { //one to one/OneOrZero or reverse var sqlTableEnd1Status = GetSqlTableDataFromClass(relEfCol.ClrColumnType); if (sqlTableEnd1Status.HasErrors) { return(status.Combine(sqlTableEnd1Status)); } var sqlTableEnd2 = _sqlInfoDict[tableInfo.CombinedName]; //There is one foreign key for both directions. Therefore we need to check both var foreignKey1 = GetForeignKeys(sqlTableEnd1Status.Result.TableName, sqlTableEnd2).SingleOrDefault(); var foreignKey2 = GetForeignKeys(sqlTableEnd2.TableName, sqlTableEnd1Status.Result).SingleOrDefault(); if (foreignKey1 == null && foreignKey2 == null) { status.AddSingleError( "Missing Foreign Key: EF has a {0} relationship between {1}.{2} and {3} but we don't find that in SQL.", relEfCol.FromToRelationships, tableInfo.TableName, relEfCol.ClrColumnName, sqlTableEnd1Status.Result.TableName); } else if (foreignKey1 != null && relEfCol.FromToRelationships.FromIsCascadeDelete != foreignKey1.IsCascade) { //Look at cascase deletes status.AddSingleError( "Cascade Delete: The {0} relationship between {1}.{2} and {3} has different cascase delete value." + " SQL foreign key say {4}, EF setting is {5}.", relEfCol.FromToRelationships, tableInfo.TableName, relEfCol.ClrColumnName, sqlTableEnd1Status.Result.TableName, foreignKey1.DeleteAction, relEfCol.FromToRelationships.ToIsCascadeDelete ? "CASCADE" : "NO_ACTION"); } else if (foreignKey2 != null && relEfCol.FromToRelationships.ToIsCascadeDelete != foreignKey2.IsCascade) { //Look at cascase deletes status.AddSingleError( "Cascade Delete: The {0} relationship between {1}.{2} and {3} has different cascase delete value." + " SQL foreign key say {4}, EF setting is {5}.", relEfCol.FromToRelationships, tableInfo.TableName, relEfCol.ClrColumnName, sqlTableEnd1Status.Result.TableName, foreignKey1.DeleteAction, relEfCol.FromToRelationships.ToIsCascadeDelete ? "CASCADE" : "NO_ACTION"); } } } return(status.HasErrors ? status : status.SetSuccessWithResult(manyToManyTableName, "All Ok")); }
public void Test27SuccessWithOtherWarningsOk() { //SETUP var status1 = new SuccessOrErrors<string>(); var status2 = new SuccessOrErrors(); status2.AddWarning("This is a warning"); status1.SetSuccessWithResult("The result", "This was {0}.", "successful"); //ATTEMPT status1.Combine(status2); //VERIFY status1.IsValid.ShouldEqual(true); status1.HasErrors.ShouldEqual(false); status1.HasWarnings.ShouldEqual(true); status1.SuccessMessage.ShouldEqual("This was successful. (has 1 warnings)"); status1.Warnings.Count.ShouldEqual(1); status1.Warnings[0].ShouldEqual("Warning: This is a warning"); }
public void Test06SuccessWithWarningsOk() { //SETUP var status = new SuccessOrErrors(); //ATTEMPT status.AddWarning("This is a warning"); status.SetSuccessMessage("This was {0}.", "successful"); //VERIFY status.IsValid.ShouldEqual(true); status.HasErrors.ShouldEqual(false); status.HasWarnings.ShouldEqual(true); status.SuccessMessage.ShouldEqual("This was successful. (has 1 warnings)"); status.Warnings.Count.ShouldEqual(1); status.Warnings[0].ShouldEqual("Warning: This is a warning"); }