public ArticleController (ArticleService articleService, ArticleLikeService articleLikeService, ArticleModelBuilder articleModelBuilder, CommentService commentService, CommentReportService commentReportService) { _articleService = articleService; _articleLikeService = articleLikeService; _articleModelBuilder = articleModelBuilder; _commentService = commentService; _commentReportService = commentReportService; }
public async Task Translation_CreateDuplicated_ErrorRaised() { var article = new ArticleModelBuilder() .WithRandomValues() .Build(); using var client = await _webAppContext.GetLoggedClient(); // Create article using var httpResponseCreate = await CallApiAsync <CreateArticleRequest>( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article } ); Assert.True(httpResponseCreate.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseCreate.StatusCode}"); var dataCreate = await GetResponse <CreateArticleResponse>(httpResponseCreate.Content); var translation = new TranslationModelBuilder().WithRandomValues().Build(); // Create translation using var httpResponseCreateTranslation = await CallApiAsync <CreateTranslationRequest>( client.PostAsync, $"/api/v1/translation", new CreateTranslationRequest { ArticleId = dataCreate.Article.Id, Translation = translation } ); Assert.True(httpResponseCreateTranslation.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseCreateTranslation.StatusCode}"); // Create duplicated translation using var httpResponseCreateTranslationDuplicated = await CallApiAsync <CreateTranslationRequest>( client.PostAsync, $"/api/v1/translation", new CreateTranslationRequest { ArticleId = dataCreate.Article.Id, Translation = translation } ); Assert.True(httpResponseCreateTranslationDuplicated.StatusCode == System.Net.HttpStatusCode.BadRequest, $"Duplicated translation error not raised"); var exception = await GetResponse <dynamic>(httpResponseCreateTranslationDuplicated.Content); Assert.True(exception.error.code == ExceptionCodes.TRANSLATION_ALREADY_EXISTS, "Invalid error code returned for duplicated translation"); }
public void Init() { AutoMapperConfiguration.Configure(); _repository = new Mock <IRepository <Article, Guid> >(); _mediaUploadFacade = new Mock <IMediaUploadFacade>(); _modelBuider = new ArticleModelBuilder(_repository.Object, _mediaUploadFacade.Object); _mediaUploadFacade.Setup(x => x.CreateMedaiItem(It.IsAny <Stream>(), It.IsAny <string>(), It.IsAny <string>())); }
public async Task Article_CreateWithTranslations_TranslationsIgnored() { var article = new ArticleModelBuilder() .WithRandomValues() .Build(); article.Translations = new List <Translation> { new TranslationModelBuilder() .WithRandomValues() .Build() }; using var client = await _webAppContext.GetLoggedClient(); // Create article using var httpResponseCreate = await CallApiAsync <CreateArticleRequest>( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article } ); Assert.True(httpResponseCreate.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseCreate.StatusCode}"); var dataCreate = await GetResponse <CreateArticleResponse>(httpResponseCreate.Content); Assert.True(dataCreate != null, "No data received"); Assert.True(dataCreate.Article != null, "No article created"); Assert.True(dataCreate.Article.Translations == null || dataCreate.Article.Translations.Count == 0, "Translations not ignored"); // Delete using var httpResponseDelete = await CallApiAsync( client.DeleteAsync, $"/api/v1/article/{dataCreate.Article.Id}" ); Assert.True(httpResponseDelete.StatusCode == System.Net.HttpStatusCode.OK, $"Error in deleting article response: {httpResponseDelete.StatusCode}"); }
public async Task Translation_UpdateNoExistingTranslation_NotFoundRaised() { var article = new ArticleModelBuilder() .WithRandomValues() .Build(); using var client = await _webAppContext.GetLoggedClient(); // Create article using var httpResponseCreate = await CallApiAsync <CreateArticleRequest>( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article } ); Assert.True(httpResponseCreate.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseCreate.StatusCode}"); var dataCreate = await GetResponse <CreateArticleResponse>(httpResponseCreate.Content); var translation = new TranslationModelBuilder().WithRandomValues().Build(); // Update non existing translation using var httpResponseUpdateTranslation = await CallApiAsync <UpdateTranslationRequest>( client.PutAsync, $"/api/v1/translation", new UpdateTranslationRequest { ArticleId = dataCreate.Article.Id, Translation = translation } ); Assert.True(httpResponseUpdateTranslation.StatusCode == System.Net.HttpStatusCode.NotFound, $"Update error 'Not Found' not raised: {httpResponseUpdateTranslation.StatusCode}"); }
public async Task Translation_CreateMultipleSearchByReviewer_Success() { var article = new ArticleModelBuilder() .WithRandomValues() .Build(); using var client = await _webAppContext.GetLoggedClient(); // Create article using var httpResponseCreate = await CallApiAsync <CreateArticleRequest>( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article, Text = "In ENglish" } ); Assert.True(httpResponseCreate.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseCreate.StatusCode}"); var dataCreate = await GetResponse <CreateArticleResponse>(httpResponseCreate.Content); var translationES = new TranslationModelBuilder() .WithRandomValues() .WithLanguage("es") .Build(); // Create translation ES using var httpResponseCreateTranslationES = await CallApiAsync <CreateTranslationRequest>( client.PostAsync, $"/api/v1/translation", new CreateTranslationRequest { ArticleId = dataCreate.Article.Id, Translation = translationES, Text = "En español" } ); Assert.True(httpResponseCreateTranslationES.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create translation response: {httpResponseCreateTranslationES.StatusCode}"); var translationFR = new TranslationModelBuilder() .WithRandomValues() .WithLanguage("fr") .Build(); // Create translation FR using var httpResponseCreateTranslationFR = await CallApiAsync <CreateTranslationRequest>( client.PostAsync, $"/api/v1/translation", new CreateTranslationRequest { ArticleId = dataCreate.Article.Id, Translation = translationFR, Text = "Fraçous" } ); Assert.True(httpResponseCreateTranslationFR.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create translation response: {httpResponseCreateTranslationFR.StatusCode}"); // Search by reviewed by using var httpResponseSearch = await CallApiAsync( client.GetAsync, $"/api/v1/articles?filter.reviewedBy={HttpUtility.UrlEncode(translationES.ReviewedBy)}&page=1&pageCount=10" ); var searchResult = await GetResponse <ArticleSearchResponse>(httpResponseSearch.Content); Assert.True(searchResult.Total == 1, "Not found articles"); Assert.True(searchResult.Articles != null && searchResult.Articles.Count == 1, "Not found articles"); Assert.True(searchResult.Articles[0].Translations != null && searchResult.Articles[0].Translations.Where(w => w.ReviewedBy == translationES.ReviewedBy).Count() == 1, "Not found articles"); // Delete using var httpResponseDelete = await CallApiAsync( client.DeleteAsync, $"/api/v1/article/{dataCreate.Article.Id}" ); Assert.True(httpResponseDelete.StatusCode == System.Net.HttpStatusCode.OK, $"Error in deleting article response: {httpResponseCreate.StatusCode}"); }
public async Task Translation_CreateUpdateDelete_Success() { var article = new ArticleModelBuilder() .WithRandomValues() .Build(); using var client = await _webAppContext.GetLoggedClient(); // Create article using var httpResponseCreate = await CallApiAsync <CreateArticleRequest>( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article } ); Assert.True(httpResponseCreate.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseCreate.StatusCode}"); var dataCreate = await GetResponse <CreateArticleResponse>(httpResponseCreate.Content); var translation = new TranslationModelBuilder().WithRandomValues().Build(); // Create translation using var httpResponseCreateTranslation = await CallApiAsync <CreateTranslationRequest>( client.PostAsync, $"/api/v1/translation", new CreateTranslationRequest { ArticleId = dataCreate.Article.Id, Text = "Prueba", Translation = translation } ); Assert.True(httpResponseCreateTranslation.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseCreateTranslation.StatusCode}"); // Retrieve article using var httpResponseRetrieve = await CallApiAsync( client.GetAsync, $"/api/v1/article/{dataCreate.Article.Id}" ); Assert.True(httpResponseRetrieve.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create translation response: {httpResponseRetrieve.StatusCode}"); var dataArticle = await GetResponse <Article>(httpResponseRetrieve.Content); Assert.True(dataArticle.Translations != null && dataArticle.Translations.Count > 0, "No data received"); Assert.True(DateEquals(dataArticle.Translations.First().Date, translation.Date), "Date mismatch"); Assert.True(dataArticle.Translations.First().Language == translation.Language, "Language mismatch"); Assert.True(dataArticle.Translations.First().ReviewedBy == translation.ReviewedBy, "ReviewedBy mismatch"); Assert.True(dataArticle.Translations.First().Status == translation.Status, "Status mismatch"); Assert.True(dataArticle.Translations.First().Subtitle == translation.Subtitle, "Subtitle mismatch"); Assert.True(dataArticle.Translations.First().Summary == translation.Summary, "Summary mismatch"); Assert.True(dataArticle.Translations.First().Title == translation.Title, "Title mismatch"); Assert.True(dataArticle.Translations.First().TranslatedBy == translation.TranslatedBy, "TranslatedBy mismatch"); HttpClient httpGet = new HttpClient(); var getTranslationTextResponse = await httpGet.GetAsync(dataArticle.Translations.Where(w => w.Language == translation.Language).First().TextLink); Assert.True(getTranslationTextResponse.StatusCode == System.Net.HttpStatusCode.OK, $"Error retrieving translation text file: {getTranslationTextResponse.StatusCode}"); // Delete using var httpResponseDelete = await CallApiAsync( client.DeleteAsync, $"/api/v1/translation?articleId={dataArticle.Id}&language={translation.Language}" ); Assert.True(httpResponseDelete.StatusCode == System.Net.HttpStatusCode.OK, $"Error in deleting article response: {httpResponseCreate.StatusCode}"); // Check article using var httpResponseRetrieveCheck = await CallApiAsync( client.GetAsync, $"/api/v1/article/{dataCreate.Article.Id}" ); Assert.True(httpResponseRetrieveCheck.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseRetrieveCheck.StatusCode}"); var dataArticleCheck = await GetResponse <Article>(httpResponseRetrieveCheck.Content); Assert.True(dataArticle.Translations.Where(w => w.Language == article.Language).Count() == 0, "Translation not deleted"); }
public async Task Translation_CreateMultipleUpdateDelete_Success() { var article = new ArticleModelBuilder() .WithRandomValues() .Build(); using var client = await _webAppContext.GetLoggedClient(); // Create article using var httpResponseCreate = await CallApiAsync <CreateArticleRequest>( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article, Text = "In ENglish" } ); Assert.True(httpResponseCreate.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseCreate.StatusCode}"); var dataCreate = await GetResponse <CreateArticleResponse>(httpResponseCreate.Content); var translationES = new TranslationModelBuilder() .WithRandomValues() .WithLanguage("es") .Build(); // Create translation ES using var httpResponseCreateTranslationES = await CallApiAsync <CreateTranslationRequest>( client.PostAsync, $"/api/v1/translation", new CreateTranslationRequest { ArticleId = dataCreate.Article.Id, Translation = translationES, Text = "En español" } ); Assert.True(httpResponseCreateTranslationES.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create translation response: {httpResponseCreateTranslationES.StatusCode}"); var translationFR = new TranslationModelBuilder() .WithRandomValues() .WithLanguage("fr") .Build(); // Create translation FR using var httpResponseCreateTranslationFR = await CallApiAsync <CreateTranslationRequest>( client.PostAsync, $"/api/v1/translation", new CreateTranslationRequest { ArticleId = dataCreate.Article.Id, Translation = translationFR, Text = "Fraçous" } ); Assert.True(httpResponseCreateTranslationFR.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create translation response: {httpResponseCreateTranslationFR.StatusCode}"); // Update translation FR var translationUpdateFR = new TranslationModelBuilder() .WithRandomValues() .WithLanguage("fr") .WithHasText(false) // To check that has text is not updated... .WithTextLink(null) // To check that link is not updated... .Build(); using var httpResponseUpdateTranslationFR = await CallApiAsync <CreateTranslationRequest>( client.PutAsync, $"/api/v1/translation", new CreateTranslationRequest { ArticleId = dataCreate.Article.Id, Translation = translationUpdateFR, Text = "Fraçous 2" } ); Assert.True(httpResponseUpdateTranslationFR.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create translation FR response: {httpResponseUpdateTranslationFR.StatusCode}"); // Retrieve article and check fr translation update using var httpResponseRetrieve = await CallApiAsync( client.GetAsync, $"/api/v1/article/{dataCreate.Article.Id}" ); Assert.True(httpResponseCreate.StatusCode == System.Net.HttpStatusCode.OK, $"Error in translarion update FR response: {httpResponseRetrieve.StatusCode}"); var dataRetrieve = await GetResponse <Article>(httpResponseRetrieve.Content); var dataFR = dataRetrieve.Translations.Where(w => w.Language == "fr").First(); Assert.True(DateEquals(dataFR.Date, translationUpdateFR.Date), "Date mismatch"); Assert.True(dataFR.HasText != translationUpdateFR.HasText, "HasText mismatch"); Assert.True(dataFR.Language == translationUpdateFR.Language, "Language mismatch"); Assert.True(dataFR.ReviewedBy == translationUpdateFR.ReviewedBy, "ReviewedBy mismatch"); Assert.True(dataFR.Status == translationUpdateFR.Status, "Status mismatch"); Assert.True(dataFR.Subtitle == translationUpdateFR.Subtitle, "Subtitle mismatch"); Assert.True(dataFR.Summary == translationUpdateFR.Summary, "Summary mismatch"); Assert.True(dataFR.TextLink != translationUpdateFR.TextLink, "TextLink mismatch"); Assert.True(dataFR.Title == translationUpdateFR.Title, "Title mismatch"); Assert.True(dataFR.TranslatedBy == translationUpdateFR.TranslatedBy, "TranslatedBy mismatch"); // Update Text using var httpResponseUpdateTranslationTextFR = await CallApiAsync <UpdateTranslationTextRequest>( client.PutAsync, $"/api/v1/translation/text", new UpdateTranslationTextRequest { ArticleId = dataCreate.Article.Id, Language = "fr", Text = "Updated" } ); Assert.True(httpResponseUpdateTranslationTextFR.StatusCode == System.Net.HttpStatusCode.OK, $"Error in update translation text FR response: {httpResponseUpdateTranslationTextFR.StatusCode}"); HttpClient httpGet = new HttpClient(); var getTranslationTextFrResponse = await httpGet.GetAsync(dataFR.TextLink); Assert.True(getTranslationTextFrResponse.StatusCode == System.Net.HttpStatusCode.OK, $"Error retrieving translation text file: {getTranslationTextFrResponse.StatusCode}"); var updatedTranslationTextFR = await getTranslationTextFrResponse.Content.ReadAsStringAsync(); Assert.True(updatedTranslationTextFR == "Updated", "Translation text not updated"); // Delete using var httpResponseDelete = await CallApiAsync( client.DeleteAsync, $"/api/v1/article/{dataCreate.Article.Id}" ); Assert.True(httpResponseDelete.StatusCode == System.Net.HttpStatusCode.OK, $"Error in deleting article response: {httpResponseCreate.StatusCode}"); }
public async Task Article_CreateWithMissingFields_BadRequest() { using var client = await _webAppContext.GetLoggedClient(); var article = new ArticleModelBuilder() .WithRandomValues() .WithAuthor(null) .Build(); var httpResponse = await CallApiAsync( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article } ); Assert.True(httpResponse.StatusCode == System.Net.HttpStatusCode.BadRequest, "Article created with missing Author"); article = new ArticleModelBuilder() .WithRandomValues() .WithDate(new DateTime()) .Build(); httpResponse = await CallApiAsync( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article } ); Assert.True(httpResponse.StatusCode == System.Net.HttpStatusCode.BadRequest, "Article created with missing Date"); article = new ArticleModelBuilder() .WithRandomValues() .WithLanguage(null) .Build(); httpResponse = await CallApiAsync( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article } ); Assert.True(httpResponse.StatusCode == System.Net.HttpStatusCode.BadRequest, "Article created with missing Language"); article = new ArticleModelBuilder() .WithRandomValues() .WithOwner(null) .Build(); httpResponse = await CallApiAsync( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article } ); Assert.True(httpResponse.StatusCode == System.Net.HttpStatusCode.BadRequest, "Article created with missing Owner"); article = new ArticleModelBuilder() .WithRandomValues() .WithTitle(null) .Build(); httpResponse = await CallApiAsync( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article } ); Assert.True(httpResponse.StatusCode == System.Net.HttpStatusCode.BadRequest, "Article created with missing Title"); }
public async Task Article_CreateWithTextImageUpdateDelete_Success() { var article = new ArticleModelBuilder() .WithRandomValues() .Build(); using var client = await _webAppContext.GetLoggedClient(); // Create article using var httpResponseCreate = await CallApiAsync <CreateArticleRequest>( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article, Text = text } ); Assert.True(httpResponseCreate.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseCreate.StatusCode}"); var dataCreate = await GetResponse <CreateArticleResponse>(httpResponseCreate.Content); Assert.True(dataCreate != null, "No data received"); Assert.True(dataCreate.Article != null, "No article created"); Assert.True(dataCreate.Article.Id != null, "No article Id created"); Assert.True(dataCreate.Article.HasText, "Text missing"); Assert.True(!string.IsNullOrEmpty(dataCreate.Article.TextLink), "Text link missing"); Assert.True(!string.IsNullOrEmpty(dataCreate.Article.ImageLink), "Image link missing"); // Check text and image files exists HttpClient httpGet = new HttpClient(); var getTextResponse = await httpGet.GetAsync(dataCreate.Article.TextLink); Assert.True(getTextResponse.StatusCode == System.Net.HttpStatusCode.OK, $"Error retrieving text file: {getTextResponse.StatusCode}"); // Update article text using var httpResponseUpdateText = await CallApiAsync <UpdateArticleTextRequest>( client.PutAsync, $"/api/v1/article/text", new UpdateArticleTextRequest { Id = dataCreate.Article.Id, Text = textUpdated, } ); Assert.True(httpResponseUpdateText.StatusCode == System.Net.HttpStatusCode.OK, $"Error updating article text: {httpResponseUpdateText.StatusCode}"); var getTextUpdatedResponse = await httpGet.GetAsync(dataCreate.Article.TextLink); Assert.True(getTextUpdatedResponse.StatusCode == System.Net.HttpStatusCode.OK, $"Error retrieving text file: {getTextUpdatedResponse.StatusCode}"); var updatedTextContent = await getTextUpdatedResponse.Content.ReadAsStringAsync(); Assert.True(updatedTextContent == textUpdated, "Text not updated"); // Delete using var httpResponseDelete = await CallApiAsync( client.DeleteAsync, $"/api/v1/article/{dataCreate.Article.Id}" ); Assert.True(httpResponseDelete.StatusCode == System.Net.HttpStatusCode.OK, $"Error in deleting article response: {httpResponseDelete.StatusCode}"); // Check article deleted and text, images deleted from S3 using var httpResponseRetrieveDeleted = await CallApiAsync( client.GetAsync, $"/api/v1/article/{dataCreate.Article.Id}" ); Assert.True(httpResponseRetrieveDeleted.StatusCode == System.Net.HttpStatusCode.NotFound, $"Error checking article 'Not Found' after deleting it"); }
public async Task Article_CreateRetrieveUpdateDeleteWithNoTextImageTranslations_Success() { var article = new ArticleModelBuilder() .WithRandomValues() .Build(); using var client = await _webAppContext.GetLoggedClient(); // Create article using var httpResponseCreate = await CallApiAsync <CreateArticleRequest>( client.PostAsync, $"/api/v1/article", new CreateArticleRequest { Article = article } ); Assert.True(httpResponseCreate.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseCreate.StatusCode}"); var dataCreate = await GetResponse <CreateArticleResponse>(httpResponseCreate.Content); Assert.True(dataCreate != null, "No data received"); Assert.True(dataCreate.Article != null, "No article created"); Assert.True(dataCreate.Article.Id != null, "No article Id created"); Assert.True(dataCreate.Article.Author.SequenceEqual(article.Author), "Author mismatch"); Assert.True(dataCreate.Article.Category == article.Category, "Category mismatch"); Assert.True(dataCreate.Article.Date.Ticks == article.Date.Ticks, "Date mismatch"); Assert.True(dataCreate.Article.Language == article.Language, "Language mismatch"); Assert.True(dataCreate.Article.Owner == article.Owner, "Owner mismatch"); Assert.True(dataCreate.Article.SourceLink == article.SourceLink, "SourceLink mismatch"); Assert.True(dataCreate.Article.Subtitle == article.Subtitle, "Subtitle mismatch"); Assert.True(dataCreate.Article.Summary == article.Summary, "Summary mismatch"); Assert.True(dataCreate.Article.Title == article.Title, "Title mismatch"); Assert.True(dataCreate.Article.Words == article.Words, "Words mismatch"); Assert.True(dataCreate.Article.Characters == article.Characters, "Characters mismatch"); // Retrieve article using var httpResponseRetrieve = await CallApiAsync( client.GetAsync, $"/api/v1/article/{dataCreate.Article.Id}" ); Assert.True(httpResponseCreate.StatusCode == System.Net.HttpStatusCode.OK, $"Error in create article response: {httpResponseRetrieve.StatusCode}"); var dataRetrieve = await GetResponse <Article>(httpResponseRetrieve.Content); Assert.True(dataRetrieve != null, "No data received"); Assert.True(dataCreate.Article.Id == dataRetrieve.Id, "Id mismatch"); Assert.True(dataCreate.Article.Author.SequenceEqual(dataRetrieve.Author), "Author mismatch"); Assert.True(dataCreate.Article.Category == dataRetrieve.Category, "Category mismatch"); Assert.True(DateEquals(dataCreate.Article.Date, dataRetrieve.Date), "Date mismatch"); Assert.True(dataCreate.Article.Language == dataRetrieve.Language, "Language mismatch"); Assert.True(dataCreate.Article.Owner == dataRetrieve.Owner, "Owner mismatch"); Assert.True(dataCreate.Article.SourceLink == dataRetrieve.SourceLink, "SourceLink mismatch"); Assert.True(dataCreate.Article.Subtitle == dataRetrieve.Subtitle, "Subtitle mismatch"); Assert.True(dataCreate.Article.Summary == dataRetrieve.Summary, "Summary mismatch"); Assert.True(dataCreate.Article.Title == dataRetrieve.Title, "Title mismatch"); Assert.True(dataCreate.Article.Words == dataRetrieve.Words, "Words mismatch"); Assert.True(dataCreate.Article.Characters == dataRetrieve.Characters, "Characters mismatch"); // Update article var updateArticle = new ArticleModelBuilder() .WithRandomValues() .WithId(dataRetrieve.Id) .Build(); using var httpResponseUpdate = await CallApiAsync <UpdateArticleRequest>( client.PutAsync, $"/api/v1/article", new UpdateArticleRequest { Article = updateArticle } ); Assert.True(httpResponseUpdate.StatusCode == System.Net.HttpStatusCode.OK, $"Error in update article response: {httpResponseUpdate.StatusCode}"); var dataUpdate = await GetResponse <UpdateArticleResponse>(httpResponseUpdate.Content); Assert.True(updateArticle != null, "No data received"); Assert.True(updateArticle.Id == dataUpdate.Article.Id, "Id mismatch"); Assert.True(updateArticle.Author.SequenceEqual(dataUpdate.Article.Author), "Author mismatch"); Assert.True(updateArticle.Category == dataUpdate.Article.Category, "Category mismatch"); Assert.True(DateEquals(updateArticle.Date, dataUpdate.Article.Date), "Date mismatch"); Assert.True(updateArticle.Language == dataUpdate.Article.Language, "Language mismatch"); Assert.True(updateArticle.Owner == dataUpdate.Article.Owner, "Owner mismatch"); Assert.True(updateArticle.SourceLink == dataUpdate.Article.SourceLink, "SourceLink mismatch"); Assert.True(updateArticle.Subtitle == dataUpdate.Article.Subtitle, "Subtitle mismatch"); Assert.True(updateArticle.Summary == dataUpdate.Article.Summary, "Summary mismatch"); Assert.True(updateArticle.Title == dataUpdate.Article.Title, "Title mismatch"); Assert.True(updateArticle.Words == dataUpdate.Article.Words, "Words mismatch"); Assert.True(updateArticle.Characters == dataUpdate.Article.Characters, "Characters mismatch"); // Delete using var httpResponseDelete = await CallApiAsync( client.DeleteAsync, $"/api/v1/article/{dataUpdate.Article.Id}" ); Assert.True(httpResponseDelete.StatusCode == System.Net.HttpStatusCode.OK, $"Error in deleting article response: {httpResponseDelete.StatusCode}"); // Check article deleted using var httpResponseRetrieveDeleted = await CallApiAsync( client.GetAsync, $"/api/v1/article/{dataCreate.Article.Id}" ); Assert.True(httpResponseRetrieveDeleted.StatusCode == System.Net.HttpStatusCode.NotFound, $"Error checking article 'not found' after deleting it"); }