예제 #1
0
        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"));
        }
예제 #3
0
        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();
        }
예제 #4
0
        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());
        }
예제 #6
0
        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();
        }
예제 #7
0
        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());
        }
예제 #8
0
 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"));
        }
예제 #12
0
        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();
        }
예제 #16
0
        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"));
        }
예제 #18
0
        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());
        }
예제 #19
0
        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);
        }
예제 #22
0
        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());
        }
예제 #23
0
        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();
        }
예제 #25
0
        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"));
        }
예제 #26
0
        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);
        }
예제 #28
0
        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);
        }