// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Testing.xunit; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Xunit; namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test { public class CustomPocoTest : IClassFixture { private readonly ScratchDatabaseFixture _fixture; public CustomPocoTest(ScratchDatabaseFixture fixture) { _fixture = fixture; } public class User where TKey : IEquatable { public TKey Id { get; set; } public string UserName { get; set; } } public class CustomDbContext : DbContext where TKey : IEquatable { public CustomDbContext(DbContextOptions options) : base(options) { } public DbSet> Users { get; set; } } public CustomDbContext GetContext() where TKey : IEquatable { return DbUtil.Create>(_fixture.ConnectionString); } public CustomDbContext CreateContext(bool delete = false) where TKey : IEquatable { var db = GetContext(); if (delete) { db.Database.EnsureDeleted(); } db.Database.EnsureCreated(); return db; } [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono)] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task CanUpdateNameGuid() { using (var db = CreateContext(true)) { var oldName = Guid.NewGuid().ToString(); var user = new User { UserName = oldName, Id = Guid.NewGuid() }; db.Users.Add(user); await db.SaveChangesAsync(); var newName = Guid.NewGuid().ToString(); user.UserName = newName; await db.SaveChangesAsync(); Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName)); Assert.Equal(user, db.Users.Single(u => u.UserName == newName)); } } [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono)] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task CanUpdateNameString() { using (var db = CreateContext(true)) { var oldName = Guid.NewGuid().ToString(); var user = new User { UserName = oldName, Id = Guid.NewGuid().ToString() }; db.Users.Add(user); await db.SaveChangesAsync(); var newName = Guid.NewGuid().ToString(); user.UserName = newName; await db.SaveChangesAsync(); Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName)); Assert.Equal(user, db.Users.Single(u => u.UserName == newName)); } } [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono)] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task CanCreateUserInt() { using (var db = CreateContext(true)) { var user = new User(); db.Users.Add(user); await db.SaveChangesAsync(); user.UserName = "Boo"; await db.SaveChangesAsync(); var fetch = db.Users.First(u => u.UserName == "Boo"); Assert.Equal(user, fetch); } } [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono)] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task CanCreateUserIntViaSet() { using (var db = CreateContext(true)) { var user = new User(); var users = db.Set>(); users.Add(user); await db.SaveChangesAsync(); user.UserName = "Boo"; await db.SaveChangesAsync(); var fetch = users.First(u => u.UserName == "Boo"); Assert.Equal(user, fetch); } } [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono)] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task CanUpdateNameInt() { using (var db = CreateContext(true)) { var oldName = Guid.NewGuid().ToString(); var user = new User { UserName = oldName }; db.Users.Add(user); await db.SaveChangesAsync(); var newName = Guid.NewGuid().ToString(); user.UserName = newName; await db.SaveChangesAsync(); Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName)); Assert.Equal(user, db.Users.Single(u => u.UserName == newName)); } } [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono)] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task CanUpdateNameIntWithSet() { using (var db = CreateContext(true)) { var oldName = Guid.NewGuid().ToString(); var user = new User { UserName = oldName }; db.Set>().Add(user); await db.SaveChangesAsync(); var newName = Guid.NewGuid().ToString(); user.UserName = newName; await db.SaveChangesAsync(); Assert.Null(db.Set>().SingleOrDefault(u => u.UserName == oldName)); Assert.Equal(user, db.Set>().Single(u => u.UserName == newName)); } } } }