public void TestResetKeysSingleEntityAlternativeNotReset() { //SETUP var options = SqliteInMemory.CreateOptions <OwnedWithKeyDbContext>(); using (var context = new OwnedWithKeyDbContext(options)) { var entity = new User { UserId = 123, Email = "Hello" }; //ATTEMPT var config = new DataResetterConfig { DoNotResetAlternativeKey = true }; var resetter = new DataResetter(context, config); resetter.ResetKeysSingleEntity(entity); //VERIFY entity.UserId.ShouldEqual(0); entity.Email.ShouldEqual("Hello"); } }
public void TestDddSeedDatabaseFourBooksDataResetter() { List <DddBook> entities; //SETUP var options = SqliteInMemory.CreateOptions <DddBookContext>(); using (var context = new DddBookContext(options)) { context.Database.EnsureCreated(); context.SeedDatabaseFourBooks(); entities = context.DddBooks .Include(x => x.Reviews) .Include(x => x.AuthorsLink) .ThenInclude(x => x.DddAuthor) .ToList(); } using (var context = new DddBookContext(options)) { //ATTEMPT var resetter = new DataResetter(context); resetter.ResetKeysEntityAndRelationships(entities); context.AddRange(entities); context.SaveChanges(); //VERIFY context.DddBooks.Count().ShouldEqual(8); context.DddAuthors.Count().ShouldEqual(6); context.Set <DddReview>().Count().ShouldEqual(4); } }
public void ExampleSetup() { //This simulates the production database //Typically you would get the options for a database using the SqlProductionSetup class. var options = SqliteInMemory.CreateOptions <DddBookContext>(); using (var context = new DddBookContext(options)) { context.Database.EnsureCreated(); context.SeedDatabaseFourBooks(); //1a. Read in the data to want to seed the database with var entities = context.DddBooks .Include(x => x.Reviews) .Include(x => x.AuthorsLink) .ThenInclude(x => x.DddAuthor).ThenInclude(x => x.BooksLink) .ToList(); //1b. Reset primary and foreign keys (see next version for anonymise) var resetter = new DataResetter(context); resetter.ResetKeysEntityAndRelationships(entities); //1c. Convert to JSON string var jsonString = entities.DefaultSerializeToJson(); //1d. Save to JSON local file in TestData directory "DddExampleDatabase".WriteJsonToJsonFile(jsonString); } }
public void TestResetKeysSingleEntityAnonymiseOwnAnonymiser() { //SETUP string MyAnonymiser(AnonymiserData data, object objectInstance) { return("My Replacement text"); } var options = SqliteInMemory.CreateOptions <BookContext>(); using (var context = new BookContext(options)) { var entity = new Author { Name = "Test" }; //ATTEMPT var config = new DataResetterConfig { AnonymiserFunc = MyAnonymiser }; config.AddToAnonymiseList <Author>(x => x.Name, "Name"); var resetter = new DataResetter(context, config); resetter.ResetKeysSingleEntity(entity); //VERIFY entity.Name.ShouldEqual("My Replacement text"); } }
public void TestResetKeysSingleEntityWithRelationshipsCheckStateIsAdded() { //SETUP var options = SqliteInMemory.CreateOptions <BookContext>(); Book entity; using (var context = new BookContext(options)) { context.Database.EnsureCreated(); context.SeedDatabaseFourBooks(); entity = context.Books .Include(x => x.Reviews) .Include(x => x.Promotion) .Include(x => x.AuthorsLink) .ThenInclude(x => x.Author) .First(x => x.Reviews.Any()); var resetter = new DataResetter(context); resetter.ResetKeysEntityAndRelationships(entity); } using (var context = new BookContext(options)) { //ATTEMPT context.Add(entity); var states = context.ChangeTracker.Entries().Select(x => x.State).ToList(); //VERIFY states.Count.ShouldEqual(1 + 2 + 1 + 1 + 1); // Book + 2 reviews + promotion + BookAuthor + author states.All(x => x == EntityState.Added).ShouldBeTrue(); } }
public void TestResetKeysSingleEntityWithRelationships() { //SETUP var options = SqliteInMemory.CreateOptions <BookContext>(); using (var context = new BookContext(options)) { context.Database.EnsureCreated(); context.SeedDatabaseFourBooks(); var entity = context.Books .Include(x => x.Reviews) .Include(x => x.Promotion) .Include(x => x.AuthorsLink) .ThenInclude(x => x.Author) .First(x => x.Reviews.Any()); //ATTEMPT var resetter = new DataResetter(context); resetter.ResetKeysEntityAndRelationships(entity); //VERIFY entity.BookId.ShouldEqual(0); entity.Reviews.All(x => x.ReviewId == 0).ShouldBeTrue(); entity.Reviews.All(x => x.BookId == 0).ShouldBeTrue(); entity.Promotion.BookId.ShouldEqual(0); entity.Promotion.PriceOfferId.ShouldEqual(0); entity.AuthorsLink.All(x => x.AuthorId == 0).ShouldBeTrue(); entity.AuthorsLink.All(x => x.BookId == 0).ShouldBeTrue(); entity.AuthorsLink.Select(x => x.Author).All(x => x.AuthorId == 0).ShouldBeTrue(); } }
private void OnEnable() { resettersProperty = serializedObject.FindProperty(dataResetterPropResettableScriptableObjectsName); dataResetter = (DataResetter)target; if (dataResetter.resettableScriptableObjects == null) { dataResetter.resettableScriptableObjects = new ResettableScriptableObject[0]; } }
// The name of the field to be represented. private void OnEnable() { // Cache the property and target. resettersProperty = serializedObject.FindProperty(dataResetterPropResettableScriptableObjectsName); dataResetter = (DataResetter)target; // If the array is null, initialise it to prevent null refs. if (dataResetter.resettableScriptableObjects == null) { dataResetter.resettableScriptableObjects = new ResettableScriptableObject[0]; } }
// Called when Script is Enabled private void OnEnable() { // Cache Property resettersProperty = serializedObject.FindProperty(dataResetterPropResettableScriptableObjectsName); // Cache the Target dataResetter = (DataResetter)target; // If no DataResetters Found (Array is Null) if (dataResetter.resettableScriptableObjects == null) { // Prevent Null reference dataResetter.resettableScriptableObjects = new ResettableScriptableObject[0]; } }
public void TestResetAndSerializeFourBooks() { //SETUP var options = SqliteInMemory.CreateOptions <DddBookContext>(); using (var context = new DddBookContext(options)) { var books = DddEfTestData.CreateFourBooks(); var resetter = new DataResetter(context); resetter.ResetKeysEntityAndRelationships(books); //ATTEMPT var jsonString = books.DefaultSerializeToJson(); //VERIFY } }
public void TestResetKeysSingleEntityNonEntityClassBad() { //SETUP var options = SqliteInMemory.CreateOptions <BookContext>(); using (var context = new BookContext(options)) { var entity = new User(); //ATTEMPT var resetter = new DataResetter(context); var ex = Assert.Throws <InvalidOperationException>(() => resetter.ResetKeysSingleEntity(entity)); //VERIFY ex.Message.ShouldEqual("The class User is not a class that the provided DbContext knows about."); } }
public void ExampleSetupWithAnonymiseLinkToLibrary() { //SETUP //This simulates the production database //Typically you would open a database var options = SqliteInMemory.CreateOptions <BookContext>(); using (var context = new BookContext(options)) { context.Database.EnsureCreated(); context.SeedDatabaseFourBooks(); //1a. Read in the data to want to seed the database with var entities = context.Books .Include(x => x.Reviews) .Include(x => x.Promotion) .Include(x => x.AuthorsLink) .ThenInclude(x => x.Author) .ToList(); //1b-ii. Set up resetter config to use own method var myAnonymiser = new MyAnonymiser(42); var config = new DataResetterConfig { AnonymiserFunc = myAnonymiser.AnonymiseThis }; //1b-ii. Add all class/properties that you want to anonymise config.AddToAnonymiseList <Author>(x => x.Name, "FullName"); config.AddToAnonymiseList <Review>(x => x.VoterName, "FirstName"); //1b. Reset primary and foreign keys and anonymise author's name and Review's VoterName var resetter = new DataResetter(context, config); resetter.ResetKeysEntityAndRelationships(entities); //Show author's myAnonymiser foreach (var author in entities.SelectMany(x => x.AuthorsLink.Select(y => y.Author)).Distinct()) { _output.WriteLine($"Author name = {author.Name}"); } //1c. Convert to JSON string var jsonString = entities.DefaultSerializeToJson(); //1d. Save to JSON local file in TestData directory "ExampleDatabaseAnonymised".WriteJsonToJsonFile(jsonString); } }
public void TestResetKeysSingleEntityPrivateSetter() { //SETUP var options = SqliteInMemory.CreateOptions <SpecializedDbContext>(); using (var context = new SpecializedDbContext(options)) { var entity = new AllTypesEntity(); entity.SetId(123); //ATTEMPT var resetter = new DataResetter(context); resetter.ResetKeysSingleEntity(entity); //VERIFY entity.Id.ShouldEqual(0); } }
public void TestResetKeysSingleEntityPkOnly() { //SETUP var options = SqliteInMemory.CreateOptions <BookContext>(); using (var context = new BookContext(options)) { context.Database.EnsureCreated(); context.SeedDatabaseFourBooks(); var entity = context.Books.First(); //ATTEMPT var resetter = new DataResetter(context); resetter.ResetKeysSingleEntity(entity); //VERIFY entity.BookId.ShouldEqual(0); } }
public void TestResetKeysSingleEntityAnonymiseNameAsEmail() { //SETUP var options = SqliteInMemory.CreateOptions <BookContext>(); using (var context = new BookContext(options)) { var entity = new Author { Name = "Test" }; //ATTEMPT var config = new DataResetterConfig(); config.AddToAnonymiseList <Author>(x => x.Name, "Email"); var resetter = new DataResetter(context, config); resetter.ResetKeysSingleEntity(entity); //VERIFY entity.Name.ShouldEndWith(DataResetterConfig.EmailSuffix); } }
public void TestResetKeysSingleEntityAnonymiseNameMinLength() { //SETUP var options = SqliteInMemory.CreateOptions <BookContext>(); using (var context = new BookContext(options)) { var entity = new Author { Name = "Test" }; //ATTEMPT var config = new DataResetterConfig(); config.AddToAnonymiseList <Author>(x => x.Name, "Name:Min=100"); var resetter = new DataResetter(context, config); resetter.ResetKeysSingleEntity(entity); //VERIFY entity.Name.Length.ShouldBeInRange(100, 140); } }