public void ShouldAddEmailsToCacheIndex() { // Arrange string roleToSearchFor = _rolesList[2].Name; var expectedRolesList = new List <AppRole>(); foreach (var userInfo in _users) { _appCache.AddOrUpdateAsync(userInfo.EntityId.ToString(), userInfo, null, "Users").WaitAndUnwrapException(); foreach (var email in userInfo.Emails) { _appCache.AddOrUpdateItemOnCustomIndexAsync("UserEmails", email, userInfo.EntityId.ToString(), "Users") .WaitAndUnwrapException(); } foreach (var appRole in userInfo.Roles) { if (appRole.Name == roleToSearchFor) { expectedRolesList.Add(appRole); } _appCache.AddOrUpdateItemOnCustomIndexAsync("UsersForRole", appRole.Name, userInfo.EntityId.ToString(), "Users") .WaitAndUnwrapException(); } } // Act var users0 = _users[0]; var users0Email0 = users0.Emails[0]; // We attempt twice due to the first query attempt forcing the logic to go to the database before querying the cache to ensure // that we have the latest elements from the database. We're assuming the developer will put what was found into the cache to // keep them in sync with each other with the Cache aside pattern. var user1 = (_appCache.FindAsync <UserInfo>("UserEmails", _users[0].Emails[0], "Users").WaitAndUnwrapException()).FirstOrDefault() ?? (_appCache.FindAsync <UserInfo>("UserEmails", _users[0].Emails[0], "Users").WaitAndUnwrapException()).FirstOrDefault(); var user1Email1 = user1.Emails[0]; // Again we attempt the query twice. var usersForRole = _appCache.FindAsync <UserInfo>("UsersForRole", roleToSearchFor, "Users").WaitAndUnwrapException(); if (usersForRole == null || usersForRole.Count < 1) { usersForRole = _appCache.FindAsync <UserInfo>("UsersForRole", roleToSearchFor, "Users").WaitAndUnwrapException(); } // Assert Assert.AreEqual(user1.EntityId, users0.EntityId); Assert.AreEqual(users0Email0, user1Email1); Assert.IsTrue(usersForRole.Count == expectedRolesList.Count); }
public virtual async Task <List <T> > FindAsync(string indexName, string indexedValue) { var results = await _appCache.FindAsync <T>(indexName, indexedValue, PartitionNameFormatter()).ConfigureAwait(false); return(results); }