/// <summary>
        /// Unmarshaller the response from the service to the response class.
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context)
        {
            ListApiKeysResponse response = new ListApiKeysResponse();

            context.Read();
            int targetDepth = context.CurrentDepth;

            while (context.ReadAtDepth(targetDepth))
            {
                if (context.TestExpression("apiKeys", targetDepth))
                {
                    var unmarshaller = new ListUnmarshaller <ApiKey, ApiKeyUnmarshaller>(ApiKeyUnmarshaller.Instance);
                    response.ApiKeys = unmarshaller.Unmarshall(context);
                    continue;
                }
                if (context.TestExpression("nextToken", targetDepth))
                {
                    var unmarshaller = StringUnmarshaller.Instance;
                    response.NextToken = unmarshaller.Unmarshall(context);
                    continue;
                }
            }

            return(response);
        }
        public async Task TestApiKeys()
        {
            ApiKey apiKeyToSend = new ApiKey
            {
                Acl = new List <string> {
                    "search"
                },
                Description = "A description",
                Indexes     = new List <string> {
                    "indexes"
                },
                MaxHitsPerQuery        = 1000,
                MaxQueriesPerIPPerHour = 1000,
                QueryParameters        = "typoTolerance=strict",
                Referers = new List <string> {
                    "referer"
                },
                Validity = 600
            };

            AddApiKeyResponse addKeyResponse = await BaseTest.SearchClient.AddApiKeyAsync(apiKeyToSend);

            _apiKey            = addKeyResponse.Key;
            apiKeyToSend.Value = _apiKey;
            addKeyResponse.Wait();

            var addedKey = await BaseTest.SearchClient.GetApiKeyAsync(_apiKey);

            Assert.IsTrue(TestHelper.AreObjectsEqual(apiKeyToSend, addedKey, "CreatedAt", "Validity",
                                                     "GetApiKeyDelegate", "Key"));

            ListApiKeysResponse allKeys = await BaseTest.SearchClient.ListApiKeysAsync();

            Assert.IsTrue(allKeys.Keys.Exists(x => x.Value.Equals(_apiKey)));

            apiKeyToSend.MaxHitsPerQuery = 42;
            var updateKey = await BaseTest.SearchClient.UpdateApiKeyAsync(apiKeyToSend);

            updateKey.Wait();

            var getUpdatedKey = await BaseTest.SearchClient.GetApiKeyAsync(_apiKey);

            Assert.IsTrue(getUpdatedKey.MaxHitsPerQuery == 42);

            var deleteApiKey = await BaseTest.SearchClient.DeleteApiKeyAsync(_apiKey);

            deleteApiKey.Wait();

            var restoreAPIKey = await BaseTest.SearchClient.RestoreApiKeyAsync(_apiKey);

            restoreAPIKey.Wait();

            await BaseTest.SearchClient.GetApiKeyAsync(_apiKey);

            await BaseTest.SearchClient.DeleteApiKeyAsync(_apiKey);
        }
        public async Task TestApiKeys()
        {
            ApiKey apiKeyToSend = new ApiKey
            {
                Acl = new List <string> {
                    "search"
                },
                Description = "A description",
                Indexes     = new List <string> {
                    "indexes"
                },
                MaxHitsPerQuery        = 1000,
                MaxQueriesPerIPPerHour = 1000,
                QueryParameters        = "typoTolerance=strict",
                Referers = new List <string> {
                    "referer"
                },
                Validity = 600
            };

            AddApiKeyResponse addKeyResponse = await BaseTest.SearchClient.AddApiKeyAsync(apiKeyToSend);

            _apiKey            = addKeyResponse.Key;
            apiKeyToSend.Value = _apiKey;
            addKeyResponse.Wait();

            var addedKey = await BaseTest.SearchClient.GetApiKeyAsync(_apiKey);

            Assert.IsTrue(TestHelper.AreObjectsEqual(apiKeyToSend, addedKey, "CreatedAt", "Validity",
                                                     "GetApiKeyDelegate", "Key"));

            ListApiKeysResponse allKeys = await BaseTest.SearchClient.ListApiKeysAsync();

            Assert.IsTrue(allKeys.Keys.Exists(x => x.Value.Equals(_apiKey)));

            apiKeyToSend.MaxHitsPerQuery = 42;
            var updateKey = await BaseTest.SearchClient.UpdateApiKeyAsync(apiKeyToSend);

            updateKey.Wait();

            var getUpdatedKey = await BaseTest.SearchClient.GetApiKeyAsync(_apiKey);

            Assert.That(getUpdatedKey.MaxHitsPerQuery, Is.EqualTo(42));

            var deleteApiKey = await BaseTest.SearchClient.DeleteApiKeyAsync(_apiKey);

            deleteApiKey.Wait();

            TestHelper.Retry(async() =>
            {
                bool shouldRetry;
                try
                {
                    var restoreAPIKey = await BaseTest.SearchClient.RestoreApiKeyAsync(_apiKey);
                    restoreAPIKey.Wait();
                    shouldRetry = false;
                }
                catch (AlgoliaApiException e)
                {
                    shouldRetry = e.HttpErrorCode == 404 && e.Message == "Key already exists";
                }
                return(shouldRetry);
            }, TimeSpan.FromSeconds(1), 10);

            await BaseTest.SearchClient.GetApiKeyAsync(_apiKey);

            await BaseTest.SearchClient.DeleteApiKeyAsync(_apiKey);
        }