File: CustomPocoTest.cs
Web Access
Project: src\src\Identity\EntityFrameworkCore\test\EF.Test\Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test.csproj (Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.InternalTesting;
using Microsoft.EntityFrameworkCore;
 
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test;
 
public class CustomPocoTest
{
 
    public class User<TKey> where TKey : IEquatable<TKey>
    {
        public TKey Id { get; set; }
        public string UserName { get; set; }
    }
 
    public class CustomDbContext<TKey> : DbContext where TKey : IEquatable<TKey>
    {
        public CustomDbContext(DbContextOptions options) : base(options)
        { }
 
        public DbSet<User<TKey>> Users { get; set; }
 
    }
 
    [ConditionalFact]
    public async Task CanUpdateNameGuid()
    {
        using (var db = new CustomDbContext<Guid>(
            new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
        {
            db.Database.EnsureCreated();
 
            var oldName = Guid.NewGuid().ToString();
            var user = new User<Guid> { 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));
 
            db.Database.EnsureDeleted();
        }
    }
 
    [ConditionalFact]
    public async Task CanUpdateNameString()
    {
        using (var db = new CustomDbContext<string>(
            new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
        {
            db.Database.EnsureCreated();
 
            var oldName = Guid.NewGuid().ToString();
            var user = new User<string> { 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));
 
            db.Database.EnsureDeleted();
        }
    }
 
    [ConditionalFact]
    public async Task CanCreateUserInt()
    {
        using (var db = new CustomDbContext<int>(
            new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
        {
            db.Database.EnsureCreated();
 
            var user = new User<int>();
            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);
 
            db.Database.EnsureDeleted();
        }
    }
 
    [ConditionalFact]
    public async Task CanCreateUserIntViaSet()
    {
        using (var db = new CustomDbContext<int>(
            new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
        {
            db.Database.EnsureCreated();
 
            var user = new User<int>();
            var users = db.Set<User<int>>();
            users.Add(user);
            await db.SaveChangesAsync();
            user.UserName = "Boo";
            await db.SaveChangesAsync();
            var fetch = users.First(u => u.UserName == "Boo");
            Assert.Equal(user, fetch);
 
            db.Database.EnsureDeleted();
        }
    }
 
    [ConditionalFact]
    public async Task CanUpdateNameInt()
    {
        using (var db = new CustomDbContext<int>(
            new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
        {
            db.Database.EnsureCreated();
 
            var oldName = Guid.NewGuid().ToString();
            var user = new User<int> { 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));
 
            db.Database.EnsureDeleted();
        }
    }
 
    [ConditionalFact]
    public async Task CanUpdateNameIntWithSet()
    {
        using (var db = new CustomDbContext<int>(
            new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
        {
            db.Database.EnsureCreated();
 
            var oldName = Guid.NewGuid().ToString();
            var user = new User<int> { UserName = oldName };
            db.Set<User<int>>().Add(user);
            await db.SaveChangesAsync();
            var newName = Guid.NewGuid().ToString();
            user.UserName = newName;
            await db.SaveChangesAsync();
            Assert.Null(db.Set<User<int>>().SingleOrDefault(u => u.UserName == oldName));
            Assert.Equal(user, db.Set<User<int>>().Single(u => u.UserName == newName));
 
            db.Database.EnsureDeleted();
        }
    }
}