public void EquipLoadout_LoadoutNameHasExtraWhitespace_ShouldTrimNameAndThenEquipLoadout() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); long destinyCharacterId = 2305843009504575107; uint izanagiHash = 3211806999; long izanagiInstanceId = 6917529135183883487; DestinyItem izanagiItem = new DestinyItem(izanagiInstanceId, "Izanagi's Burden", new List <string>() { "Weapon", "Kinetic Weapon", "Sniper Rifle" }, izanagiHash, new List <uint>() { 2, 1, 10 }, "Exotic"); Loadout loadout = new Loadout(discordId, destinyCharacterId, "last wish raid", new List <DestinyItem>() { izanagiItem }); EquipItemsResponse response = new EquipItemsResponse(new List <EquipItemResult>() { new EquipItemResult(izanagiHash, BungiePlatformErrorCodes.Success) }); ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter titan = new DestinyCharacter(2305843009504575107, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), destinyProfileId, BungieMembershipType.Steam); charactersResponse.Characters.Add(titan.CharacterId, titan); Mock.Get(bungieApiService).Setup(m => m.EquipItems(It.IsAny <EquipItemsRequest>())).Returns(response); Mock.Get(bungieApiService).Setup(m => m.GetProfileCharacters(It.IsAny <ProfileCharactersRequest>())).Returns(charactersResponse); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(It.IsAny <ulong>())).Returns(user); Mock.Get(emissaryDao).Setup(m => m.GetLoadout(It.IsAny <ulong>(), It.IsAny <long>(), It.IsAny <string>())).Returns(loadout); Mock.Get(authorizationService).Setup(m => m.GetAccessToken(discordId)).Returns("access-token"); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.EquipLoadout(discordId, " \t last wish raid \t \n "); Assert.IsTrue(result.Success); Mock.Get(emissaryDao).Verify(m => m.GetLoadout(discordId, destinyCharacterId, "last wish raid")); // Mock.Get(bungieApiService).Verify(m => // m.EquipItems(It.Is<EquipItemsRequest>(r => // r.DestinyCharacterId == destinyCharacterId && // r.MembershipType == destinyMembershipType && // r.AccessToken == accessToken && // r.ItemInstanceIds.Count == loadout.Items.Count && // r.ItemInstanceIds[0] == izanagiInstanceId)), Times.Once()); }
public void AddOrUpdateUser_UserWithSameValuesButDifferentDiscordId_ShouldKeepBoth() { ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; string accessToken = "access-token"; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); EmissaryUser user2 = new EmissaryUser(69, destinyProfileId, destinyMembershipType); using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) { connection.Open(); DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>() .UseSqlite(connection) .Options; using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) { dbContext.Database.EnsureCreated(); dbContext.Users.Add(user); dbContext.SaveChanges(); } using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) { Assert.AreEqual(1, dbContext.Users.Count()); UserDao userDao = new UserDao(dbContext); userDao.AddOrUpdateUser(user2); } using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) { Assert.AreEqual(2, dbContext.Users.Count()); EmissaryUser foundUser = dbContext.Users.Find(user.DiscordId); Assert.IsNotNull(foundUser); EmissaryUser foundUser2 = dbContext.Users.Find(user2.DiscordId); Assert.IsNotNull(foundUser2); } } }
public void AddOrUpdateUser_ExampleUser_ShouldWriteToDatabase() { ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; string accessToken = "access-token"; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) { connection.Open(); DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>() .UseSqlite(connection) .Options; using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) { // create the schema in the database // dbContext.Database.OpenConnection(); dbContext.Database.EnsureCreated(); // dbContext.Database.CloseConnection(); } using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) { UserDao userDao = new UserDao(dbContext); userDao.AddOrUpdateUser(user); } using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) { Assert.AreEqual(1, dbContext.Users.Count()); EmissaryUser foundUser = dbContext.Users.Find(discordId); Assert.AreEqual(discordId, foundUser.DiscordId); Assert.AreEqual(destinyProfileId, foundUser.DestinyProfileId); Assert.AreEqual(destinyMembershipType, foundUser.DestinyMembershipType); } } }
public void GetUserByDiscordId_UserExistsButThenIsRemoved_ShouldReturnUserThenReturnNull() { ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; string accessToken = "access-token"; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) { connection.Open(); DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>() .UseSqlite(connection) .Options; using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) { dbContext.Database.EnsureCreated(); dbContext.Users.Add(user); dbContext.SaveChanges(); } using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) { UserDao userDao = new UserDao(dbContext); EmissaryUser foundUser = userDao.GetUserByDiscordId(discordId); Assert.AreEqual(discordId, foundUser.DiscordId); Assert.AreEqual(destinyProfileId, foundUser.DestinyProfileId); dbContext.Users.Remove(foundUser); dbContext.SaveChanges(); } using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) { UserDao userDao = new UserDao(dbContext); EmissaryUser foundUser = userDao.GetUserByDiscordId(discordId); Assert.IsNull(foundUser); } } }
public void GetUserByDiscordId_UserDoesExistAndThereAreLotsOfOtherUsersToo_ShouldReturnUser() { EmissaryUser user1 = new EmissaryUser(69, 69, 3); EmissaryUser user2 = new EmissaryUser(420, 69, 3); EmissaryUser user3 = new EmissaryUser(42069, 69, 3); using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) { connection.Open(); DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>() .UseSqlite(connection) .Options; using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) { dbContext.Database.EnsureCreated(); dbContext.Users.Add(user1); dbContext.Users.Add(user2); dbContext.Users.Add(user3); dbContext.SaveChanges(); } using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) { UserDao userDao = new UserDao(dbContext); EmissaryUser foundUser = userDao.GetUserByDiscordId(69); Assert.AreEqual((ulong)69, foundUser.DiscordId); Assert.AreEqual((long)69, foundUser.DestinyProfileId); } } }
public void RegisterOrReauthorize_NewUser_ShouldRequestNewAccessTokenAndWriteToDatabase() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; EmissaryUser expectedUser = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); string authCode = "auth-code"; OAuthResponse authResponse = new OAuthResponse(); authResponse.AccessToken = "access-token"; // Mock.Get(bungieApiService) // .Setup(m => // m.GetOAuthAccessToken(It.Is<OAuthRequest>(r => // r.AuthCode == authCode))) // .Returns(authResponse); Mock.Get(authorizationService).Setup(m => m.AuthorizeUser(discordId, authCode)).Returns(authResponse); UserMembershipsResponse membershipsResponse = new UserMembershipsResponse(); membershipsResponse.DestinyMemberships = new List <DestinyMembership>(); membershipsResponse.DestinyMemberships.Add(new DestinyMembership("pimpdaddy", destinyProfileId, destinyMembershipType, BungieMembershipType.Steam)); Mock.Get(bungieApiService) .Setup(m => m.GetMembershipsForUser(It.Is <UserMembershipsRequest>(r => r.AccessToken == "access-token"))) .Returns(membershipsResponse); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.RegisterOrReauthorize(discordId, authCode); Assert.IsTrue(result.Success); // Mock.Get(bungieApiService).Verify(m => m.GetOAuthAccessToken(It.IsAny<OAuthRequest>()), Times.Once()); Mock.Get(authorizationService).Verify(m => m.AuthorizeUser(discordId, authCode), Times.Once()); Mock.Get(authorizationService).VerifyNoOtherCalls(); Mock.Get(bungieApiService).Verify(m => m.GetMembershipsForUser(It.IsAny <UserMembershipsRequest>()), Times.Once()); Mock.Get(emissaryDao) .Verify(m => m.AddOrUpdateUser(It.Is <EmissaryUser>(u => u.DiscordId == discordId && u.DestinyProfileId == destinyProfileId && u.DestinyMembershipType == destinyMembershipType)), Times.Once()); }
public void ListLoadouts_UserHasOneLoadout_ShouldReturnSuccessWithLoadoutMessageString() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); long titanCharacterId = 2305843009504575107; uint izanagiHash = 3211806999; long izanagiInstanceId = 6917529135183883487; DestinyItem izanagiItem = new DestinyItem(izanagiInstanceId, "Izanagi's Burden", new List <string>() { "Weapon", "Kinetic Weapon", "Sniper Rifle" }, izanagiHash, new List <uint>() { 2, 1, 10 }, "Exotic"); Loadout titanLoadout = new Loadout(discordId, titanCharacterId, "raid", new List <DestinyItem>() { izanagiItem }); ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter titan = new DestinyCharacter(titanCharacterId, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), destinyProfileId, BungieMembershipType.Steam); charactersResponse.Characters.Add(titan.CharacterId, titan); IList <Loadout> allLoadoutsForUser = new List <Loadout>() { titanLoadout }; Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(user); Mock.Get(emissaryDao).Setup(m => m.GetAllLoadoutsForUser(discordId)).Returns(allLoadoutsForUser); Mock.Get(bungieApiService).Setup(m => m.GetProfileCharacters(It.IsAny <ProfileCharactersRequest>())).Returns(charactersResponse); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.ListLoadouts(discordId); Assert.IsTrue(result.Success); Assert.AreEqual(JsonConvert.SerializeObject(allLoadoutsForUser), result.Message); }
public void EquipLoadout_AccessTokenExpired_ShouldEmitRequestAuthorizationEvent() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; string accessToken = "expired-access-token"; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter titan = new DestinyCharacter(2305843009504575107, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), destinyProfileId, BungieMembershipType.Steam); charactersResponse.Characters.Add(titan.CharacterId, titan); long destinyCharacterId = 2305843009504575107; uint izanagiHash = 3211806999; long izanagiInstanceId = 6917529135183883487; DestinyItem izanagiItem = new DestinyItem(izanagiInstanceId, "Izanagi's Burden", new List <string>() { "Weapon", "Kinetic Weapon", "Sniper Rifle" }, izanagiHash, new List <uint>() { 2, 1, 10 }, "Exotic"); Loadout loadout = new Loadout(discordId, destinyCharacterId, "raid", new List <DestinyItem>() { izanagiItem }); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(It.Is <ulong>(u => u == discordId))).Returns(user); Mock.Get(bungieApiService).Setup(m => m.GetProfileCharacters(It.IsAny <ProfileCharactersRequest>())).Returns(charactersResponse); Mock.Get(emissaryDao).Setup(m => m.GetLoadout(discordId, destinyCharacterId, "last wish raid")).Returns(loadout); Mock.Get(bungieApiService).Setup(m => m.EquipItems(It.IsAny <EquipItemsRequest>())).Throws(new BungieApiException("Unauthorized: Access is denied due to invalid credentials.")); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); bool eventEmitted = false; emissary.RequestAuthorizationEvent += (discordId) => eventEmitted = true; EmissaryResult result = emissary.EquipLoadout(discordId, "last wish raid"); Assert.IsFalse(result.Success); Assert.IsTrue(eventEmitted); }
public void RegisterOrReauthorize_UserAlreadyExists_ShouldRefreshAccessTokenAndWriteToDatabase() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; string expiredAccessToken = "expired-access-token"; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(user); string authCode = "auth-code"; OAuthResponse oauthResponse = new OAuthResponse(); string newAccessToken = "new-access-token"; oauthResponse.AccessToken = newAccessToken; Mock.Get(bungieApiService) .Setup(m => m.GetOAuthAccessToken(It.Is <OAuthRequest>(r => r.AuthCode == authCode))) .Returns(oauthResponse); Mock.Get(authorizationService).Setup(m => m.AuthorizeUser(discordId, authCode)).Returns(oauthResponse); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.RegisterOrReauthorize(discordId, authCode); Assert.IsTrue(result.Success); Assert.IsTrue(result.Message.ToLower().Contains("authorized")); Mock.Get(authorizationService).Verify(m => m.AuthorizeUser(discordId, authCode), Times.Once()); Mock.Get(emissaryDao).Verify(m => m.GetUserByDiscordId(discordId), Times.Once()); Mock.Get(emissaryDao).Verify(m => m.AddOrUpdateUser(It.Is <EmissaryUser>(r => r.DiscordId == discordId)), Times.Never()); // Mock.Get(emissaryDao).Verify(m => m.AddOrUpdateAccessToken(It.Is<BungieAccessToken>(r => r.AccessToken == "new-access-token")), Times.Once()); }
public void RegisterOrReauthorize_ExistingUserButInvalidAuthCode_ShouldReturnErrorResultAndNotChangeDatabase() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(user); string authCode = "auth-code"; OAuthResponse authResponse = new OAuthResponse(); authResponse.AccessToken = null; authResponse.ErrorType = "AuthorizationCodeInvalid"; // Mock.Get(bungieApiService) // .Setup(m => // m.GetOAuthAccessToken(It.Is<OAuthRequest>(r => // r.AuthCode == authCode))) // .Returns(authResponse); Mock.Get(authorizationService).Setup(m => m.AuthorizeUser(discordId, authCode)).Returns(authResponse); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.RegisterOrReauthorize(discordId, authCode); Assert.IsFalse(result.Success); Assert.IsTrue(result.ErrorMessage.Contains("AuthorizationCodeInvalid")); // Mock.Get(bungieApiService).Verify(m => m.GetOAuthAccessToken(It.IsAny<OAuthRequest>()), Times.Once()); Mock.Get(bungieApiService).VerifyNoOtherCalls(); Mock.Get(authorizationService).Verify(m => m.AuthorizeUser(discordId, authCode), Times.Once()); Mock.Get(authorizationService).VerifyNoOtherCalls(); Mock.Get(emissaryDao).Verify(m => m.GetUserByDiscordId(discordId), Times.Once()); // it should not try to update the user in the database Mock.Get(emissaryDao).VerifyNoOtherCalls(); }
public void SaveLoadout_NewLoadoutForRegisteredUser_ShouldSucceedAndWriteToDatabase() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 221313820847636491; long destinyCharacterId = 2305843009504575107; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); uint izanagiHash = 3211806999; long izanagiInstanceId = 6917529135183883487; DestinyItem izanagiItem = new DestinyItem(izanagiInstanceId, "Izanagi's Burden", new List <string>() { "Weapon", "Kinetic Weapon", "Sniper Rifle" }, izanagiHash, new List <uint>() { 2, 1, 10 }, "Exotic"); Loadout loadoutToSave = new Loadout(discordId, destinyCharacterId, "crucible", new List <DestinyItem>() { izanagiItem }); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(user); Mock.Get(emissaryDao).Setup(m => m.GetAllLoadoutsForUser(discordId)).Returns(new List <Loadout>()); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.SaveLoadout(discordId, loadoutToSave, "crucible"); Assert.IsTrue(result.Success); Mock.Get(emissaryDao) .Verify(m => m.AddOrUpdateLoadout(It.Is <Loadout>(l => l.DiscordId == loadoutToSave.DiscordId && l.DestinyCharacterId == loadoutToSave.DestinyCharacterId && l.LoadoutName == loadoutToSave.LoadoutName)), Times.Once()); }
public void ListLoadouts_UserHasNoLoadouts_ShouldReturnSuccessButZeroLoadoutsEmptyList() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); IList <Loadout> allLoadoutsForUser = new List <Loadout>() { }; // assemble so that titan is the most recently played character long titanCharacterId = 2305843009504575107; ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter titan = new DestinyCharacter(titanCharacterId, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), destinyProfileId, BungieMembershipType.Steam); charactersResponse.Characters.Add(titan.CharacterId, titan); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(user); Mock.Get(emissaryDao).Setup(m => m.GetAllLoadoutsForUser(discordId)).Returns(allLoadoutsForUser); Mock.Get(bungieApiService).Setup(m => m.GetProfileCharacters(It.IsAny <ProfileCharactersRequest>())).Returns(charactersResponse); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.ListLoadouts(discordId); Assert.IsTrue(result.Success); Assert.AreEqual(JsonConvert.SerializeObject(allLoadoutsForUser), result.Message); }
public void ListLoadouts_UserHasLoadoutsOnDifferentCharacters_ShouldReturnLoadoutsForCurrentCharacterOnly() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType); long titanCharacterId = 2305843009504575107; uint izanagiHash = 3211806999; long izanagiInstanceId = 6917529135183883487; DestinyItem izanagiItem = new DestinyItem(izanagiInstanceId, "Izanagi's Burden", new List <string>() { "Kinetic Weapon", "Weapon", "Sniper Rifle" }, izanagiHash, new List <uint>() { 2, 1, 10 }, "Exotic"); uint suddenDeathHash = 1879212552; long suddenDeathInstanceId = 6917529043814140192; DestinyItem suddenDeathItem = new DestinyItem(suddenDeathInstanceId, "A Sudden Death", new List <string>() { "Energy Weapon", "Weapon", "Shotgun" }, suddenDeathHash, new List <uint>() { 3, 1, 11 }, "Exotic"); Loadout titanLoadout = new Loadout(discordId, titanCharacterId, "raid", new List <DestinyItem>() { izanagiItem }); Loadout titanLoadout2 = new Loadout(discordId, titanCharacterId, "raid2", new List <DestinyItem>() { suddenDeathItem }); Loadout titanLoadout3 = new Loadout(discordId, titanCharacterId, "raid3", new List <DestinyItem>() { izanagiItem, suddenDeathItem }); Loadout warlockLoadout = new Loadout(discordId, 69, "raid", new List <DestinyItem>() { izanagiItem }); Loadout hunterLoadout = new Loadout(discordId, 420, "raid", new List <DestinyItem>() { izanagiItem }); IList <Loadout> allLoadoutsForUser = new List <Loadout>() { titanLoadout, titanLoadout2, titanLoadout3, warlockLoadout, hunterLoadout }; // need this for verification IList <Loadout> titanLoadouts = new List <Loadout>() { titanLoadout, titanLoadout2, titanLoadout3 }; // assemble so that titan is the most recently played character ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter titan = new DestinyCharacter(titanCharacterId, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), destinyProfileId, BungieMembershipType.Steam); charactersResponse.Characters.Add(titan.CharacterId, titan); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(user); Mock.Get(emissaryDao).Setup(m => m.GetAllLoadoutsForUser(discordId)).Returns(allLoadoutsForUser); Mock.Get(bungieApiService).Setup(m => m.GetProfileCharacters(It.IsAny <ProfileCharactersRequest>())).Returns(charactersResponse); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.ListLoadouts(discordId); Assert.IsTrue(result.Success); Assert.AreEqual(JsonConvert.SerializeObject(titanLoadouts), result.Message); }
public void CurrentlyEquipped_CurrentGearDoesNotMatchAnySavedLoadouts_ShouldReturnLoadoutNameUnsavedLoadout() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 69; long destinyCharacterId = 420; string loadoutName = "last wish raid"; DestinyItem destinyItem1 = new DestinyItem(6969, "dummy item 1", new List <string>() { "Weapon", "Kinetic Weapon" }, 420420, new List <uint>() { 1, 2 }, "Legendary"); DestinyItem destinyItem2 = new DestinyItem(9696, "dummy item 2", new List <string>() { "Armor", "Helmet" }, 240240, new List <uint>() { 3, 4 }, "Legendary"); List <DestinyItem> loadoutItems = new List <DestinyItem>() { destinyItem1, destinyItem2 }; Loadout savedLoadout = new Loadout(discordId, destinyCharacterId, loadoutName, loadoutItems); long destinyProfileId = 42069; EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, BungieMembershipType.Steam); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(user); Mock.Get(emissaryDao).Setup(m => m.GetAllLoadoutsForUser(discordId)).Returns(new List <Loadout>() { savedLoadout }); Mock.Get(emissaryDao).Setup(m => m.GetLoadout(discordId, destinyCharacterId, loadoutName)).Returns(savedLoadout); ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter character = new DestinyCharacter(destinyCharacterId, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), destinyProfileId, BungieMembershipType.Steam); charactersResponse.Characters.Add(character.CharacterId, character); CharacterEquipmentResponse equipmentResponse = new CharacterEquipmentResponse(); DestinyGenericItem genericItem1 = new DestinyGenericItem(destinyItem1.ItemHash, destinyItem1.ItemInstanceId); equipmentResponse.Items = new List <DestinyGenericItem>() { genericItem1 }; Mock.Get(bungieApiService).Setup(m => m.GetProfileCharacters(It.IsAny <ProfileCharactersRequest>())).Returns(charactersResponse); Mock.Get(bungieApiService).Setup(m => m.GetCharacterEquipment(It.IsAny <CharacterEquipmentRequest>())).Returns(equipmentResponse); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(destinyItem1.ItemHash)).Returns(new ManifestItemDefinition(destinyItem1.Name, destinyItem1.TierTypeName, destinyItem1.CategoryHashes)); Mock.Get(manifestDao).Setup(m => m.GetItemCategoryDefinition(1)).Returns(new ManifestItemCategoryDefinition("Weapon")); Mock.Get(manifestDao).Setup(m => m.GetItemCategoryDefinition(2)).Returns(new ManifestItemCategoryDefinition("Kinetic Weapon")); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.CurrentlyEquipped(discordId); Loadout actualLoadout = JsonConvert.DeserializeObject <Loadout>(result.Message); Assert.AreEqual("unsaved loadout", actualLoadout.LoadoutName); }
public void CurrentlyEquipped_MultipleCharacters_ShouldReturnEquippedItemsForMostRecentlyPlayedCharacter() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; int destinyMembershipType = BungieMembershipType.Steam; EmissaryUser user = new EmissaryUser(); user.DiscordId = discordId; user.DestinyProfileId = destinyProfileId; user.DestinyMembershipType = destinyMembershipType; Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(user); ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter warlock = new DestinyCharacter(2305843009470834170, DateTimeOffset.Parse("2019-12-13T02:31:43Z"), destinyProfileId, BungieMembershipType.Steam); // titan is the most recently played character DestinyCharacter titan = new DestinyCharacter(2305843009504575107, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), destinyProfileId, BungieMembershipType.Steam); DestinyCharacter hunter = new DestinyCharacter(2305843009557154440, DateTimeOffset.Parse("2019-11-25T03:34:56Z"), destinyProfileId, BungieMembershipType.Steam); charactersResponse.Characters.Add(warlock.CharacterId, warlock); charactersResponse.Characters.Add(titan.CharacterId, titan); charactersResponse.Characters.Add(hunter.CharacterId, hunter); Mock.Get(bungieApiService).Setup(m => m.GetProfileCharacters(It.Is <ProfileCharactersRequest>(r => r.DestinyProfileId == destinyProfileId && r.MembershipType == destinyMembershipType))).Returns(charactersResponse); uint izanagiHash = 3211806999; long izanagiInstanceId = 6917529135183883487; DestinyGenericItem[] equippedItems = new DestinyGenericItem[] { new DestinyGenericItem(izanagiHash, izanagiInstanceId) }; CharacterEquipmentResponse equipmentResponse = new CharacterEquipmentResponse(equippedItems); Mock.Get(bungieApiService).Setup(m => m.GetCharacterEquipment(It.Is <CharacterEquipmentRequest>(r => r.DestinyCharacterId == titan.CharacterId && r.DestinyProfileId == destinyProfileId && r.DestinyMembershipType == destinyMembershipType))).Returns(equipmentResponse); DestinyItem izanagiItem = new DestinyItem(izanagiInstanceId, "Izanagi's Burden", new List <string>() { "Kinetic Weapon", "Weapon", "Sniper Rifle" }, izanagiHash, new List <uint>() { 2, 1, 10 }, "Exotic"); IList <DestinyItem> expectedLoadoutItems = new List <DestinyItem>() { izanagiItem }; Loadout expectedLoadout = new Loadout(discordId, titan.CharacterId, "unsaved loadout", expectedLoadoutItems); // IBungieApiService bungieApiService = Mock.Of<IBungieApiService>(x => // x.GetProfileCharacters(charactersRequest) == charactersResponse && // x.GetCharacterEquipment(equipmentRequest) == equipmentResponse // ); ManifestItemDefinition izanagiItemDefinition = new ManifestItemDefinition("Izanagi's Burden", "Exotic", new uint[] { 2, 1, 10 }); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(izanagiHash)).Returns(izanagiItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemCategoryDefinition(1)).Returns(new ManifestItemCategoryDefinition("Weapon")); Mock.Get(manifestDao).Setup(m => m.GetItemCategoryDefinition(2)).Returns(new ManifestItemCategoryDefinition("Kinetic Weapon")); Mock.Get(manifestDao).Setup(m => m.GetItemCategoryDefinition(10)).Returns(new ManifestItemCategoryDefinition("Sniper Rifle")); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.CurrentlyEquipped(discordId); Assert.IsTrue(result.Success); Assert.AreEqual(JsonConvert.SerializeObject(expectedLoadout), result.Message); }
public void CurrentlyEquipped_LotsOfItems_ShouldReturnLoadoutWithAllItems() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IManifestDao manifestDao = Mock.Of <IManifestDao>(); EmissaryDbContext dbContext = Mock.Of <EmissaryDbContext>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>(); ulong discordId = 221313820847636491; long destinyProfileId = 4611686018467260757; // long destinyCharacterId = 2305843009504575107; int destinyMembershipType = BungieMembershipType.Steam; EmissaryUser user = new EmissaryUser(); user.DiscordId = discordId; user.DestinyProfileId = destinyProfileId; user.DestinyMembershipType = destinyMembershipType; Mock.Get(emissaryDao).Setup(ud => ud.GetUserByDiscordId(discordId)).Returns(user); ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter warlock = new DestinyCharacter(2305843009470834170, DateTimeOffset.Parse("2019-12-13T02:31:43Z"), destinyProfileId, BungieMembershipType.Steam); // titan is the most recently played character DestinyCharacter titan = new DestinyCharacter(2305843009504575107, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), destinyProfileId, BungieMembershipType.Steam); DestinyCharacter hunter = new DestinyCharacter(2305843009557154440, DateTimeOffset.Parse("2019-11-25T03:34:56Z"), destinyProfileId, BungieMembershipType.Steam); charactersResponse.Characters.Add(warlock.CharacterId, warlock); charactersResponse.Characters.Add(titan.CharacterId, titan); charactersResponse.Characters.Add(hunter.CharacterId, hunter); Mock.Get(bungieApiService).Setup(m => m.GetProfileCharacters(It.Is <ProfileCharactersRequest>(r => r.DestinyProfileId == destinyProfileId && r.MembershipType == destinyMembershipType))).Returns(charactersResponse); // item hashes uint perfectParadoxHash = 3393519051; uint suddenDeathHash = 1879212552; uint apexPredatorHash = 2545083870; uint maskOfRullHash = 2913992254; uint reverieDawnGauntletsHash = 2336820707; uint plateOfTranscendenceHash = 3939809874; uint peacekeepersHash = 3539357319; uint markOfTheGreatHuntHash = 16387641; uint starMapShellHash = 1558857470; uint soloStandSparrowHash = 3538153284; uint safePassageShipHash = 4063523619; uint sentinelSubclassHash = 3382391785; uint clanBannerHash = 2873099163; uint prismaticInfernoEmblemHash = 4159550313; uint finisherHash = 152583919; uint emoteHash = 3183180185; uint lanternOfOsirisHash = 3360014173; // item instance IDs long perfectParadox = 6917529138356180356; long suddenDeath = 6917529043814140192; long apexPredator = 6917529137866710642; long maskOfRull = 6917529110566559001; long reverieDawnGauntlets = 6917529138010460936; long plateOfTranscendence = 6917529109687230597; long peacekeepers = 6917529122999918127; long markOfTheGreatHunt = 6917529128966008940; long starMapShell = 6917529134911753611; long soloStandSparrow = 6917529096117947574; long safePassageShip = 6917529128292261186; long sentinelSubclass = 6917529102011422104; long clanBanner = 6917529137830892799; long prismaticInfernoEmblem = 6917529105645094388; long finisher = 6917529137848551327; long emote = 6917529101999517414; long lanternOfOsiris = 6917529137968184629; DestinyGenericItem[] equippedItems = new DestinyGenericItem[] { new DestinyGenericItem(perfectParadoxHash, perfectParadox), new DestinyGenericItem(suddenDeathHash, suddenDeath), new DestinyGenericItem(apexPredatorHash, apexPredator), new DestinyGenericItem(maskOfRullHash, maskOfRull), new DestinyGenericItem(reverieDawnGauntletsHash, reverieDawnGauntlets), new DestinyGenericItem(plateOfTranscendenceHash, plateOfTranscendence), new DestinyGenericItem(peacekeepersHash, peacekeepers), new DestinyGenericItem(markOfTheGreatHuntHash, markOfTheGreatHunt), new DestinyGenericItem(starMapShellHash, starMapShell), new DestinyGenericItem(soloStandSparrowHash, soloStandSparrow), new DestinyGenericItem(safePassageShipHash, safePassageShip), new DestinyGenericItem(sentinelSubclassHash, sentinelSubclass), new DestinyGenericItem(clanBannerHash, clanBanner), new DestinyGenericItem(prismaticInfernoEmblemHash, prismaticInfernoEmblem), new DestinyGenericItem(finisherHash, finisher), new DestinyGenericItem(emoteHash, emote), new DestinyGenericItem(lanternOfOsirisHash, lanternOfOsiris) }; CharacterEquipmentResponse equipmentResponse = new CharacterEquipmentResponse(equippedItems); Mock.Get(bungieApiService).Setup(m => m.GetCharacterEquipment(It.Is <CharacterEquipmentRequest>(r => r.DestinyCharacterId == titan.CharacterId && r.DestinyProfileId == destinyProfileId && r.DestinyMembershipType == destinyMembershipType))).Returns(equipmentResponse); // IBungieApiService bungieApiService = Mock.Of<IBungieApiService>(x => // x.GetProfileCharacters(charactersRequest) == charactersResponse && // x.GetCharacterEquipment(equipmentRequest) == equipmentResponse // ); ManifestItemDefinition perfectParadoxItemDefinition = new ManifestItemDefinition("Perfect Paradox", "Legendary", new List <uint>() { 1, 2 }); ManifestItemDefinition suddenDeathItemDefinition = new ManifestItemDefinition("A Sudden Death", "Legendary", new List <uint>() { 1, 3 }); ManifestItemDefinition apexPredatorItemDefinition = new ManifestItemDefinition("Apex Predator", "Legendary", new List <uint>() { 1, 4 }); ManifestItemDefinition maskOfRullItemDefinition = new ManifestItemDefinition("Mask of Rull", "Legendary", new List <uint>() { 20 }); ManifestItemDefinition reverieDawnGauntletsItemDefinition = new ManifestItemDefinition("Reverie Dawn Gauntlets", "Legendary", new List <uint>() { 20 }); ManifestItemDefinition plateOfTranscendenceItemDefinition = new ManifestItemDefinition("Plate of Transcendence", "Legendary", new List <uint>() { 20 }); ManifestItemDefinition peacekeepersItemDefinition = new ManifestItemDefinition("Peacekeepers", "Exotic", new List <uint>() { 20 }); ManifestItemDefinition markOfTheGreatHuntItemDefinition = new ManifestItemDefinition("Mark of the Great Hunt", "Legendary", new List <uint>() { 20 }); ManifestItemDefinition starMapShellItemDefinition = new ManifestItemDefinition("Star Map Shell", "Exotic", new List <uint>()); ManifestItemDefinition soloStandSparrowItemDefinition = new ManifestItemDefinition("Solo Stand", "Legendary", new List <uint>()); ManifestItemDefinition safePassageItemDefinition = new ManifestItemDefinition("Safe Passage", "Legendary", new List <uint>()); ManifestItemDefinition sentinelItemDefinition = new ManifestItemDefinition("Sentinel", "Common", new List <uint>()); ManifestItemDefinition clanBannerItemDefinition = new ManifestItemDefinition("Clan Banner", "Legendary", new List <uint>()); ManifestItemDefinition prismaticInfernoItemDefinition = new ManifestItemDefinition("Prismatic Inferno", "Legendary", new List <uint>()); ManifestItemDefinition finishersItemDefinition = new ManifestItemDefinition("Finishers", "Common", new List <uint>()); ManifestItemDefinition emotesItemDefinition = new ManifestItemDefinition("Emotes", "Common", new List <uint>()); ManifestItemDefinition lanternOfOsirisItemDefinition = new ManifestItemDefinition("The Lantern of Osiris", "Legendary", new List <uint>()); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(perfectParadoxHash)).Returns(perfectParadoxItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(suddenDeathHash)).Returns(suddenDeathItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(apexPredatorHash)).Returns(apexPredatorItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(maskOfRullHash)).Returns(maskOfRullItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(reverieDawnGauntletsHash)).Returns(reverieDawnGauntletsItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(plateOfTranscendenceHash)).Returns(plateOfTranscendenceItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(peacekeepersHash)).Returns(peacekeepersItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(markOfTheGreatHuntHash)).Returns(markOfTheGreatHuntItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(starMapShellHash)).Returns(starMapShellItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(soloStandSparrowHash)).Returns(soloStandSparrowItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(safePassageShipHash)).Returns(safePassageItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(sentinelSubclassHash)).Returns(sentinelItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(clanBannerHash)).Returns(clanBannerItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(prismaticInfernoEmblemHash)).Returns(prismaticInfernoItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(finisherHash)).Returns(finishersItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(emoteHash)).Returns(emotesItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemDefinition(lanternOfOsirisHash)).Returns(lanternOfOsirisItemDefinition); Mock.Get(manifestDao).Setup(m => m.GetItemCategoryDefinition(1)).Returns(new ManifestItemCategoryDefinition("Weapon")); Mock.Get(manifestDao).Setup(m => m.GetItemCategoryDefinition(2)).Returns(new ManifestItemCategoryDefinition("Kinetic Weapon")); Mock.Get(manifestDao).Setup(m => m.GetItemCategoryDefinition(3)).Returns(new ManifestItemCategoryDefinition("Energy Weapon")); Mock.Get(manifestDao).Setup(m => m.GetItemCategoryDefinition(4)).Returns(new ManifestItemCategoryDefinition("Power Weapon")); Mock.Get(manifestDao).Setup(m => m.GetItemCategoryDefinition(20)).Returns(new ManifestItemCategoryDefinition("Armor")); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.CurrentlyEquipped(discordId); Assert.IsTrue(result.Success); Loadout loadoutResult = JsonConvert.DeserializeObject <Loadout>(result.Message); Assert.AreEqual(discordId, loadoutResult.DiscordId); Assert.AreEqual(titan.CharacterId, loadoutResult.DestinyCharacterId); Assert.IsFalse(string.IsNullOrWhiteSpace(loadoutResult.LoadoutName)); // Assert.AreEqual(17, loadoutResult.Items.Count); // it should only return 8 items, because now we only pay attention to weapons and armor Assert.AreEqual(8, loadoutResult.Items.Count); Assert.AreEqual("Perfect Paradox", loadoutResult.Items[0].Name); Assert.AreEqual("A Sudden Death", loadoutResult.Items[1].Name); }