using AutoTazTest.Infrastructure; using AvtoTAZContratcs.ViewModels; using AvtoTAZContratcs.BindingModels; using AvtoTAZDatabase; using AvtoTAZDatabase.Models; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http.Headers; using System.Threading.Tasks; using NUnit.Framework; namespace AutoTazTest.WebApiControllersTests; [TestFixture] internal class DealerWebApiControllerTest : BaseWebApiControllerTest { [TearDown] public void TearDown() { AvtoTAZDbContext.Dealers.RemoveRange(AvtoTAZDbContext.Dealers); AvtoTAZDbContext.SaveChanges(); } [Test] public async Task Try_GetList_WhenHaveRecords_Test() { // Arrange var dealerA = AvtoTAZDbContext.InsertDealerToDatabaseAndReturn("Dealer A"); var dealerB = AvtoTAZDbContext.InsertDealerToDatabaseAndReturn("Dealer B"); var loginResponse = await HttpClient.GetAsync("/login/testuser"); Assert.That(loginResponse.StatusCode, Is.EqualTo(HttpStatusCode.OK), "Failed to get token"); var token = await loginResponse.Content.ReadAsStringAsync(); HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); // Act var response = await HttpClient.GetAsync("/api/dealer"); Console.WriteLine($"Response Status: {response.StatusCode}"); Console.WriteLine($"Response Content: {await response.Content.ReadAsStringAsync()}"); // Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK), "Expected OK status"); var data = await GetModelFromResponseAsync>(response); Assert.Multiple(() => { Assert.That(data, Is.Not.Null, "Response data should not be null"); Assert.That(data, Has.Count.EqualTo(2), "Expected 2 dealers in the list"); AssertElement(data.First(x => x.Id == dealerA.Id), dealerA); AssertElement(data.First(x => x.Id == dealerB.Id), dealerB); }); } [Test] public async Task Try_GetList_WhenNoRecords_Test() { // Arrange var loginResponse = await HttpClient.GetAsync("/login/testuser"); Assert.That(loginResponse.StatusCode, Is.EqualTo(HttpStatusCode.OK), "Failed to get token"); var token = await loginResponse.Content.ReadAsStringAsync(); HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); // Act var response = await HttpClient.GetAsync("/api/dealer"); // Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK), "Expected OK status"); var data = await GetModelFromResponseAsync>(response); Assert.Multiple(() => { Assert.That(data, Is.Not.Null, "Response data should not be null"); Assert.That(data, Is.Empty, "Expected empty list when no records"); }); } [Test] public async Task Try_GetDealerById_WhenRecordDoesNotExist_Test() { // Arrange var loginResponse = await HttpClient.GetAsync("/login/testuser"); Assert.That(loginResponse.StatusCode, Is.EqualTo(HttpStatusCode.OK), "Failed to get token"); var token = await loginResponse.Content.ReadAsStringAsync(); HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); // Act var response = await HttpClient.GetAsync($"/api/dealer/{Guid.NewGuid()}"); Console.WriteLine($"Response Status: {response.StatusCode}"); Console.WriteLine($"Response Content: {await response.Content.ReadAsStringAsync()}"); // Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound), "Expected NotFound for non-existent dealer"); } [Test] public async Task GetElement_ById_WhenHaveRecord_ShouldSuccess_Test() { //Arrange var dealer = AvtoTAZDbContext.InsertDealerToDatabaseAndReturn(); //Act var response = await HttpClient.GetAsync($"/api/dealer/{dealer.Id}"); //Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); AssertElement(await GetModelFromResponseAsync(response), dealer); } [Test] public async Task GetElement_ById_WhenNoRecord_ShouldNotFound_Test() { //Arrange AvtoTAZDbContext.InsertDealerToDatabaseAndReturn(); //Act var response = await HttpClient.GetAsync($"/api/dealer/{Guid.NewGuid()}"); //Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound)); } [Test] public async Task GetElement_ByNameDealer_WhenHaveRecord_ShouldSuccess_Test() { //Arrange var dealer = AvtoTAZDbContext.InsertDealerToDatabaseAndReturn(); //Act var response = await HttpClient.GetAsync($"/api/dealer/{dealer.NameDealer}"); //Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); AssertElement(await GetModelFromResponseAsync(response), dealer); } [Test] public async Task GetElement_ByFIO_WhenNoRecord_ShouldNotFound_Test() { //Arrange AvtoTAZDbContext.InsertDealerToDatabaseAndReturn(); //Act var response = await HttpClient.GetAsync($"/api/dealer/New%20Fio"); //Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound)); } [Test] public async Task Put_WhenSendEmptyData_ShouldBadRequest_Test() { //Act var response = await HttpClient.PutAsync($"/api/dealer", MakeContent(string.Empty)); //Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); } [Test] public async Task Delete_ShouldSuccess_Test() { //Arrange var buyerId = Guid.NewGuid().ToString(); AvtoTAZDbContext.InsertDealerToDatabaseAndReturn(buyerId); //Act var response = await HttpClient.DeleteAsync($"/api/dealer/{buyerId}"); //Assert Assert.Multiple(() => { Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent)); Assert.That(AvtoTAZDbContext.GetDealerFromDatabase(buyerId), Is.Null); }); } [Test] public async Task Put_WhenSendWrongFormatData_ShouldBadRequest_Test() { //Act var response = await HttpClient.PutAsync($"/api/dealer", MakeContent(new { Data = "test", Position = 10 })); //Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); } [Test] public async Task Delete_WhenNoFoundRecord_ShouldBadRequest_Test() { //Arrange AvtoTAZDbContext.InsertDealerToDatabaseAndReturn(); //Act var response = await HttpClient.DeleteAsync($"/api/dealer/{Guid.NewGuid()}"); //Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound)); } [Test] public async Task Delete_WhenSendWrongFormatData_ShouldBadRequest_Test() { //Act var response = await HttpClient.DeleteAsync($"/api/dealer/id"); //Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); } [Test] public async Task Try_DeleteDealer_WhenRecordDoesNotExist_Test() { // Arrange var loginResponse = await HttpClient.GetAsync("/login/testuser"); Assert.That(loginResponse.StatusCode, Is.EqualTo(HttpStatusCode.OK), "Failed to get token"); var token = await loginResponse.Content.ReadAsStringAsync(); HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); // Act var response = await HttpClient.DeleteAsync($"/api/dealer/{Guid.NewGuid()}"); Console.WriteLine($"Response Status: {response.StatusCode}"); Console.WriteLine($"Response Content: {await response.Content.ReadAsStringAsync()}"); // Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound), "Expected NotFound for non-existent dealer"); } private static void AssertElement(DealerViewModel? actual, Dealer expected) { Assert.That(actual, Is.Not.Null, "Dealer view model should not be null"); Assert.Multiple(() => { Assert.That(actual.Id, Is.EqualTo(expected.Id), "ID mismatch"); Assert.That(actual.NameDealer, Is.EqualTo(expected.NameDealer), "Name mismatch"); }); } }