using SmallSoftwareContracts.DataModels; using SmallSoftwareContracts.Enums; using SmallSoftwareContracts.ViewModels; using SmallSoftwareDatabase.Models; using SmallSoftwareTests.Infrastructure; using System.Net; namespace SmallSoftwareTests.WebApiControllersApi; [TestFixture] internal class ReportControllerTests : BaseWebApiControllerTest { [TearDown] public void TearDown() { SmallSoftwareDbContext.RemoveRequestsFromDatabase(); SmallSoftwareDbContext.RemoveWorkersFromDatabase(); SmallSoftwareDbContext.RemovePostsFromDatabase(); SmallSoftwareDbContext.RemoveSoftwaresFromDatabase(); SmallSoftwareDbContext.RemoveManufacturersFromDatabase(); } [Test] public async Task GetSoftwares_WhenHaveRecords_ShouldSuccess_Test() { // Arrange var manufacturer1 = new ManufacturerDataModel(Guid.NewGuid().ToString(), "name1"); var manufacturer2 = new ManufacturerDataModel(Guid.NewGuid().ToString(), "name2"); SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturer1.Id, manufacturerName: manufacturer1.ManufacturerName); SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturer2.Id, manufacturerName: manufacturer2.ManufacturerName); var software1 = new SoftwareDataModel(Guid.NewGuid().ToString(), "soft1", SoftwareType.AudioDriver, manufacturer1.Id, 10, false); var software2 = new SoftwareDataModel(Guid.NewGuid().ToString(), "soft2", SoftwareType.AudioDriver, manufacturer2.Id, 10, false); SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer1.Id, software1.Id, softwareName: software1.SoftwareName); SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer2.Id, software2.Id, softwareName: software2.SoftwareName); SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software1.Id, 11); SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software1.Id, 12); SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software1.Id, 13); SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software2.Id, 11); SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software2.Id, 12); // Act var response = await HttpClient.GetAsync("/api/report/getsoftwares"); var responseContent = await response.Content.ReadAsStringAsync(); Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}"); // Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); var data = await GetModelFromResponseAsync>(response); Assert.That(data, Is.Not.Null); Assert.Multiple(() => { Assert.That(data, Has.Count.EqualTo(2)); Assert.That(data.First(x => x.SoftwareName == software1.SoftwareName).Histories, Has.Count.EqualTo(3)); Assert.That(data.First(x => x.SoftwareName == software2.SoftwareName).Histories, Has.Count.EqualTo(2)); }); } [Test] public async Task GetRequests_WhenHaveRecords_ShouldSuccess_Test() { //Arrange var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(); var manufacturerId = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(); var software1 = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturerId.Id, softwareName: "name 1"); var software2 = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturerId.Id, softwareName: "name 2"); SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, softwares: [(software1.Id, 10, 1.1), (software2.Id, 10, 1.1)]); SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, softwares: [(software1.Id, 10, 1.1)]); //Act var response = await HttpClient.GetAsync($"/api/report/getrequests?fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}"); //Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); var data = await GetModelFromResponseAsync>(response); Assert.That(data, Is.Not.Null); Assert.Multiple(() => { Assert.That(data, Has.Count.EqualTo(2)); }); } [Test] public async Task GetRequests_WhenDateIsIncorrect_ShouldBadRequest_Test() { //Act var response = await HttpClient.GetAsync($"/api/report/getrequests?fromDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}"); //Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); } [Test] public async Task GetSalary_WhenHaveRecords_ShouldSuccess_Test() { // Arrange var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(); var worker1 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 1", postId: post.PostId).AddPost(post); var worker2 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2", postId: post.PostId).AddPost(post); SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn( worker1.Id, workerSalary: 100, salaryDate: DateTime.UtcNow.AddDays(-10)); SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn( worker1.Id, workerSalary: 1000, salaryDate: DateTime.UtcNow.AddDays(-5)); SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn( worker1.Id, workerSalary: 200, salaryDate: DateTime.UtcNow.AddDays(5)); SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn( worker2.Id, workerSalary: 500, salaryDate: DateTime.UtcNow.AddDays(-5)); SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn( worker2.Id, workerSalary: 300, salaryDate: DateTime.UtcNow.AddDays(-3)); // Act var response = await HttpClient.GetAsync( $"/api/report/getsalary?" + $"fromDate={DateTime.Now.AddDays(-7):MM/dd/yyyy HH:mm:ss}&" + $"toDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}"); // Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); var data = await GetModelFromResponseAsync>(response); Assert.That(data, Is.Not.Null); Assert.That(data, Has.Count.EqualTo(1)); } [Test] public async Task GetSalary_WhenDateIsIncorrect_ShouldBadRequest_Test() { // Act var response = await HttpClient.GetAsync( $"/api/report/getsalary?" + $"fromDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&" + $"toDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}"); // Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); } [Test] public async Task LoadSoftwares_WhenHaveRecords_ShouldSuccess_Test() { //Arrange var manufacturer1 = new ManufacturerDataModel(Guid.NewGuid().ToString(), "name1"); var manufacturer2 = new ManufacturerDataModel(Guid.NewGuid().ToString(), "name2"); SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturer1.Id, manufacturerName: manufacturer1.ManufacturerName); SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturer2.Id, manufacturerName: manufacturer2.ManufacturerName); var softwareId1 = Guid.NewGuid().ToString(); var softwareId2 = Guid.NewGuid().ToString(); var software1 = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer1.Id,softwareId1, "name1", SoftwareType.Windows, 10, false); var software2 = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer2.Id, softwareId2, "name2", SoftwareType.Windows, 10, false); SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(softwareId1, 22, DateTime.UtcNow); SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(softwareId2, 21, DateTime.UtcNow); SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(softwareId1, 33, DateTime.UtcNow); SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(softwareId1, 32, DateTime.UtcNow); SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(softwareId2, 65, DateTime.UtcNow); //Act var response = await HttpClient.GetAsync("/api/report/LoadSoftwares"); //Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); using var data = await response.Content.ReadAsStreamAsync(); Assert.That(data, Is.Not.Null); Assert.That(data.Length, Is.GreaterThan(0)); await AssertStreamAsync(response, "file.docx"); } [Test] public async Task LoadRequests_WhenHaveRecords_ShouldSuccess_Test() { // Arrange var manufacturer1 = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: "name 1"); var manufacturer2 = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: "name 2"); var worker1 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(); var worker2 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(); var software1 = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn( manufacturer1.Id, softwareName: "name 1"); var software2 = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn( manufacturer2.Id, softwareName: "name 2"); SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn( worker1.Id, sum: 100, email: "cdsfs@dd.ru", softwares: [(software1.Id, 10, 1.1), (software2.Id, 10, 1.1)]); SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn( worker2.Id, sum: 200, email: "cdswws@dd.ru", softwares: [(software1.Id, 10, 1.1)]); // Act var response = await HttpClient.GetAsync( $"/api/report/loadrequests?" + $"fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&" + $"toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}"); // Assert await AssertStreamAsync(response, "file.xlsx"); } [Test] public async Task LoadRequests_WhenDateIsIncorrect_ShouldBadRequest_Test() { // Act var response = await HttpClient.GetAsync( $"/api/report/loadrequests?" + $"fromDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&" + $"toDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}"); // Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); } [Test] public async Task LoadSalary_WhenHaveRecords_ShouldSuccess_Test() { // Arrange var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(); var worker1 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn( fio: "fio 1", postId: post.PostId).AddPost(post); var worker2 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn( fio: "fio 2", postId: post.PostId).AddPost(post); SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn( worker1.Id, workerSalary: 100, salaryDate: DateTime.UtcNow.AddDays(-10)); SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn( worker1.Id, workerSalary: 1000, salaryDate: DateTime.UtcNow.AddDays(-5)); SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn( worker1.Id, workerSalary: 200, salaryDate: DateTime.UtcNow.AddDays(5)); SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn( worker2.Id, workerSalary: 500, salaryDate: DateTime.UtcNow.AddDays(-5)); SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn( worker2.Id, workerSalary: 300, salaryDate: DateTime.UtcNow.AddDays(-3)); // Act var response = await HttpClient.GetAsync( $"/api/report/loadsalary?" + $"fromDate={DateTime.Now.AddDays(-7):MM/dd/yyyy HH:mm:ss}&" + $"toDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}"); // Assert await AssertStreamAsync(response, "file.pdf"); } [Test] public async Task LoadSalary_WhenDateIsIncorrect_ShouldBadRequest_Test() { // Act var response = await HttpClient.GetAsync( $"/api/report/loadsalary?" + $"fromDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&" + $"toDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}"); // Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); } private static async Task AssertStreamAsync(HttpResponseMessage response, string fileNameForSave = "") { Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); using var data = await response.Content.ReadAsStreamAsync(); Assert.That(data, Is.Not.Null); Assert.That(data.Length, Is.GreaterThan(0)); await SaveStreamAsync(data, fileNameForSave); } private static async Task SaveStreamAsync(Stream stream, string fileName) { if (string.IsNullOrEmpty(fileName)) { return; } var path = Path.Combine(Directory.GetCurrentDirectory(), fileName); if (File.Exists(path)) { File.Delete(path); } stream.Position = 0; using var fileStream = new FileStream(path, FileMode.OpenOrCreate); await stream.CopyToAsync(fileStream); } }