public async Task <RateMovieResult> RateMovie(string sessionId, decimal rating, int mediaId, string guestSessionId = null, int retryCount = 0, int delayMilliseconds = 1000) { if (!string.IsNullOrEmpty(guestSessionId)) { throw new NotImplementedException($"Rating with guest session is not supported by the method: {nameof(RateMovie)}, parameter: {nameof(guestSessionId)}={guestSessionId}"); } string baseUrl = BASE_Address + BASE_Path + MOVIE_DETAILS_Path + "/" + mediaId + RATING_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 { value = rating }; 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 { } } RateMovieResult result = new RateMovieResult { HttpStatusCode = response?.StatusCode ?? HttpStatusCode.RequestTimeout }; await ReadResponseAsStringIntoResultWhenSafe(result, response); return(result); }
// failure path public async Task WhenCalledWithInvalidMovieId_ReturnsErrorCode404() { decimal rating = 5.5m; RateMovieResult response = await _client.RateMovie(_settings.SessionId, rating : rating, mediaId : _invalidMovie, guestSessionId : null, retryCount : 0, delayMilliseconds : 1000); _output.WriteLine($"TMDB server's response code {response.HttpStatusCode}"); Assert.True(response.HttpStatusCode == System.Net.HttpStatusCode.NotFound); }
// happy path public async Task WhenCalledOnUnratedMovie_RatesMovie() { decimal rating = 10m; RateMovieResult response = await _client.RateMovie(_settings.SessionId, rating : rating, mediaId : _movie, guestSessionId : null, retryCount : 0, delayMilliseconds : 1000); _output.WriteLine($"TMDB server's response code {response.HttpStatusCode}"); _output.WriteLine($"TMDB server's response message {response.Json}"); Assert.True(response.HttpStatusCode == System.Net.HttpStatusCode.Created); }
// happy path public async Task WhenCalledOnAlreadyRatedMovieWithDifferentRating_ReturnsSuccessUpdates() { decimal rating1 = 7.5m; decimal rating2 = 9.5m; await _client.RateMovie(_settings.SessionId, rating : rating1, mediaId : _movie, guestSessionId : null, retryCount : 0, delayMilliseconds : 1000); RateMovieResult response = await _client.RateMovie(_settings.SessionId, rating : rating2, mediaId : _movie, guestSessionId : null, retryCount : 0, delayMilliseconds : 1000); _output.WriteLine($"TMDB server's response code {response.HttpStatusCode}"); _output.WriteLine($"TMDB server's response message {response.Json}"); Assert.True(response.HttpStatusCode == System.Net.HttpStatusCode.Created); }