From 31ce3269c5bd02f4f2ed73d682bc5ee122f03dde Mon Sep 17 00:00:00 2001 From: David Melendez Date: Mon, 11 Nov 2019 17:16:16 -0800 Subject: [PATCH] initial cosmos sdk update --- .../Constants.cs | 2 +- ...Camino.AspNetCore.Identity.CosmosDB.csproj | 2 +- .../Extensions/IQueryableExtensions.cs | 18 +- .../Helpers/JsonHelpers.cs | 28 - .../Helpers/PartitionKeyHelper.cs | 23 + .../IdentityCloudContext.cs | 156 ++--- .../Model/IResource.cs | 17 +- .../Model/IdentityConfiguration.cs | 9 +- .../Model/IdentityRole.cs | 33 +- .../Model/IdentityRoleClaim.cs | 1 - .../Model/IdentityUser.cs | 30 +- .../Model/IdentityUserToken.cs | 29 +- .../RoleStore.cs | 129 ++-- .../StoredProcs/getUserByEmail_sproc.js | 7 +- .../StoredProcs/getUserById_sproc.js | 7 +- .../UserStore.cs | 248 ++++---- .../BaseTest.cs | 9 +- ....AspNetCore.Identity.CosmosDB.Tests.csproj | 2 +- .../RoleStoreTests.cs | 156 +++-- .../UserStoreTests.Properties.partial.cs | 280 ++++----- .../UserStoreTests.cs | 550 ++++++++---------- .../config.json | 2 +- 22 files changed, 830 insertions(+), 908 deletions(-) delete mode 100644 src/ElCamino.AspNetCore.Identity.CosmosDB/Helpers/JsonHelpers.cs create mode 100644 src/ElCamino.AspNetCore.Identity.CosmosDB/Helpers/PartitionKeyHelper.cs diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/Constants.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/Constants.cs index a194606..17f7ca6 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/Constants.cs +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/Constants.cs @@ -11,7 +11,7 @@ namespace ElCamino.AspNetCore.Identity.CosmosDB public static class Constants { - public static class DocumentCollectionIds + public static class ContainerIds { public const string DefaultIdentityCollection = "identity"; } diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/ElCamino.AspNetCore.Identity.CosmosDB.csproj b/src/ElCamino.AspNetCore.Identity.CosmosDB/ElCamino.AspNetCore.Identity.CosmosDB.csproj index f7de5b6..e7c4c02 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/ElCamino.AspNetCore.Identity.CosmosDB.csproj +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/ElCamino.AspNetCore.Identity.CosmosDB.csproj @@ -34,7 +34,7 @@ - + diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/Extensions/IQueryableExtensions.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/Extensions/IQueryableExtensions.cs index bd027ae..188d005 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/Extensions/IQueryableExtensions.cs +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/Extensions/IQueryableExtensions.cs @@ -12,8 +12,16 @@ internal static class IQueryableExtensions { public static Task> ToListAsync(this IEnumerable source, Func where = null, CancellationToken cancellationToken = default(CancellationToken)) { - if(where == null) + + if (where == null) + { + List list = source as List; + if (list != null) + { + return Task.FromResult(list); + } return Task.Run(() => { return source.ToList(); }, cancellationToken); + } else return Task.Run(() => { return source.Where(where).ToList(); }, cancellationToken); } @@ -22,8 +30,8 @@ public static Task FirstOrDefaultAsync(this IEnumerable { if (where == null) - return source.Where(where).FirstOrDefault(); - return source.Where(where).FirstOrDefault(where); + return source.FirstOrDefault(); + return source.FirstOrDefault(where); }, cancellationToken); } @@ -31,8 +39,8 @@ public static Task SingleOrDefaultAsync(this IEnumerable { if(where == null) - return source.Where(where).SingleOrDefault(); - return source.Where(where).SingleOrDefault(where); + return source.SingleOrDefault(); + return source.Where(where).SingleOrDefault(); }, cancellationToken); } } diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/Helpers/JsonHelpers.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/Helpers/JsonHelpers.cs deleted file mode 100644 index 638b35e..0000000 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/Helpers/JsonHelpers.cs +++ /dev/null @@ -1,28 +0,0 @@ -// MIT License Copyright 2019 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. -using ElCamino.AspNetCore.Identity.CosmosDB.Model; -using Microsoft.Azure.Documents; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Text; - -namespace ElCamino.AspNetCore.Identity.CosmosDB.Helpers -{ - public static class JsonHelpers - { - public static T CreateObject(Document doc) where T : new() - { - var t = JsonConvert.DeserializeObject(doc.ToString()); - var r = t as IResource; - if(r != null) - { - r.AltLink = doc.AltLink; - r.ETag = doc.ETag; - r.ResourceId = doc.ResourceId; - r.SelfLink = doc.SelfLink; - r.Timestamp = doc.Timestamp; - } - return t; - } - } -} diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/Helpers/PartitionKeyHelper.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/Helpers/PartitionKeyHelper.cs new file mode 100644 index 0000000..623c335 --- /dev/null +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/Helpers/PartitionKeyHelper.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ElCamino.AspNetCore.Identity.CosmosDB.Helpers +{ + public static class PartitionKeyHelper + { + public static string GetPartitionKeyFromId(string id) + { + id = id?.ToString()?.Trim(); + if (!string.IsNullOrWhiteSpace(id)) + { + if (id.Length > 4) + { + return id.Substring(id.Length - 4, 4); + } + } + + return string.Empty; + } + } +} diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/IdentityCloudContext.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/IdentityCloudContext.cs index 23affea..8e8aec5 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/IdentityCloudContext.cs +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/IdentityCloudContext.cs @@ -1,18 +1,18 @@ // MIT License Copyright 2019 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. -using Microsoft.Azure.Documents.Client; -using Microsoft.Azure.Documents.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ElCamino.AspNetCore.Identity.CosmosDB.Model; -using Microsoft.Azure.Documents; using System.Diagnostics; using System.Reflection; using System.IO; using System.Collections.ObjectModel; using System.Collections.Concurrent; +using Microsoft.Azure.Cosmos; +using Microsoft.Azure.Cosmos.Scripts; +using Microsoft.Azure.Cosmos.Linq; namespace ElCamino.AspNetCore.Identity.CosmosDB { @@ -20,32 +20,32 @@ public class IdentityCloudContext : IDisposable { internal class InternalContext : IDisposable { - private DocumentClient _client = null; + private CosmosClient _client = null; private Database _db = null; - private DocumentCollection _identityDocumentCollection; - private StoredProcedure _getUserByEmailSproc = null; - private StoredProcedure _getUserByUserNameSproc = null; - private StoredProcedure _getUserByIdSproc = null; - private StoredProcedure _getUserByLoginSproc = null; + private Container _identityContainer; + private string _getUserByEmailSproc = null; + private string _getUserByUserNameSproc = null; + private string _getUserByIdSproc = null; + private string _getUserByLoginSproc = null; private string _sessionToken = string.Empty; private bool _disposed = false; - public StoredProcedure GetUserByLoginSproc + public string GetUserByLoginSproc { get { return _getUserByLoginSproc; } } - public StoredProcedure GetUserByIdSproc + public string GetUserByIdSproc { get { return _getUserByIdSproc; } } - public StoredProcedure GetUserByUserNameSproc + public string GetUserByUserNameSproc { get { return _getUserByUserNameSproc; } } - public StoredProcedure GetUserByEmailSproc + public string GetUserByEmailSproc { get { return _getUserByEmailSproc; } } @@ -53,31 +53,34 @@ public StoredProcedure GetUserByEmailSproc public InternalContext(IdentityConfiguration config) { - _client = new DocumentClient(new Uri(config.Uri), config.AuthKey, config.Policy, ConsistencyLevel.Session); - InitDatabase(config.Database); - _identityDocumentCollection = new DocumentCollection() { Id = config.IdentityCollection }; + + _client = new CosmosClient(config.Uri, config.AuthKey, config.Options); + InitDatabase(config.Database); InitCollection(config.IdentityCollection); InitStoredProcs(); } private void InitDatabase(string database) { - _db = _client.CreateDatabaseIfNotExistsAsync(new Database { Id = database }).Result.Resource; + var databaseResponse = _client.CreateDatabaseIfNotExistsAsync(database); + databaseResponse.Wait(); + _db = databaseResponse.Result; } private void InitCollection(string userCollectionId) { - var ucresult = _client.CreateDocumentCollectionIfNotExistsAsync(_db.SelfLink, _identityDocumentCollection, this.RequestOptions).Result; - IdentityDocumentCollection = ucresult.Resource; + var ucresult = _db.CreateContainerIfNotExistsAsync(new ContainerProperties(userCollectionId, "/partitionKey")); + ucresult.Wait(); + IdentityDocumentCollection = ucresult.Result.Container; } private void InitStoredProcs() { - InitGetUserByEmail(); - InitGetUserByUserName(); + //InitGetUserByEmail(); + //InitGetUserByUserName(); InitGetUserById(); - InitGetUserByLogin(); + //InitGetUserByLogin(); } private void InitGetUserByLogin() @@ -92,14 +95,10 @@ private void InitGetUserByLogin() string strId = "getUserByLogin_v1"; if (_getUserByLoginSproc == null) { - var task = _client.UpsertStoredProcedureAsync(_identityDocumentCollection.SelfLink, - new StoredProcedure() - { - Id = strId, - Body = body, - }, - RequestOptions); - _getUserByLoginSproc = task.Result; + TryDeleteStoredProcedure(_identityContainer, strId).Wait(); + Task task = _identityContainer.Scripts.CreateStoredProcedureAsync( + new StoredProcedureProperties(strId, body)); + _getUserByLoginSproc = task.Result.Resource.Id; } } @@ -115,17 +114,29 @@ private void InitGetUserById() string strId = "getUserById_v1"; if (_getUserByIdSproc == null) { - var task = _client.UpsertStoredProcedureAsync(_identityDocumentCollection.SelfLink, - new StoredProcedure() - { - Id = strId, - Body = body, - }, - RequestOptions); - _getUserByIdSproc = task.Result; + TryDeleteStoredProcedure(_identityContainer, strId).Wait(); + Task task = _identityContainer.Scripts.CreateStoredProcedureAsync( + new StoredProcedureProperties(strId, body)); + task.Wait(); + + _getUserByIdSproc = task.Result.Resource.Id; } } + private async Task TryDeleteStoredProcedure(Container container, string sprocId) + { + Scripts cosmosScripts = container.Scripts; + + try + { + StoredProcedureResponse sproc = await cosmosScripts.ReadStoredProcedureAsync(sprocId); + await cosmosScripts.DeleteStoredProcedureAsync(sprocId); + } + catch (CosmosException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound) + { + //Nothing to delete + } + } private void InitGetUserByUserName() { string body = string.Empty; @@ -139,14 +150,10 @@ private void InitGetUserByUserName() if (_getUserByUserNameSproc == null) { - var task = _client.UpsertStoredProcedureAsync(_identityDocumentCollection.SelfLink, - new StoredProcedure() - { - Id = strId, - Body = body, - }, - RequestOptions); - _getUserByUserNameSproc = task.Result; + TryDeleteStoredProcedure(_identityContainer, strId).Wait(); + Task task = _identityContainer.Scripts.CreateStoredProcedureAsync( + new StoredProcedureProperties(strId, body)); + _getUserByUserNameSproc = task.Result.Resource.Id; } } @@ -162,14 +169,10 @@ private void InitGetUserByEmail() string strId = "getUserByEmail_v1"; if (_getUserByEmailSproc == null) { - var task = _client.UpsertStoredProcedureAsync(_identityDocumentCollection.SelfLink, - new StoredProcedure() - { - Id = strId, - Body = body, - }, - RequestOptions); - _getUserByEmailSproc = task.Result; + TryDeleteStoredProcedure(_identityContainer, strId).Wait(); + Task task = _identityContainer.Scripts.CreateStoredProcedureAsync( + new StoredProcedureProperties(strId, body)); + _getUserByEmailSproc = task.Result.Resource.Id; } } @@ -178,7 +181,7 @@ private void InitGetUserByEmail() this.Dispose(false); } - public DocumentClient Client + public CosmosClient Client { get { ThrowIfDisposed(); return _client; } } @@ -188,28 +191,28 @@ public Database Database get { ThrowIfDisposed(); return _db; } } + public ConsistencyLevel ConsistencyLevel { get; private set; } = ConsistencyLevel.Session; - public RequestOptions RequestOptions + public ItemRequestOptions RequestOptions { get { - return new RequestOptions() + return new ItemRequestOptions() { - ConsistencyLevel = ConsistencyLevel.Session, + ConsistencyLevel = this.ConsistencyLevel, SessionToken = SessionToken, }; } } - public FeedOptions FeedOptions + public QueryRequestOptions FeedOptions { get { - return new FeedOptions() + return new QueryRequestOptions() { - EnableCrossPartitionQuery = true, EnableScanInQuery = true, - SessionToken = SessionToken, + ConsistencyLevel = this.ConsistencyLevel, }; } } @@ -227,10 +230,10 @@ public void SetSessionTokenIfEmpty(string tokenNew) } } - public DocumentCollection IdentityDocumentCollection + public Container IdentityDocumentCollection { - get { ThrowIfDisposed(); return _identityDocumentCollection; } - set { _identityDocumentCollection = value; } + get { ThrowIfDisposed(); return _identityContainer; } + set { _identityContainer = value; } } protected void ThrowIfDisposed() @@ -250,14 +253,10 @@ protected virtual void Dispose(bool disposing) { if (!_disposed && disposing) { - if (_client != null) - { - _client.Dispose(); - } _disposed = true; _client = null; _db = null; - _identityDocumentCollection = null; + _identityContainer = null; _sessionToken = null; } } @@ -269,22 +268,22 @@ protected virtual void Dispose(bool disposing) private string _configHash = null; private InternalContext _currentContext = null; - public StoredProcedure GetUserByLoginSproc + public string GetUserByLoginSproc { get { return _currentContext.GetUserByLoginSproc; } } - public StoredProcedure GetUserByIdSproc + public string GetUserByIdSproc { get { return _currentContext.GetUserByIdSproc; } } - public StoredProcedure GetUserByUserNameSproc + public string GetUserByUserNameSproc { get { return _currentContext.GetUserByUserNameSproc; } } - public StoredProcedure GetUserByEmailSproc + public string GetUserByEmailSproc { get { return _currentContext.GetUserByEmailSproc; } } @@ -314,7 +313,7 @@ public IdentityCloudContext(IdentityConfiguration config) this.Dispose(false); } - public DocumentClient Client + public CosmosClient Client { get { ThrowIfDisposed(); return _currentContext.Client; } } @@ -325,7 +324,7 @@ public Database Database } - public RequestOptions RequestOptions + public ItemRequestOptions RequestOptions { get { @@ -333,7 +332,7 @@ public RequestOptions RequestOptions } } - public FeedOptions FeedOptions + public QueryRequestOptions FeedOptions { get { @@ -341,6 +340,7 @@ public FeedOptions FeedOptions } } + public string SessionToken { get { return _currentContext.SessionToken; } @@ -351,7 +351,7 @@ public void SetSessionTokenIfEmpty(string tokenNew) _currentContext.SetSessionTokenIfEmpty(tokenNew); } - public DocumentCollection IdentityDocumentCollection + public Container IdentityContainer { get { ThrowIfDisposed(); return _currentContext.IdentityDocumentCollection; } set { _currentContext.IdentityDocumentCollection = value; } diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IResource.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IResource.cs index 74d3a77..1364928 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IResource.cs +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IResource.cs @@ -1,5 +1,4 @@ -using Microsoft.Azure.Documents; -using Newtonsoft.Json; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Text; @@ -10,16 +9,12 @@ interface IResource where TKey : IEquatable { [JsonProperty(PropertyName = "id")] TKey Id { get; set; } - [JsonProperty(PropertyName = "_rid")] - string ResourceId { get; set; } - [JsonProperty(PropertyName = "_self")] - string SelfLink { get; set;} - [JsonIgnore] - string AltLink { get; set; } - [JsonConverter(typeof(UnixDateTimeConverter))] - [JsonProperty(PropertyName = "_ts")] - DateTime Timestamp { get; set; } + [JsonProperty(PropertyName = "_etag")] string ETag { get; set; } + + string PartitionKey { get; set; } + void SetPartitionKey(); + } } diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityConfiguration.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityConfiguration.cs index 22d2313..1ad2b57 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityConfiguration.cs +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityConfiguration.cs @@ -1,7 +1,7 @@ // MIT License Copyright 2019 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. using ElCamino.AspNetCore.Identity.CosmosDB.Helpers; -using Microsoft.Azure.Documents.Client; +using Microsoft.Azure.Cosmos; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System.Security; @@ -17,11 +17,14 @@ public class IdentityConfiguration public string Database { get; set; } - public string IdentityCollection { get; set; } = Constants.DocumentCollectionIds.DefaultIdentityCollection; + public string IdentityCollection { get; set; } = Constants.ContainerIds.DefaultIdentityCollection; [JsonIgnore] - public ConnectionPolicy Policy { get; set; } = ConnectionPolicy.Default; + public CosmosClientOptions Options { get; set; } = new CosmosClientOptions() + { + ConsistencyLevel = ConsistencyLevel.Session + }; public override string ToString() { diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityRole.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityRole.cs index c097ad6..97e6250 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityRole.cs +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityRole.cs @@ -1,7 +1,9 @@ // MIT License Copyright 2019 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. -using Microsoft.Azure.Documents; +using ElCamino.AspNetCore.Identity.CosmosDB.Helpers; +using Microsoft.Azure.Cosmos; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; @@ -38,20 +40,15 @@ public class IdentityRole : Microsoft.AspNetCore.Id public IdentityRole() { } [JsonProperty(PropertyName = "id")] - public override TKey Id { get; set; } - - [JsonProperty(PropertyName = "_rid")] - public virtual string ResourceId { get; set; } - - [JsonProperty(PropertyName = "_self")] - public virtual string SelfLink { get; set; } - - [JsonIgnore] - public string AltLink { get; set; } - - [JsonConverter(typeof(UnixDateTimeConverter))] - [JsonProperty(PropertyName = "_ts")] - public virtual DateTime Timestamp { get; set; } + public override TKey Id + { + get => base.Id; + set + { + base.Id = value; + SetPartitionKey(); + } + } [JsonProperty(PropertyName = "_etag")] public virtual string ETag { get; set; } @@ -61,6 +58,12 @@ public IdentityRole(string roleName) : this() Name = roleName; } + public virtual void SetPartitionKey() + { + PartitionKey = PartitionKeyHelper.GetPartitionKeyFromId(Id?.ToString()); + } + + public virtual string PartitionKey { get; set; } [JsonProperty(PropertyName = "claims")] public virtual IList Claims { get; } = new List(); diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityRoleClaim.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityRoleClaim.cs index 34f60d2..c981fd1 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityRoleClaim.cs +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityRoleClaim.cs @@ -1,6 +1,5 @@ // MIT License Copyright 2019 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. -using Microsoft.Azure.Documents; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityUser.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityUser.cs index 5cf8dd3..910a9d3 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityUser.cs +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityUser.cs @@ -1,6 +1,7 @@ // MIT License Copyright 2019 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. -using Microsoft.Azure.Documents; +using ElCamino.AspNetCore.Identity.CosmosDB.Helpers; +using Microsoft.Azure.Cosmos; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; @@ -40,24 +41,25 @@ public IdentityUser(string userName) : this() } [JsonProperty(PropertyName = "id")] - public override TKey Id { get => base.Id; set => base.Id = value; } - - [JsonProperty(PropertyName = "_rid")] - public virtual string ResourceId { get; set; } - - [JsonProperty(PropertyName = "_self")] - public virtual string SelfLink { get; set; } - - [JsonIgnore] - public string AltLink { get; set; } + public override TKey Id + { + get => base.Id; + set + { + base.Id = value; + SetPartitionKey(); + } + } - [JsonConverter(typeof(UnixDateTimeConverter))] - [JsonProperty(PropertyName = "_ts")] - public virtual DateTime Timestamp { get; set; } + public virtual void SetPartitionKey() + { + PartitionKey = PartitionKeyHelper.GetPartitionKeyFromId(Id?.ToString()); + } [JsonProperty(PropertyName = "_etag")] public virtual string ETag { get; set; } + public virtual string PartitionKey { get; set; } [JsonProperty("userName")] public override string UserName { get; set; } diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityUserToken.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityUserToken.cs index b6967fe..59556fd 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityUserToken.cs +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/Model/IdentityUserToken.cs @@ -3,7 +3,7 @@ using System; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; -using Microsoft.Azure.Documents; +using ElCamino.AspNetCore.Identity.CosmosDB.Helpers; namespace ElCamino.AspNetCore.Identity.CosmosDB.Model { @@ -21,26 +21,31 @@ public IdentityUserToken() public class IdentityUserToken : Microsoft.AspNetCore.Identity.IdentityUserToken, IResource where TKey : IEquatable { + private TKey _Id; [JsonProperty(PropertyName = "id")] - public TKey Id { get; set; } + public TKey Id + { + get => _Id; + set + { + _Id = value; + SetPartitionKey(); + } + } + + public void SetPartitionKey() + { + PartitionKey = PartitionKeyHelper.GetPartitionKeyFromId(Id?.ToString()); + } [JsonProperty(PropertyName = "_rid")] public virtual string ResourceId { get; set; } - [JsonProperty(PropertyName = "_self")] - public virtual string SelfLink { get; set; } - - [JsonIgnore] - public string AltLink { get; set; } - - [JsonConverter(typeof(UnixDateTimeConverter))] - [JsonProperty(PropertyName = "_ts")] - public virtual DateTime Timestamp { get; set; } - [JsonProperty(PropertyName = "_etag")] public virtual string ETag { get; set; } + public string PartitionKey { get; set; } [JsonProperty("userId")] diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/RoleStore.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/RoleStore.cs index c26d72d..49219e5 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/RoleStore.cs +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/RoleStore.cs @@ -8,12 +8,11 @@ using System.Net; using System.Diagnostics; using ElCamino.AspNetCore.Identity.CosmosDB.Model; -using Microsoft.Azure.Documents; -using Microsoft.Azure.Documents.Linq; +using Microsoft.Azure.Cosmos; +using Microsoft.Azure.Cosmos.Linq; using Newtonsoft.Json; using System.Threading; using ElCamino.AspNetCore.Identity.CosmosDB.Extensions; -using System.ComponentModel; using System.Security.Claims; using ElCamino.AspNetCore.Identity.CosmosDB.Helpers; @@ -38,10 +37,21 @@ public class RoleStore : RoleStoreThe . public RoleStore(TContext context, IdentityErrorDescriber describer = null) : base(context, describer) { } - public override IQueryable Roles => Context.Client.CreateDocumentQuery(Context.IdentityDocumentCollection.DocumentsLink); - - public override IQueryable> RoleClaims => Context.Client.CreateDocumentQuery>(Context.IdentityDocumentCollection.DocumentsLink); + public override IQueryable Roles + { + get + { + return Context.IdentityContainer.GetItemLinqQueryable(true); + } + } + public virtual IQueryable> RoleClaims + { + get + { + return Context.IdentityContainer.GetItemLinqQueryable>(true); + } + } public override async Task> GetClaimsAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken)) { @@ -78,10 +88,7 @@ public override Task AddClaimAsync(TRole role, Claim claim, CancellationToken ca role.Claims.Add(CreateRoleClaim(role, claim)); return TaskCacheExtensions.CompletedTask; - } - - - + } } @@ -94,12 +101,12 @@ public abstract class RoleStore : where TRoleClaim : Model.IdentityRoleClaim, new() { private bool _disposed; - private DocumentCollection _roleTable; + private Container _roleTable; public RoleStore(TContext context, IdentityErrorDescriber describer = null) : base(describer) { Context = context ?? throw new ArgumentNullException(nameof(context)); - _roleTable = context.IdentityDocumentCollection; + _roleTable = context.IdentityContainer; } @@ -112,10 +119,8 @@ public override async Task CreateAsync(TRole role, CancellationT throw new ArgumentNullException(nameof(role)); } - var doc = await Context.Client.CreateDocumentAsync(Context.IdentityDocumentCollection.DocumentsLink, role - , Context.RequestOptions, true); - Context.SetSessionTokenIfEmpty(doc.SessionToken); - role = JsonHelpers.CreateObject(doc); + var doc = await Context.IdentityContainer.CreateItemAsync(role, new PartitionKey(role.PartitionKey), Context.RequestOptions); + Context.SetSessionTokenIfEmpty(doc.Headers.Session); return IdentityResult.Success; } @@ -129,9 +134,8 @@ public async override Task UpdateAsync(TRole role, CancellationT } role.ConcurrencyStamp = Guid.NewGuid().ToString(); - var doc = await Context.Client.UpsertDocumentAsync(Context.IdentityDocumentCollection.DocumentsLink, role, Context.RequestOptions, - disableAutomaticIdGeneration: true); - Context.SetSessionTokenIfEmpty(doc.SessionToken); + var doc = await Context.IdentityContainer.UpsertItemAsync(role, new PartitionKey(role.PartitionKey), Context.RequestOptions); + Context.SetSessionTokenIfEmpty(doc.Headers.Session); return IdentityResult.Success; } @@ -143,9 +147,8 @@ public async override Task DeleteAsync(TRole role, CancellationT { throw new ArgumentNullException(nameof(role)); } - var doc = await Context.Client.DeleteDocumentAsync(role.SelfLink, - Context.RequestOptions); - Context.SetSessionTokenIfEmpty(doc.SessionToken); + var doc = await Context.IdentityContainer.DeleteItemAsync(role.Id.ToString(), new PartitionKey(role.PartitionKey), Context.RequestOptions); + Context.SetSessionTokenIfEmpty(doc.Headers.Session); return IdentityResult.Success; } @@ -177,11 +180,11 @@ protected virtual void Dispose(bool disposing) /// The role ID to look for. /// The used to propagate notifications that the operation should be canceled. /// A that result of the look up. - public override async Task FindByIdAsync(string id, CancellationToken cancellationToken = default(CancellationToken)) + public override Task FindByIdAsync(string id, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - return await Task.FromResult(FindById(id)); + return FindById(id); } /// @@ -194,36 +197,43 @@ public override async Task FindByNameAsync(string normalizedName, Cancell { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - SqlQuerySpec query = new SqlQuerySpec("SELECT * FROM Roles r WHERE (r.normalizedName = @normalizedName)", new SqlParameterCollection(){ - new SqlParameter("@normalizedName", normalizedName) - }); - - var fo = Context.FeedOptions; - fo.MaxItemCount = 1; - var doc = Context.Client.CreateDocumentQuery(Context.IdentityDocumentCollection.DocumentsLink, - query, fo) - .ToList() - .FirstOrDefault(); - - TRole role = doc; - return await Task.FromResult(role); + + QueryDefinition query = new QueryDefinition("SELECT * FROM Roles r WHERE (r.normalizedName = @normalizedName)") + .WithParameter("@normalizedName", normalizedName); + + QueryRequestOptions options = Context.FeedOptions; + options.MaxItemCount = 1; + options.MaxBufferedItemCount = 1; + options.MaxConcurrency = 0; //max parallel + + + var feedIterator = Context.IdentityContainer.GetItemQueryIterator(query, requestOptions:options); + + if (feedIterator.HasMoreResults) + { + return (await feedIterator.ReadNextAsync()).FirstOrDefault(); + } + + return null; } - private TRole FindById(string roleKeyString) + private async Task FindById(string roleKeyString) { - SqlQuerySpec query = new SqlQuerySpec("SELECT * FROM Roles r WHERE (r.id = @id)", new SqlParameterCollection(){ - new SqlParameter("@id", roleKeyString) - }); - - var fo = Context.FeedOptions; - fo.MaxItemCount = 1; - var doc = Context.Client.CreateDocumentQuery(Context.IdentityDocumentCollection.DocumentsLink, - query, fo) - .ToList() - .FirstOrDefault(); - - TRole role = doc; - return role; + try + { + var itemResponse = await Context.IdentityContainer.ReadItemAsync(roleKeyString, + new PartitionKey(PartitionKeyHelper.GetPartitionKeyFromId(roleKeyString))); + + return itemResponse.Resource; + } + catch (CosmosException ex) + { + if (ex.StatusCode == HttpStatusCode.NotFound) + { + return null; + } + throw; + } } @@ -262,10 +272,21 @@ public override Task RemoveClaimAsync(TRole role, Claim claim, CancellationToken public TContext Context { get; private set; } - public override IQueryable Roles => Context.Client.CreateDocumentQuery(Context.IdentityDocumentCollection.DocumentsLink); + public override IQueryable Roles + { + get + { + return Context.IdentityContainer.GetItemLinqQueryable(true); + } + } - public virtual IQueryable RoleClaims => Context.Client.CreateDocumentQuery(Context.IdentityDocumentCollection.DocumentsLink); + public virtual IQueryable RoleClaims + { + get + { + return Context.IdentityContainer.GetItemLinqQueryable(true); + } + } - } } diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/StoredProcs/getUserByEmail_sproc.js b/src/ElCamino.AspNetCore.Identity.CosmosDB/StoredProcs/getUserByEmail_sproc.js index 40629eb..34ff1c4 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/StoredProcs/getUserByEmail_sproc.js +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/StoredProcs/getUserByEmail_sproc.js @@ -12,7 +12,12 @@ function getUserByEmail_v1(normalizedEmail) { emailQuery, function (err, feed, options) { if (err) throw err; - getContext().getResponse().setBody(feed); + if (!feed || !feed.length) { + getContext().getResponse().setBody("no docs found"); + } + else { + getContext().getResponse().setBody(prefix + JSON.stringify(feed[0])); + } }); } \ No newline at end of file diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/StoredProcs/getUserById_sproc.js b/src/ElCamino.AspNetCore.Identity.CosmosDB/StoredProcs/getUserById_sproc.js index 57e2c28..60e9f3e 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/StoredProcs/getUserById_sproc.js +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/StoredProcs/getUserById_sproc.js @@ -12,7 +12,12 @@ function getUserById_v1(userid) { 'SELECT * FROM root r WHERE r.id = "' + userid + '"', function (err, feed, options) { if (err) throw err; - getContext().getResponse().setBody(feed); + if (!feed || !feed.length) { + getContext().getResponse().setBody(""); + } + else { + getContext().getResponse().setBody(JSON.stringify(feed[0])); + } }); } diff --git a/src/ElCamino.AspNetCore.Identity.CosmosDB/UserStore.cs b/src/ElCamino.AspNetCore.Identity.CosmosDB/UserStore.cs index ecc8aaa..c83a1d1 100644 --- a/src/ElCamino.AspNetCore.Identity.CosmosDB/UserStore.cs +++ b/src/ElCamino.AspNetCore.Identity.CosmosDB/UserStore.cs @@ -8,18 +8,17 @@ using System.Net; using System.Diagnostics; using ElCamino.AspNetCore.Identity.CosmosDB.Model; -using Microsoft.Azure.Documents; -using Microsoft.Azure.Documents.Linq; +using Microsoft.Azure.Cosmos; +using Microsoft.Azure.Cosmos.Linq; using Newtonsoft.Json; using System.Threading; using ElCamino.AspNetCore.Identity.CosmosDB.Extensions; using System.ComponentModel; using System.Security.Claims; using System.Globalization; -using Microsoft.Azure.Documents.Client; using ElCamino.AspNetCore.Identity.CosmosDB.Helpers; using System.Collections.Concurrent; - +using Microsoft.Azure.Cosmos.Scripts; namespace ElCamino.AspNetCore.Identity.CosmosDB { @@ -71,23 +70,23 @@ public override async Task> GetRolesAsync(TUser user, Cancellation } var userId = user.Id; - - SqlQuerySpec query = new SqlQuerySpec("SELECT VALUE r.roleId " + + + QueryDefinition query = new QueryDefinition("SELECT VALUE r.roleId " + "FROM u " + "JOIN r in u.roles " + - "WHERE (u.id = @userid) ", new SqlParameterCollection(){ - new SqlParameter("@userid", userId) - }); + "WHERE (u.id = @userid) ").WithParameter("@userid", userId); - List lroleIds = await ExecuteSqlQuery(query, Context.FeedOptions).ToListAsync(cancellationToken: cancellationToken); + List lroleIds = await (await ExecuteSqlQuery(query, Context.FeedOptions) + .ConfigureAwait(false)) + .ToListAsync(cancellationToken: cancellationToken); if (lroleIds.Count > 0) { - SqlQuerySpec query2 = new SqlQuerySpec(string.Format("SELECT VALUE r.name " + + QueryDefinition query2 = new QueryDefinition(string.Format("SELECT VALUE r.name " + "FROM r " + "WHERE (r.id in ( {0} )) ", string.Join(",", lroleIds.Select(rn => "'" + rn + "'")))); - return await ExecuteSqlQuery(query2, Context.FeedOptions).ToListAsync(cancellationToken: cancellationToken); + return await (await ExecuteSqlQuery(query2, Context.FeedOptions).ConfigureAwait(false)).ToListAsync(cancellationToken: cancellationToken); } return new List(); @@ -102,16 +101,15 @@ public async override Task> GetUsersForClaimAsync(Claim claim, Canc { throw new ArgumentNullException(nameof(claim)); } - SqlQuerySpec query = new SqlQuerySpec("SELECT VALUE u " + + QueryDefinition query = new QueryDefinition("SELECT VALUE u " + "FROM ROOT u " + "JOIN uc in u.claims " + - "WHERE (uc.claimValue = @claimValue) AND (uc.claimType = @claimType) ", new SqlParameterCollection(){ - new SqlParameter("@claimValue", claim.Value), - new SqlParameter("@claimType", claim.Type) - }); + "WHERE (uc.claimValue = @claimValue) AND (uc.claimType = @claimType) ") + .WithParameter("@claimValue", claim.Value) + .WithParameter("@claimType", claim.Type); Debug.WriteLine(query.QueryText); - return await ExecuteSqlQuery(query, Context.FeedOptions).ToListAsync(cancellationToken: cancellationToken); + return await (await ExecuteSqlQuery(query, Context.FeedOptions).ConfigureAwait(false)).ToListAsync(cancellationToken: cancellationToken); } @@ -135,15 +133,14 @@ public override async Task> GetUsersInRoleAsync(string normalizedRo string roleId = await GetRoleIdByNormalizedNameAsync(normalizedRoleName, cancellationToken: cancellationToken); if (!string.IsNullOrWhiteSpace(roleId)) { - SqlQuerySpec query = new SqlQuerySpec("SELECT VALUE u " + + QueryDefinition query = new QueryDefinition("SELECT VALUE u " + "FROM ROOT u " + "JOIN ur in u.roles " + - "WHERE (ur.roleId = @roleId) ", new SqlParameterCollection(){ - new SqlParameter("@roleId", roleId) - }); + "WHERE (ur.roleId = @roleId) ") + .WithParameter("@roleId", roleId); Debug.WriteLine(query.QueryText); - return await ExecuteSqlQuery(query, Context.FeedOptions).ToListAsync(cancellationToken: cancellationToken); + return await (await ExecuteSqlQuery(query, Context.FeedOptions).ConfigureAwait(false)).ToListAsync(cancellationToken: cancellationToken); } return new List(); } @@ -184,14 +181,15 @@ protected override Model.IdentityUserRole CreateUserRole(TUser user, TRo protected override async Task FindRoleAsync(string normalizedRoleName, CancellationToken cancellationToken) { - SqlQuerySpec roleQuery = new SqlQuerySpec("SELECT VALUE r " + + QueryDefinition roleQuery = new QueryDefinition("SELECT VALUE r " + "FROM ROOT r " + - "WHERE (r.normalizedName = @normalizedName) ", new SqlParameterCollection(){ - new SqlParameter("@normalizedName", normalizedRoleName) - }); + "WHERE (r.normalizedName = @normalizedName) ") + .WithParameter("@normalizedName", normalizedRoleName); Console.WriteLine(roleQuery.QueryText); - var roles = await ExecuteSqlQuery(roleQuery, Context.FeedOptions).ToListAsync(cancellationToken: cancellationToken); + var roles = await (await ExecuteSqlQuery(roleQuery, Context.FeedOptions) + .ConfigureAwait(false)) + .ToListAsync(cancellationToken: cancellationToken); return roles.FirstOrDefault(); } @@ -209,15 +207,15 @@ protected override async Task> FindUserRoleAsync( throw new ArgumentNullException(nameof(roleId)); } - SqlQuerySpec query = new SqlQuerySpec("SELECT VALUE ur.roleId, ur.userId " + + QueryDefinition query = new QueryDefinition("SELECT VALUE ur.roleId, ur.userId " + "FROM ROOT u " + "JOIN ur in u.roles " + - "WHERE (ur.roleId = @roleId) AND (ur.userId = @userId)", new SqlParameterCollection(){ - new SqlParameter("@roleId", roleId), new SqlParameter("@userId", userId) - }); + "WHERE (ur.roleId = @roleId) AND (ur.userId = @userId)") + .WithParameter("@roleId", roleId) + .WithParameter("@userId", userId); Debug.WriteLine(query.QueryText); - return await ExecuteSqlQuery>(query, Context.FeedOptions).SingleOrDefaultAsync(); + return await (await ExecuteSqlQuery>(query, Context.FeedOptions).ConfigureAwait(false)).SingleOrDefaultAsync(); } protected override Task FindUserAsync(string userId, CancellationToken cancellationToken) @@ -292,10 +290,9 @@ protected override Task> FindUserLoginAsync(stri protected override async Task AddUserTokenAsync(Model.IdentityUserToken token) { - var doc = await Context.Client.CreateDocumentAsync(Context.IdentityDocumentCollection.DocumentsLink, token - , Context.RequestOptions, true); - Context.SetSessionTokenIfEmpty(doc.SessionToken); - token = JsonHelpers.CreateObject>(doc); + var doc = await Context.IdentityContainer.CreateItemAsync>(token, new PartitionKey(token.PartitionKey), Context.RequestOptions); + Context.SetSessionTokenIfEmpty(doc.Headers.Session); + token = doc.Resource; } protected override Model.IdentityUserToken CreateUserToken(TUser user, string loginProvider, string name, string value) @@ -311,9 +308,8 @@ protected override Model.IdentityUserToken CreateUserToken(TUser user, s protected override async Task RemoveUserTokenAsync(Model.IdentityUserToken token) { - var doc = await Context.Client.DeleteDocumentAsync(token.SelfLink, - Context.RequestOptions); - Context.SetSessionTokenIfEmpty(doc.SessionToken); + var doc = await Context.IdentityContainer.DeleteItemAsync>(token.Id, new PartitionKey(token.PartitionKey), Context.RequestOptions); + Context.SetSessionTokenIfEmpty(doc.Headers.Session); } } @@ -373,44 +369,53 @@ public UserStore(TContext context, IdentityErrorDescriber describer = null): bas public TContext Context { get; private set; } - internal protected IEnumerable ExecuteSqlQuery(SqlQuerySpec sqlQuery, FeedOptions feedOptions = null) where Q : class + internal protected async Task> ExecuteSqlQuery(QueryDefinition sqlQuery, QueryRequestOptions queryOptions = null) where Q : class { - if(feedOptions == null) +#if !NETSTANDARD2_1 + List results = new List(); +#endif + + if (queryOptions == null) { - feedOptions = Context.FeedOptions; + queryOptions = Context.FeedOptions; } - var results = Context.Client.CreateDocumentQuery(Context.IdentityDocumentCollection.DocumentsLink, sqlQuery, - Context.FeedOptions); - foreach (dynamic d in results.ToList()) + var feedIterator = Context.IdentityContainer.GetItemQueryIterator(sqlQuery, requestOptions: queryOptions); + + while (feedIterator.HasMoreResults) { - Q q = d; - //Q q = JsonHelpers.CreateObject( d.ToString()); - yield return q; + foreach (Q q in (await feedIterator.ReadNextAsync())) + { +#if NETSTANDARD2_1 + yield return q; +#else + results.Add(q); +#endif + } } +#if !NETSTANDARD2_1 + return results; +#endif } protected IOrderedQueryable UsersSet { get { - return Context.Client.CreateDocumentQuery(Context.IdentityDocumentCollection.DocumentsLink, - Context.FeedOptions); + return Context.IdentityContainer.GetItemLinqQueryable(true); } } protected IOrderedQueryable Roles { get { - return Context.Client.CreateDocumentQuery(Context.IdentityDocumentCollection.DocumentsLink, - Context.FeedOptions); + return Context.IdentityContainer.GetItemLinqQueryable(true); } } protected IOrderedQueryable UserClaims { get { - return Context.Client.CreateDocumentQuery(Context.IdentityDocumentCollection.DocumentsLink, - Context.FeedOptions); + return Context.IdentityContainer.GetItemLinqQueryable(true); } } @@ -418,8 +423,7 @@ protected IOrderedQueryable UserTokens { get { - return Context.Client.CreateDocumentQuery(Context.IdentityDocumentCollection.DocumentsLink, - Context.FeedOptions); + return Context.IdentityContainer.GetItemLinqQueryable(true); } } @@ -439,10 +443,9 @@ public async override Task CreateAsync(TUser user, CancellationT throw new ArgumentNullException(nameof(user)); } - var doc = await Context.Client.CreateDocumentAsync(Context.IdentityDocumentCollection.DocumentsLink, user - , Context.RequestOptions, true); - Context.SetSessionTokenIfEmpty(doc.SessionToken); - user = JsonHelpers.CreateObject(doc) ; + var doc = await Context.IdentityContainer.CreateItemAsync(user, new PartitionKey(user.PartitionKey), Context.RequestOptions); + Context.SetSessionTokenIfEmpty(doc.Headers.Session); + user = doc.Resource; return IdentityResult.Success; } @@ -464,15 +467,16 @@ public override async Task UpdateAsync(TUser user, CancellationT user.ConcurrencyStamp = Guid.NewGuid().ToString(); try { - AccessCondition ac = new AccessCondition { Condition = user.ETag, Type = AccessConditionType.IfMatch }; - RequestOptions ro = Context.RequestOptions; - //ro.AccessCondition = ac; - var doc = await Context.Client.ReplaceDocumentAsync(user.SelfLink, user, ro); - Context.SetSessionTokenIfEmpty(doc.SessionToken); - user = JsonHelpers.CreateObject(doc); + ItemRequestOptions ro = Context.RequestOptions; + //TODO: Investigate why UserManager is updating twice with different ETag + //ro.IfMatchEtag = user.ETag; + + var doc = await Context.IdentityContainer.ReplaceItemAsync(user, user.Id.ToString(), new PartitionKey(user.PartitionKey), ro); + Context.SetSessionTokenIfEmpty(doc.Headers.Session); + user = doc.Resource; return IdentityResult.Success; } - catch (DocumentClientException dc) + catch (CosmosException dc) { return ConcurrencyCheckResultFailed(dc); } @@ -484,9 +488,9 @@ public override async Task UpdateAsync(TUser user, CancellationT /// /// /// - protected IdentityResult ConcurrencyCheckResultFailed(DocumentClientException dc) + protected IdentityResult ConcurrencyCheckResultFailed(CosmosException dc) { - if (dc.StatusCode.HasValue && dc.StatusCode.Value == HttpStatusCode.PreconditionFailed) + if (dc.StatusCode == HttpStatusCode.PreconditionFailed) { return IdentityResult.Failed(ErrorDescriber.ConcurrencyFailure()); } @@ -511,11 +515,10 @@ public override async Task DeleteAsync(TUser user, CancellationT try { - var doc = await Context.Client.DeleteDocumentAsync(user.SelfLink, - Context.RequestOptions); - Context.SetSessionTokenIfEmpty(doc.SessionToken); + var doc = await Context.IdentityContainer.DeleteItemAsync(user.Id.ToString(), new PartitionKey(user.PartitionKey), Context.RequestOptions); + Context.SetSessionTokenIfEmpty(doc.Headers.Session); } - catch (DocumentClientException dc) + catch (CosmosException dc) { return ConcurrencyCheckResultFailed(dc); } @@ -534,29 +537,16 @@ public override async Task FindByIdAsync(string userId, CancellationToken { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - return await Context.Client.ExecuteStoredProcedureAsync>(Context.GetUserByIdSproc.SelfLink, - Context.RequestOptions, - new dynamic[] { userId }) - .ContinueWith((storedProcTask) => { - Context.SetSessionTokenIfEmpty(storedProcTask.Result.SessionToken); - return GetUserAggregate(storedProcTask.Result.Response.ToList()); - }); - - } - - private TUser GetUserAggregate(List userResults) - { - TUser user = default(TUser); - var vUser = userResults.Where(u => u.Id == u.Id).SingleOrDefault(); + StoredProcedureExecuteResponse response = await Context.IdentityContainer.Scripts.ExecuteStoredProcedureAsync( + Context.GetUserByIdSproc, + new PartitionKey(PartitionKeyHelper.GetPartitionKeyFromId(userId)), + new dynamic[] { userId }); - if (vUser != null) - { - user = (dynamic)vUser; - } - return user; + return !string.IsNullOrWhiteSpace(response.Resource) ? + JsonConvert.DeserializeObject(response.Resource) : null; + } - /// /// Finds and returns a user, if any, who has the specified normalized user name. /// @@ -569,12 +559,16 @@ public override async Task FindByNameAsync(string normalizedUserName, Can { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - return await Context.Client.ExecuteStoredProcedureAsync>(Context.GetUserByUserNameSproc.SelfLink, - Context.RequestOptions, - new dynamic[] { normalizedUserName }).ContinueWith((storedProcTask) => { - Context.SetSessionTokenIfEmpty(storedProcTask.Result.SessionToken); - return GetUserAggregate(storedProcTask.Result.Response.ToList()); - }); + + //TODO: Deprecate Stored Proc: getUserByUserName_v1 + QueryDefinition query = new QueryDefinition("SELECT * FROM root r " + + "WHERE (r.normalizedUserName = @normalizedName) ") + .WithParameter("@normalizedName", normalizedUserName); + + Console.WriteLine(query.QueryText); + return await (await ExecuteSqlQuery(query, Context.FeedOptions) + .ConfigureAwait(false)) + .FirstOrDefaultAsync(cancellationToken: cancellationToken); } /// @@ -649,14 +643,13 @@ public override async Task IsInRoleAsync(TUser user, string normalizedRole protected async Task GetRoleIdByNormalizedNameAsync(string normalizedRoleName, CancellationToken cancellationToken = default(CancellationToken)) { - SqlQuerySpec roleQuery = new SqlQuerySpec("SELECT VALUE r.id " + + QueryDefinition roleQuery = new QueryDefinition("SELECT VALUE r.id " + "FROM ROOT r " + - "WHERE (r.normalizedName = @normalizedName) ", new SqlParameterCollection(){ - new SqlParameter("@normalizedName", normalizedRoleName) - }); + "WHERE (r.normalizedName = @normalizedName) ") + .WithParameter("@normalizedName", normalizedRoleName); Console.WriteLine(roleQuery.QueryText); - var roleIds = await ExecuteSqlQuery(roleQuery, Context.FeedOptions).ToListAsync(cancellationToken: cancellationToken); + var roleIds = await (await ExecuteSqlQuery(roleQuery, Context.FeedOptions).ConfigureAwait(false)).ToListAsync(cancellationToken: cancellationToken); return roleIds.FirstOrDefault(); } @@ -856,11 +849,17 @@ public override async Task> GetLoginsAsync(TUser user, Canc { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - var result = await Context.Client.ExecuteStoredProcedureAsync>(Context.GetUserByLoginSproc.SelfLink, - Context.RequestOptions, - new dynamic[] { loginProvider, providerKey }); - Context.SetSessionTokenIfEmpty(result.SessionToken); - return GetUserAggregate(result.Response.ToList()); + //TODO: Deprecate Stored Proc: getUserByLogin_v1 + QueryDefinition query = new QueryDefinition("SELECT VALUE r FROM root r JOIN l IN r.logins " + + "WHERE l.loginProvider = @loginProvider " + + "AND l.providerKey = @providerKey ") + .WithParameter("@loginProvider", loginProvider) + .WithParameter("@providerKey", providerKey); + + Console.WriteLine(query.QueryText); + return await (await ExecuteSqlQuery(query, Context.FeedOptions) + .ConfigureAwait(false)) + .FirstOrDefaultAsync(cancellationToken: cancellationToken); } @@ -876,20 +875,31 @@ public override async Task FindByEmailAsync(string normalizedEmail, Cance { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - return await Context.Client.ExecuteStoredProcedureAsync>(Context.GetUserByEmailSproc.SelfLink, - Context.RequestOptions, - new dynamic[] { normalizedEmail }).ContinueWith((storedProcTask) => { - Context.SetSessionTokenIfEmpty(storedProcTask.Result.SessionToken); - return GetUserAggregate(storedProcTask.Result.Response.ToList()); - }); + //TODO: Deprecate Stored Proc: getUserByEmail_v1 + QueryDefinition query = new QueryDefinition("SELECT * FROM root r " + + "WHERE (r.normalizedEmail = @normalizedEmail) ") + .WithParameter("@normalizedEmail", normalizedEmail); + + Console.WriteLine(query.QueryText); + return await (await ExecuteSqlQuery(query, Context.FeedOptions) + .ConfigureAwait(false)) + .FirstOrDefaultAsync(cancellationToken: cancellationToken); } - public async virtual Task> FindAllByEmailAsync(string email, CancellationToken cancellationToken = default(CancellationToken)) + public async virtual Task> FindAllByEmailAsync(string normalizedEmail, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - return await Users.ToListAsync(where:u => u.Email == email, cancellationToken: cancellationToken); - } + + QueryDefinition query = new QueryDefinition("SELECT * FROM root r " + + "WHERE (r.normalizedEmail = @normalizedEmail) ") + .WithParameter("@normalizedEmail", normalizedEmail); + + Console.WriteLine(query.QueryText); + return await (await ExecuteSqlQuery(query, Context.FeedOptions) + .ConfigureAwait(false)) + .ToListAsync(cancellationToken: cancellationToken); + } } } diff --git a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/BaseTest.cs b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/BaseTest.cs index 8d7dd7b..baff5b1 100644 --- a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/BaseTest.cs +++ b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/BaseTest.cs @@ -11,7 +11,7 @@ using Microsoft.Extensions.Configuration.Json; using Microsoft.AspNetCore.Builder; using Microsoft.VisualStudio.TestTools.UnitTesting; -using Microsoft.Azure.Documents.Client; +using Microsoft.Azure.Cosmos; namespace ElCamino.AspNetCore.Identity.CosmosDB.Tests { @@ -105,13 +105,16 @@ public static IdentityConfiguration GetConfig() AuthKey = root["IdentityCosmosDB:identityConfiguration:authKey"], Database = root["IdentityCosmosDB:identityConfiguration:database"], IdentityCollection = root["IdentityCosmosDB:identityConfiguration:identityCollection"], - Policy = new ConnectionPolicy() + Options = new CosmosClientOptions() { ConnectionMode = ConnectionMode.Gateway, - ConnectionProtocol = Protocol.Https + ConsistencyLevel = ConsistencyLevel.Session, + SerializerOptions = new CosmosSerializationOptions() } }; + idconfig.Options.SerializerOptions.PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase; + return idconfig; } diff --git a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests.csproj b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests.csproj index 920e62e..1c9a55c 100644 --- a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests.csproj +++ b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests.csproj @@ -34,7 +34,7 @@ - + diff --git a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/RoleStoreTests.cs b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/RoleStoreTests.cs index adf23ef..f3d7209 100644 --- a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/RoleStoreTests.cs +++ b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/RoleStoreTests.cs @@ -6,13 +6,15 @@ using ElCamino.AspNetCore.Identity.CosmosDB.Model; using Newtonsoft.Json; using System.Diagnostics; -using Microsoft.Azure.Documents.Linq; using System.Linq; using System.Threading; using ElCamino.AspNetCore.Identity.CosmosDB.Tests.ModelTests; using System.Security.Claims; using IdentityRole = ElCamino.AspNetCore.Identity.CosmosDB.Model.IdentityRole; using IdentityUser = ElCamino.AspNetCore.Identity.CosmosDB.Model.IdentityUser; +using ElCamino.AspNetCore.Identity.CosmosDB.Helpers; +using Microsoft.Azure.Cosmos; +using System.Threading.Tasks; namespace ElCamino.AspNetCore.Identity.CosmosDB.Tests { @@ -49,91 +51,84 @@ private Claim GenRoleClaim() [TestMethod] [TestCategory("RoleStore.Role")] - public void AddRemoveRoleClaim() + public async Task AddRemoveRoleClaim() { RoleManager manager = CreateRoleManager(true); string roleNew = string.Format("TestRole_{0}", Guid.NewGuid()); Console.WriteLine($"RoleId: {roleNew}"); var role = new IdentityRole(roleNew); var start = DateTime.UtcNow; - var createTask = manager.CreateAsync(role); - createTask.Wait(); + var createTask = await manager.CreateAsync(role); Console.WriteLine("CreateRoleAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); Claim c1 = GenRoleClaim(); Claim c2 = GenRoleClaim(); - AddRoleClaimHelper(role, c1); - AddRoleClaimHelper(role, c2); + await AddRoleClaimHelper(role, c1); + await AddRoleClaimHelper(role, c2); - RemoveRoleClaimHelper(role, c1); + await RemoveRoleClaimHelper(role, c1); } [TestMethod] [TestCategory("RoleStore.Role")] - public void AddRoleClaim() + public async Task AddRoleClaim() { RoleStore store = CreateRoleStore(true); RoleManager manager = CreateRoleManager(true); string roleNew = string.Format("TestRole_{0}", Guid.NewGuid()); var role = new IdentityRole(roleNew); var start = DateTime.UtcNow; - var createTask = manager.CreateAsync(role); - createTask.Wait(); + var createTask = await manager.CreateAsync(role); Console.WriteLine("CreateRoleAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - AddRoleClaimHelper(role, GenRoleClaim()); + await AddRoleClaimHelper(role, GenRoleClaim()); - role = manager.FindByIdAsync(role.Id).Result; + role = await manager.FindByIdAsync(role.Id); WriteLineObject(role); } - private void AddRoleClaimHelper(IdentityRole role, Claim claim) + private async Task AddRoleClaimHelper(IdentityRole role, Claim claim) { RoleManager manager = CreateRoleManager(true); - var userClaimTask = manager.AddClaimAsync(role, claim); + var userClaimTask = await manager.AddClaimAsync(role, claim); + var claimsTask = await manager.GetClaimsAsync(role); - userClaimTask.Wait(); - var claimsTask = manager.GetClaimsAsync(role); - - claimsTask.Wait(); - Assert.IsTrue(claimsTask.Result.ToList().Any(c => c.Value == claim.Value & c.ValueType == claim.ValueType), "Claim not found"); + Assert.IsTrue(claimsTask.ToList().Any(c => c.Value == claim.Value & c.ValueType == claim.ValueType), "Claim not found"); } - private void RemoveRoleClaimHelper(IdentityRole role, Claim claim) + private async Task RemoveRoleClaimHelper(IdentityRole role, Claim claim) { RoleStore store = CreateRoleStore(true); RoleManager manager = CreateRoleManager(true); - var userClaimTask = manager.RemoveClaimAsync(role, claim); + var userClaimTask = await manager.RemoveClaimAsync(role, claim); - userClaimTask.Wait(); - var claimsTask = manager.GetClaimsAsync(role); + var claimsTask = await manager.GetClaimsAsync(role); - claimsTask.Wait(); - Assert.IsFalse(claimsTask.Result.ToList().Any(c => c.Value == claim.Value & c.ValueType == claim.ValueType), "Claim not found"); + Assert.IsFalse(claimsTask.ToList().Any(c => c.Value == claim.Value & c.ValueType == claim.ValueType), "Claim not found"); } [TestMethod] [TestCategory("RoleStore.Role")] - public void CreateRoleScratch() + public async Task CreateRoleScratch() { Guid id = Guid.NewGuid(); IdentityCloudContext context = GetContext(); - var doc = new { id = id.ToString(), SpiderMonkey = "Monkey baby" }; - var docTask = context.Client.CreateDocumentAsync(context.IdentityDocumentCollection.SelfLink, - doc, context.RequestOptions); - docTask.Wait(); - var docResult = docTask.Result; + var doc = new IdentityRole() + { + Id = id.ToString(), + Name = "SpiderMonkey" + }; + var docResult = await context.IdentityContainer.CreateItemAsync( + doc, new PartitionKey(doc.PartitionKey), context.RequestOptions); Console.WriteLine(docResult.Resource.ToString()); var fo = context.FeedOptions; fo.MaxItemCount = 1; - var docQrTask = context.Client.CreateDocumentQuery(context.IdentityDocumentCollection.DocumentsLink - , fo) - .Where(d => d.Id == doc.id) - .Select(s => s) + var docQrTask = context.IdentityContainer.GetItemLinqQueryable(true) + .Where(d => d.Id == doc.Id) .ToList() .FirstOrDefault(); Console.WriteLine(docQrTask.ToString()); @@ -143,138 +138,127 @@ public void CreateRoleScratch() [TestMethod] [TestCategory("RoleStore.Role")] - public void CreateRole() + public async Task CreateRole() { RoleStore store = CreateRoleStore(true); RoleManager manager = CreateRoleManager(true); - var role = CreateRoleHelper(manager); + var role = await CreateRoleHelper(manager); WriteLineObject(role); - AssertInnerExceptionType(() => store.CreateAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.CreateAsync(null)); } - private IdentityRole CreateRoleHelper(RoleManager manager) + private async Task CreateRoleHelper(RoleManager manager) { string roleNew = string.Format("TestRole_{0}", Guid.NewGuid()); var role = new IdentityRole(roleNew); - var createTask = manager.CreateAsync(role); - createTask.Wait(); + var createTask = await manager.CreateAsync(role); return role; } [TestMethod] [TestCategory("RoleStore.Role")] - public void ThrowIfDisposed() + public async Task ThrowIfDisposed() { RoleStore store = new RoleStore(new IdentityCloudContext(GetConfig()), new IdentityErrorDescriber()); store.Dispose(); - AssertInnerExceptionType(() => store.DeleteAsync(new IdentityRole()).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.DeleteAsync(new IdentityRole())); } [TestMethod] [TestCategory("RoleStore.Role")] - public void UpdateRole() + public async Task UpdateRole() { RoleStore store = CreateRoleStore(true); RoleManager manager = CreateRoleManager(true); string roleNew = string.Format("TestRole_{0}", Guid.NewGuid()); var role = new IdentityRole(roleNew); - var createTask = manager.CreateAsync(role); - createTask.Wait(); + var createTask = await manager.CreateAsync(role); role.Name = Guid.NewGuid() + role.Name; - var updateTask = manager.UpdateAsync(role); - updateTask.Wait(); + var updateTask = await manager.UpdateAsync(role); - var findTask = manager.FindByIdAsync(role.Id); + var findTask = await manager.FindByIdAsync(role.Id); - Assert.IsNotNull(findTask.Result, "Find Role Result is null"); - Assert.AreNotEqual(roleNew, findTask.Result.Name, "Name not updated."); + Assert.IsNotNull(findTask, "Find Role Result is null"); + Assert.AreNotEqual(roleNew, findTask.Name, "Name not updated."); - AssertInnerExceptionType(() => store.UpdateAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.UpdateAsync(null)); } [TestMethod] [TestCategory("RoleStore.Role")] - public void UpdateRole2() + public async Task UpdateRole2() { RoleStore store = CreateRoleStore(true); RoleManager manager = CreateRoleManager(true); string roleNew = string.Format("{0}_TestRole", Guid.NewGuid()); var role = new IdentityRole(roleNew); - var createTask = manager.CreateAsync(role); - createTask.Wait(); + var createTask = await manager.CreateAsync(role); role.Name = role.Name + Guid.NewGuid(); - var updateTask = manager.UpdateAsync(role); - updateTask.Wait(); - - var findTask = manager.FindByIdAsync(role.Id); - findTask.Wait(); - Assert.IsNotNull(findTask.Result, "Find Role Result is null"); - Assert.AreEqual(role.Id, findTask.Result.Id, "RowKeys don't match."); - Assert.AreNotEqual(roleNew, findTask.Result.Name, "Name not updated."); + var updateTask = await manager.UpdateAsync(role); + + var findTask = await manager.FindByIdAsync(role.Id); + Assert.IsNotNull(findTask, "Find Role Result is null"); + Assert.AreEqual(role.Id, findTask.Id, "RowKeys don't match."); + Assert.AreNotEqual(roleNew, findTask.Name, "Name not updated."); } [TestMethod] [TestCategory("RoleStore.Role")] - public void DeleteRole() + public async Task DeleteRole() { RoleStore store = CreateRoleStore(true); RoleManager manager = CreateRoleManager(true); string roleNew = string.Format("TestRole_{0}", Guid.NewGuid()); var role = new IdentityRole(roleNew); - var createTask = manager.CreateAsync(role); - createTask.Wait(); + var createTask = await manager.CreateAsync(role); - role = manager.FindByIdAsync(role.Id).Result; - var delTask = manager.DeleteAsync(role); - delTask.Wait(); + role = await manager.FindByIdAsync(role.Id); + var delTask = await manager.DeleteAsync(role); - var findTask = manager.FindByIdAsync(role.Id); - findTask.Wait(); - Assert.IsNull(findTask.Result, "Role not deleted "); + var findTask = await manager.FindByIdAsync(role.Id); + Assert.IsNull(findTask, "Role not deleted "); - AssertInnerExceptionType(() => store.DeleteAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.DeleteAsync(null)); } [TestMethod] [TestCategory("RoleStore.Role")] - public void FindRoleById() + public async Task FindRoleById() { RoleStore store = CreateRoleStore(true); RoleManager manager = CreateRoleManager(true); DateTime start = DateTime.UtcNow; - var role = CreateRoleHelper(manager); - var findTask = manager.FindByIdAsync(role.Id); - findTask.Wait(); + var role = await CreateRoleHelper(manager); + var findTask = await manager.FindByIdAsync(role.Id); Console.WriteLine("FindByIdAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - Assert.IsNotNull(findTask.Result, "Find Role Result is null"); - WriteLineObject(findTask.Result); - Assert.AreEqual(role.Id, findTask.Result.Id, "Role Ids don't match."); + Assert.IsNotNull(findTask, "Find Role Result is null"); + WriteLineObject(findTask); + Assert.AreEqual(role.Id, findTask.Id, "Role Ids don't match."); } [TestMethod] [TestCategory("RoleStore.Role")] - public void FindRoleByName() + public async Task FindRoleByName() { RoleManager manager = CreateRoleManager(true); - var role = CreateRoleHelper(manager); + var role = await CreateRoleHelper(manager); DateTime start = DateTime.UtcNow; - var findTask = manager.FindByNameAsync(role.Name); - findTask.Wait(); + var findTask = await manager.FindByNameAsync(role.Name); Console.WriteLine("FindByNameAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - Assert.IsNotNull(findTask.Result, "Find Role Result is null"); - Assert.AreEqual(role.Name, findTask.Result.Name, "Role names don't match."); + Assert.IsNotNull(findTask, "Find Role Result is null"); + Assert.AreEqual(role.Name, findTask.Name, "Role names don't match."); } private void WriteLineObject(t obj) where t : class diff --git a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/UserStoreTests.Properties.partial.cs b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/UserStoreTests.Properties.partial.cs index 1922abe..1b18098 100644 --- a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/UserStoreTests.Properties.partial.cs +++ b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/UserStoreTests.Properties.partial.cs @@ -6,13 +6,13 @@ using ElCamino.AspNetCore.Identity.CosmosDB.Model; using Newtonsoft.Json; using System.Diagnostics; -using Microsoft.Azure.Documents.Linq; using System.Linq; using System.Threading; using ElCamino.AspNetCore.Identity.CosmosDB.Tests.ModelTests; using System.Security.Claims; using IdentityRole = ElCamino.AspNetCore.Identity.CosmosDB.Model.IdentityRole; using IdentityUser = ElCamino.AspNetCore.Identity.CosmosDB.Model.IdentityUser; +using System.Threading.Tasks; namespace ElCamino.AspNetCore.Identity.CosmosDB.Tests { @@ -23,69 +23,55 @@ public partial class UserStoreTests : BaseTest store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CreateTestUser(includeRoles); - var taskUser = manager.GetAccessFailedCountAsync(user); + var user = await CreateTestUser(includeRoles); + var taskUser = await manager.GetAccessFailedCountAsync(user); + Assert.AreEqual(user.AccessFailedCount, taskUser); - taskUser.Wait(); - Assert.AreEqual(user.AccessFailedCount, taskUser.Result); + var taskAccessFailed = await manager.AccessFailedAsync(user); + Assert.IsTrue(taskAccessFailed.Succeeded, string.Concat(taskAccessFailed.Errors.Select(e => e.Code).ToArray())); - var taskAccessFailed = manager.AccessFailedAsync(user); + user = await manager.FindByIdAsync(user.Id); - taskAccessFailed.Wait(); + var taskAccessReset = await manager.ResetAccessFailedCountAsync(user); + Assert.IsTrue(taskAccessReset.Succeeded, string.Concat(taskAccessReset.Errors)); - Assert.IsTrue(taskAccessFailed.Result.Succeeded, string.Concat(taskAccessFailed.Result.Errors.Select(e => e.Code).ToArray())); - - var userTaskFindById = manager.FindByIdAsync(user.Id); - userTaskFindById.Wait(); - user = userTaskFindById.Result; - - var taskAccessReset = manager.ResetAccessFailedCountAsync(user); - - taskAccessReset.Wait(); - Assert.IsTrue(taskAccessReset.Result.Succeeded, string.Concat(taskAccessReset.Result.Errors)); - - Assert.ThrowsException(() => store.GetAccessFailedCountAsync(null).Wait()); - Assert.ThrowsException(() => store.IncrementAccessFailedCountAsync(null).Wait()); - Assert.ThrowsException(() => store.ResetAccessFailedCountAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.GetAccessFailedCountAsync(null)); + await Assert.ThrowsExceptionAsync(async () => await store.IncrementAccessFailedCountAsync(null)); + await Assert.ThrowsExceptionAsync(async () => await store.ResetAccessFailedCountAsync(null)); } - private void SetValidateEmail(UserManager manager, + private async Task SetValidateEmail(UserManager manager, UserStore store, ApplicationUser user, string strNewEmail) { string originalEmail = user.Email; - var taskUserSet = manager.SetEmailAsync(user, strNewEmail); - - taskUserSet.Wait(); - Assert.IsTrue(taskUserSet.Result.Succeeded, string.Concat(taskUserSet.Result.Errors)); + var taskUserSet = await manager.SetEmailAsync(user, strNewEmail); - var taskUser = manager.GetEmailAsync(user); + Assert.IsTrue(taskUserSet.Succeeded, string.Concat(taskUserSet.Errors)); - taskUser.Wait(); - Assert.AreEqual(strNewEmail, taskUser.Result); + var taskUser = await manager.GetEmailAsync(user); + Assert.AreEqual(strNewEmail, taskUser); if (!string.IsNullOrWhiteSpace(strNewEmail)) { - var taskFind = manager.FindByEmailAsync(strNewEmail); - taskFind.Wait(); - Assert.AreEqual(strNewEmail, taskFind.Result.Email); + var taskFind = await manager.FindByEmailAsync(strNewEmail); + Assert.AreEqual(strNewEmail, taskFind.Email); } else { - var noEmailUser = manager.FindByIdAsync(user.Id).Result; + var noEmailUser = await manager.FindByIdAsync(user.Id); Assert.IsTrue(string.IsNullOrWhiteSpace(noEmailUser.Email)); } //Should not find old by old email. if (!string.IsNullOrWhiteSpace(originalEmail)) { - var taskFind = manager.FindByEmailAsync(originalEmail); - taskFind.Wait(); - Assert.IsNull(taskFind.Result); + var taskFind = await manager.FindByEmailAsync(originalEmail); + Assert.IsNull(taskFind); } } @@ -94,15 +80,15 @@ public void AccessFailedCount(bool includeRoles) [TestCategory("UserStore.Properties")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void EmailNone(bool includeRoles) + public async Task EmailNone(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CreateTestUser(false, false); + var user = await CreateTestUser(false, false); string strNewEmail = string.Format("{0}@hotmail.com", Guid.NewGuid().ToString("N")); - SetValidateEmail(manager, store, user, strNewEmail); + await SetValidateEmail(manager, store, user, strNewEmail); - SetValidateEmail(manager, store, user, string.Empty); + await SetValidateEmail(manager, store, user, string.Empty); } @@ -110,18 +96,18 @@ public void EmailNone(bool includeRoles) [TestCategory("UserStore.Properties")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void Email(bool includeRoles) + public async Task Email(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CurrentUser(includeRoles); + var user = await CurrentUser(includeRoles); string strNewEmail = string.Format("{0}@gmail.com", Guid.NewGuid().ToString("N")); - SetValidateEmail(manager, store, user, strNewEmail); + await SetValidateEmail(manager, store, user, strNewEmail); - Assert.ThrowsException(() => store.GetEmailAsync(null).Wait()); - Assert.ThrowsException(() => store.SetEmailAsync(null, strNewEmail).Wait()); - store.SetEmailAsync(user, null).Wait(); + await Assert.ThrowsExceptionAsync(() => store.GetEmailAsync(null)); + await Assert.ThrowsExceptionAsync(() => store.SetEmailAsync(null, strNewEmail)); + await store.SetEmailAsync(user, null); Assert.IsNull(user.Email); } @@ -130,36 +116,26 @@ public void Email(bool includeRoles) [TestCategory("UserStore.Properties")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void EmailConfirmed(bool includeRoles) + public async Task EmailConfirmed(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CreateTestUser(includeRoles); - - - var taskUserSet = manager.GenerateEmailConfirmationTokenAsync(user); - - taskUserSet.Wait(); - Assert.IsFalse(string.IsNullOrWhiteSpace(taskUserSet.Result), "GenerateEmailConfirmationToken failed."); - string token = taskUserSet.Result; - + var user = await CreateTestUser(includeRoles); - var taskConfirm = manager.ConfirmEmailAsync(user, token); - taskConfirm.Wait(); - Assert.IsTrue(taskConfirm.Result.Succeeded, string.Concat(taskConfirm.Result.Errors)); + string token = await manager.GenerateEmailConfirmationTokenAsync(user); + Assert.IsFalse(string.IsNullOrWhiteSpace(token), "GenerateEmailConfirmationToken failed."); + var taskConfirm = await manager.ConfirmEmailAsync(user, token); + Assert.IsTrue(taskConfirm.Succeeded, string.Concat(taskConfirm.Errors)); - var userTask02 = manager.FindByEmailAsync(user.Email); - userTask02.Wait(); - user = userTask02.Result; + user = await manager.FindByEmailAsync(user.Email); - var taskConfirmGet = store.GetEmailConfirmedAsync(user); - taskConfirmGet.Wait(); - Assert.IsTrue(taskConfirmGet.Result, "Email not confirmed"); + var taskConfirmGet = await store.GetEmailConfirmedAsync(user); + Assert.IsTrue(taskConfirmGet, "Email not confirmed"); - Assert.ThrowsException(() => store.SetEmailConfirmedAsync(null, true).Wait()); - Assert.ThrowsException(() => store.GetEmailConfirmedAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.SetEmailConfirmedAsync(null, true)); + await Assert.ThrowsExceptionAsync(async() => await store.GetEmailConfirmedAsync(null)); } @@ -167,85 +143,70 @@ public void EmailConfirmed(bool includeRoles) [TestCategory("UserStore.Properties")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void LockoutEnabled(bool includeRoles) + public async Task LockoutEnabled(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CurrentUser(includeRoles); + var user = await CurrentUser(includeRoles); - var taskLockoutSet = manager.SetLockoutEnabledAsync(user, true); - - taskLockoutSet.Wait(); - Assert.IsTrue(taskLockoutSet.Result.Succeeded, string.Concat(taskLockoutSet.Result.Errors)); + var taskLockoutSet = await manager.SetLockoutEnabledAsync(user, true); + Assert.IsTrue(taskLockoutSet.Succeeded, string.Concat(taskLockoutSet.Errors)); DateTimeOffset offSet = new DateTimeOffset(DateTime.Now.AddMinutes(3)); - var taskDateSet = manager.SetLockoutEndDateAsync(user, offSet); - - taskDateSet.Wait(); - Assert.IsTrue(taskDateSet.Result.Succeeded, string.Concat(taskDateSet.Result.Errors)); - + var taskDateSet = await manager.SetLockoutEndDateAsync(user, offSet); + Assert.IsTrue(taskDateSet.Succeeded, string.Concat(taskDateSet.Errors)); - var taskEnabledGet = manager.GetLockoutEnabledAsync(user); - taskEnabledGet.Wait(); - Assert.IsTrue(taskEnabledGet.Result, "Lockout not true"); + var taskEnabledGet = await manager.GetLockoutEnabledAsync(user); + Assert.IsTrue(taskEnabledGet, "Lockout not true"); - var taskDateGet = manager.GetLockoutEndDateAsync(user); - - taskDateGet.Wait(); - Assert.AreEqual(offSet, taskDateGet.Result); + var taskDateGet = await manager.GetLockoutEndDateAsync(user); + Assert.AreEqual(offSet, taskDateGet); DateTime tmpDate = DateTime.UtcNow.AddDays(1); user.LockoutEnd = tmpDate; - var taskGet = store.GetLockoutEndDateAsync(user); - taskGet.Wait(); - - Assert.AreEqual(new DateTimeOffset?(tmpDate), taskGet.Result); + var taskGet = await store.GetLockoutEndDateAsync(user); + Assert.AreEqual(new DateTimeOffset?(tmpDate), taskGet); user.LockoutEnd = null; - var taskGet2 = store.GetLockoutEndDateAsync(user); - taskGet2.Wait(); - Assert.AreEqual(new DateTimeOffset?(), taskGet2.Result); + var taskGet2 = await store.GetLockoutEndDateAsync(user); + Assert.AreEqual(new DateTimeOffset?(), taskGet2); var minOffSet = DateTimeOffset.MinValue; - var taskSet2 = store.SetLockoutEndDateAsync(user, minOffSet); - taskSet2.Wait(); + await store.SetLockoutEndDateAsync(user, minOffSet); Assert.IsNotNull(user.LockoutEnd); - Assert.ThrowsException(() => store.GetLockoutEnabledAsync(null).Wait()); - Assert.ThrowsException(() => store.GetLockoutEndDateAsync(null).Wait()); - Assert.ThrowsException(() => store.SetLockoutEndDateAsync(null, offSet).Wait()); - Assert.ThrowsException(() => store.SetLockoutEnabledAsync(null, false).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.GetLockoutEnabledAsync(null)); + await Assert.ThrowsExceptionAsync(async () => await store.GetLockoutEndDateAsync(null)); + await Assert.ThrowsExceptionAsync(async () => await store.SetLockoutEndDateAsync(null, offSet)); + await Assert.ThrowsExceptionAsync(async () => await store.SetLockoutEnabledAsync(null, false)); } [TestMethod] [TestCategory("UserStore.Properties")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void PhoneNumber(bool includeRoles) + public async Task PhoneNumber(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CurrentUser(includeRoles); + var user = await CurrentUser(includeRoles); string strNewPhoneNumber = "542-887-3434"; - var taskPhoneNumberSet = manager.SetPhoneNumberAsync(user, strNewPhoneNumber); + var taskPhoneNumberSet = await manager.SetPhoneNumberAsync(user, strNewPhoneNumber); + Assert.IsTrue(taskPhoneNumberSet.Succeeded, string.Concat(taskPhoneNumberSet.Errors)); - taskPhoneNumberSet.Wait(); - Assert.IsTrue(taskPhoneNumberSet.Result.Succeeded, string.Concat(taskPhoneNumberSet.Result.Errors)); + var taskUser = await manager.GetPhoneNumberAsync(user); + Assert.AreEqual(strNewPhoneNumber, taskUser); - var taskUser = manager.GetPhoneNumberAsync(user); - taskUser.Wait(); - Assert.AreEqual(strNewPhoneNumber, taskUser.Result); - - Assert.ThrowsException(() => store.GetPhoneNumberAsync(null).Wait()); - Assert.ThrowsException(() => store.SetPhoneNumberAsync(null, strNewPhoneNumber).Wait()); - store.SetPhoneNumberAsync(user, null).Wait(); + await Assert.ThrowsExceptionAsync(async() => await store.GetPhoneNumberAsync(null)); + await Assert.ThrowsExceptionAsync(async() => await store.SetPhoneNumberAsync(null, strNewPhoneNumber)); + await store.SetPhoneNumberAsync(user, null); Assert.IsNull(user.PhoneNumber); } @@ -253,36 +214,29 @@ public void PhoneNumber(bool includeRoles) [TestCategory("UserStore.Properties")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void PhoneNumberConfirmed(bool includeRoles) + public async Task PhoneNumberConfirmed(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CreateTestUser(includeRoles); + var user = await CreateTestUser(includeRoles); string strNewPhoneNumber = "425-555-1111"; - var taskUserSet = manager.GenerateChangePhoneNumberTokenAsync(user, strNewPhoneNumber); - - taskUserSet.Wait(); - Assert.IsFalse(string.IsNullOrWhiteSpace(taskUserSet.Result), "GeneratePhoneConfirmationToken failed."); - string token = taskUserSet.Result; + string token = await manager.GenerateChangePhoneNumberTokenAsync(user, strNewPhoneNumber); + Assert.IsFalse(string.IsNullOrWhiteSpace(token), "GeneratePhoneConfirmationToken failed."); - var taskConfirm = manager.ChangePhoneNumberAsync(user, strNewPhoneNumber, token); - taskConfirm.Wait(); - Assert.IsTrue(taskConfirm.Result.Succeeded, string.Concat(taskConfirm.Result.Errors)); + var taskConfirm = await manager.ChangePhoneNumberAsync(user, strNewPhoneNumber, token); + Assert.IsTrue(taskConfirm.Succeeded, string.Concat(taskConfirm.Errors)); - var uTask01 = manager.FindByEmailAsync(user.Email); - uTask01.Wait(); - user = uTask01.Result; + user = await manager.FindByEmailAsync(user.Email); - var taskConfirmGet = store.GetPhoneNumberConfirmedAsync(user); - taskConfirmGet.Wait(); - Assert.IsTrue(taskConfirmGet.Result, "Phone not confirmed"); + var taskConfirmGet = await store.GetPhoneNumberConfirmedAsync(user); + Assert.IsTrue(taskConfirmGet, "Phone not confirmed"); - Assert.ThrowsException(() => store.SetPhoneNumberConfirmedAsync(null, true).Wait()); - Assert.ThrowsException(() => store.GetPhoneNumberConfirmedAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.SetPhoneNumberConfirmedAsync(null, true)); + await Assert.ThrowsExceptionAsync(async() => await store.GetPhoneNumberConfirmedAsync(null)); } @@ -290,26 +244,22 @@ public void PhoneNumberConfirmed(bool includeRoles) [TestCategory("UserStore.Properties")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void TwoFactorEnabled(bool includeRoles) + public async Task TwoFactorEnabled(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CurrentUser(includeRoles); + var user = await CurrentUser(includeRoles); bool twoFactorEnabled = true; - var taskTwoFactorEnabledSet = manager.SetTwoFactorEnabledAsync(user, twoFactorEnabled); - - taskTwoFactorEnabledSet.Wait(); - Assert.IsTrue(taskTwoFactorEnabledSet.Result.Succeeded, string.Concat(taskTwoFactorEnabledSet.Result.Errors)); - - var taskUser = manager.GetTwoFactorEnabledAsync(user); + var taskTwoFactorEnabledSet = await manager.SetTwoFactorEnabledAsync(user, twoFactorEnabled); + Assert.IsTrue(taskTwoFactorEnabledSet.Succeeded, string.Concat(taskTwoFactorEnabledSet.Errors)); - taskUser.Wait(); - Assert.AreEqual(twoFactorEnabled, taskUser.Result); + var taskUser = await manager.GetTwoFactorEnabledAsync(user); + Assert.AreEqual(twoFactorEnabled, taskUser); - Assert.ThrowsException(() => store.GetTwoFactorEnabledAsync(null).Wait()); - Assert.ThrowsException(() => store.SetTwoFactorEnabledAsync(null, twoFactorEnabled).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.GetTwoFactorEnabledAsync(null)); + await Assert.ThrowsExceptionAsync(async() => await store.SetTwoFactorEnabledAsync(null, twoFactorEnabled)); } @@ -317,33 +267,30 @@ public void TwoFactorEnabled(bool includeRoles) [TestCategory("UserStore.Properties")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void PasswordHash(bool includeRoles) + public async Task PasswordHash(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CurrentUser(includeRoles); + var user = await CurrentUser(includeRoles); string passwordPlain = Guid.NewGuid().ToString("N"); string passwordHash = new PasswordHasher().HashPassword(user, passwordPlain); - var taskUserSet = store.SetPasswordHashAsync(user, passwordHash); - taskUserSet.Wait(); + await store.SetPasswordHashAsync(user, passwordHash); - var taskHasHash = manager.HasPasswordAsync(user); + var taskHasHash = await manager.HasPasswordAsync(user); - taskHasHash.Wait(); - Assert.IsTrue(taskHasHash.Result, "PasswordHash not set"); + Assert.IsTrue(taskHasHash, "PasswordHash not set"); - var taskUser = store.GetPasswordHashAsync(user); - taskUser.Wait(); - Assert.AreEqual(passwordHash, taskUser.Result); + var taskUser = await store.GetPasswordHashAsync(user); + Assert.AreEqual(passwordHash, taskUser); user.PasswordHash = passwordHash; - Assert.ThrowsException(() => store.GetPasswordHashAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.GetPasswordHashAsync(null)); - Assert.ThrowsException(() => store.SetPasswordHashAsync(null, passwordHash).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.SetPasswordHashAsync(null, passwordHash)); - store.SetPasswordHashAsync(user, null).Wait(); + await store.SetPasswordHashAsync(user, null); Assert.IsNull(user.PasswordHash); } @@ -351,7 +298,7 @@ public void PasswordHash(bool includeRoles) [TestCategory("UserStore.Properties")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void UsersProperty(bool includeRoles) + public async Task UsersProperty(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); @@ -365,14 +312,15 @@ public void UsersProperty(bool includeRoles) Console.WriteLine(""); string email = "A" + Guid.NewGuid().ToString() + "@gmail.com"; - CreateTestUser(includeRoles, true, true, email); + await CreateTestUser(includeRoles, true, true, email); DateTime start3 = DateTime.UtcNow; - var list3 = manager.Users.Where(w=> w.Email != null).Select(s => s.Email).ToList(); + var list3 = manager.Users.Where(w=> w.Email == email).Select(s => s.Email).ToList(); Console.WriteLine("UserQuery: {0} seconds", (DateTime.UtcNow - start3).TotalSeconds); Console.WriteLine("UserQuery.Email: {0} users", list3.Count()); Console.WriteLine(""); + Assert.AreEqual(1, list3.Count()); DateTime start4 = DateTime.UtcNow; var list4 = manager.Users.Select(s => s).ToList(); @@ -426,7 +374,7 @@ public void UsersProperty(bool includeRoles) Console.WriteLine(""); - Assert.ThrowsException(() => manager.Users.Select(s => s.Email).FirstOrDefault()); + Assert.IsNotNull(manager.Users.Select(s => s.Email).ToList().FirstOrDefault()); Assert.IsNotNull(store.Users); @@ -437,24 +385,22 @@ public void UsersProperty(bool includeRoles) [TestCategory("UserStore.Properties")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void SecurityStamp(bool includeRoles) + public async Task SecurityStamp(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CreateTestUser(includeRoles); + var user = await CreateTestUser(includeRoles); - var taskUser = manager.GetSecurityStampAsync(user); + var taskUser = await manager.GetSecurityStampAsync(user); - taskUser.Wait(); - Assert.AreEqual(user.SecurityStamp, taskUser.Result); + Assert.AreEqual(user.SecurityStamp, taskUser); string strNewSecurityStamp = Guid.NewGuid().ToString("N"); - var taskUserSet = store.SetSecurityStampAsync(user, strNewSecurityStamp); - taskUserSet.Wait(); + await store.SetSecurityStampAsync(user, strNewSecurityStamp); - Assert.ThrowsException(() => store.GetSecurityStampAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.GetSecurityStampAsync(null)); - Assert.ThrowsException(() => store.SetSecurityStampAsync(null, strNewSecurityStamp).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.SetSecurityStampAsync(null, strNewSecurityStamp)); } diff --git a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/UserStoreTests.cs b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/UserStoreTests.cs index 66d089f..75e683b 100644 --- a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/UserStoreTests.cs +++ b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/UserStoreTests.cs @@ -6,7 +6,6 @@ using ElCamino.AspNetCore.Identity.CosmosDB.Model; using Newtonsoft.Json; using System.Diagnostics; -using Microsoft.Azure.Documents.Linq; using System.Linq; using System.Threading; using ElCamino.AspNetCore.Identity.CosmosDB.Tests.ModelTests; @@ -48,7 +47,7 @@ public TestContext TestContext } } - public ApplicationUser CurrentUser(bool includeRoles) + public Task CurrentUser(bool includeRoles) { if (!includeRoles) { @@ -58,11 +57,13 @@ public ApplicationUser CurrentUser(bool includeRoles) { if (currentUser == null) { - currentUser = CreateUser(includeRoles); + var task = CreateUser(includeRoles); + task.Wait(); + currentUser = task.Result; } } } - return currentUser; + return Task.FromResult(currentUser); } else { @@ -72,11 +73,13 @@ public ApplicationUser CurrentUser(bool includeRoles) { if (currentRoleUser == null) { - currentRoleUser = CreateUser(includeRoles); + var task = CreateUser(includeRoles); + task.Wait(); + currentRoleUser = task.Result; } } } - return currentRoleUser; + return Task.FromResult(currentRoleUser); } } @@ -160,17 +163,17 @@ private ApplicationUser GetTestAppUser() [TestCategory("UserStore.User")] [DataRow(true, DisplayName ="IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void CheckDupUser(bool includeRoles) + public async Task CheckDupUser(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); var user = GenTestUser(); var user2 = GenTestUser(); - var result1 = manager.CreateAsync(user).Result; + var result1 = await manager.CreateAsync(user); Assert.IsTrue(result1.Succeeded, string.Concat(result1.Errors.Select(e => e.Code))); user2.UserName = user.UserName; - var result2 = manager.CreateAsync(user2).Result; + var result2 = await manager.CreateAsync(user2); Assert.IsFalse(result2.Succeeded); Assert.IsTrue(new IdentityErrorDescriber().DuplicateUserName(user.UserName).Code == result2.Errors.First().Code); @@ -178,7 +181,7 @@ public void CheckDupUser(bool includeRoles) [TestMethod] [TestCategory("UserStore.User")] - public void CheckDupEmail() + public async Task CheckDupEmail() { IdentityOptions options = new IdentityOptions(); options.User.RequireUniqueEmail = true; @@ -187,11 +190,11 @@ public void CheckDupEmail() var user = GenTestUser(); var user2 = GenTestUser(); - var result1 = manager.CreateAsync(user).Result; + var result1 = await manager.CreateAsync(user); Assert.IsTrue(result1.Succeeded, string.Concat(result1.Errors.Select(e => e.Code))); user2.Email = user.Email; - var result2 = manager.CreateAsync(user2).Result; + var result2 = await manager.CreateAsync(user2); Assert.IsFalse(result2.Succeeded); Assert.IsTrue(new IdentityErrorDescriber().DuplicateEmail(user.Email).Code @@ -202,17 +205,17 @@ public void CheckDupEmail() [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void CreateUserTest(bool includeRoles) + public async Task CreateUserTest(bool includeRoles) { - WriteLineObject(CreateTestUser(includeRoles)); + WriteLineObject(await CreateTestUser(includeRoles)); } - public T CreateUser(bool includeRoles) where T : IdentityUser, new() + public Task CreateUser(bool includeRoles) where T : IdentityUser, new() { return CreateTestUser(includeRoles); } - private T CreateTestUser(bool includeRoles, bool createPassword = true, bool createEmail = true, + private async Task CreateTestUser(bool includeRoles, bool createPassword = true, bool createEmail = true, string emailAddress = null) where T : IdentityUser, new() { @@ -232,27 +235,24 @@ public T CreateUser(bool includeRoles) where T : IdentityUser, new() } } var taskUser = createPassword ? - manager.CreateAsync(user, DefaultUserPassword) : - manager.CreateAsync(user); - taskUser.Wait(); - Assert.IsTrue(taskUser.Result.Succeeded, string.Concat(taskUser.Result.Errors)); - user = manager.FindByIdAsync(user.Id).Result; + await manager.CreateAsync(user, DefaultUserPassword) : + await manager.CreateAsync(user); + Assert.IsTrue(taskUser.Succeeded, string.Concat(taskUser.Errors)); + user = await manager.FindByIdAsync(user.Id); for (int i = 0; i < 1; i++) { - AddUserClaimHelper(user, GenAdminClaim(), includeRoles); - AddUserLoginHelper(user, GenGoogleLogin(), includeRoles); + await AddUserClaimHelper(user, GenAdminClaim(), includeRoles); + await AddUserLoginHelper(user, GenGoogleLogin(), includeRoles); if (includeRoles) { - AddUserRoleHelper(user, string.Format("{0}_{1}", Constants.AccountRoles.AccountTestUserRole, Guid.NewGuid().ToString("N")), includeRoles); + await AddUserRoleHelper(user, string.Format("{0}_{1}", Constants.AccountRoles.AccountTestUserRole, Guid.NewGuid().ToString("N")), includeRoles); } } - AssertInnerExceptionType(() => store.CreateAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.CreateAsync(null)); - var getUserTask = manager.FindByIdAsync(user.Id); - getUserTask.Wait(); - return getUserTask.Result as T; + return (await manager.FindByIdAsync(user.Id)) as T; } private async Task CreateTestUserLite(bool includeRoles, bool createPassword = true, bool createEmail = true, @@ -284,7 +284,7 @@ public T CreateUser(bool includeRoles) where T : IdentityUser, new() if (includeRoles) { string roleName = string.Format("{0}_{1}", Constants.AccountRoles.AccountTestUserRole, Guid.NewGuid().ToString("N")); - var identityRole = CreateRoleIfNotExists(includeRoles, roleName); + await CreateRoleIfNotExists(includeRoles, roleName); await manager.AddToRoleAsync(user, roleName); } @@ -302,48 +302,42 @@ public T CreateUser(bool includeRoles) where T : IdentityUser, new() [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void DeleteUser(bool includeRoles) + public async Task DeleteUser(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); var user = GenTestUser(); - var taskUser = manager.CreateAsync(user, DefaultUserPassword); - taskUser.Wait(); - Assert.IsTrue(taskUser.Result.Succeeded, string.Concat(taskUser.Result.Errors)); + var taskUser = await manager.CreateAsync(user, DefaultUserPassword); + Assert.IsTrue(taskUser.Succeeded, string.Concat(taskUser.Errors)); - user = manager.FindByIdAsync(user.Id).Result; + user = await manager.FindByIdAsync(user.Id); for (int i = 0; i < 7; i++) { - AddUserClaimHelper(user, GenAdminClaim(), includeRoles); - AddUserLoginHelper(user, GenGoogleLogin(), includeRoles); + await AddUserClaimHelper(user, GenAdminClaim(), includeRoles); + await AddUserLoginHelper(user, GenGoogleLogin(), includeRoles); if (includeRoles) { - AddUserRoleHelper(user, string.Format("{0}_{1}", Constants.AccountRoles.AccountTestUserRole, Guid.NewGuid().ToString("N")), includeRoles); + await AddUserRoleHelper(user, string.Format("{0}_{1}", Constants.AccountRoles.AccountTestUserRole, Guid.NewGuid().ToString("N")), includeRoles); } } - var findUserTask2 = manager.FindByIdAsync(user.Id); - findUserTask2.Wait(); - user = findUserTask2.Result; + user = await manager.FindByIdAsync(user.Id); WriteLineObject(user); DateTime start = DateTime.UtcNow; - var taskUserDel = manager.DeleteAsync(user); - taskUserDel.Wait(); - Assert.IsTrue(taskUserDel.Result.Succeeded, string.Concat(taskUser.Result.Errors)); + var taskUserDel = await manager.DeleteAsync(user); + Assert.IsTrue(taskUserDel.Succeeded, string.Concat(taskUser.Errors)); Console.WriteLine("DeleteAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - Thread.Sleep(1000); - var findUserTask = manager.FindByIdAsync(user.Id); - findUserTask.Wait(); - Assert.IsNull(findUserTask.Result); + var findUserTask = await manager.FindByIdAsync(user.Id); + Assert.IsNull(findUserTask); - AssertInnerExceptionType(() => store.DeleteAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.DeleteAsync(null)); } @@ -352,77 +346,70 @@ public void DeleteUser(bool includeRoles) [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void UpdateApplicationUser(bool includeRoles) + public async Task UpdateApplicationUser(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); var user = GetTestAppUser(); WriteLineObject(user); - var taskUser = manager.CreateAsync(user, DefaultUserPassword); - taskUser.Wait(); - Assert.IsTrue(taskUser.Result.Succeeded, string.Concat(taskUser.Result.Errors)); + var taskUser = await manager.CreateAsync(user, DefaultUserPassword); + Assert.IsTrue(taskUser.Succeeded, string.Concat(taskUser.Errors)); string oFirstName = user.FirstName; string oLastName = user.LastName; - var taskFind1 = manager.FindByNameAsync(user.UserName); - taskFind1.Wait(); - Assert.AreEqual(oFirstName, taskFind1.Result.FirstName); - Assert.AreEqual(oLastName, taskFind1.Result.LastName); + user = await manager.FindByNameAsync(user.UserName); + Assert.AreEqual(oFirstName, user.FirstName); + Assert.AreEqual(oLastName, user.LastName); - user = taskFind1.Result; string cFirstName = string.Format("John_{0}", Guid.NewGuid()); string cLastName = string.Format("Doe_{0}", Guid.NewGuid()); user.FirstName = cFirstName; user.LastName = cLastName; - var taskUserUpdate = manager.UpdateAsync(user); - taskUserUpdate.Wait(); - Assert.IsTrue(taskUserUpdate.Result.Succeeded, string.Concat(taskUserUpdate.Result.Errors)); + var taskUserUpdate = await manager.UpdateAsync(user); + Assert.IsTrue(taskUserUpdate.Succeeded, string.Concat(taskUserUpdate.Errors)); - var taskFind = manager.FindByNameAsync(user.UserName); - taskFind.Wait(); - Assert.AreEqual(cFirstName, taskFind.Result.FirstName); - Assert.AreEqual(cLastName, taskFind.Result.LastName); + var taskFind = await manager.FindByNameAsync(user.UserName); + Assert.AreEqual(cFirstName, taskFind.FirstName); + Assert.AreEqual(cLastName, taskFind.LastName); } [TestMethod] [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void UpdateUser(bool includeRoles) + public async Task UpdateUser(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); var user = GenTestUser(); WriteLineObject(user); - var taskUser = manager.CreateAsync(user, DefaultUserPassword); - taskUser.Wait(); - Assert.IsTrue(taskUser.Result.Succeeded, string.Concat(taskUser.Result.Errors)); - user = manager.FindByIdAsync(user.Id).Result; + var taskUser = await manager.CreateAsync(user, DefaultUserPassword); + Assert.IsTrue(taskUser.Succeeded, string.Concat(taskUser.Errors)); + user = await manager.FindByIdAsync(user.Id); user.FirstName = "Mike"; - var taskUserUpdate = manager.UpdateAsync(user); - taskUserUpdate.Wait(); + var taskUserUpdate = await manager.UpdateAsync(user); - user = manager.FindByIdAsync(user.Id).Result; - Assert.IsTrue(taskUserUpdate.Result.Succeeded, string.Concat(taskUserUpdate.Result.Errors)); + user = await manager.FindByIdAsync(user.Id); + Assert.IsTrue(taskUserUpdate.Succeeded, string.Concat(taskUserUpdate.Errors)); Assert.AreEqual("Mike", user.FirstName); - Assert.ThrowsException(() => store.UpdateAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.UpdateAsync(null)); } [TestMethod] [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void ChangeUserName(bool includeRoles) + public async Task ChangeUserName(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var firstUser = CreateTestUser(includeRoles); + var firstUser = await CreateTestUser(includeRoles); Console.WriteLine("{0}", "Original User"); WriteLineObject(firstUser); string originalPlainUserName = firstUser.UserName; @@ -431,16 +418,13 @@ public void ChangeUserName(bool includeRoles) DateTime start = DateTime.UtcNow; - var taskUserUpdate = manager.SetUserNameAsync(firstUser, userNameChange); + var taskUserUpdate = await manager.SetUserNameAsync(firstUser, userNameChange); - taskUserUpdate.Wait(); Console.WriteLine("UpdateAsync(ChangeUserName): {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - Assert.IsTrue(taskUserUpdate.Result.Succeeded, string.Concat(taskUserUpdate.Result.Errors)); - Task.Delay(200).Wait(); - var taskUserChanged = manager.FindByNameAsync(userNameChange); - taskUserChanged.Wait(); - var changedUser = taskUserChanged.Result; + Assert.IsTrue(taskUserUpdate.Succeeded, string.Concat(taskUserUpdate.Errors)); + await Task.Delay(200); + var changedUser = await manager.FindByNameAsync(userNameChange); Console.WriteLine("{0}", "Changed User"); WriteLineObject(changedUser); @@ -449,182 +433,176 @@ public void ChangeUserName(bool includeRoles) Assert.IsFalse(originalPlainUserName.Equals(changedUser.UserName, StringComparison.OrdinalIgnoreCase), "UserName property not updated."); Assert.AreEqual(firstUser.Roles.Count, changedUser.Roles.Count); - //Assert.IsTrue(changedUser.Roles.All(r => r.PartitionKey == changedUser.Id.ToString()), "Roles partition keys are not equal to the new user id"); Assert.AreEqual(firstUser.Claims.Count, changedUser.Claims.Count); - //Assert.IsTrue(changedUser.Claims.All(r => r.PartitionKey == changedUser.Id.ToString()), "Claims partition keys are not equal to the new user id"); Assert.AreEqual(firstUser.Logins.Count, changedUser.Logins.Count); - //Assert.IsTrue(changedUser.Logins.All(r => r.PartitionKey == changedUser.Id.ToString()), "Logins partition keys are not equal to the new user id"); Assert.AreEqual(originalUserId, changedUser.Id); Assert.AreNotEqual(originalPlainUserName, changedUser.UserName); //Check email - var taskFindEmail = manager.FindByEmailAsync(changedUser.Email); - taskFindEmail.Wait(); - Assert.IsNotNull(taskFindEmail.Result); + var taskFindEmail = await manager.FindByEmailAsync(changedUser.Email); + Assert.IsNotNull(taskFindEmail); //Check the old username is deleted - var oldUserTask = manager.FindByNameAsync(originalUserId); - oldUserTask.Wait(); - Assert.IsNull(oldUserTask.Result); + var oldUserTask = await manager.FindByNameAsync(originalUserId); + Assert.IsNull(oldUserTask); //Check logins - foreach (var log in taskFindEmail.Result.Logins) + foreach (var log in taskFindEmail.Logins) { - var taskFindLogin = manager.FindByLoginAsync(log.LoginProvider, log.ProviderKey); - taskFindLogin.Wait(); - Assert.IsNotNull(taskFindLogin.Result); - Assert.AreEqual(originalUserId, taskFindLogin.Result.Id.ToString()); + var taskFindLogin = await manager.FindByLoginAsync(log.LoginProvider, log.ProviderKey); + Assert.IsNotNull(taskFindLogin); + Assert.AreEqual(originalUserId, taskFindLogin.Id.ToString()); } - AssertInnerExceptionType(() => store.UpdateAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.UpdateAsync(null)); } [TestMethod] [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void FindUserByEmail(bool includeRoles) + public async Task FindUserByEmail(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CreateUser(includeRoles); + var user = await CreateUser(includeRoles); WriteLineObject(user); DateTime start = DateTime.UtcNow; - var findUserTask = manager.FindByEmailAsync(user.Email); - findUserTask.Wait(); + var findUserTask = await manager.FindByEmailAsync(user.Email); Console.WriteLine("FindByEmailAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - Assert.AreEqual(user.Email, findUserTask.Result.Email); + Assert.AreEqual(user.Email, findUserTask.Email); } [TestMethod] [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void FindUsersByEmail(bool includeRoles) + public async Task FindUsersByEmail(bool includeRoles) { string strEmail = Guid.NewGuid().ToString() + "@live.com"; UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - +#if NETCOREAPP3_0 + strEmail = manager.NormalizeEmail(strEmail); +#else + strEmail = strEmail.ToUpper(); +#endif int createdCount = 11; for (int i = 0; i < createdCount; i++) { - var task = CreateTestUserLite(includeRoles, true, true, strEmail); - task.Wait(); + var task = await CreateTestUserLite(includeRoles, true, true, strEmail); } DateTime start = DateTime.UtcNow; Console.WriteLine("FindAllByEmailAsync: {0}", strEmail); - var findUserTask = store.FindAllByEmailAsync(strEmail); - findUserTask.Wait(); + var findUserTask = await store.FindAllByEmailAsync(strEmail); Console.WriteLine("FindAllByEmailAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - Console.WriteLine("Users Found: {0}", findUserTask.Result.Count()); - Assert.AreEqual(createdCount, findUserTask.Result.Count()); + Console.WriteLine("Users Found: {0}", findUserTask.Count()); + Assert.AreEqual(createdCount, findUserTask.Count()); - var listCreated = findUserTask.Result.ToList(); + var listCreated = findUserTask.ToList(); //Change email and check results string strEmailChanged = Guid.NewGuid().ToString() + "@live.com"; var userToChange = listCreated.Last(); - manager.SetEmailAsync(userToChange, strEmailChanged).Wait(); + await manager.SetEmailAsync(userToChange, strEmailChanged); - var findUserChanged = manager.FindByEmailAsync(strEmailChanged); - findUserChanged.Wait(); - Assert.AreEqual(userToChange.Id, findUserChanged.Result.Id); - Assert.AreNotEqual(strEmail, findUserChanged.Result.Email); + var findUserChanged = await manager.FindByEmailAsync(strEmailChanged); + Assert.AreEqual(userToChange.Id, findUserChanged.Id); + Assert.AreNotEqual(strEmail, findUserChanged.Email); //Make sure changed user doesn't show up in previous query start = DateTime.UtcNow; - findUserTask = store.FindAllByEmailAsync(strEmail); - findUserTask.Wait(); + findUserTask = await store.FindAllByEmailAsync(strEmail); Console.WriteLine("FindAllByEmailAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - Console.WriteLine("Users Found: {0}", findUserTask.Result.Count()); - Assert.AreEqual((listCreated.Count() - 1), findUserTask.Result.Count()); - - + Console.WriteLine("Users Found: {0}", findUserTask.Count()); + Assert.AreEqual(listCreated.Count() - 1, findUserTask.Count()); } [TestMethod] [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void FindUserById(bool includeRoles) + public async Task FindUserById(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CurrentUser(includeRoles); + var user = await CurrentUser(includeRoles); DateTime start = DateTime.UtcNow; - var findUserTask = manager.FindByIdAsync(user.Id); - findUserTask.Wait(); + var findUser = await manager.FindByIdAsync(user.Id); + Console.WriteLine("FindByIdAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - Assert.AreEqual(user.Id, findUserTask.Result.Id); + Assert.AreEqual(user.Id, findUser.Id); + + findUser = await manager.FindByIdAsync(Guid.NewGuid().ToString()); + Assert.IsNull(findUser); } [TestMethod] [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void FindUserByName(bool includeRoles) + public async Task FindUserByName(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CurrentUser(includeRoles); + var user = await CurrentUser(includeRoles); WriteLineObject(user); DateTime start = DateTime.UtcNow; - var findUserTask = manager.FindByNameAsync(user.UserName); - findUserTask.Wait(); + var findUser = await manager.FindByNameAsync(user.UserName); Console.WriteLine("FindByNameAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - Assert.AreEqual(user.UserName, findUserTask.Result.UserName); + Assert.AreEqual(user.UserName, findUser.UserName); + + findUser = await manager.FindByNameAsync(Guid.NewGuid().ToString()); + Assert.IsNull(findUser); + } [TestMethod] [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void AddUserLogin(bool includeRoles) + public async Task AddUserLogin(bool includeRoles) { - var user = CreateTestUser(includeRoles, false); + var user = await CreateTestUser(includeRoles, false); WriteLineObject(user); - AddUserLoginHelper(user, GenGoogleLogin(), includeRoles); + await AddUserLoginHelper(user, GenGoogleLogin(), includeRoles); } - public void AddUserLoginHelper(ApplicationUser user, UserLoginInfo loginInfo, bool includeRoles) + public async Task AddUserLoginHelper(ApplicationUser user, UserLoginInfo loginInfo, bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var userAddLoginTask = manager.AddLoginAsync(user, loginInfo); - userAddLoginTask.Wait(); - Assert.IsTrue(userAddLoginTask.Result.Succeeded, string.Concat(userAddLoginTask.Result.Errors)); + var userAddLoginTask = await manager.AddLoginAsync(user, loginInfo); + Assert.IsTrue(userAddLoginTask.Succeeded, string.Concat(userAddLoginTask.Errors)); - var loginGetTask = manager.GetLoginsAsync(user); + var loginGetTask = await manager.GetLoginsAsync(user); - loginGetTask.Wait(); - Assert.IsTrue(loginGetTask.Result + Assert.IsTrue(loginGetTask .Any(log => log.LoginProvider == loginInfo.LoginProvider & log.ProviderKey == loginInfo.ProviderKey), "LoginInfo not found: GetLoginsAsync"); DateTime start = DateTime.UtcNow; - var loginGetTask2 = manager.FindByLoginAsync(loginGetTask.Result.First().LoginProvider, loginGetTask.Result.First().ProviderKey); + var loginGetTask2 = await manager.FindByLoginAsync(loginGetTask.First().LoginProvider, loginGetTask.First().ProviderKey); - loginGetTask2.Wait(); Console.WriteLine(string.Format("FindAsync(By Login): {0} seconds", (DateTime.UtcNow - start).TotalSeconds)); - Assert.IsNotNull(loginGetTask2.Result); + Assert.IsNotNull(loginGetTask2); } @@ -632,17 +610,16 @@ public void AddUserLoginHelper(ApplicationUser user, UserLoginInfo loginInfo, bo [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void AddRemoveUserToken(bool includeRoles) + public async Task AddRemoveUserToken(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); var user = GenTestUser(); WriteLineObject(user); - var taskUser = manager.CreateAsync(user, DefaultUserPassword); - taskUser.Wait(); - Assert.IsTrue(taskUser.Result.Succeeded, string.Concat(taskUser.Result.Errors)); - user = manager.FindByIdAsync(user.Id).Result; + var taskUser = await manager.CreateAsync(user, DefaultUserPassword); + Assert.IsTrue(taskUser.Succeeded, string.Concat(taskUser.Errors)); + user = await manager.FindByIdAsync(user.Id); string tokenValue = Guid.NewGuid().ToString(); string tokenName = string.Format("TokenName{0}", Guid.NewGuid().ToString()); @@ -651,34 +628,34 @@ public void AddRemoveUserToken(bool includeRoles) Console.WriteLine($"TokenName: {tokenName2}"); Console.WriteLine($"ToienValue: {tokenValue}"); - manager.SetAuthenticationTokenAsync(user, + await manager.SetAuthenticationTokenAsync(user, Constants.LoginProviders.GoogleProvider.LoginProvider, tokenName, - tokenValue).Wait(); + tokenValue); - string getTokenValue = manager.GetAuthenticationTokenAsync(user, + string getTokenValue = await manager.GetAuthenticationTokenAsync(user, Constants.LoginProviders.GoogleProvider.LoginProvider, - tokenName).Result; + tokenName); Assert.IsNotNull(tokenName); Assert.AreEqual(getTokenValue, tokenValue); - manager.SetAuthenticationTokenAsync(user, + await manager.SetAuthenticationTokenAsync(user, Constants.LoginProviders.GoogleProvider.LoginProvider, tokenName2, - tokenValue).Wait(); + tokenValue); - manager.RemoveAuthenticationTokenAsync(user, + await manager.RemoveAuthenticationTokenAsync(user, Constants.LoginProviders.GoogleProvider.LoginProvider, - tokenName).Wait(); + tokenName); - getTokenValue = manager.GetAuthenticationTokenAsync(user, + getTokenValue = await manager.GetAuthenticationTokenAsync(user, Constants.LoginProviders.GoogleProvider.LoginProvider, - tokenName).Result; + tokenName); Assert.IsNull(getTokenValue); - getTokenValue = manager.GetAuthenticationTokenAsync(user, + getTokenValue = await manager.GetAuthenticationTokenAsync(user, Constants.LoginProviders.GoogleProvider.LoginProvider, - tokenName2).Result; + tokenName2); Assert.IsNotNull(getTokenValue); Assert.AreEqual(getTokenValue, tokenValue); } @@ -688,239 +665,213 @@ public void AddRemoveUserToken(bool includeRoles) [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void AddRemoveUserLogin(bool includeRoles) + public async Task AddRemoveUserLogin(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); var user = GenTestUser(); WriteLineObject(user); - var taskUser = manager.CreateAsync(user, DefaultUserPassword); - taskUser.Wait(); - Assert.IsTrue(taskUser.Result.Succeeded, string.Concat(taskUser.Result.Errors)); + var taskUser = await manager.CreateAsync(user, DefaultUserPassword); + Assert.IsTrue(taskUser.Succeeded, string.Concat(taskUser.Errors)); var loginInfo = GenGoogleLogin(); - user = manager.FindByIdAsync(user.Id).Result; - var userAddLoginTask = manager.AddLoginAsync(user, loginInfo); - - userAddLoginTask.Wait(); - Assert.IsTrue(userAddLoginTask.Result.Succeeded, string.Concat(userAddLoginTask.Result.Errors)); + user = await manager.FindByIdAsync(user.Id); + var userAddLoginTask = await manager.AddLoginAsync(user, loginInfo); + Assert.IsTrue(userAddLoginTask.Succeeded, string.Concat(userAddLoginTask.Errors)); - var loginGetTask = manager.GetLoginsAsync(user); + var loginGetTask = await manager.GetLoginsAsync(user); - loginGetTask.Wait(); - Assert.IsTrue(loginGetTask.Result + Assert.IsTrue(loginGetTask .Any(log => log.LoginProvider == loginInfo.LoginProvider & log.ProviderKey == loginInfo.ProviderKey), "LoginInfo not found: GetLoginsAsync"); - var loginGetTask2 = manager.FindByLoginAsync(loginGetTask.Result.First().LoginProvider, loginGetTask.Result.First().ProviderKey); - - loginGetTask2.Wait(); - Assert.IsNotNull(loginGetTask2.Result); - - var userRemoveLoginTaskNeg1 = manager.RemoveLoginAsync(user, string.Empty, loginInfo.ProviderKey); - - userRemoveLoginTaskNeg1.Wait(); - - var userRemoveLoginTaskNeg2 = manager.RemoveLoginAsync(user, loginInfo.LoginProvider, string.Empty); + var loginGetTask2 = await manager.FindByLoginAsync(loginGetTask.First().LoginProvider, loginGetTask.First().ProviderKey); + Assert.IsNotNull(loginGetTask2); - userRemoveLoginTaskNeg2.Wait(); + var userRemoveLoginTaskNeg1 = await manager.RemoveLoginAsync(user, string.Empty, loginInfo.ProviderKey); + var userRemoveLoginTaskNeg2 = await manager.RemoveLoginAsync(user, loginInfo.LoginProvider, string.Empty); - var userRemoveLoginTask = manager.RemoveLoginAsync(user, loginInfo.LoginProvider, loginInfo.ProviderKey); + var userRemoveLoginTask = await manager.RemoveLoginAsync(user, loginInfo.LoginProvider, loginInfo.ProviderKey); - userRemoveLoginTask.Wait(); - Assert.IsTrue(userRemoveLoginTask.Result.Succeeded, string.Concat(userRemoveLoginTask.Result.Errors)); - var loginGetTask3 = manager.GetLoginsAsync(user); - - loginGetTask3.Wait(); - Assert.IsTrue(!loginGetTask3.Result.Any(), "LoginInfo not removed"); + Assert.IsTrue(userRemoveLoginTask.Succeeded, string.Concat(userRemoveLoginTask.Errors)); + + var loginGetTask3 = await manager.GetLoginsAsync(user); + Assert.IsTrue(!loginGetTask3.Any(), "LoginInfo not removed"); //Negative cases - var loginFindNeg = manager.FindByLoginAsync("asdfasdf", "http://4343443dfaksjfaf"); - - loginFindNeg.Wait(); - Assert.IsNull(loginFindNeg.Result); + var loginFindNeg = await manager.FindByLoginAsync("asdfasdf", "http://4343443dfaksjfaf"); + Assert.IsNull(loginFindNeg); - Assert.ThrowsException(() => store.AddLoginAsync(null, loginInfo).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.AddLoginAsync(null, loginInfo)); - Assert.ThrowsException(() => store.AddLoginAsync(user, null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.AddLoginAsync(user, null)); - Assert.ThrowsException(() => store.RemoveLoginAsync(null, loginInfo.ProviderKey, loginInfo.LoginProvider).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.RemoveLoginAsync(null, loginInfo.ProviderKey, loginInfo.LoginProvider)); - Assert.ThrowsException(() => store.GetLoginsAsync(null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.GetLoginsAsync(null)); } [TestMethod] [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] - public void AddUserRole(bool includeRoles) + public async Task AddUserRole(bool includeRoles) { string strUserRole = string.Format("{0}_{1}", Constants.AccountRoles.AccountTestUserRole, Guid.NewGuid().ToString("N")); - WriteLineObject(CurrentUser(includeRoles)); - AddUserRoleHelper(CurrentUser(includeRoles), strUserRole, includeRoles); + WriteLineObject(await CurrentUser(includeRoles)); + await AddUserRoleHelper(await CurrentUser(includeRoles), strUserRole, includeRoles); } [TestMethod] [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] - public void GetUsersByRole(bool includeRoles) + public async Task GetUsersByRole(bool includeRoles) { string strUserRole = string.Format("{0}_{1}", Constants.AccountRoles.AccountTestUserRole, Guid.NewGuid().ToString("N")); - var identityRole = CreateRoleIfNotExists(includeRoles, strUserRole); + var identityRole = await CreateRoleIfNotExists(includeRoles, strUserRole); UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); int userCount = 4; DateTime start2 = DateTime.UtcNow; ApplicationUser tempUser = null; - IdentityRole role = CreateRoleIfNotExists(includeRoles, strUserRole); + IdentityRole role = await CreateRoleIfNotExists(includeRoles, strUserRole); Console.WriteLine($"RoleId: {role.Id}"); for (int i = 0; i < userCount; i++) { DateTime start = DateTime.UtcNow; Console.WriteLine("CreateTestUserLite()"); - tempUser = CreateTestUserLite(true, true).Result; + tempUser = await CreateTestUserLite(true, true); Console.WriteLine("CreateTestUserLite(): {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - AddUserRoleHelper(tempUser, strUserRole, includeRoles); + await AddUserRoleHelper(tempUser, strUserRole, includeRoles); } Console.WriteLine("GenerateUsers(): {0} user count", userCount); Console.WriteLine("GenerateUsers(): {0} seconds", (DateTime.UtcNow - start2).TotalSeconds); start2 = DateTime.UtcNow; - var users = manager.GetUsersInRoleAsync(strUserRole).Result; + var users = await manager.GetUsersInRoleAsync(strUserRole); Console.WriteLine("GetUsersInRoleAsync(): {0} seconds", (DateTime.UtcNow - start2).TotalSeconds); Assert.AreEqual(users.Where(u => u.Roles.Any(r=> r.RoleId == role.Id)).Count(), userCount); } - private IdentityRole CreateRoleIfNotExists(bool includeRoles, string roleName) + private async Task CreateRoleIfNotExists(bool includeRoles, string roleName) { var rmanager = CreateRoleManager(includeRoles); - var userRole = rmanager.FindByNameAsync(roleName); - userRole.Wait(); - IdentityRole role = userRole.Result; - if (userRole.Result == null) + var userRole = await rmanager.FindByNameAsync(roleName); + IdentityRole role = userRole; + if (userRole == null) { - var taskResult = rmanager.CreateAsync(new IdentityRole(roleName)).Result; + var taskResult = await rmanager.CreateAsync(new IdentityRole(roleName)); Assert.IsTrue(taskResult.Succeeded); - role = rmanager.FindByNameAsync(roleName).Result; + role = await rmanager.FindByNameAsync(roleName); } return role; } - public IdentityRole AddUserRoleHelper(ApplicationUser user, string roleName, bool includeRoles) + public async Task AddUserRoleHelper(ApplicationUser user, string roleName, bool includeRoles) { - var identityRole = CreateRoleIfNotExists(includeRoles, roleName); + var identityRole = await CreateRoleIfNotExists(includeRoles, roleName); Console.WriteLine($"RoleId: {identityRole.Id}"); UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var userRoleTask = manager.AddToRoleAsync(user, roleName); + var userRoleTask = await manager.AddToRoleAsync(user, roleName); + Assert.IsTrue(userRoleTask.Succeeded, string.Concat(userRoleTask.Errors)); - userRoleTask.Wait(); - Assert.IsTrue(userRoleTask.Result.Succeeded, string.Concat(userRoleTask.Result.Errors)); - - var roles2Task = manager.IsInRoleAsync(user, roleName); - roles2Task.Wait(); - Assert.IsTrue(roles2Task.Result, "Role not found"); + var roles2Task = await manager.IsInRoleAsync(user, roleName); + Assert.IsTrue(roles2Task, "Role not found"); return identityRole; } - [TestMethod] [TestCategory("UserStore.User")] + [TestMethod] [DataRow(true, DisplayName = "IncludeRoleProvider")] - public void AddRemoveUserRole(bool includeRoles) + public async Task AddRemoveUserRole(bool includeRoles) { string roleName = string.Format("{0}_{1}", Constants.AccountRoles.AccountTestAdminRole, Guid.NewGuid().ToString("N")); - var adminRole = CreateRoleIfNotExists(includeRoles, roleName); + var adminRole = await CreateRoleIfNotExists(includeRoles, roleName); UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CurrentUser(includeRoles); - user = manager.FindByIdAsync(user.Id).Result; - WriteLineObject(user); - var userRoleTask = manager.AddToRoleAsync(user, roleName); + var user = await CurrentUser(includeRoles); + user = await manager.FindByIdAsync(user.Id); + WriteLineObject(user.Id); + var userRoleTask = await manager.AddToRoleAsync(user, roleName); - userRoleTask.Wait(); - Assert.IsTrue(userRoleTask.Result.Succeeded, string.Concat(userRoleTask.Result.Errors)); + Assert.IsTrue(userRoleTask.Succeeded, string.Concat(userRoleTask.Errors)); DateTime getRolesStart = DateTime.UtcNow; - var rolesTask = manager.GetRolesAsync(user); + var tempRoles = await manager.GetRolesAsync(user); - rolesTask.Wait(); - var tempRoles = rolesTask.Result; var getout = string.Format("{0} ms", (DateTime.UtcNow - getRolesStart).TotalMilliseconds); Console.WriteLine(getout); - Console.WriteLine(getout); - Assert.IsTrue(rolesTask.Result.Contains(roleName), "Role not found"); + Assert.IsTrue(tempRoles.Contains(roleName), "Role not found"); DateTime isInRolesStart = DateTime.UtcNow; - var roles2Task = manager.IsInRoleAsync(user, roleName); + var roles2Task = await manager.IsInRoleAsync(user, roleName); - roles2Task.Wait(); var isInout = string.Format("IsInRoleAsync() {0} ms", (DateTime.UtcNow - isInRolesStart).TotalMilliseconds); Console.WriteLine(isInout); - Assert.IsTrue(roles2Task.Result, "Role not found"); + Assert.IsTrue(roles2Task, "Role not found"); - manager.RemoveFromRoleAsync(user, roleName).Wait(); + await manager.RemoveFromRoleAsync(user, roleName); DateTime start = DateTime.UtcNow; - var rolesTask2 = manager.GetRolesAsync(user).Result; + var rolesTask2 = await manager.GetRolesAsync(user); Console.WriteLine("GetRolesAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); Assert.IsFalse(rolesTask2.Contains(roleName), "Role not removed."); - Assert.IsTrue(Assert.ThrowsException(() => store.AddToRoleAsync(null, roleName).Wait()).InnerException is ArgumentException); + await Assert.ThrowsExceptionAsync(async () => await store.AddToRoleAsync(null, roleName)); - Assert.IsTrue(Assert.ThrowsException(() => store.AddToRoleAsync(user, null).Wait()).InnerException is ArgumentException); + await Assert.ThrowsExceptionAsync (async () => await store.AddToRoleAsync(user, null)); - Assert.IsTrue(Assert.ThrowsException(() => store.AddToRoleAsync(user, Guid.NewGuid().ToString()).Wait()).InnerException is InvalidOperationException); + await Assert.ThrowsExceptionAsync(async () => await store.AddToRoleAsync(user, Guid.NewGuid().ToString())); - Assert.IsTrue(Assert.ThrowsException(() => store.RemoveFromRoleAsync(null, roleName).Wait()).InnerException is ArgumentException); + await Assert.ThrowsExceptionAsync(async () => await store.RemoveFromRoleAsync(null, roleName)); - Assert.IsTrue(Assert.ThrowsException(() => store.RemoveFromRoleAsync(user, null).Wait()).InnerException is ArgumentException); + await Assert.ThrowsExceptionAsync(async () => await store.RemoveFromRoleAsync(user, null)); - Assert.IsTrue(Assert.ThrowsException(() => store.GetRolesAsync(null).Wait()).InnerException is ArgumentException); + await Assert.ThrowsExceptionAsync(async () => await store.GetRolesAsync(null)); } [TestMethod] [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] - public void IsUserInRole(bool includeRoles) + public async Task IsUserInRole(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CurrentUser(includeRoles); + var user = await CurrentUser(includeRoles); WriteLineObject(user); string roleName = string.Format("{0}_{1}", Constants.AccountRoles.AccountTestUserRole, Guid.NewGuid().ToString("N")); - AddUserRoleHelper(user, roleName, includeRoles); + await AddUserRoleHelper(user, roleName, includeRoles); DateTime start = DateTime.UtcNow; - var roles2Task = manager.IsInRoleAsync(user, roleName); - - roles2Task.Wait(); + var roles2Task = await manager.IsInRoleAsync(user, roleName); Console.WriteLine("IsInRoleAsync: {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - Assert.IsTrue(roles2Task.Result, "Role not found"); + Assert.IsTrue(roles2Task, "Role not found"); - Assert.IsTrue(Assert.ThrowsException(() => store.IsInRoleAsync(null, roleName).Wait()).InnerException is ArgumentException); - Assert.IsTrue(Assert.ThrowsException(() => store.IsInRoleAsync(user, null).Wait()).InnerException is ArgumentException); + await Assert.ThrowsExceptionAsync(async () => await store.IsInRoleAsync(null, roleName)); + await Assert.ThrowsExceptionAsync(async () => await store.IsInRoleAsync(user, null)); } @@ -952,33 +903,28 @@ public async Task GenerateUsers(bool includeRoles) [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void AddUserClaim(bool includeRoles) + public async Task AddUserClaim(bool includeRoles) { - WriteLineObject(CurrentUser(includeRoles)); - AddUserClaimHelper(CurrentUser(includeRoles), GenUserClaim(), includeRoles); + WriteLineObject(await CurrentUser(includeRoles)); + await AddUserClaimHelper(await CurrentUser(includeRoles), GenUserClaim(), includeRoles); } - private void AddUserClaimHelper(ApplicationUser user, Claim claim, bool includeRoles) + private async Task AddUserClaimHelper(ApplicationUser user, Claim claim, bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - - var userClaimTask = manager.AddClaimAsync(user, claim); - - userClaimTask.Wait(); - Assert.IsTrue(userClaimTask.Result.Succeeded, string.Concat(userClaimTask.Result.Errors.Select(e => e.Code))); - var claimsTask = manager.GetClaimsAsync(user); - - claimsTask.Wait(); - Assert.IsTrue(claimsTask.Result.Any(c => c.Value == claim.Value & c.ValueType == claim.ValueType), "Claim not found"); + var userClaimTask = await manager.AddClaimAsync(user, claim); + Assert.IsTrue(userClaimTask.Succeeded, string.Concat(userClaimTask.Errors.Select(e => e.Code))); + var claimsTask = await manager.GetClaimsAsync(user); + Assert.IsTrue(claimsTask.Any(c => c.Value == claim.Value & c.ValueType == claim.ValueType), "Claim not found"); } [TestMethod] [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void GetUsersByClaim(bool includeRoles) + public async Task GetUsersByClaim(bool includeRoles) { var claim = GenUserClaim(); UserStore store = CreateUserStore(includeRoles); @@ -991,15 +937,15 @@ public void GetUsersByClaim(bool includeRoles) { DateTime start = DateTime.UtcNow; Console.WriteLine("CreateTestUserLite()"); - tempUser = CreateTestUserLite(true, true).Result; + tempUser = await CreateTestUserLite(includeRoles, true, true); Console.WriteLine("CreateTestUserLite(): {0} seconds", (DateTime.UtcNow - start).TotalSeconds); - AddUserClaimHelper(tempUser, claim, includeRoles); + await AddUserClaimHelper(tempUser, claim, includeRoles); } Console.WriteLine("GenerateUsers(): {0} user count", userCount); Console.WriteLine("GenerateUsers(): {0} seconds", (DateTime.UtcNow - start2).TotalSeconds); start2 = DateTime.UtcNow; - var users = manager.GetUsersForClaimAsync(claim).Result; + var users = await manager.GetUsersForClaimAsync(claim); Console.WriteLine("GetUsersForClaimAsync(): {0} seconds", (DateTime.UtcNow - start2).TotalSeconds); Assert.AreEqual(users.Where(u => u.Claims.Single(c => c.ClaimType == claim.Type && c.ClaimValue == c.ClaimValue) !=null).Count(), userCount); @@ -1009,69 +955,61 @@ public void GetUsersByClaim(bool includeRoles) [TestCategory("UserStore.User")] [DataRow(true, DisplayName = "IncludeRoleProvider")] [DataRow(false, DisplayName = "NoRoleProvider")] - public void AddRemoveUserClaim(bool includeRoles) + public async Task AddRemoveUserClaim(bool includeRoles) { UserStore store = CreateUserStore(includeRoles); UserManager manager = CreateUserManager(includeRoles); - var user = CurrentUser(includeRoles); + var user = await CurrentUser(includeRoles); WriteLineObject(user); Claim claim = GenAdminClaim(); - var userClaimTask = manager.AddClaimAsync(user, claim); + var userClaimTask = await manager.AddClaimAsync(user, claim); - userClaimTask.Wait(); - Assert.IsTrue(userClaimTask.Result.Succeeded, string.Concat(userClaimTask.Result.Errors)); + Assert.IsTrue(userClaimTask.Succeeded, string.Concat(userClaimTask.Errors)); - var claimsTask = manager.GetClaimsAsync(user); + var claimsTask = await manager.GetClaimsAsync(user); - claimsTask.Wait(); - Assert.IsTrue(claimsTask.Result.Any(c => c.Value == claim.Value & c.ValueType == claim.ValueType), "Claim not found"); + Assert.IsTrue(claimsTask.Any(c => c.Value == claim.Value & c.ValueType == claim.ValueType), "Claim not found"); + var userRemoveClaimTask = await manager.RemoveClaimAsync(user, claim); - var userRemoveClaimTask = manager.RemoveClaimAsync(user, claim); + Assert.IsTrue(userClaimTask.Succeeded, string.Concat(userClaimTask.Errors)); + var claimsTask2 = await manager.GetClaimsAsync(user); - userRemoveClaimTask.Wait(); - Assert.IsTrue(userClaimTask.Result.Succeeded, string.Concat(userClaimTask.Result.Errors)); - var claimsTask2 = manager.GetClaimsAsync(user); - - claimsTask2.Wait(); - Assert.IsTrue(!claimsTask2.Result.Any(c => c.Value == claim.Value & c.ValueType == claim.ValueType), "Claim not removed"); + Assert.IsTrue(!claimsTask2.Any(c => c.Value == claim.Value & c.ValueType == claim.ValueType), "Claim not removed"); //adding test for removing an empty claim Claim claimEmpty = GenAdminClaimEmptyValue(); - var userClaimTask2 = manager.AddClaimAsync(user, claimEmpty); - - userClaimTask2.Wait(); + var userClaimTask2 = await manager.AddClaimAsync(user, claimEmpty); - var userRemoveClaimTask2 = manager.RemoveClaimAsync(user, claimEmpty); + var userRemoveClaimTask2 = await manager.RemoveClaimAsync(user, claimEmpty); - userRemoveClaimTask2.Wait(); - Assert.IsTrue(userClaimTask2.Result.Succeeded, string.Concat(userClaimTask2.Result.Errors)); + Assert.IsTrue(userClaimTask2.Succeeded, string.Concat(userClaimTask2.Errors)); - Assert.ThrowsException(() => store.AddClaimsAsync(null, new List() { claim }).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.AddClaimsAsync(null, new List() { claim })); - Assert.ThrowsException(() => store.AddClaimsAsync(user, null).Wait()); + await Assert.ThrowsExceptionAsync(async() => await store.AddClaimsAsync(user, null)); - Assert.IsTrue(Assert.ThrowsException(() => store.RemoveClaimsAsync(null, new List() { claim }).Wait()).InnerException is ArgumentException); + await Assert.ThrowsExceptionAsync(async () => await store.RemoveClaimsAsync(null, new List() { claim })); - Assert.IsTrue(Assert.ThrowsException(() => store.RemoveClaimsAsync(user, null).Wait()).InnerException is ArgumentException); + await Assert.ThrowsExceptionAsync(async () => await store.RemoveClaimsAsync(user, null)); - Assert.ThrowsException(() => store.RemoveClaimsAsync(user, new List() { new Claim(claim.Type, null) }).Wait()); + await Assert.ThrowsExceptionAsync(async () => await store.RemoveClaimsAsync(user, new List() { new Claim(claim.Type, null) })); - Assert.ThrowsException(() => store.AddClaimsAsync(null, new List() { claim }).Wait()); + await Assert.ThrowsExceptionAsync(async () => await store.AddClaimsAsync(null, new List() { claim })); } [TestMethod] [TestCategory("UserStore.User")] - public void ThrowIfDisposed() + public async Task ThrowIfDisposed() { var store = new UserStore(GetContext(), describer: new IdentityErrorDescriber()); store.Dispose(); GC.Collect(); - Assert.IsTrue(Assert.ThrowsException(() => store.DeleteAsync(new ApplicationUser()).Wait()).InnerException is ObjectDisposedException); + await Assert.ThrowsExceptionAsync(async () => await store.DeleteAsync(new ApplicationUser())); } } diff --git a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/config.json b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/config.json index a356489..7704fd9 100644 --- a/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/config.json +++ b/tests/ElCamino.AspNetCore.Identity.CosmosDB.Tests/config.json @@ -7,7 +7,7 @@ "identityConfiguration": { "uri": "https://localhost:8081", "authKey": "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==", - "database": "IdDb2", + "database": "Id2", "identityCollection": "u" } }