// Copyright (c) Microsoft Open Technologies, Inc. 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 JetBrains.Annotations; using Microsoft.AspNet.Identity.Test; using Microsoft.Data.Entity; using Microsoft.Data.Entity.Metadata; using Microsoft.Data.Entity.Services; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Logging; using Microsoft.Framework.OptionsModel; using Xunit; namespace Microsoft.AspNet.Identity.EntityFramework.Test { [TestCaseOrderer("Microsoft.AspNet.Identity.Test.PriorityOrderer", "Microsoft.AspNet.Identity.EntityFramework.Test")] public class CustomPocoTest { private readonly string ConnectionString = @"Server=(localdb)\v11.0;Database=CustomUserContextTest" + DateTime.Now.Month + "-" + DateTime.Now.Day + "-" + DateTime.Now.Year + ";Trusted_Connection=True;"; public class User where TKey : IEquatable { public TKey Id { get; set; } public string UserName { get; set; } } public class CustomDbContext : DbContext where TKey : IEquatable { public DbSet> Users { get; set; } public CustomDbContext(IServiceProvider services) : base(services, services.GetService>().Options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity>().Property(p => p.Id) .GenerateValuesOnAdd(generateValues: false); } } public CustomDbContext GetContext() where TKey : IEquatable { var serviceProvider = UserStoreTest.ConfigureDbServices(ConnectionString).BuildServiceProvider(); return new CustomDbContext(serviceProvider); } public CustomDbContext CreateContext(bool delete = false) where TKey : IEquatable { var db = GetContext(); if (delete) { db.Database.EnsureDeleted(); } db.Database.EnsureCreated(); return db; } [TestPriority(-1000)] [Fact] public void DropDatabaseStart() { DropDb(); } [TestPriority(10000)] [Fact] public void DropDatabaseDone() { DropDb(); } public void DropDb() { var db = GetContext(); db.Database.EnsureDeleted(); } [Fact] 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)); } } [Fact] 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)); } } [Fact] public async Task CanCreateUserInt() { using (var db = CreateContext(true)) { var user = new User { Id = 11 }; 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); } } [Fact] public async Task CanCreateUserIntViaSet() { using (var db = CreateContext(true)) { var user = new User { Id = 11 }; 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); } } [Fact] public async Task CanUpdateNameInt() { using (var db = CreateContext(true)) { var oldName = Guid.NewGuid().ToString(); var user = new User { UserName = oldName, Id = 1 }; 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)); } } [Fact] public async Task CanUpdateNameIntWithSet() { using (var db = CreateContext(true)) { var oldName = Guid.NewGuid().ToString(); var user = new User { UserName = oldName, Id = 1 }; 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)); } } } }