//TODO : Make sort option to enum
        public async Task <GetFavoriteMoviesResult> GetFavoriteMovies(string sessionId, int?accountId = null, string language = null, string sortBy = null, int?page = 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 + MOVIES_Path;

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

            query.Add(API_KEY_Key, ApiKey);

            if (!string.IsNullOrEmpty(language))
            {
                query.Add(LANGUAGE_Key, language);
            }

            if (page > 0)
            {
                query.Add(PAGE_Key, page.Value.ToString());
            }

            if (!string.IsNullOrEmpty(sortBy))
            {
                query.Add(SORTBY_Key, sortBy);
            }

            query.Add(SESSION_ID_Key, sessionId);

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

            GetFavoriteMoviesResult result = await GetResponse <GetFavoriteMoviesResult>(retryCount, delayMilliseconds, requestUri);

            return(result);
        }
        // failure path
        public async Task WhenCalledWithInvalidSessionId_ReturnsUnauthorized401()
        {
            _settings.SessionId = "invalidSessionId";

            GetFavoriteMoviesResult result = await _client.GetFavoriteMovies(_settings.SessionId, accountId : null, language : null, sortBy : null, page : null, retryCount : 0);

            _output.WriteLine($"Server returned {result.HttpStatusCode}");

            Assert.True(result.HttpStatusCode == System.Net.HttpStatusCode.Unauthorized);
        }
        // empty the favorite list if not yet empty
        public async Task InitializeAsync()
        {
            GetFavoriteMoviesResult getFavoriteList = await _client.GetFavoriteMovies(_settings.SessionId);

            SearchResult moviesOnFavoriteList = JsonConvert.DeserializeObject <SearchResult>(getFavoriteList.Json);

            foreach (var movie in moviesOnFavoriteList.MovieDetailModels)
            {
                await _client.UpdateFavoriteList(_settings.SessionId, "movie", false, movie.Id);
            }
        }
        // happy path
        public async Task WhenCalledOnEmptyList_ReturnsEmptyCollection()
        {
            GetFavoriteMoviesResult result = await _client.GetFavoriteMovies(_settings.SessionId, accountId : null, language : null, sortBy : null, page : null, retryCount : 0);

            _output.WriteLine($"Server returned {result.HttpStatusCode}");
            _output.WriteLine($"Json: {result.Json}");

            var favoriteList = JsonConvert.DeserializeObject <SearchResult>(result.Json);

            PrintMovieList(favoriteList);

            Assert.True(favoriteList.MovieDetailModels.Count == 0);
        }
        // happy path
        public async Task WhenCalledOnNonemptyList_GivesBackList()
        {
            await _client.UpdateFavoriteList(_settings.SessionId, "movie", true, _movie1);

            await _client.UpdateFavoriteList(_settings.SessionId, "movie", true, _movie2);

            GetFavoriteMoviesResult result = await _client.GetFavoriteMovies(_settings.SessionId, accountId : null, language : null, sortBy : null, page : null, retryCount : 0);

            _output.WriteLine($"Server returned {result.HttpStatusCode}");
            _output.WriteLine($"Json: {result.Json}");

            var favoriteList = JsonConvert.DeserializeObject <SearchResult>(result.Json);

            PrintMovieList(favoriteList);

            Assert.True(favoriteList.MovieDetailModels.Count > 0);
            Assert.Contains(favoriteList.MovieDetailModels, movie => movie.Id == _movie1);
            Assert.Contains(favoriteList.MovieDetailModels, movie => movie.Id == _movie2);
        }
        // happy path
        public async Task WhenCalledWithSortOption_RespectsSortRequest()
        {
            await _client.UpdateFavoriteList(_settings.SessionId, "movie", true, _movie1);

            await _client.UpdateFavoriteList(_settings.SessionId, "movie", true, _movie2);


            GetFavoriteMoviesResult resultAsc = await _client.GetFavoriteMovies(_settings.SessionId, accountId : null, language : null, sortBy : "created_at.asc", page : null, retryCount : 0);

            var favoriteListAsc = JsonConvert.DeserializeObject <SearchResult>(resultAsc.Json);
            var movieIdsAsc     = favoriteListAsc.MovieDetailModels.Select(movie => movie.Id);

            GetFavoriteMoviesResult resultDesc = await _client.GetFavoriteMovies(_settings.SessionId, accountId : null, language : null, sortBy : "created_at.desc", page : null, retryCount : 0);

            var favoriteListDesc = JsonConvert.DeserializeObject <SearchResult>(resultDesc.Json);
            var movieIdsDesc     = favoriteListDesc.MovieDetailModels.Select(movie => movie.Id);

            PrintMovieList(favoriteListAsc);
            PrintMovieList(favoriteListDesc);

            Assert.True(movieIdsAsc.Reverse().SequenceEqual(movieIdsDesc));
        }