Big cleanup and adding IdentityBuilder extensions the same way as the EF IdentityBuilder extensions do, allowing customer Identity setup.

This commit is contained in:
alexandre-spieser
2017-10-29 15:09:57 +00:00
parent 7a1558a48b
commit d99ce293f0
32 changed files with 697 additions and 521 deletions
@@ -7,7 +7,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AspNetCore.Identity.MongoDbCore" Version="1.0.4" />
<PackageReference Include="AspNetCore.Identity.MongoDbCore" Version="1.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Http" />
@@ -1,150 +0,0 @@
// 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 Xunit;
namespace AspNetCore.Identity.MongoDbCore.Test
{
//public class CustomPocoTest : IClassFixture<MongoDatabaseFixture>
//{
// private readonly MongoDatabaseFixture _fixture;
// public CustomPocoTest(MongoDatabaseFixture fixture)
// {
// _fixture = fixture;
// }
// 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; }
// }
// public CustomDbContext<TKey> GetContext<TKey>() where TKey : IEquatable<TKey>
// {
// return DbUtil.Create<CustomDbContext<TKey>>(_fixture.ConnectionString);
// }
// public CustomDbContext<TKey> CreateContext<TKey>(bool delete = false) where TKey : IEquatable<TKey>
// {
// var db = GetContext<TKey>();
// if (delete)
// {
// db.Database.EnsureDeleted();
// }
// db.Database.EnsureCreated();
// return db;
// }
// [Fact]
// public async Task CanUpdateNameGuid()
// {
// using (var db = CreateContext<Guid>(true))
// {
// 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));
// }
// }
// [Fact]
// public async Task CanUpdateNameString()
// {
// using (var db = CreateContext<string>(true))
// {
// 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));
// }
// }
// [Fact]
// public async Task CanCreateUserInt()
// {
// using (var db = CreateContext<int>(true))
// {
// 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);
// }
// }
// [Fact]
// public async Task CanCreateUserIntViaSet()
// {
// using (var db = CreateContext<int>(true))
// {
// 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);
// }
// }
// [Fact]
// public async Task CanUpdateNameInt()
// {
// using (var db = CreateContext<int>(true))
// {
// 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));
// }
// }
// [Fact]
// public async Task CanUpdateNameIntWithSet()
// {
// using (var db = CreateContext<int>(true))
// {
// 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));
// }
// }
//}
}
@@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Data.SqlClient;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Claims;
@@ -14,7 +13,6 @@ using Microsoft.Extensions.Logging;
using Xunit;
using AspNetCore.Identity.MongoDbCore.Models;
using AspNetCore.Identity.MongoDbCore.Extensions;
using AspNetCore.Identity.MongoDbCore;
using MongoDB.Driver;
using AspNetCore.Identity.MongoDbCore.IntegrationTests.Infrastructure;
using MongoDbGenericRepository;
@@ -24,7 +22,7 @@ namespace AspNetCore.Identity.MongoDbCore.Test
{
// TODO: Add test variation with non IdentityDbContext
public abstract class SqlStoreTestBase<TUser, TRole, TKey> : IdentitySpecificationTestBase<TUser, TRole, TKey>,
public abstract class MongoDbStoreTestBase<TUser, TRole, TKey> : IdentitySpecificationTestBase<TUser, TRole, TKey>,
IClassFixture<MongoDatabaseFixture<TUser, TRole, TKey>>
where TUser : MongoIdentityUser<TKey>, new()
where TRole : MongoIdentityRole<TKey>, new()
@@ -32,7 +30,7 @@ namespace AspNetCore.Identity.MongoDbCore.Test
{
private readonly MongoDatabaseFixture<TUser, TRole, TKey> _fixture;
protected SqlStoreTestBase(MongoDatabaseFixture<TUser, TRole, TKey> fixture)
protected MongoDbStoreTestBase(MongoDatabaseFixture<TUser, TRole, TKey> fixture)
{
_fixture = fixture;
}
@@ -3,9 +3,7 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
using AspNetCore.Identity.MongoDbCore.Models;
using AspNetCore.Identity.MongoDbCore;
using MongoDbGenericRepository;
using AspNetCore.Identity.MongoDbCore.IntegrationTests.Infrastructure;
using Microsoft.AspNetCore.Identity;
@@ -26,7 +24,7 @@ namespace AspNetCore.Identity.MongoDbCore.Test
}
}
public class UserStoreGuidTest : SqlStoreTestBase<GuidUser, GuidRole, Guid>
public class UserStoreGuidTest : MongoDbStoreTestBase<GuidUser, GuidRole, Guid>
{
public UserStoreGuidTest(MongoDatabaseFixture<GuidUser, GuidRole, Guid> fixture)
: base(fixture)
@@ -2,8 +2,6 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
using AspNetCore.Identity.MongoDbCore.Models;
namespace AspNetCore.Identity.MongoDbCore.Test
@@ -23,7 +21,7 @@ namespace AspNetCore.Identity.MongoDbCore.Test
}
}
public class UserStoreIntTest : SqlStoreTestBase<IntUser, IntRole, int>
public class UserStoreIntTest : MongoDbStoreTestBase<IntUser, IntRole, int>
{
public UserStoreIntTest(MongoDatabaseFixture<IntUser, IntRole, int> fixture)
: base(fixture)
@@ -22,7 +22,7 @@ namespace AspNetCore.Identity.MongoDbCore.Test
}
}
public class UserStoreStringKeyTest : SqlStoreTestBase<StringUser, StringRole, string>
public class UserStoreStringKeyTest : MongoDbStoreTestBase<StringUser, StringRole, string>
{
public UserStoreStringKeyTest(MongoDatabaseFixture<StringUser, StringRole, string> fixture)
: base(fixture)
@@ -222,7 +222,6 @@ namespace AspNetCore.Identity.MongoDbCore.Test
{
public IdentityUserWithGenerics() : base()
{
}
}
@@ -1,165 +0,0 @@
// 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.Data.Common;
using System.Data.SqlClient;
using System.IO;
using System.Threading;
namespace AspNetCore.Identity.MongoDbCore.Test.Utilities
{
//public class SqlServerTestStore : IDisposable
//{
// public const int CommandTimeout = 90;
// public static string CreateConnectionString(string name)
// {
// var connStrBuilder = new SqlConnectionStringBuilder(TestEnvironment.Config["Test:SqlServer:DefaultConnectionString"])
// {
// InitialCatalog = name
// };
// return connStrBuilder.ConnectionString;
// }
// public static SqlServerTestStore CreateScratch(bool createDatabase = true)
// => new SqlServerTestStore(GetScratchDbName()).CreateTransient(createDatabase);
// private SqlConnection _connection;
// private readonly string _name;
// private bool _deleteDatabase;
// private SqlServerTestStore(string name)
// {
// _name = name;
// }
// private static string GetScratchDbName()
// {
// string name;
// do
// {
// name = "Scratch_" + Guid.NewGuid();
// } while (DatabaseExists(name)
// || DatabaseFilesExist(name));
// return name;
// }
// private static void WaitForExists(SqlConnection connection)
// {
// var retryCount = 0;
// while (true)
// {
// try
// {
// connection.Open();
// connection.Close();
// return;
// }
// catch (SqlException e)
// {
// if (++retryCount >= 30
// || (e.Number != 233 && e.Number != -2 && e.Number != 4060))
// {
// throw;
// }
// SqlConnection.ClearPool(connection);
// Thread.Sleep(100);
// }
// }
// }
// private SqlServerTestStore CreateTransient(bool createDatabase)
// {
// _connection = new SqlConnection(CreateConnectionString(_name));
// if (createDatabase)
// {
// using (var master = new SqlConnection(CreateConnectionString("master")))
// {
// master.Open();
// using (var command = master.CreateCommand())
// {
// command.CommandTimeout = CommandTimeout;
// command.CommandText = $"{Environment.NewLine}CREATE DATABASE [{_name}]";
// command.ExecuteNonQuery();
// WaitForExists(_connection);
// }
// }
// _connection.Open();
// }
// _deleteDatabase = true;
// return this;
// }
// private static bool DatabaseExists(string name)
// {
// using (var master = new SqlConnection(CreateConnectionString("master")))
// {
// master.Open();
// using (var command = master.CreateCommand())
// {
// command.CommandTimeout = CommandTimeout;
// command.CommandText = $@"SELECT COUNT(*) FROM sys.databases WHERE name = N'{name}'";
// return (int) command.ExecuteScalar() > 0;
// }
// }
// }
// private static bool DatabaseFilesExist(string name)
// {
// var userFolder = Environment.GetEnvironmentVariable("USERPROFILE") ??
// Environment.GetEnvironmentVariable("HOME");
// return userFolder != null
// && (File.Exists(Path.Combine(userFolder, name + ".mdf"))
// || File.Exists(Path.Combine(userFolder, name + "_log.ldf")));
// }
// private void DeleteDatabase(string name)
// {
// using (var master = new SqlConnection(CreateConnectionString("master")))
// {
// master.Open();
// using (var command = master.CreateCommand())
// {
// command.CommandTimeout = CommandTimeout;
// // Query will take a few seconds if (and only if) there are active connections
// // SET SINGLE_USER will close any open connections that would prevent the drop
// command.CommandText
// = string.Format(@"IF EXISTS (SELECT * FROM sys.databases WHERE name = N'{0}')
// BEGIN
// ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
// DROP DATABASE [{0}];
// END", name);
// command.ExecuteNonQuery();
// }
// }
// }
// public DbConnection Connection => _connection;
// public void Dispose()
// {
// _connection.Dispose();
// if (_deleteDatabase)
// {
// DeleteDatabase(_name);
// }
// }
//}
}