Example #1
0
        async Task TestApiAgainstAccessToken(string accessToken, ServerTester tester, TestAccount testAccount)
        {
            var resultUser =
                await TestApiAgainstAccessToken <string>(accessToken, "api/test/me/id",
                                                         tester.PayTester.HttpClient);

            Assert.Equal(testAccount.UserId, resultUser);

            var secondUser = tester.NewAccount();

            secondUser.GrantAccess();

            var resultStores =
                await TestApiAgainstAccessToken <StoreData[]>(accessToken, "api/test/me/stores",
                                                              tester.PayTester.HttpClient);

            Assert.Contains(resultStores,
                            data => data.Id.Equals(testAccount.StoreId, StringComparison.InvariantCultureIgnoreCase));
            Assert.DoesNotContain(resultStores,
                                  data => data.Id.Equals(secondUser.StoreId, StringComparison.InvariantCultureIgnoreCase));

            Assert.True(await TestApiAgainstAccessToken <bool>(accessToken,
                                                               $"api/test/me/stores/{testAccount.StoreId}/can-edit",
                                                               tester.PayTester.HttpClient));

            Assert.Equal(testAccount.RegisterDetails.IsAdmin, await TestApiAgainstAccessToken <bool>(accessToken,
                                                                                                     $"api/test/me/is-admin",
                                                                                                     tester.PayTester.HttpClient));

            await Assert.ThrowsAnyAsync <HttpRequestException>(async() =>
            {
                await TestApiAgainstAccessToken <bool>(accessToken, $"api/test/me/stores/{secondUser.StoreId}/can-edit",
                                                       tester.PayTester.HttpClient);
            });
        }
Example #2
0
        async Task TestApiAgainstAccessToken(string accessToken, ServerTester tester, TestAccount testAccount,
                                             params string[] permissions)
        {
            var resultUser =
                await TestApiAgainstAccessToken <string>(accessToken, $"{TestApiPath}/me/id",
                                                         tester.PayTester.HttpClient);

            Assert.Equal(testAccount.UserId, resultUser);

            //create a second user to see if any of its data gets messed upin our results.
            var secondUser = tester.NewAccount();

            secondUser.GrantAccess();

            var selectiveStorePermissions = Permissions.ExtractStorePermissionsIds(permissions);

            if (permissions.Contains(Permissions.StoreManagement) || selectiveStorePermissions.Any())
            {
                var resultStores =
                    await TestApiAgainstAccessToken <StoreData[]>(accessToken, $"{TestApiPath}/me/stores",
                                                                  tester.PayTester.HttpClient);

                foreach (string selectiveStorePermission in selectiveStorePermissions)
                {
                    Assert.True(await TestApiAgainstAccessToken <bool>(accessToken,
                                                                       $"{TestApiPath}/me/stores/{selectiveStorePermission}/can-edit",
                                                                       tester.PayTester.HttpClient));

                    Assert.Contains(resultStores,
                                    data => data.Id.Equals(selectiveStorePermission, StringComparison.InvariantCultureIgnoreCase));
                }

                if (permissions.Contains(Permissions.StoreManagement))
                {
                    Assert.True(await TestApiAgainstAccessToken <bool>(accessToken,
                                                                       $"{TestApiPath}/me/stores/actions",
                                                                       tester.PayTester.HttpClient));

                    Assert.True(await TestApiAgainstAccessToken <bool>(accessToken,
                                                                       $"{TestApiPath}/me/stores/{testAccount.StoreId}/can-edit",
                                                                       tester.PayTester.HttpClient));
                    Assert.Contains(resultStores,
                                    data => data.Id.Equals(testAccount.StoreId, StringComparison.InvariantCultureIgnoreCase));
                }
                else
                {
                    await Assert.ThrowsAnyAsync <HttpRequestException>(async() =>
                    {
                        await TestApiAgainstAccessToken <bool>(accessToken,
                                                               $"{TestApiPath}/me/stores/actions",
                                                               tester.PayTester.HttpClient);
                    });
                }

                Assert.DoesNotContain(resultStores,
                                      data => data.Id.Equals(secondUser.StoreId, StringComparison.InvariantCultureIgnoreCase));
            }
            else
            {
                await Assert.ThrowsAnyAsync <HttpRequestException>(async() =>
                {
                    await TestApiAgainstAccessToken <bool>(accessToken,
                                                           $"{TestApiPath}/me/stores/{testAccount.StoreId}/can-edit",
                                                           tester.PayTester.HttpClient);
                });
            }

            await Assert.ThrowsAnyAsync <HttpRequestException>(async() =>
            {
                await TestApiAgainstAccessToken <bool>(accessToken, $"{TestApiPath}/me/stores/{secondUser.StoreId}/can-edit",
                                                       tester.PayTester.HttpClient);
            });

            if (permissions.Contains(Permissions.ServerManagement))
            {
                Assert.True(await TestApiAgainstAccessToken <bool>(accessToken,
                                                                   $"{TestApiPath}/me/is-admin",
                                                                   tester.PayTester.HttpClient));
            }
        }
Example #3
0
        async Task TestApiAgainstAccessToken(string accessToken, ServerTester tester, TestAccount testAccount,
                                             string expectedPermissionsString)
        {
            var expectedPermissions = Permission.ToPermissions(expectedPermissionsString).ToArray();

            expectedPermissions ??= new Permission[0];
            var apikeydata = await TestApiAgainstAccessToken <ApiKeyData>(accessToken, $"api/v1/api-keys/current", tester.PayTester.HttpClient);

            var permissions = apikeydata.Permissions;

            Assert.Equal(expectedPermissions.Length, permissions.Length);
            foreach (var expectPermission in expectedPermissions)
            {
                Assert.True(permissions.Any(p => p == expectPermission), $"Missing expected permission {expectPermission}");
            }

            if (permissions.Contains(Permission.Create(Policies.CanViewProfile)))
            {
                var resultUser = await TestApiAgainstAccessToken <string>(accessToken, $"{TestApiPath}/me/id", tester.PayTester.HttpClient);

                Assert.Equal(testAccount.UserId, resultUser);
            }
            else
            {
                await Assert.ThrowsAnyAsync <HttpRequestException>(async() =>
                {
                    await TestApiAgainstAccessToken <string>(accessToken, $"{TestApiPath}/me/id", tester.PayTester.HttpClient);
                });
            }
            //create a second user to see if any of its data gets messed upin our results.
            var secondUser = tester.NewAccount();

            secondUser.GrantAccess();

            var canModifyAllStores        = Permission.Create(Policies.CanModifyStoreSettings, null);
            var canModifyServer           = Permission.Create(Policies.CanModifyServerSettings, null);
            var unrestricted              = Permission.Create(Policies.Unrestricted, null);
            var selectiveStorePermissions = permissions.Where(p => p.StoreId != null && p.Policy == Policies.CanModifyStoreSettings);

            if (permissions.Contains(canModifyAllStores) || selectiveStorePermissions.Any())
            {
                var resultStores =
                    await TestApiAgainstAccessToken <StoreData[]>(accessToken, $"{TestApiPath}/me/stores",
                                                                  tester.PayTester.HttpClient);

                foreach (var selectiveStorePermission in selectiveStorePermissions)
                {
                    Assert.True(await TestApiAgainstAccessToken <bool>(accessToken,
                                                                       $"{TestApiPath}/me/stores/{selectiveStorePermission.StoreId}/can-edit",
                                                                       tester.PayTester.HttpClient));

                    Assert.Contains(resultStores,
                                    data => data.Id.Equals(selectiveStorePermission.StoreId, StringComparison.InvariantCultureIgnoreCase));
                }

                bool shouldBeAuthorized = false;
                if (permissions.Contains(canModifyAllStores) || selectiveStorePermissions.Contains(Permission.Create(Policies.CanViewStoreSettings, testAccount.StoreId)))
                {
                    Assert.True(await TestApiAgainstAccessToken <bool>(accessToken,
                                                                       $"{TestApiPath}/me/stores/{testAccount.StoreId}/can-view",
                                                                       tester.PayTester.HttpClient));
                    Assert.Contains(resultStores,
                                    data => data.Id.Equals(testAccount.StoreId, StringComparison.InvariantCultureIgnoreCase));
                    shouldBeAuthorized = true;
                }
                if (permissions.Contains(canModifyAllStores) || selectiveStorePermissions.Contains(Permission.Create(Policies.CanModifyStoreSettings, testAccount.StoreId)))
                {
                    Assert.True(await TestApiAgainstAccessToken <bool>(accessToken,
                                                                       $"{TestApiPath}/me/stores/{testAccount.StoreId}/can-view",
                                                                       tester.PayTester.HttpClient));
                    Assert.True(await TestApiAgainstAccessToken <bool>(accessToken,
                                                                       $"{TestApiPath}/me/stores/{testAccount.StoreId}/can-edit",
                                                                       tester.PayTester.HttpClient));
                    Assert.Contains(resultStores,
                                    data => data.Id.Equals(testAccount.StoreId, StringComparison.InvariantCultureIgnoreCase));
                    shouldBeAuthorized = true;
                }

                if (!shouldBeAuthorized)
                {
                    await Assert.ThrowsAnyAsync <HttpRequestException>(async() =>
                    {
                        await TestApiAgainstAccessToken <bool>(accessToken,
                                                               $"{TestApiPath}/me/stores/{testAccount.StoreId}/can-edit",
                                                               tester.PayTester.HttpClient);
                    });

                    await Assert.ThrowsAnyAsync <HttpRequestException>(async() =>
                    {
                        await TestApiAgainstAccessToken <bool>(accessToken,
                                                               $"{TestApiPath}/me/stores/{testAccount.StoreId}/can-view",
                                                               tester.PayTester.HttpClient);
                    });

                    Assert.DoesNotContain(resultStores,
                                          data => data.Id.Equals(testAccount.StoreId, StringComparison.InvariantCultureIgnoreCase));
                }
            }
            else if (!permissions.Contains(unrestricted))
            {
                await Assert.ThrowsAnyAsync <HttpRequestException>(async() =>
                {
                    await TestApiAgainstAccessToken <bool>(accessToken,
                                                           $"{TestApiPath}/me/stores/{testAccount.StoreId}/can-edit",
                                                           tester.PayTester.HttpClient);
                });
            }
            else
            {
                await TestApiAgainstAccessToken <bool>(accessToken,
                                                       $"{TestApiPath}/me/stores/{testAccount.StoreId}/can-edit",
                                                       tester.PayTester.HttpClient);
            }

            if (!permissions.Contains(unrestricted))
            {
                await Assert.ThrowsAnyAsync <HttpRequestException>(async() =>
                {
                    await TestApiAgainstAccessToken <bool>(accessToken, $"{TestApiPath}/me/stores/{secondUser.StoreId}/can-edit",
                                                           tester.PayTester.HttpClient);
                });
            }
            else
            {
                await TestApiAgainstAccessToken <bool>(accessToken, $"{TestApiPath}/me/stores/{secondUser.StoreId}/can-edit",
                                                       tester.PayTester.HttpClient);
            }

            if (permissions.Contains(canModifyServer))
            {
                Assert.True(await TestApiAgainstAccessToken <bool>(accessToken,
                                                                   $"{TestApiPath}/me/is-admin",
                                                                   tester.PayTester.HttpClient));
            }
            else
            {
                await Assert.ThrowsAnyAsync <HttpRequestException>(async() =>
                {
                    await TestApiAgainstAccessToken <bool>(accessToken,
                                                           $"{TestApiPath}/me/is-admin",
                                                           tester.PayTester.HttpClient);
                });
            }
        }