// failure path
        public async Task WhenAddingInvalidMovie_Returns404()
        {
            int movieToAdd = _invalidMovieId;
            UpdateFavoriteListResult response = await _client.UpdateFavoriteList(_settings.SessionId, "movie", true, movieToAdd);

            _output.WriteLine($"Server responded: {response.HttpStatusCode}");

            Assert.True(response.HttpStatusCode == System.Net.HttpStatusCode.NotFound);
        }
        // adds or removes media from favorite list
        // media type: "movie" OR "tv"
        //TODO refactor media type to enum
        public async Task <UpdateFavoriteListResult> UpdateFavoriteList(string sessionId, string mediaType, bool add, int mediaId, int?accountId = null, int retryCount = 0, int delayMilliseconds = 1000)
        {
            // no mistake here: missing "account_id" parameter add the string literal "{account_id}" as paths segment
            string baseUrl = BASE_Address + BASE_Path + ACCOUNT_DETAILS_Path + "/" + (accountId.HasValue ? accountId.Value.ToString() : "{account_id}") + FAVORITE_Path;

            var query = new Dictionary <string, string>();

            query.Add(API_KEY_Key, ApiKey);
            query.Add(SESSION_ID_Key, sessionId);

            string requestUri = QueryHelpers.AddQueryString(baseUrl, query);

            var jsonObj = new
            {
                media_type = mediaType,
                media_id   = mediaId,
                favorite   = add
            };

            string json    = JsonConvert.SerializeObject(jsonObj);
            var    content = new StringContent(json, encoding: Encoding.UTF8, mediaType: "application/json");

            HttpRequestMessage request = new HttpRequestMessage
            {
                Content    = content,
                Method     = HttpMethod.Post,
                RequestUri = new Uri(requestUri)
            };

            HttpResponseMessage response = null;
            int counter = retryCount;

            try
            {
                response = await HttpClient.SendAsync(request);
            }
            catch { }
            while (response?.IsSuccessStatusCode != true && counter > 0)
            {
                await Task.Delay(delayMilliseconds);

                try
                {
                    --counter;
                    response = await HttpClient.SendAsync(request);
                }
                catch { }
            }
            UpdateFavoriteListResult result = new UpdateFavoriteListResult
            {
                HttpStatusCode = response?.StatusCode ?? HttpStatusCode.RequestTimeout
            };

            await ReadResponseAsStringIntoResultWhenSafe(result, response);

            return(result);
        }
        // happy path
        public async Task WhenAddingMovieNotOnFavoriteList_AddsMovie()
        {
            int movieToAdd = _movie1;
            UpdateFavoriteListResult response = await _client.UpdateFavoriteList(_settings.SessionId, "movie", true, movieToAdd);

            _output.WriteLine($"Server responded: {response.HttpStatusCode}");
            _output.WriteLine(response.Json);

            var getFavorites = await _client.GetFavoriteMovies(_settings.SessionId);

            Assert.True(response.HttpStatusCode.IsSuccessCode());
            Assert.Contains(movieToAdd.ToString(), getFavorites.Json);
        }