public void GetAccessToken_UserHasValidToken_ShouldReturnToken() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); ulong discordId = 69; BungieAccessToken accessToken = new BungieAccessToken(); accessToken.DiscordId = discordId; accessToken.AccessToken = "access.token"; accessToken.RefreshToken = "refresh.token"; accessToken.AccessTokenExpiresInSeconds = 3600; accessToken.RefreshTokenExpiresInSeconds = 7776000; accessToken.AccessTokenCreatedDate = DateTimeOffset.UtcNow; accessToken.RefreshTokenCreatedDate = DateTimeOffset.UtcNow; Mock.Get(emissaryDao).Setup(m => m.GetAccessTokenByDiscordId(discordId)).Returns(accessToken); IAuthorizationService authorizationService = new AuthorizationService(config, bungieApiService, emissaryDao); string actual = authorizationService.GetAccessToken(discordId); Assert.AreEqual("access.token", actual); Mock.Get(bungieApiService).Verify(m => m.RefreshAccessToken(It.IsAny <string>()), Times.Never()); }
public void SaveLoadout_AlreadyReachedMaxLoadoutLimit_ShouldReturnError() { 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>(); int maxLoadoutsLimit = 25; ulong discordId = 69; long characterId = 420; Loadout loadoutToSave = new Loadout(discordId, characterId, "loadout 26", new List <DestinyItem>()); IList <Loadout> savedLoadouts = new List <Loadout>(new Loadout[maxLoadoutsLimit]); for (int i = 0; i < maxLoadoutsLimit; i++) { savedLoadouts[i] = new Loadout(discordId, characterId, $"loadout {i + 1}", new List <DestinyItem>()); } Mock.Get(emissaryDao).Setup(m => m.GetAllLoadoutsForUser(discordId)).Returns(savedLoadouts); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.SaveLoadout(discordId, loadoutToSave, "loadout 26"); Assert.IsFalse(result.Success); Assert.IsTrue(result.ErrorMessage.Contains("limit")); }
public void AuthorizeUser_AuthCodeIsValid_ShouldSendRequestToBungieApiAndUpdateDatabaseAndReturnTrue() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); DateTimeOffset currentTimeBeforeRequest = DateTimeOffset.UtcNow; OAuthResponse oauthResponse = new OAuthResponse(); oauthResponse.AccessToken = "new-access-token"; oauthResponse.RefreshToken = "refresh-token"; oauthResponse.AccessTokenExpiresInSeconds = 3600; oauthResponse.RefreshTokenExpiresInSeconds = 7776000; Mock.Get(bungieApiService).Setup(m => m.GetOAuthAccessToken(It.IsAny <OAuthRequest>())).Returns(oauthResponse); IAuthorizationService authorizationService = new AuthorizationService(config, bungieApiService, emissaryDao); ulong discordId = 69; OAuthResponse actual = authorizationService.AuthorizeUser(discordId, "auth-code"); Assert.IsFalse(string.IsNullOrWhiteSpace(actual.AccessToken)); Assert.IsTrue(string.IsNullOrWhiteSpace(actual.ErrorType)); Mock.Get(bungieApiService).Verify(m => m.GetOAuthAccessToken(It.Is <OAuthRequest>(r => r.AuthCode == "auth-code")), Times.Once()); Mock.Get(bungieApiService).VerifyNoOtherCalls(); Mock.Get(emissaryDao).Verify(m => m.AddOrUpdateAccessToken(It.Is <BungieAccessToken>(r => r.DiscordId == discordId && r.AccessToken == "new-access-token" && r.RefreshToken == "refresh-token" && r.AccessTokenExpiresInSeconds == 3600 && r.RefreshTokenExpiresInSeconds == 7776000 && r.AccessTokenCreatedDate > currentTimeBeforeRequest && r.RefreshTokenCreatedDate > currentTimeBeforeRequest)), Times.Once()); Mock.Get(emissaryDao).VerifyNoOtherCalls(); }
public void AuthorizeUser_AuthCodeInvalid_ShouldSendRequestToBungieApiButThenReturnErrorAndNotUpdateDatabase() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); OAuthResponse errorOAuthResponse = new OAuthResponse(); errorOAuthResponse.AccessToken = default; errorOAuthResponse.RefreshToken = default; errorOAuthResponse.AccessTokenExpiresInSeconds = default; errorOAuthResponse.RefreshTokenExpiresInSeconds = default; errorOAuthResponse.ErrorType = "server_error"; errorOAuthResponse.ErrorDescription = "Invalid length for a Base-64 char array or string."; Mock.Get(bungieApiService).Setup(m => m.GetOAuthAccessToken(It.IsAny <OAuthRequest>())).Returns(errorOAuthResponse); IAuthorizationService authorizationService = new AuthorizationService(config, bungieApiService, emissaryDao); OAuthResponse actual = authorizationService.AuthorizeUser(69, "bad-auth-code"); Assert.IsTrue(string.IsNullOrWhiteSpace(actual.AccessToken)); Assert.IsFalse(string.IsNullOrWhiteSpace(actual.ErrorType)); Mock.Get(bungieApiService).Verify(m => m.GetOAuthAccessToken(It.Is <OAuthRequest>(r => r.AuthCode == "bad-auth-code")), Times.Once()); Mock.Get(bungieApiService).VerifyNoOtherCalls(); Mock.Get(emissaryDao).VerifyNoOtherCalls(); }
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 GetAccessToken_TokenIsExpiredAndRefreshTokenIsAlsoExpired_ShouldNotCallBungieApiAndShouldReturnNull() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); ulong discordId = 69; BungieAccessToken accessToken = new BungieAccessToken(); accessToken.DiscordId = discordId; accessToken.AccessToken = "access.token"; accessToken.RefreshToken = "refresh.token"; accessToken.AccessTokenExpiresInSeconds = 3600; accessToken.RefreshTokenExpiresInSeconds = 7776000; Mock.Get(emissaryDao).Setup(m => m.GetAccessTokenByDiscordId(discordId)).Returns(accessToken); DateTimeOffset currentTime = DateTimeOffset.UtcNow; DateTimeOffset timeOverNinetyDaysAgo = currentTime.AddDays(-91); accessToken.RefreshTokenCreatedDate = timeOverNinetyDaysAgo; DateTimeOffset timeOverSixtyMinsAgo = currentTime.AddSeconds(-3601); accessToken.AccessTokenCreatedDate = timeOverSixtyMinsAgo; IAuthorizationService authorizationService = new AuthorizationService(config, bungieApiService, emissaryDao); string actual = authorizationService.GetAccessToken(discordId); Assert.IsNull(actual); Mock.Get(bungieApiService).VerifyNoOtherCalls(); }
public void DeleteLoadout_LoadoutDoesNotExist_ShouldReturnErrorResult() { 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; string loadoutName = "last wish raid"; ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter titan = new DestinyCharacter(2305843009504575107, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), 420, BungieMembershipType.Steam); charactersResponse.Characters.Add(titan.CharacterId, titan); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(It.IsAny <ulong>())).Returns(new EmissaryUser()); Mock.Get(emissaryDao).Setup(m => m.GetLoadout(It.IsAny <ulong>(), It.IsAny <long>(), It.IsAny <string>())).Returns(value: null); 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.DeleteLoadout(discordId, loadoutName); Assert.IsFalse(result.Success); Assert.IsTrue(result.ErrorMessage.Contains("not found")); Mock.Get(emissaryDao).Verify(m => m.RemoveLoadout(It.IsAny <ulong>(), It.IsAny <long>(), It.IsAny <string>()), Times.Never()); }
public Emissary(IConfiguration config, IBungieApiService bungieApiService, IManifestDao manifestDao, EmissaryDbContext dbContext, IEmissaryDao emissaryDao, IAuthorizationService authorizationService) { this.config = config; this.bungieApiService = bungieApiService; this.manifestDao = manifestDao; this.dbContext = dbContext; this.emissaryDao = emissaryDao; this.authorizationService = authorizationService; }
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_UnknownErrorCode_ShouldReturnErrorResultWithMessage() { 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 = 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 loadoutToEquip = new Loadout(discordId, destinyCharacterId, "raid", new List<DestinyItem>() { izanagiItem }); EquipItemResult izanagiEquipResult = new EquipItemResult(izanagiInstanceId, 155); EquipItemsResponse equipResponse = new EquipItemsResponse(new List <EquipItemResult>() { izanagiEquipResult }); ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter titan = new DestinyCharacter(2305843009504575107, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), 420, BungieMembershipType.Steam); charactersResponse.Characters.Add(titan.CharacterId, titan); Mock.Get(bungieApiService).Setup(m => m.EquipItems(It.IsAny <EquipItemsRequest>())).Returns(equipResponse); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(It.IsAny <ulong>())).Returns(new EmissaryUser()); Mock.Get(bungieApiService).Setup(m => m.GetProfileCharacters(It.IsAny <ProfileCharactersRequest>())).Returns(charactersResponse); Mock.Get(emissaryDao).Setup(m => m.GetLoadout(It.IsAny <ulong>(), It.IsAny <long>(), It.IsAny <string>())).Returns(new Loadout(69, 420, "raid", new List <DestinyItem>() { izanagiItem })); Mock.Get(authorizationService).Setup(m => m.GetAccessToken(69)).Returns("access-token"); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.EquipLoadout(69, "raid"); Assert.IsFalse(result.Success); Assert.IsTrue(result.ErrorMessage.Contains("155")); }
public void GetAccessToken_UserHasNoTokenYet_ShouldReturnNull() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); ulong discordId = 69; Mock.Get(emissaryDao).Setup(m => m.GetAccessTokenByDiscordId(discordId)).Returns(value: null); IAuthorizationService authorizationService = new AuthorizationService(config, bungieApiService, emissaryDao); string actual = authorizationService.GetAccessToken(discordId); Assert.IsTrue(string.IsNullOrWhiteSpace(actual)); Mock.Get(bungieApiService).Verify(m => m.RefreshAccessToken(It.IsAny <string>()), Times.Never()); }
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 GetAccessToken_TriesToRefreshTokenButApiRequestFails_ShouldCallBungieApiAndShouldReturnNull() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); OAuthResponse errorResponse = new OAuthResponse(); errorResponse.ErrorType = "invalid_request"; errorResponse.ErrorDescription = "Missing required parameter code"; Mock.Get(bungieApiService).Setup(m => m.RefreshAccessToken("refresh-token")).Returns(errorResponse); IAuthorizationService authorizationService = new AuthorizationService(config, bungieApiService, emissaryDao); string actual = authorizationService.GetAccessToken(69); Assert.IsNull(actual); Mock.Get(bungieApiService).VerifyNoOtherCalls(); }
public void EquipLoadout_ItemHasBeenDismantled_ShouldReturnErrorResult() { 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>(); long wendigoInstanceId = 6917529112673221040; DestinyItem wendigoItem = new DestinyItem(wendigoInstanceId, "Wendigo GL3", new List <string>() { }, 69, new List <uint>() { }, "Legendary"); EquipItemResult wendigoEquipResult = new EquipItemResult(wendigoInstanceId, BungiePlatformErrorCodes.DestinyItemNotFound); EquipItemsResponse equipResponse = new EquipItemsResponse(new List <EquipItemResult>() { wendigoEquipResult }); ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter titan = new DestinyCharacter(2305843009504575107, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), 420, BungieMembershipType.Steam); charactersResponse.Characters.Add(titan.CharacterId, titan); Mock.Get(bungieApiService).Setup(m => m.EquipItems(It.IsAny <EquipItemsRequest>())).Returns(equipResponse); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(It.IsAny <ulong>())).Returns(new EmissaryUser()); Mock.Get(bungieApiService).Setup(m => m.GetProfileCharacters(It.IsAny <ProfileCharactersRequest>())).Returns(charactersResponse); Mock.Get(emissaryDao).Setup(m => m.GetLoadout(It.IsAny <ulong>(), It.IsAny <long>(), It.IsAny <string>())).Returns(new Loadout(69, 420, "raid", new List <DestinyItem>() { wendigoItem })); Mock.Get(authorizationService).Setup(m => m.GetAccessToken(69)).Returns("access-token"); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.EquipLoadout(69, "raid"); Assert.IsFalse(result.Success); Assert.IsTrue(result.ErrorMessage.Contains("dismantled")); }
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 CurrentlyEquipped_UserNotRegisteredYet_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>(); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); bool eventEmitted = false; emissary.RequestAuthorizationEvent += (discordId) => eventEmitted = true; ulong discordId = 221313820847636491; Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(value: null); EmissaryResult result = emissary.CurrentlyEquipped(discordId); Assert.IsTrue(eventEmitted); }
public void ListLoadouts_UserIsNotRegistered_ShouldReturnError() { 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; Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(value: null); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.ListLoadouts(discordId); Assert.IsFalse(result.Success); // Assert.IsTrue(result.ErrorMessage.Contains("user not found")); }
public void EquipLoadout_UserIsNotRegistered_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; Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(It.Is <ulong>(u => u == discordId))).Returns(value: null); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); bool eventEmitted = false; emissary.RequestAuthorizationEvent += (discordId) => eventEmitted = true; EmissaryResult result = emissary.EquipLoadout(discordId, "raid"); Assert.IsFalse(result.Success); Assert.IsTrue(eventEmitted); }
public void GetAccessToken_TokenHasExpiredButCanBeRefreshed_ShouldSendRequestToBungieApiAndUpdateDatabaseAndReturnNewToken() { IConfiguration config = Mock.Of <IConfiguration>(); IBungieApiService bungieApiService = Mock.Of <IBungieApiService>(); IEmissaryDao emissaryDao = Mock.Of <IEmissaryDao>(); ulong discordId = 69; BungieAccessToken accessToken = new BungieAccessToken(); accessToken.DiscordId = discordId; accessToken.AccessToken = "access.token"; accessToken.RefreshToken = "refresh.token"; accessToken.AccessTokenExpiresInSeconds = 3600; accessToken.RefreshTokenExpiresInSeconds = 7776000; DateTimeOffset currentTime = DateTimeOffset.UtcNow; DateTimeOffset timeSixtyMinsAgo = currentTime.AddSeconds(-3601); accessToken.AccessTokenCreatedDate = timeSixtyMinsAgo; accessToken.RefreshTokenCreatedDate = timeSixtyMinsAgo; Mock.Get(emissaryDao).Setup(m => m.GetAccessTokenByDiscordId(discordId)).Returns(accessToken); OAuthResponse refreshResponse = new OAuthResponse(); refreshResponse.AccessToken = "new.access.token"; refreshResponse.RefreshToken = "refresh.token"; refreshResponse.AccessTokenExpiresInSeconds = 3600; refreshResponse.RefreshTokenExpiresInSeconds = 7776000; Mock.Get(bungieApiService).Setup(m => m.RefreshAccessToken("refresh.token")).Returns(refreshResponse); IAuthorizationService authorizationService = new AuthorizationService(config, bungieApiService, emissaryDao); string actual = authorizationService.GetAccessToken(discordId); Assert.AreEqual("new.access.token", actual); Mock.Get(bungieApiService).Verify(m => m.RefreshAccessToken("refresh.token"), Times.Once()); Mock.Get(emissaryDao).Verify(m => m.AddOrUpdateAccessToken(It.Is <BungieAccessToken>(r => r.AccessToken == "new.access.token" && r.AccessTokenCreatedDate > timeSixtyMinsAgo)), Times.Once()); }
public void DeleteLoadout_LoadoutNameDoesntMatchExactly_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 = 69; string loadoutName = "last wish raid"; ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter titan = new DestinyCharacter(2305843009504575107, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), 420, BungieMembershipType.Steam); charactersResponse.Characters.Add(titan.CharacterId, titan); DestinyItem izanagiItem = new DestinyItem(6917529135183883487, "Izanagi's Burden", new List <string>() { "Weapon", "Kinetic Weapon", "Sniper Rifle" }, 3211806999, new List <uint>() { 2, 1, 10 }, "Exotic"); Loadout savedLoadout = new Loadout(discordId, titan.CharacterId, loadoutName, new List <DestinyItem>() { izanagiItem }); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(new EmissaryUser()); Mock.Get(emissaryDao).Setup(m => m.GetLoadout(discordId, titan.CharacterId, loadoutName)).Returns(savedLoadout); 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.DeleteLoadout(discordId, "Last Wish Raid"); Assert.IsFalse(result.Success); Assert.IsTrue(result.ErrorMessage.Contains("not found")); Mock.Get(emissaryDao).Verify(m => m.RemoveLoadout(It.IsAny <ulong>(), It.IsAny <long>(), It.IsAny <string>()), Times.Never()); }
public void EquipLoadout_UserIsNotRegistered_ShouldReturnErrorResultAndNotCallBungieApi() { 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; Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(It.Is <ulong>(u => u == discordId))).Returns(value: null); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); EmissaryResult result = emissary.EquipLoadout(discordId, "raid"); Assert.IsFalse(result.Success); Mock.Get(bungieApiService).Verify(m => m.GetOAuthAccessToken(It.IsAny <OAuthRequest>()), Times.Never()); Mock.Get(bungieApiService).Verify(m => m.EquipItems(It.IsAny <EquipItemsRequest>()), Times.Never()); Mock.Get(bungieApiService).VerifyNoOtherCalls(); }
public void SaveCurrentlyEquippedAsLoadout_CurrentlyEquippedFailsBecauseUserIsNotRegistered_ShouldReturnSameErrorAsCurrentlyEquipped() { 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; IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); bool eventEmitted = false; emissary.RequestAuthorizationEvent += (discordId) => eventEmitted = true; EmissaryResult result = emissary.SaveCurrentlyEquippedAsLoadout(discordId, "raid"); Assert.IsFalse(result.Success); Assert.IsTrue(eventEmitted); Assert.IsTrue(result.ErrorMessage.Contains("need access")); }
public void DeleteLoadout_UserIsNotRegistered_ShouldReturnErrorResultAndEmitRequestAuthorizationEvent() { 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; Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(value: null); IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService); bool eventEmitted = false; emissary.RequestAuthorizationEvent += (discordId) => eventEmitted = true; EmissaryResult result = emissary.DeleteLoadout(discordId, "raid"); Assert.IsFalse(result.Success); Assert.IsTrue(eventEmitted); Assert.IsTrue(result.ErrorMessage.Contains("need access")); }
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 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 EquipLoadout_ExoticWeaponAndArmorCurrentlyEquipped_ShouldPutExoticsAtEndOfEquipRequestList() { 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 izanagiInstanceId = 6917529135183883487; long recluseInstanceId = 6917529123204409619; long wendigoInstanceId = 6917529112673221040; long maskOfRullInstanceId = 6917529110566559001; long reverieDawnInstanceId = 6917529138010460936; long plateOfTranscendenceInstanceId = 6917529109687230597; long peacekeepersInstanceId = 6917529122999918127; long markOfTheGreatHuntInstanceId = 6917529128966008940; DestinyItem izanagiItem = new DestinyItem(izanagiInstanceId, "Izanagi's Burden", new List <string>() { }, 69, new List <uint>() { }, "Exotic"); DestinyItem recluseItem = new DestinyItem(recluseInstanceId, "The Recluse", new List <string>() { }, 69, new List <uint>() { }, "Legendary"); DestinyItem wendigoItem = new DestinyItem(wendigoInstanceId, "Wendigo GL3", new List <string>() { }, 69, new List <uint>() { }, "Legendary"); DestinyItem maskOfRullItem = new DestinyItem(maskOfRullInstanceId, "Mask of Rull", new List <string>() { }, 69, new List <uint>() { }, "Legendary"); DestinyItem reverieDawnItem = new DestinyItem(reverieDawnInstanceId, "Reverie Dawn Gauntlets", new List <string>() { }, 69, new List <uint>() { }, "Legendary"); DestinyItem plateOfTranscendenceItem = new DestinyItem(plateOfTranscendenceInstanceId, "Plate of Transcendence", new List <string>() { }, 69, new List <uint>() { }, "Legendary"); DestinyItem peacekeepersItem = new DestinyItem(peacekeepersInstanceId, "Peacekeepers", new List <string>() { }, 69, new List <uint>() { }, "Exotic"); DestinyItem markOfTheGreatHuntItem = new DestinyItem(markOfTheGreatHuntInstanceId, "Mark of the Great Hunt", new List <string>() { }, 69, new List <uint>() { }, "Legendary"); IList <DestinyItem> loadoutItems = new List <DestinyItem>() { izanagiItem, recluseItem, wendigoItem, maskOfRullItem, reverieDawnItem, plateOfTranscendenceItem, peacekeepersItem, markOfTheGreatHuntItem }; Loadout savedLoadout = new Loadout(discordId, 420, "last wish raid", loadoutItems); ProfileCharactersResponse charactersResponse = new ProfileCharactersResponse(); DestinyCharacter titan = new DestinyCharacter(2305843009504575107, DateTimeOffset.Parse("2019-12-24T22:40:31Z"), 69, BungieMembershipType.Steam); charactersResponse.Characters.Add(titan.CharacterId, titan); IList <long> originalItemInstanceIdsOrder = new List <long>() { izanagiInstanceId, recluseInstanceId, wendigoInstanceId, maskOfRullInstanceId, reverieDawnInstanceId, plateOfTranscendenceInstanceId, peacekeepersInstanceId, markOfTheGreatHuntInstanceId }; IList <long> expectedItemInstanceIdsOrder = new List <long>() { recluseInstanceId, wendigoInstanceId, maskOfRullInstanceId, reverieDawnInstanceId, plateOfTranscendenceInstanceId, markOfTheGreatHuntInstanceId, izanagiInstanceId, peacekeepersInstanceId }; EquipItemResult izanagiEquipResult = new EquipItemResult(izanagiInstanceId, BungiePlatformErrorCodes.Success); EquipItemResult recluseEquipResult = new EquipItemResult(recluseInstanceId, BungiePlatformErrorCodes.Success); EquipItemResult wendigoEquipResult = new EquipItemResult(wendigoInstanceId, BungiePlatformErrorCodes.Success); EquipItemResult maskOfRullEquipResult = new EquipItemResult(maskOfRullInstanceId, BungiePlatformErrorCodes.Success); EquipItemResult reverieDawnEquipResult = new EquipItemResult(reverieDawnInstanceId, BungiePlatformErrorCodes.Success); EquipItemResult plateOfTranscendenceEquipResult = new EquipItemResult(plateOfTranscendenceInstanceId, BungiePlatformErrorCodes.Success); EquipItemResult peacekeepersEquipResult = new EquipItemResult(peacekeepersInstanceId, BungiePlatformErrorCodes.Success); EquipItemResult markOfTheGreatHuntEquipResult = new EquipItemResult(markOfTheGreatHuntInstanceId, BungiePlatformErrorCodes.Success); EquipItemsResponse equipResponse = new EquipItemsResponse(new List <EquipItemResult>() { izanagiEquipResult, recluseEquipResult, wendigoEquipResult, maskOfRullEquipResult, reverieDawnEquipResult, plateOfTranscendenceEquipResult, peacekeepersEquipResult, markOfTheGreatHuntEquipResult }); Mock.Get(emissaryDao).Setup(m => m.GetLoadout(discordId, It.IsAny <long>(), "last wish raid")).Returns(savedLoadout); Mock.Get(bungieApiService).Setup(m => m.GetProfileCharacters(It.IsAny <ProfileCharactersRequest>())).Returns(charactersResponse); Mock.Get(emissaryDao).Setup(m => m.GetUserByDiscordId(discordId)).Returns(new EmissaryUser()); Mock.Get(bungieApiService).Setup(m => m.EquipItems(It.IsAny <EquipItemsRequest>())).Returns(equipResponse); 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, "last wish raid"); Assert.IsTrue(result.Success); Mock.Get(bungieApiService).Verify(m => m.EquipItems(It.Is <EquipItemsRequest>(r => r.ItemInstanceIds.SequenceEqual(expectedItemInstanceIdsOrder))), Times.Once()); }
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); }