Часть тестов реализована + добавление api и куча всего

This commit is contained in:
2025-03-27 02:56:00 +04:00
parent abbfe117f9
commit d3bf4eec43
47 changed files with 2367 additions and 300 deletions

View File

@@ -20,12 +20,10 @@ postStorageContract, ILogger logger) : IPostBusinessLogicContract
private readonly ILogger _logger = logger;
private readonly IPostStorageContract _postStorageContract =
postStorageContract;
public List<PostDataModel> GetAllPosts(bool onlyActive = true)
public List<PostDataModel> GetAllPosts()
{
_logger.LogInformation("GetAllPosts params: {onlyActive}",
onlyActive);
return _postStorageContract.GetList() ?? throw new
NullListException();
_logger.LogInformation("GetAllPosts");
return _postStorageContract.GetList() ?? throw new NullListException();
}
public List<PostDataModel> GetAllDataOfPost(string postId)
{

View File

@@ -12,6 +12,7 @@
<ItemGroup>
<InternalsVisibleTo Include="SmallSoftwareTests" />
<InternalsVisibleTo Include="SmallSoftwareWebApi" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup>

View File

@@ -0,0 +1,18 @@
using SmallSoftwareContracts.AdapterContracts.OperationResponses;
using SmallSoftwareContracts.BindingModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SmallSoftwareContracts.AdapterContracts;
public interface IManufacturerAdapter
{
ManufacturerOperationResponse GetList();
ManufacturerOperationResponse GetElement(string data);
ManufacturerOperationResponse RegisterManufacturer(ManufacturerBindingModel manufacturerModel);
ManufacturerOperationResponse ChangeManufacturerInfo(ManufacturerBindingModel manufacturerModel);
ManufacturerOperationResponse RemoveManufacturer(string id);
}

View File

@@ -0,0 +1,15 @@
using SmallSoftwareContracts.AdapterContracts.OperationResponses;
using SmallSoftwareContracts.BindingModels;
namespace SmallSoftwareContracts.AdapterContracts;
public interface IPostAdapter
{
PostOperationResponse GetList();
PostOperationResponse GetHistory(string id);
PostOperationResponse GetElement(string data);
PostOperationResponse RegisterPost(PostBindingModel postModel);
PostOperationResponse ChangePostInfo(PostBindingModel postModel);
PostOperationResponse RemovePost(string id);
PostOperationResponse RestorePost(string id);
}

View File

@@ -0,0 +1,25 @@
using SmallSoftwareContracts.Infrastructure;
using SmallSoftwareContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SmallSoftwareContracts.AdapterContracts.OperationResponses;
public class ManufacturerOperationResponse : OperationResponse
{
public static ManufacturerOperationResponse OK(List<ManufacturerViewModel>
data) => OK<ManufacturerOperationResponse, List<ManufacturerViewModel>>(data);
public static ManufacturerOperationResponse OK(ManufacturerViewModel data)
=> OK<ManufacturerOperationResponse, ManufacturerViewModel>(data);
public static ManufacturerOperationResponse NoContent() =>
NoContent<ManufacturerOperationResponse>();
public static ManufacturerOperationResponse NotFound(string message) =>
NotFound<ManufacturerOperationResponse>(message);
public static ManufacturerOperationResponse BadRequest(string message) =>
BadRequest<ManufacturerOperationResponse>(message);
public static ManufacturerOperationResponse InternalServerError(string
message) => InternalServerError<ManufacturerOperationResponse>(message);
}

View File

@@ -0,0 +1,20 @@
using SmallSoftwareContracts.Infrastructure;
using SmallSoftwareContracts.ViewModels;
namespace SmallSoftwareContracts.AdapterContracts.OperationResponses;
public class PostOperationResponse : OperationResponse
{
public static PostOperationResponse OK(List<PostViewModel> data) =>
OK<PostOperationResponse, List<PostViewModel>>(data);
public static PostOperationResponse OK(PostViewModel data) =>
OK<PostOperationResponse, PostViewModel>(data);
public static PostOperationResponse NoContent() =>
NoContent<PostOperationResponse>();
public static PostOperationResponse NotFound(string message) =>
NotFound<PostOperationResponse>(message);
public static PostOperationResponse BadRequest(string message) =>
BadRequest<PostOperationResponse>(message);
public static PostOperationResponse InternalServerError(string message) =>
InternalServerError<PostOperationResponse>(message);
}

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SmallSoftwareContracts.BindingModels;
public class ManufacturerBindingModel
{
public string? Id { get; set; }
public string? ManufacturerName { get; set; }
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SmallSoftwareContracts.BindingModels;
public class PostBindingModel
{
public string? Id { get; set; }
public string? PostId => Id;
public string? PostName { get; set; }
public string? PostType { get; set; }
public double Salary { get; set; }
}

View File

@@ -9,7 +9,7 @@ namespace SmallSoftwareContracts.BusinessLogicsContracts;
public interface IPostBusinessLogicContract
{
List<PostDataModel> GetAllPosts(bool onlyActive);
List<PostDataModel> GetAllPosts();
List<PostDataModel> GetAllDataOfPost(string postId);
PostDataModel GetPostByData(string data);
void InsertPost(PostDataModel postDataModel);

View File

@@ -13,6 +13,9 @@ prevManufacturerName, string? prevPrevManufacturerName) : IValidation
prevManufacturerName;
public string? PrevPrevManufacturerName { get; private set; } =
prevPrevManufacturerName;
public ManufacturerDataModel(string id, string manufacturerName) : this(id, manufacturerName, null, null){ }
public void Validate()
{
if (Id.IsEmpty())

View File

@@ -0,0 +1,48 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Net;
namespace SmallSoftwareContracts.Infrastructure;
public class OperationResponse
{
protected HttpStatusCode StatusCode { get; set; }
protected object? Result { get; set; }
public IActionResult GetResponse(HttpRequest request, HttpResponse
response)
{
ArgumentNullException.ThrowIfNull(request);
ArgumentNullException.ThrowIfNull(response);
response.StatusCode = (int)StatusCode;
if (Result is null)
{
return new StatusCodeResult((int)StatusCode);
}
return new ObjectResult(Result);
}
protected static TResult OK<TResult, TData>(TData data) where TResult :
OperationResponse, new() => new()
{
StatusCode = HttpStatusCode.OK,
Result = data
};
protected static TResult NoContent<TResult>() where TResult :
OperationResponse, new() => new() { StatusCode = HttpStatusCode.NoContent };
protected static TResult BadRequest<TResult>(string? errorMessage = null)
where TResult : OperationResponse, new() => new()
{
StatusCode = HttpStatusCode.BadRequest,
Result = errorMessage
};
protected static TResult NotFound<TResult>(string? errorMessage = null)
where TResult : OperationResponse, new() => new()
{
StatusCode = HttpStatusCode.NotFound,
Result = errorMessage
};
protected static TResult InternalServerError<TResult>(string? errorMessage = null) where TResult : OperationResponse, new() => new()
{
StatusCode = HttpStatusCode.InternalServerError,
Result = errorMessage
};
}

View File

@@ -6,4 +6,9 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.3.0" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SmallSoftwareContracts.ViewModels;
public class ManufacturerViewModel
{
public required string Id { get; set; }
public required string ManufacturerName { get; set; }
public string? PrevManufacturerName { get; set; }
public string? PrevPrevManufacturerName { get; set; }
}

View File

@@ -0,0 +1,10 @@

namespace SmallSoftwareContracts.ViewModels;
public class PostViewModel
{
public required string Id { get; set; }
public required string PostName { get; set; }
public required string PostType { get; set; }
public double Salary { get; set; }
}

View File

@@ -24,6 +24,7 @@ internal class PostStorageContract : IPostStorageContract
.ForMember(x => x.PostId, x => x.MapFrom(src => src.Id))
.ForMember(x => x.IsActual, x => x.MapFrom(src => true))
.ForMember(x => x.ChangeDate, x => x.MapFrom(src => DateTime.UtcNow));
});
_mapper = new Mapper(config);
}

View File

@@ -16,7 +16,8 @@
<ProjectReference Include="..\SmallSoftwareContracts\SmallSoftwareContracts.csproj" />
</ItemGroup>
<ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="SmallSoftwareWebApi" />
<InternalsVisibleTo Include="SmallSoftwareTests" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup>

View File

@@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmallSoftwareBusinessLogic"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmallSoftwareDatabase", "SmallSoftwareDatabase\SmallSoftwareDatabase.csproj", "{59771C74-7A34-4354-949A-F3AA071FBCAA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmallSoftwareWebApi", "SmallSoftwareWebApi\SmallSoftwareWebApi.csproj", "{AC51FBAD-A0B1-40C3-AD75-E29F6E7FD624}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -33,6 +35,10 @@ Global
{59771C74-7A34-4354-949A-F3AA071FBCAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{59771C74-7A34-4354-949A-F3AA071FBCAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{59771C74-7A34-4354-949A-F3AA071FBCAA}.Release|Any CPU.Build.0 = Release|Any CPU
{AC51FBAD-A0B1-40C3-AD75-E29F6E7FD624}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AC51FBAD-A0B1-40C3-AD75-E29F6E7FD624}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AC51FBAD-A0B1-40C3-AD75-E29F6E7FD624}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AC51FBAD-A0B1-40C3-AD75-E29F6E7FD624}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -61,8 +61,8 @@ internal class PostBusinessLogicContractTests
_postStorageContract.Setup(x =>
x.GetList()).Returns([]);
//Act
var listOnlyActive = _postBusinessLogicContract.GetAllPosts(true);
var listAll = _postBusinessLogicContract.GetAllPosts(false);
var listOnlyActive = _postBusinessLogicContract.GetAllPosts();
var listAll = _postBusinessLogicContract.GetAllPosts();
//Assert
Assert.Multiple(() =>
{
@@ -79,7 +79,7 @@ internal class PostBusinessLogicContractTests
{
//Act&Assert
Assert.That(() =>
_postBusinessLogicContract.GetAllPosts(It.IsAny<bool>()),
_postBusinessLogicContract.GetAllPosts(),
Throws.TypeOf<NullListException>());
_postStorageContract.Verify(x => x.GetList(),
Times.Once);
@@ -93,7 +93,7 @@ internal class PostBusinessLogicContractTests
InvalidOperationException()));
//Act&Assert
Assert.That(() =>
_postBusinessLogicContract.GetAllPosts(It.IsAny<bool>()),
_postBusinessLogicContract.GetAllPosts(),
Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.GetList(),
Times.Once);

View File

@@ -0,0 +1,27 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SmallSoftwareContracts.Infrastructure;
namespace SmallSoftwareTests.Infrastructure;
internal class CustomWebApplicationFactory<TProgram> : WebApplicationFactory<TProgram>
where TProgram : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
var databaseConfig = services.SingleOrDefault(x => x.ServiceType == typeof(IConfigurationDatabase));
if (databaseConfig is not null)
services.Remove(databaseConfig);
var loggerFactory = services.SingleOrDefault(x => x.ServiceType == typeof(LoggerFactory));
if (loggerFactory is not null)
services.Remove(loggerFactory);
services.AddSingleton<IConfigurationDatabase, ConfigurationDatabaseTest>();
});
builder.UseEnvironment("Development");
base.ConfigureWebHost(builder);
}
}

View File

@@ -0,0 +1,170 @@

using Microsoft.EntityFrameworkCore;
using SmallSoftwareContracts.Enums;
using SmallSoftwareDatabase;
using SmallSoftwareDatabase.Models;
using static NUnit.Framework.Internal.OSPlatform;
using System;
using System.ComponentModel.DataAnnotations;
namespace SmallSoftwareTests.Infrastructure;
internal static class SmallSoftwareDbContextExtensions
{
public static Manufacturer InsertManufacturerToDatabaseAndReturn(this SmallSoftwareDbContext dbContext,
string? id = null, string manufacturerName = "test", string prevManufacturerName = "prev",
string prevPrevManufacturerName = "prevPrev")
{
var manufacturer = new Manufacturer()
{
Id = id ?? Guid.NewGuid().ToString(),
ManufacturerName = manufacturerName,
PrevManufacturerName = prevManufacturerName,
PrevPrevManufacturerName = prevPrevManufacturerName
};
dbContext.Manufacturers.Add(manufacturer);
dbContext.SaveChanges();
return manufacturer;
}
public static Post InsertPostToDatabaseAndReturn(this SmallSoftwareDbContext
dbContext, string? id = null, string postName = "test", PostType postType =
PostType.SoftInstaller, double salary = 10, bool isActual = true, DateTime?
changeDate = null)
{
var post = new Post()
{
Id = Guid.NewGuid().ToString(),
PostId = id ?? Guid.NewGuid().ToString(),
PostName = postName,
PostType = postType,
Salary = salary,
IsActual = isActual,
ChangeDate = changeDate ?? DateTime.UtcNow
};
dbContext.Posts.Add(post);
dbContext.SaveChanges();
return post;
}
public static Software InsertSoftwareToDatabaseAndReturn(this
SmallSoftwareDbContext dbContext, string manufacturerId, string? id = null, string
softwareName = "test", SoftwareType softwareType = SoftwareType.Windows, double price =
1, bool isDeleted = false)
{
var software = new Software()
{
Id = id ?? Guid.NewGuid().ToString(),
ManufacturerId = manufacturerId,
SoftwareName = softwareName,
SoftwareType = softwareType,
Price = price,
IsDeleted = isDeleted
};
dbContext.Softwares.Add(software);
dbContext.SaveChanges();
return software;
}
public static SoftwareHistory InsertSoftwareHistoryToDatabaseAndReturn(this
SmallSoftwareDbContext dbContext, string softwareId, double price = 10, DateTime?
changeDate = null)
{
var softwareHistory = new SoftwareHistory()
{
Id = Guid.NewGuid().ToString(),
SoftwareId = softwareId,
OldPrice = price,
ChangeDate = changeDate ?? DateTime.UtcNow
};
dbContext.SoftwareHistories.Add(softwareHistory);
dbContext.SaveChanges();
return softwareHistory;
}
public static Salary InsertSalaryToDatabaseAndReturn(this
SmallSoftwareDbContext dbContext, string workerId, double workerSalary = 1,
DateTime? salaryDate = null)
{
var salary = new Salary()
{
WorkerId = workerId,
WorkerSalary =
workerSalary,
SalaryDate = salaryDate ?? DateTime.UtcNow
};
dbContext.Salaries.Add(salary);
dbContext.SaveChanges();
return salary;
}
public static Request InsertRequestToDatabaseAndReturn(this SmallSoftwareDbContext dbContext,
string workerId, string email, double sum = 1, bool isCancel = false, List<(string, int, double)>? softwares = null)
{
var request = new Request()
{
WorkerId = workerId,
Email = email,
Sum = sum,
IsCancel = isCancel,
InstallationRequests = []
};
if (softwares is not null)
{
foreach (var elem in softwares)
{
request.InstallationRequests.Add(new InstallationRequest
{
SoftwareId = elem.Item1,
RequestId = request.Id,
Count = elem.Item2,
Price = elem.Item3
});
}
}
dbContext.Requests.Add(request);
dbContext.SaveChanges();
return request;
}
public static Worker InsertWorkerToDatabaseAndReturn(this SmallSoftwareDbContext dbContext,
string? id = null, string fio = "test", string? postId = null, DateTime? birthDate = null,
DateTime? employmentDate = null, bool isDeleted = false)
{
var worker = new Worker()
{
Id = id ?? Guid.NewGuid().ToString(),
FIO = fio,
PostId = postId ?? Guid.NewGuid().ToString(),
BirthDate = birthDate ?? DateTime.UtcNow.AddYears(-20),
EmploymentDate = employmentDate ?? DateTime.UtcNow,
IsDeleted = isDeleted
};
dbContext.Workers.Add(worker);
dbContext.SaveChanges();
return worker;
}
public static Manufacturer? GetManufacturerFromDatabase(this
SmallSoftwareDbContext dbContext, string id) => dbContext.Manufacturers.FirstOrDefault(x => x.Id == id);
public static Post? GetPostFromDatabaseByPostId(this SmallSoftwareDbContext
dbContext, string id) => dbContext.Posts.FirstOrDefault(x => x.PostId == id && x.IsActual);
public static Post[] GetPostsFromDatabaseByPostId(this SmallSoftwareDbContext
dbContext, string id) => [.. dbContext.Posts.Where(x => x.PostId == id).OrderByDescending(x => x.ChangeDate)];
public static Software? GetSoftwareFromDatabaseById(this SmallSoftwareDbContext
dbContext, string id) => dbContext.Softwares.FirstOrDefault(x => x.Id == id);
public static Salary[] GetSalariesFromDatabaseByWorkerId(this
SmallSoftwareDbContext dbContext, string id) => [.. dbContext.Salaries.Where(x => x.WorkerId == id)];
public static Request? GetRequestFromDatabaseById(this SmallSoftwareDbContext
dbContext, string id) => dbContext.Requests.Include(x => x.InstallationRequests).FirstOrDefault(x => x.Id == id);
public static Worker? GetWorkerFromDatabaseById(this SmallSoftwareDbContext
dbContext, string id) => dbContext.Workers.FirstOrDefault(x => x.Id == id);
public static void RemoveManufacturersFromDatabase(this SmallSoftwareDbContext
dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Manufacturers\" CASCADE;");
public static void RemovePostsFromDatabase(this SmallSoftwareDbContext
dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Posts\" CASCADE;");
public static void RemoveSoftwaresFromDatabase(this SmallSoftwareDbContext
dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Softwares\" CASCADE;");
public static void RemoveSalariesFromDatabase(this SmallSoftwareDbContext
dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Salaries\" CASCADE;");
public static void RemoveRequestsFromDatabase(this SmallSoftwareDbContext
dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Requests\" CASCADE;");
public static void RemoveWorkersFromDatabase(this SmallSoftwareDbContext
dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Workers\" CASCADE;");
private static void ExecuteSqlRaw(this SmallSoftwareDbContext dbContext,
string command) => dbContext.Database.ExecuteSqlRaw(command);
}

View File

@@ -8,19 +8,36 @@
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<None Remove="appsettings.json" />
</ItemGroup>
<ItemGroup>
<Content Include="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.3" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="NUnit" Version="4.2.2" />
<PackageReference Include="NUnit.Analyzers" Version="4.4.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
<PackageReference Include="Serilog" Version="4.2.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="9.0.1" />
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SmallSoftwareBusinessLogic\SmallSoftwareBusinessLogic.csproj" />
<ProjectReference Include="..\SmallSoftwareContracts\SmallSoftwareContracts.csproj" />
<ProjectReference Include="..\SmallSoftwareDatabase\SmallSoftwareDatabase.csproj" />
<ProjectReference Include="..\SmallSoftwareWebApi\SmallSoftwareWebApi.csproj" />
</ItemGroup>
<ItemGroup>

View File

@@ -3,6 +3,7 @@ using SmallSoftwareContracts.DataModels;
using SmallSoftwareContracts.Exceptions;
using SmallSoftwareDatabase.Implementations;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
namespace SmallSoftwareTests.StoragesContracts;
@@ -19,17 +20,17 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Softwares\" CASCADE; ");
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Manufacturers\" CASCADE;");
SmallSoftwareDbContext.RemoveSoftwaresFromDatabase();
SmallSoftwareDbContext.RemoveManufacturersFromDatabase();
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var manufacturer =
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1");
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1");
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(),
"name 2");
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(),
"name 3");
var list = _manufacturerStorageContract.GetList();
Assert.That(list, Is.Not.Null);
@@ -47,14 +48,14 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
public void Try_GetElementById_WhenHaveRecord_Test()
{
var manufacturer =
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_manufacturerStorageContract.GetElementById(manufacturer.Id),
manufacturer);
}
[Test]
public void Try_GetElementById_WhenNoRecord_Test()
{
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
Assert.That(() =>
_manufacturerStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
}
@@ -62,13 +63,13 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
public void Try_GetElementByName_WhenHaveRecord_Test()
{
var manufacturer =
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_manufacturerStorageContract.GetElementByName(manufacturer.ManufacturerName), manufacturer);
}
[Test]
public void Try_GetElementByName_WhenNoRecord_Test()
{
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
Assert.That(() =>
_manufacturerStorageContract.GetElementByName("name"), Is.Null);
}
@@ -76,7 +77,7 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
public void Try_GetElementByOldName_WhenHaveRecord_Test()
{
var manufacturer =
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_manufacturerStorageContract.GetElementByOldName(manufacturer
.PrevManufacturerName!), manufacturer);
AssertElement(_manufacturerStorageContract.GetElementByOldName(manufacturer
@@ -85,7 +86,7 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetElementByOldName_WhenNoRecord_Test()
{
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
Assert.That(() =>
_manufacturerStorageContract.GetElementByOldName("name"), Is.Null);
}
@@ -101,7 +102,7 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
{
var manufacturer = CreateModel(Guid.NewGuid().ToString(), "name unique");
InsertManufacturerToDatabaseAndReturn(manufacturer.Id);
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturer.Id);
Assert.That(() =>
_manufacturerStorageContract.AddElement(manufacturer),
Throws.TypeOf<ElementExistsException>());
@@ -110,7 +111,7 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
public void Try_AddElement_WhenHaveRecordWithSameManufacturerName_Test()
{
var manufacturer = CreateModel(Guid.NewGuid().ToString(), "name unique");
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(),
manufacturerName: manufacturer.ManufacturerName);
Assert.That(() =>
_manufacturerStorageContract.AddElement(manufacturer),
@@ -121,7 +122,7 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
{
var manufacturer = CreateModel(Guid.NewGuid().ToString(), "name new",
"test", "prev");
InsertManufacturerToDatabaseAndReturn(manufacturer.Id,
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturer.Id,
manufacturerName: manufacturer.PrevManufacturerName!, prevManufacturerName:
manufacturer.PrevPrevManufacturerName!);
_manufacturerStorageContract.UpdElement(CreateModel(manufacturer.Id,
@@ -134,7 +135,7 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
{
var manufacturer = CreateModel(Guid.NewGuid().ToString(), "name new",
"test", "prev");
InsertManufacturerToDatabaseAndReturn(manufacturer.Id,
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturer.Id,
manufacturerName: manufacturer.ManufacturerName!, prevManufacturerName:
manufacturer.PrevManufacturerName!, prevPrevManufacturerName:
manufacturer.PrevPrevManufacturerName!);
@@ -153,9 +154,9 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
public void Try_UpdElement_WhenHaveRecordWithSameManufacturerName_Test()
{
var manufacturer = CreateModel(Guid.NewGuid().ToString(), "name unique");
InsertManufacturerToDatabaseAndReturn(manufacturer.Id,
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturer.Id,
manufacturerName: "some name");
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(),
manufacturerName: manufacturer.ManufacturerName);
Assert.That(() =>
_manufacturerStorageContract.UpdElement(manufacturer),
@@ -165,7 +166,7 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
public void Try_DelElement_WhenNoSoftwares_Test()
{
var manufacturer =
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
_manufacturerStorageContract.DelElement(manufacturer.Id);
var element = GetManufacturerFromDatabase(manufacturer.Id);
Assert.That(element, Is.Null);
@@ -174,7 +175,7 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
public void Try_DelElement_WhenHaveSoftwares_Test()
{
var manufacturer =
InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.Softwares.Add(new Software()
{
Id =
@@ -197,22 +198,7 @@ internal class ManufacturerStorageContractTests : BaseStorageContractTest
_manufacturerStorageContract.DelElement(Guid.NewGuid().ToString()),
Throws.TypeOf<ElementNotFoundException>());
}
private Manufacturer InsertManufacturerToDatabaseAndReturn(string id,
string manufacturerName = "test", string prevManufacturerName = "prev", string
prevPrevManufacturerName = "prevPrev")
{
var manufacturer = new Manufacturer()
{
Id = id,
ManufacturerName =
manufacturerName,
PrevManufacturerName = prevManufacturerName,
PrevPrevManufacturerName = prevPrevManufacturerName
};
SmallSoftwareDbContext.Manufacturers.Add(manufacturer);
SmallSoftwareDbContext.SaveChanges();
return manufacturer;
}
private static void AssertElement(ManufacturerDataModel? actual,
Manufacturer expected)
{

View File

@@ -4,6 +4,7 @@ using SmallSoftwareContracts.Enums;
using SmallSoftwareContracts.Exceptions;
using SmallSoftwareDatabase.Implementations;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -24,14 +25,14 @@ internal class PostStorageContractTests : BaseStorageContractTest
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Posts\" CASCADE; ");
SmallSoftwareDbContext.RemovePostsFromDatabase();
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1");
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2");
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 3");
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1");
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2");
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 3");
var list = _postStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
@@ -48,10 +49,10 @@ internal class PostStorageContractTests : BaseStorageContractTest
public void Try_GetPostWithHistory_WhenHaveRecords_Test()
{
var postId = Guid.NewGuid().ToString();
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1",
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1",
isActual: true);
InsertPostToDatabaseAndReturn(postId, "name 2", isActual: true);
InsertPostToDatabaseAndReturn(postId, "name 2", isActual: false);
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postId, "name 2", isActual: true);
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postId, "name 2", isActual: false);
var list = _postStorageContract.GetPostWithHistory(postId);
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
@@ -60,10 +61,10 @@ internal class PostStorageContractTests : BaseStorageContractTest
public void Try_GetPostWithHistory_WhenNoRecords_Test()
{
var postId = Guid.NewGuid().ToString();
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1",
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1",
isActual: true);
InsertPostToDatabaseAndReturn(postId, "name 2", isActual: true);
InsertPostToDatabaseAndReturn(postId, "name 2", isActual: false);
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postId, "name 2", isActual: true);
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postId, "name 2", isActual: false);
var list =
_postStorageContract.GetPostWithHistory(Guid.NewGuid().ToString());
Assert.That(list, Is.Not.Null);
@@ -72,21 +73,21 @@ internal class PostStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetElementById_WhenHaveRecord_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_postStorageContract.GetElementById(post.PostId),
post);
}
[Test]
public void Try_GetElementById_WhenNoRecord_Test()
{
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
Assert.That(() =>
_postStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
}
[Test]
public void Try_GetElementById_WhenRecordHasDeleted_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
isActual: false);
Assert.That(() => _postStorageContract.GetElementById(post.PostId),
Is.Null);
@@ -94,28 +95,28 @@ internal class PostStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetElementById_WhenTrySearchById_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
Assert.That(() => _postStorageContract.GetElementById(post.Id),
Is.Null);
}
[Test]
public void Try_GetElementByName_WhenHaveRecord_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_postStorageContract.GetElementByName(post.PostName),
post);
}
[Test]
public void Try_GetElementByName_WhenNoRecord_Test()
{
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
Assert.That(() => _postStorageContract.GetElementByName("name"),
Is.Null);
}
[Test]
public void Try_GetElementByName_WhenRecordHasDeleted_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
isActual: false);
Assert.That(() => _postStorageContract.GetElementById(post.PostName),
Is.Null);
@@ -131,7 +132,7 @@ internal class PostStorageContractTests : BaseStorageContractTest
public void Try_AddElement_WhenHaveRecordWithSameName_Test()
{
var post = CreateModel(Guid.NewGuid().ToString(), "name unique");
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), postName:
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), postName:
post.PostName, isActual: true);
Assert.That(() => _postStorageContract.AddElement(post),
Throws.TypeOf<ElementExistsException>());
@@ -140,7 +141,7 @@ internal class PostStorageContractTests : BaseStorageContractTest
public void Try_AddElement_WhenHaveRecordWithSamePostId_Test()
{
var post = CreateModel(Guid.NewGuid().ToString());
InsertPostToDatabaseAndReturn(post.Id, isActual: true);
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(post.Id, isActual: true);
Assert.That(() => _postStorageContract.AddElement(post),
Throws.TypeOf<ElementExistsException>());
}
@@ -148,7 +149,7 @@ internal class PostStorageContractTests : BaseStorageContractTest
public void Try_UpdElement_Test()
{
var post = CreateModel(Guid.NewGuid().ToString());
InsertPostToDatabaseAndReturn(post.Id, isActual: true);
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(post.Id, isActual: true);
_postStorageContract.UpdElement(post);
var posts = SmallSoftwareDbContext.Posts.Where(x => x.PostId ==
post.Id).OrderByDescending(x => x.ChangeDate);
@@ -167,8 +168,8 @@ internal class PostStorageContractTests : BaseStorageContractTest
public void Try_UpdElement_WhenHaveRecordWithSameName_Test()
{
var post = CreateModel(Guid.NewGuid().ToString(), "New Name");
InsertPostToDatabaseAndReturn(post.Id, postName: "name");
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), postName:
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(post.Id, postName: "name");
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), postName:
post.PostName);
Assert.That(() => _postStorageContract.UpdElement(post),
Throws.TypeOf<ElementExistsException>());
@@ -177,14 +178,14 @@ internal class PostStorageContractTests : BaseStorageContractTest
public void Try_UpdElement_WhenRecordWasDeleted_Test()
{
var post = CreateModel(Guid.NewGuid().ToString());
InsertPostToDatabaseAndReturn(post.Id, isActual: false);
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(post.Id, isActual: false);
Assert.That(() => _postStorageContract.UpdElement(post),
Throws.TypeOf<ElementDeletedException>());
}
[Test]
public void Try_DelElement_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
isActual: true);
_postStorageContract.DelElement(post.PostId);
var element = GetPostFromDatabaseByPostId(post.PostId);
@@ -204,7 +205,7 @@ internal class PostStorageContractTests : BaseStorageContractTest
[Test]
public void Try_DelElement_WhenRecordWasDeleted_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
isActual: false);
Assert.That(() => _postStorageContract.DelElement(post.PostId),
Throws.TypeOf<ElementDeletedException>());
@@ -212,7 +213,7 @@ internal class PostStorageContractTests : BaseStorageContractTest
[Test]
public void Try_ResElement_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
isActual: false);
_postStorageContract.ResElement(post.PostId);
var element = GetPostFromDatabaseByPostId(post.PostId);
@@ -232,29 +233,11 @@ internal class PostStorageContractTests : BaseStorageContractTest
[Test]
public void Try_ResElement_WhenRecordNotWasDeleted_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(),
isActual: true);
Assert.That(() => _postStorageContract.ResElement(post.PostId),
Throws.Nothing);
}
private Post InsertPostToDatabaseAndReturn(string id, string postName =
"test", PostType postType = PostType.SoftInstaller, double salary = 10, bool isActual
= true, DateTime? changeDate = null)
{
var post = new Post()
{
Id = Guid.NewGuid().ToString(),
PostId = id,
PostName = postName,
PostType = postType,
Salary = salary,
IsActual = isActual,
ChangeDate = changeDate ?? DateTime.UtcNow
};
SmallSoftwareDbContext.Posts.Add(post);
SmallSoftwareDbContext.SaveChanges();
return post;
}
private static void AssertElement(PostDataModel? actual, Post expected)
{
Assert.That(actual, Is.Not.Null);

View File

@@ -4,6 +4,7 @@ using SmallSoftwareContracts.Enums;
using SmallSoftwareContracts.Exceptions;
using SmallSoftwareDatabase.Implementations;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
using System.ComponentModel.DataAnnotations;
namespace SmallSoftwareTests.StoragesContracts;
@@ -25,17 +26,17 @@ internal class RequestStorageContractTests : BaseStorageContractTest
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Requests\" CASCADE; ");
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Workers\" CASCADE; ");
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Softwares\" CASCADE; ");
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Manufacturers\" CASCADE;");
SmallSoftwareDbContext.RemoveRequestsFromDatabase();
SmallSoftwareDbContext.RemoveWorkersFromDatabase();
SmallSoftwareDbContext.RemoveSalariesFromDatabase();
SmallSoftwareDbContext.RemoveManufacturersFromDatabase();
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var request = InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests: [(_software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests: [(_software.Id, 5, 1.2)]);
InsertRequestToDatabaseAndReturn(_worker.Id, "", 10, installationRequests: [(_software.Id, 10, 1.2)]);
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 5, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 10, softwares: [(_software.Id, 10, 1.2)]);
var list = _requesttStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
@@ -51,10 +52,10 @@ internal class RequestStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetList_ByPeriod_Test()
{
InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests: [(_software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests: [(_software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, installationRequests: [(_software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, installationRequests: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)]);
var list = _requesttStorageContract.GetList(startDate:
DateTime.UtcNow.AddDays(-1), endDate: DateTime.UtcNow.AddDays(1));
Assert.That(list, Is.Not.Null);
@@ -64,11 +65,11 @@ internal class RequestStorageContractTests : BaseStorageContractTest
public void Try_GetList_ByWorkerId_Test()
{
var worker = InsertWorkerToDatabaseAndReturn("Other worker");
InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests:
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests:
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(worker.Id, "", 1, installationRequests:
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "", 1, softwares:
[(_software.Id, 1, 1.2)]);
var list = _requesttStorageContract.GetList(workerId: _worker.Id);
Assert.That(list, Is.Not.Null);
@@ -80,13 +81,13 @@ internal class RequestStorageContractTests : BaseStorageContractTest
public void Try_GetList_BySoftwareId_Test()
{
var software = InsertSoftwareToDatabaseAndReturn("Other name");
InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests:
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 5, 1.2)]);
InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests:
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2), (software.Id, 4, 1.2)]);
InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, installationRequests:
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares:
[(software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, installationRequests:
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares:
[(software.Id, 1, 1.2), (_software.Id, 1, 1.2)]);
var list = _requesttStorageContract.GetList(softwareId: _software.Id);
Assert.That(list, Is.Not.Null);
@@ -99,13 +100,13 @@ internal class RequestStorageContractTests : BaseStorageContractTest
{
var worker = InsertWorkerToDatabaseAndReturn("Other worker");
var software = InsertSoftwareToDatabaseAndReturn("Other name");
InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests: [(_software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(worker.Id, "", 1, installationRequests: [(_software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(worker.Id, "test@mail.ru", 1, installationRequests: [(_software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(worker.Id, "test@mail.ru", 1, installationRequests: [(software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests: [(_software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests: [(software.Id, 1, 1.2)]);
InsertRequestToDatabaseAndReturn(worker.Id, "", 1, installationRequests: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "test@mail.ru", 1, softwares: [(software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)]);
var list = _requesttStorageContract.GetList(startDate:
DateTime.UtcNow.AddDays(-1), endDate: DateTime.UtcNow.AddDays(1), workerId:
_worker.Id, softwareId: _software.Id);
@@ -115,14 +116,14 @@ internal class RequestStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetElementById_WhenHaveRecord_Test()
{
var request = InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
installationRequests: [(_software.Id, 1, 1.2)]);
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
softwares: [(_software.Id, 1, 1.2)]);
AssertElement(_requesttStorageContract.GetElementById(request.Id), request);
}
[Test]
public void Try_GetElementById_WhenNoRecord_Test()
{
InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, installationRequests:
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2)]);
Assert.That(() =>
_requesttStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
@@ -130,8 +131,8 @@ internal class RequestStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetElementById_WhenRecordHasCanceled_Test()
{
var request = InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
installationRequests: [(_software.Id, 1, 1.2)], isCancel: true);
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
softwares: [(_software.Id, 1, 1.2)], isCancel: true);
AssertElement(_requesttStorageContract.GetElementById(request.Id), request);
}
[Test]
@@ -152,8 +153,8 @@ internal class RequestStorageContractTests : BaseStorageContractTest
[Test]
public void Try_DelElement_Test()
{
var request = InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
installationRequests: [(_software.Id, 1, 1.2)], isCancel: false);
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
softwares: [(_software.Id, 1, 1.2)], isCancel: false);
_requesttStorageContract.DelElement(request.Id);
var element = GetRequestFromDatabaseById(request.Id);
Assert.Multiple(() =>
@@ -172,8 +173,8 @@ internal class RequestStorageContractTests : BaseStorageContractTest
[Test]
public void Try_DelElement_WhenRecordWasCanceled_Test()
{
var request = InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
installationRequests: [(_software.Id, 1, 1.2)], isCancel: true);
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
softwares: [(_software.Id, 1, 1.2)], isCancel: true);
Assert.That(() => _requesttStorageContract.DelElement(request.Id),
Throws.TypeOf<ElementDeletedException>());
}
@@ -219,36 +220,6 @@ internal class RequestStorageContractTests : BaseStorageContractTest
SmallSoftwareDbContext.SaveChanges();
return software;
}
private Request InsertRequestToDatabaseAndReturn(string workerId, string email,
double sum = 1, bool isCancel = false, List<(string, int, double)>? installationRequests = null)
{
var request = new Request()
{
WorkerId = workerId,
Email = email,
Sum = sum,
IsCancel = isCancel,
InstallationRequests = []
};
if (installationRequests is not null)
{
foreach (var elem in installationRequests)
{
request.InstallationRequests.Add(new InstallationRequest
{
SoftwareId =
elem.Item1,
RequestId = request.Id,
Count = elem.Item2,
Price = elem.Item3
});
}
}
SmallSoftwareDbContext.Requests.Add(request);
SmallSoftwareDbContext.SaveChanges();
return request;
}
private static void AssertElement(RequestDataModel? actual, Request expected)
{
Assert.That(actual, Is.Not.Null);

View File

@@ -2,6 +2,7 @@
using SmallSoftwareContracts.DataModels;
using SmallSoftwareDatabase.Implementations;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -25,16 +26,15 @@ internal class SalaryStorageContractTests : BaseStorageContractTest
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Salaries\" CASCADE; ");
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Workers\" CASCADE; ");
SmallSoftwareDbContext.RemoveSalariesFromDatabase();
SmallSoftwareDbContext.RemoveWorkersFromDatabase();
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var salary = InsertSalaryToDatabaseAndReturn(_worker.Id,
workerSalary: 100);
InsertSalaryToDatabaseAndReturn(_worker.Id);
InsertSalaryToDatabaseAndReturn(_worker.Id);
var salary = SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, workerSalary: 100);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id);
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-
10), DateTime.UtcNow.AddDays(10));
Assert.That(list, Is.Not.Null);
@@ -52,17 +52,17 @@ internal class SalaryStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetList_OnlyInDatePeriod_Test()
{
InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
DateTime.UtcNow.AddDays(-2));
InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
DateTime.UtcNow.AddDays(-1).AddMinutes(-5));
InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
DateTime.UtcNow.AddDays(-1).AddMinutes(5));
InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
DateTime.UtcNow.AddDays(1).AddMinutes(-5));
InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
DateTime.UtcNow.AddDays(1).AddMinutes(5));
InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
DateTime.UtcNow.AddDays(-2));
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-
1), DateTime.UtcNow.AddDays(1));
@@ -76,9 +76,9 @@ internal class SalaryStorageContractTests : BaseStorageContractTest
public void Try_GetList_ByWorker_Test()
{
var worker = InsertWorkerToDatabaseAndReturn("name 2");
InsertSalaryToDatabaseAndReturn(_worker.Id);
InsertSalaryToDatabaseAndReturn(_worker.Id);
InsertSalaryToDatabaseAndReturn(worker.Id);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id);
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-
1), DateTime.UtcNow.AddDays(1), _worker.Id);
Assert.That(list, Is.Not.Null);
@@ -92,17 +92,17 @@ internal class SalaryStorageContractTests : BaseStorageContractTest
public void Try_GetList_ByWorkerOnlyInDatePeriod_Test()
{
var worker = InsertWorkerToDatabaseAndReturn("name 2");
InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
DateTime.UtcNow.AddDays(-2));
InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
DateTime.UtcNow.AddDays(-1).AddMinutes(5));
InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate:
DateTime.UtcNow.AddDays(-1).AddMinutes(5));
InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
DateTime.UtcNow.AddDays(1).AddMinutes(-5));
InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate:
DateTime.UtcNow.AddDays(1).AddMinutes(-5));
InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, salaryDate:
DateTime.UtcNow.AddDays(-2));
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-
1), DateTime.UtcNow.AddDays(1), _worker.Id);
@@ -134,20 +134,7 @@ internal class SalaryStorageContractTests : BaseStorageContractTest
SmallSoftwareDbContext.SaveChanges();
return worker;
}
private Salary InsertSalaryToDatabaseAndReturn(string workerId, double
workerSalary = 1, DateTime? salaryDate = null)
{
var salary = new Salary()
{
WorkerId = workerId,
WorkerSalary =
workerSalary,
SalaryDate = salaryDate ?? DateTime.UtcNow
};
SmallSoftwareDbContext.Salaries.Add(salary);
SmallSoftwareDbContext.SaveChanges();
return salary;
}
private static void AssertElement(SalaryDataModel? actual, Salary expected)
{
Assert.That(actual, Is.Not.Null);

View File

@@ -4,6 +4,7 @@ using SmallSoftwareContracts.Enums;
using SmallSoftwareContracts.Exceptions;
using SmallSoftwareDatabase.Implementations;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
namespace SmallSoftwareTests.StoragesContracts;
[TestFixture]
@@ -14,26 +15,25 @@ internal class SoftwareStorageContractTests : BaseStorageContractTest
[SetUp]
public void SetUp()
{
_softwareStorageContract = new
SoftwareStorageContract(SmallSoftwareDbContext);
_softwareStorageContract = new SoftwareStorageContract(SmallSoftwareDbContext);
_manufacturer = InsertManufacturerToDatabaseAndReturn();
}
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Softwares\" CASCADE; ");
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Manufacturers\" CASCADE;");
SmallSoftwareDbContext.RemoveSoftwaresFromDatabase();
SmallSoftwareDbContext.RemoveManufacturersFromDatabase();
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var software =
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(_manufacturer.Id,Guid.NewGuid().ToString(),
"name 1");
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 2");
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 3");
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(_manufacturer.Id,Guid.NewGuid().ToString(),
"name 2");
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(_manufacturer.Id,Guid.NewGuid().ToString(),
"name 3");
var list = _softwareStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
@@ -49,11 +49,11 @@ public void SetUp()
[Test]
public void Try_GetList_OnlyActual_Test()
{
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 1", isDeleted: true);
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 2", isDeleted: false);
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 3", isDeleted: false);
var list = _softwareStorageContract.GetList(onlyActive: true);
Assert.That(list, Is.Not.Null);
@@ -66,11 +66,11 @@ public void SetUp()
[Test]
public void Try_GetList_IncludeNoActual_Test()
{
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 1", isDeleted: true);
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 1", isDeleted: true);
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 2", isDeleted: true);
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 3", isDeleted: false);
var list = _softwareStorageContract.GetList(onlyActive: false);
Assert.That(list, Is.Not.Null);
@@ -85,11 +85,11 @@ public void SetUp()
public void Try_GetList_ByManufacturer_Test()
{
var manufacruer = InsertManufacturerToDatabaseAndReturn("name 2");
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 1", isDeleted: true);
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 2", isDeleted: false);
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
manufacruer.Id, "name 3", isDeleted: false);
var list = _softwareStorageContract.GetList(manufacturerId:
_manufacturer.Id, onlyActive: false);
@@ -105,11 +105,11 @@ public void SetUp()
public void Try_GetList_ByManufacturerOnlyActual_Test()
{
var manufacruer = InsertManufacturerToDatabaseAndReturn("name 2");
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 1", isDeleted: true);
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, "name 2", isDeleted: false);
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
manufacruer.Id, "name 3", isDeleted: false);
var list = _softwareStorageContract.GetList(manufacturerId:
_manufacturer.Id, onlyActive: true);
@@ -125,7 +125,7 @@ public void SetUp()
public void Try_GetHistoryBySoftwareId_WhenHaveRecords_Test()
{
var software =
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
"name 1");
InsertSoftwareHistoryToDatabaseAndReturn(software.Id, 20,
DateTime.UtcNow.AddDays(-1));
@@ -141,7 +141,7 @@ public void SetUp()
public void Try_GetHistoryBySoftwareId_WhenNoRecords_Test()
{
var software =
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
"name 1");
InsertSoftwareHistoryToDatabaseAndReturn(software.Id, 20,
DateTime.UtcNow.AddDays(-1));
@@ -158,14 +158,14 @@ public void SetUp()
public void Try_GetElementById_WhenHaveRecord_Test()
{
var software =
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id);
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id);
AssertElement(_softwareStorageContract.GetElementById(software.Id),
software);
}
[Test]
public void Try_GetElementById_WhenNoRecord_Test()
{
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id);
Assert.That(() =>
_softwareStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
@@ -174,7 +174,7 @@ public void SetUp()
public void Try_GetElementById_WhenRecordHasDeleted_Test()
{
var software =
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
isDeleted: true);
Assert.That(() => _softwareStorageContract.GetElementById(software.Id),
Is.Null);
@@ -183,14 +183,14 @@ public void SetUp()
public void Try_GetElementByName_WhenHaveRecord_Test()
{
var software =
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id);
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id);
AssertElement(_softwareStorageContract.GetElementByName(software.SoftwareName)
, software);
}
[Test]
public void Try_GetElementByName_WhenNoRecord_Test()
{
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id);
Assert.That(() => _softwareStorageContract.GetElementByName("name"),
Is.Null);
@@ -199,7 +199,7 @@ public void SetUp()
public void Try_GetElementByName_WhenRecordHasDeleted_Test()
{
var software =
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
isDeleted: true);
Assert.That(() =>
_softwareStorageContract.GetElementById(software.SoftwareName), Is.Null);
@@ -227,7 +227,7 @@ public void SetUp()
{
var software = CreateModel(Guid.NewGuid().ToString(),
_manufacturer.Id);
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
softwareName: "name unique");
Assert.That(() => _softwareStorageContract.AddElement(software),
Throws.TypeOf<ElementExistsException>());
@@ -237,7 +237,7 @@ public void SetUp()
{
var software = CreateModel(Guid.NewGuid().ToString(),
_manufacturer.Id, "name unique", isDeleted: false);
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, softwareName: software.SoftwareName, isDeleted: false);
Assert.That(() => _softwareStorageContract.AddElement(software),
Throws.TypeOf<ElementExistsException>());
@@ -247,7 +247,7 @@ public void SetUp()
{
var software = CreateModel(Guid.NewGuid().ToString(),
_manufacturer.Id, "name unique", isDeleted: false);
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, softwareName: software.SoftwareName, isDeleted: true);
Assert.That(() => _softwareStorageContract.AddElement(software),
Throws.Nothing);
@@ -257,7 +257,7 @@ public void SetUp()
{
var software = CreateModel(Guid.NewGuid().ToString(),
_manufacturer.Id, isDeleted: false);
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
isDeleted: false);
_softwareStorageContract.UpdElement(software);
AssertElement(GetSoftwareFromDatabaseById(software.Id), software);
@@ -267,7 +267,7 @@ public void SetUp()
{
var software = CreateModel(Guid.NewGuid().ToString(),
_manufacturer.Id, isDeleted: true);
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
isDeleted: false);
_softwareStorageContract.UpdElement(software);
AssertElement(GetSoftwareFromDatabaseById(software.Id),
@@ -285,9 +285,9 @@ public void SetUp()
{
var software = CreateModel(Guid.NewGuid().ToString(),
_manufacturer.Id, "name unique", isDeleted: false);
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
softwareName: "name");
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, softwareName: software.SoftwareName);
Assert.That(() => _softwareStorageContract.UpdElement(software),
Throws.TypeOf<ElementExistsException>());
@@ -298,10 +298,10 @@ public void SetUp()
{
var software = CreateModel(Guid.NewGuid().ToString(),
_manufacturer.Id, "name unique", isDeleted: false);
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
softwareName: "name");
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, softwareName: software.SoftwareName, isDeleted: true);
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
softwareName: "name");
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
_manufacturer.Id, softwareName: software.SoftwareName, isDeleted: true);
Assert.That(() => _softwareStorageContract.UpdElement(software),
Throws.Nothing);
}
@@ -310,7 +310,7 @@ public void SetUp()
{
var software = CreateModel(Guid.NewGuid().ToString(),
_manufacturer.Id);
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
isDeleted: true);
Assert.That(() => _softwareStorageContract.UpdElement(software),
Throws.TypeOf<ElementNotFoundException>());
@@ -319,7 +319,7 @@ public void SetUp()
public void Try_DelElement_Test()
{
var software =
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
isDeleted: false);
_softwareStorageContract.DelElement(software.Id);
var element = GetSoftwareFromDatabaseById(software.Id);
@@ -340,7 +340,7 @@ public void SetUp()
public void Try_DelElement_WhenRecordWasDeleted_Test()
{
var software =
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
isDeleted: true);
Assert.That(() => _softwareStorageContract.DelElement(software.Id),
Throws.TypeOf<ElementNotFoundException>());
@@ -358,25 +358,7 @@ public void SetUp()
SmallSoftwareDbContext.SaveChanges();
return manufacrurer;
}
private Software InsertSoftwareToDatabaseAndReturn(string id, string
manufacturerId, string softwareName = "test", SoftwareType softwareType =
SoftwareType.Windows, double price = 1, bool isDeleted = false)
{
var software = new Software()
{
Id = id,
ManufacturerId =
manufacturerId,
SoftwareName = softwareName,
SoftwareType = softwareType,
Price =
price,
IsDeleted = isDeleted
};
SmallSoftwareDbContext.Softwares.Add(software);
SmallSoftwareDbContext.SaveChanges();
return software;
}
private SoftwareHistory InsertSoftwareHistoryToDatabaseAndReturn(string
softwareId, double price, DateTime changeDate)
{

View File

@@ -3,6 +3,7 @@ using SmallSoftwareContracts.DataModels;
using SmallSoftwareContracts.Exceptions;
using SmallSoftwareDatabase.Implementations;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -24,15 +25,16 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Workers\" CASCADE; ");
}
SmallSoftwareDbContext.RemoveWorkersFromDatabase();
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var worker =
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1");
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2");
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3");
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1");
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2");
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3");
var list = _workerStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
@@ -49,11 +51,11 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
public void Try_GetList_ByPostId_Test()
{
var postId = Guid.NewGuid().ToString();
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
postId);
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
postId);
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3");
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3");
var list = _workerStorageContract.GetList(postId: postId);
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
@@ -62,13 +64,13 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetList_ByBirthDate_Test()
{
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
birthDate: DateTime.UtcNow.AddYears(-25));
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
birthDate: DateTime.UtcNow.AddYears(-21));
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3",
birthDate: DateTime.UtcNow.AddYears(-20));
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4",
birthDate: DateTime.UtcNow.AddYears(-19));
var list = _workerStorageContract.GetList(fromBirthDate:
DateTime.UtcNow.AddYears(-21).AddMinutes(-1), toBirthDate:
@@ -79,13 +81,13 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetList_ByEmploymentDate_Test()
{
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
employmentDate: DateTime.UtcNow.AddDays(-2));
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
employmentDate: DateTime.UtcNow.AddDays(-1));
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3",
employmentDate: DateTime.UtcNow.AddDays(1));
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4",
employmentDate: DateTime.UtcNow.AddDays(2));
var list = _workerStorageContract.GetList(fromEmploymentDate:
DateTime.UtcNow.AddDays(-1).AddMinutes(-1), toEmploymentDate:
@@ -97,16 +99,16 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
public void Try_GetList_ByAllParameters_Test()
{
var postId = Guid.NewGuid().ToString();
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
postId, birthDate: DateTime.UtcNow.AddYears(-25), employmentDate:
DateTime.UtcNow.AddDays(-2));
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
postId, birthDate: DateTime.UtcNow.AddYears(-22), employmentDate:
DateTime.UtcNow.AddDays(-1));
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3",
postId, birthDate: DateTime.UtcNow.AddYears(-21), employmentDate:
DateTime.UtcNow.AddDays(-1));
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4",
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4",
birthDate: DateTime.UtcNow.AddYears(-20), employmentDate:
DateTime.UtcNow.AddDays(1));
var list = _workerStorageContract.GetList(postId: postId,
@@ -121,7 +123,7 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
public void Try_GetElementById_WhenHaveRecord_Test()
{
var worker =
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_workerStorageContract.GetElementById(worker.Id),
worker);
}
@@ -135,7 +137,7 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
public void Try_GetElementByFIO_WhenHaveRecord_Test()
{
var worker =
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString());
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_workerStorageContract.GetElementByFIO(worker.FIO),
worker);
}
@@ -156,7 +158,7 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
{
var worker = CreateModel(Guid.NewGuid().ToString());
InsertWorkerToDatabaseAndReturn(worker.Id);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(worker.Id);
Assert.That(() => _workerStorageContract.AddElement(worker),
Throws.TypeOf<ElementExistsException>());
}
@@ -164,7 +166,7 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
public void Try_UpdElement_Test()
{
var worker = CreateModel(Guid.NewGuid().ToString(), "New Fio");
InsertWorkerToDatabaseAndReturn(worker.Id);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(worker.Id);
_workerStorageContract.UpdElement(worker);
AssertElement(GetWorkerFromDatabase(worker.Id), worker);
}
@@ -179,15 +181,14 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
public void Try_UpdElement_WhenNoRecordWasDeleted_Test()
{
var worker = CreateModel(Guid.NewGuid().ToString());
InsertWorkerToDatabaseAndReturn(worker.Id, isDeleted: true);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(worker.Id, isDeleted: true);
Assert.That(() => _workerStorageContract.UpdElement(worker),
Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_DelElement_Test()
{
var worker =
InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString());
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString());
_workerStorageContract.DelElement(worker.Id);
var element = GetWorkerFromDatabase(worker.Id);
Assert.That(element, Is.Not.Null);
@@ -204,29 +205,10 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
public void Try_DelElement_WhenNoRecordWasDeleted_Test()
{
var worker = CreateModel(Guid.NewGuid().ToString());
InsertWorkerToDatabaseAndReturn(worker.Id, isDeleted: true);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(worker.Id, isDeleted: true);
Assert.That(() => _workerStorageContract.DelElement(worker.Id),
Throws.TypeOf<ElementNotFoundException>());
}
private Worker InsertWorkerToDatabaseAndReturn(string id, string fio =
"test", string? postId = null, DateTime? birthDate = null, DateTime?
employmentDate = null, bool isDeleted = false)
{
var worker = new Worker()
{
Id = id,
FIO = fio,
PostId = postId ??
Guid.NewGuid().ToString(),
BirthDate = birthDate ?? DateTime.UtcNow.AddYears(-
20),
EmploymentDate = employmentDate ?? DateTime.UtcNow,
IsDeleted = isDeleted
};
SmallSoftwareDbContext.Workers.Add(worker);
SmallSoftwareDbContext.SaveChanges();
return worker;
}
private static void AssertElement(WorkerDataModel? actual, Worker expected)
{
Assert.That(actual, Is.Not.Null);

View File

@@ -0,0 +1,63 @@
using SmallSoftwareDatabase;
using SmallSoftwareTests.Infrastructure;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog;
using SmallSoftwareWebApi;
using System.Text.Json;
using System.Text;
namespace SmallSoftwareTests.WebApiControllersApi;
internal class BaseWebApiControllerTest
{
private WebApplicationFactory<Program> _webApplication;
protected SmallSoftwareDbContext SmallSoftwareDbContext { get; private set; }
protected HttpClient HttpClient { get; private set; }
protected static readonly JsonSerializerOptions JsonSerializerOptions = new() { PropertyNameCaseInsensitive = true };
[OneTimeSetUp]
public void OneTimeSetUp()
{
_webApplication = new CustomWebApplicationFactory<Program>();
HttpClient = _webApplication
.WithWebHostBuilder(builder =>
{
builder.ConfigureTestServices(services =>
{
using var loggerFactory = new LoggerFactory();
loggerFactory.AddSerilog(new LoggerConfiguration()
.ReadFrom.Configuration(new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build())
.CreateLogger());
services.AddSingleton(loggerFactory);
});
})
.CreateClient();
var request = HttpClient.GetAsync("/login/user").GetAwaiter().GetResult();
var data = request.Content.ReadAsStringAsync().GetAwaiter().GetResult();
HttpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {data}");
SmallSoftwareDbContext = _webApplication.Services.GetRequiredService<SmallSoftwareDbContext>();
SmallSoftwareDbContext.Database.EnsureDeleted();
SmallSoftwareDbContext.Database.EnsureCreated();
}
[OneTimeTearDown]
public void OneTimeTearDown()
{
SmallSoftwareDbContext?.Database.EnsureDeleted();
SmallSoftwareDbContext?.Dispose();
HttpClient?.Dispose();
_webApplication?.Dispose();
}
protected static async Task<T?> GetModelFromResponseAsync<T>(HttpResponseMessage response) =>
JsonSerializer.Deserialize<T>(await response.Content.ReadAsStringAsync(), JsonSerializerOptions);
protected static StringContent MakeContent(object model) =>
new(JsonSerializer.Serialize(model), Encoding.UTF8, "application/json");
}

View File

@@ -0,0 +1,357 @@
using SmallSoftwareContracts.BindingModels;
using SmallSoftwareContracts.ViewModels;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
using System.Net;
namespace SmallSoftwareTests.WebApiControllersApi;
[TestFixture]
internal class ManufacturerControllerTests : BaseWebApiControllerTest
{
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.RemoveSoftwaresFromDatabase();
SmallSoftwareDbContext.RemoveManufacturersFromDatabase();
}
[Test]
public async Task GetList_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var manufacturer = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: "name 1");
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: "name 2");
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: "name 3");
//Act
var response = await HttpClient.GetAsync("/api/manufacturers");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<ManufacturerViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
});
AssertElement(data.First(x => x.Id == manufacturer.Id), manufacturer);
}
[Test]
public async Task GetList_WhenNoRecords_ShouldSuccess_Test()
{
//Act
var response = await HttpClient.GetAsync("/api/manufacturers");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<ManufacturerViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task GetElement_ById_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var manufacturer = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/manufacturers/{manufacturer.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
AssertElement(await GetModelFromResponseAsync<ManufacturerViewModel>(response), manufacturer);
}
[Test]
public async Task GetElement_ById_WhenNoRecord_ShouldNotFound_Test()
{
//Arrange
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/manufacturers/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ByName_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var manufacturer = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/manufacturers/{manufacturer.ManufacturerName}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
AssertElement(await GetModelFromResponseAsync<ManufacturerViewModel>(response), manufacturer);
}
[Test]
public async Task GetElement_ByName_WhenNoRecord_ShouldNotFound_Test()
{
//Arrange
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/manufacturers/New%20Name");
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ByOldName_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var oldName = "old name";
var manufacturer = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(prevManufacturerName: oldName);
//Act
var response = await HttpClient.GetAsync($"/api/manufacturers/{oldName}");
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
AssertElement(await GetModelFromResponseAsync<ManufacturerViewModel>(response), manufacturer);
}
[Test]
public async Task Post_ShouldSuccess_Test()
{
//Arrange
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
var manufacturerModel = CreateModel();
//Act
var response = await HttpClient.PostAsync($"/api/manufacturers", MakeContent(manufacturerModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
AssertElement(SmallSoftwareDbContext.GetManufacturerFromDatabase(manufacturerModel.Id!), manufacturerModel);
}
[Test]
public async Task Post_WhenHaveRecordWithSameId_ShouldBadRequest_Test()
{
//Arrange
var manufacturerModel = CreateModel();
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerModel.Id);
//Act
var response = await HttpClient.PostAsync($"/api/manufacturers", MakeContent(manufacturerModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenHaveRecordWithSameName_ShouldBadRequest_Test()
{
//Arrange
var manufacturerModel = CreateModel(manufacturerName: "unique name");
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: manufacturerModel.ManufacturerName!);
//Act
var response = await HttpClient.PostAsync($"/api/manufacturers", MakeContent(manufacturerModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenDataIsIncorrect_ShouldBadRequest_Test()
{
//Arrange
var manufacturerModelWithIdIncorrect = new ManufacturerBindingModel { Id = "Id", ManufacturerName = "name" };
var manufacturerModelWithNameIncorrect = new ManufacturerBindingModel { Id = Guid.NewGuid().ToString(), ManufacturerName = string.Empty };
//Act
var responseWithIdIncorrect = await HttpClient.PostAsync($"/api/manufacturers", MakeContent(manufacturerModelWithIdIncorrect));
var responseWithNameIncorrect = await HttpClient.PostAsync($"/api/manufacturers", MakeContent(manufacturerModelWithNameIncorrect));
//Assert
Assert.Multiple(() =>
{
Assert.That(responseWithIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Id is incorrect");
Assert.That(responseWithNameIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Name is incorrect");
});
}
[Test]
public async Task Post_WhenSendEmptyData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/manufacturers", MakeContent(string.Empty));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/manufacturers", MakeContent(new { Data = "test", Position = 10 }));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_ShouldSuccess_Test()
{
//Arrange
var manufacturerModel = CreateModel();
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerModel.Id);
//Act
var response = await HttpClient.PutAsync($"/api/manufacturers", MakeContent(manufacturerModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
SmallSoftwareDbContext.ChangeTracker.Clear();
AssertElement(SmallSoftwareDbContext.GetManufacturerFromDatabase(manufacturerModel.Id!), manufacturerModel);
}
[Test]
public async Task Put_CheckPrevNames_ShouldSuccess_Test()
{
//Arrange
var manufacturerModel1 = CreateModel(manufacturerName: "name 1");
var manufacturerModel2 = CreateModel(id: manufacturerModel1.Id, manufacturerName: "name 2");
var manufacturerModel3 = CreateModel(id: manufacturerModel1.Id, manufacturerName: "name 3");
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerModel1.Id);
//Act
await HttpClient.PutAsync($"/api/manufacturers", MakeContent(manufacturerModel1));
await HttpClient.PutAsync($"/api/manufacturers", MakeContent(manufacturerModel2));
await HttpClient.PutAsync($"/api/manufacturers", MakeContent(manufacturerModel3));
//Assert
SmallSoftwareDbContext.ChangeTracker.Clear();
var entityModel = SmallSoftwareDbContext.GetManufacturerFromDatabase(manufacturerModel1.Id!);
Assert.That(entityModel, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(entityModel.ManufacturerName, Is.EqualTo(manufacturerModel3.ManufacturerName));
Assert.That(entityModel.PrevManufacturerName, Is.EqualTo(manufacturerModel2.ManufacturerName));
Assert.That(entityModel.PrevPrevManufacturerName, Is.EqualTo(manufacturerModel1.ManufacturerName));
});
}
[Test]
public async Task Put_WhenNoFoundRecord_ShouldBadRequest_Test()
{
//Arrange
var manufacturerModel = CreateModel();
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
//Act
var response = await HttpClient.PutAsync($"/api/manufacturers", MakeContent(manufacturerModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenHaveRecordWithSameName_ShouldBadRequest_Test()
{
//Arrange
var manufacturerModel = CreateModel(manufacturerName: "unique name");
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerModel.Id);
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: manufacturerModel.ManufacturerName!);
//Act
var response = await HttpClient.PostAsync($"/api/manufacturers", MakeContent(manufacturerModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenDataIsIncorrect_ShouldBadRequest_Test()
{
//Arrange
var manufacturerModelWithIdIncorrect = new ManufacturerBindingModel { Id = "Id", ManufacturerName = "name" };
var manufacturerModelWithNameIncorrect = new ManufacturerBindingModel { Id = Guid.NewGuid().ToString(), ManufacturerName = string.Empty };
//Act
var responseWithIdIncorrect = await HttpClient.PutAsync($"/api/manufacturers", MakeContent(manufacturerModelWithIdIncorrect));
var responseWithNameIncorrect = await HttpClient.PutAsync($"/api/manufacturers", MakeContent(manufacturerModelWithNameIncorrect));
//Assert
Assert.Multiple(() =>
{
Assert.That(responseWithIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Id is incorrect");
Assert.That(responseWithNameIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Name is incorrect");
});
}
[Test]
public async Task Put_WhenSendEmptyData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PutAsync($"/api/manufacturers", MakeContent(string.Empty));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PutAsync($"/api/manufacturers", MakeContent(new { Data = "test", Position = 10 }));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_ShouldSuccess_Test()
{
//Arrange
var manufacturerId = Guid.NewGuid().ToString();
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerId);
//Act
var response = await HttpClient.DeleteAsync($"/api/manufacturers/{manufacturerId}");
//Assert
Assert.Multiple(() =>
{
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
Assert.That(SmallSoftwareDbContext.GetManufacturerFromDatabase(manufacturerId), Is.Null);
});
}
[Test]
public async Task Delete_WhenHaveSoftwares_ShouldSuccess_Test()
{
//Arrange
var manufacturerId = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn().Id;
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturerId);
//Act
var response = await HttpClient.DeleteAsync($"/api/manufacturers/{manufacturerId}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_WhenNoFoundRecord_ShouldBadRequest_Test()
{
//Arrange
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
//Act
var response = await HttpClient.DeleteAsync($"/api/manufacturers/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.DeleteAsync($"/api/manufacturers/id");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
private static void AssertElement(ManufacturerViewModel? actual, Manufacturer expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.ManufacturerName, Is.EqualTo(expected.ManufacturerName));
Assert.That(actual.PrevManufacturerName, Is.EqualTo(expected.PrevManufacturerName));
Assert.That(actual.PrevPrevManufacturerName, Is.EqualTo(expected.PrevPrevManufacturerName));
});
}
private static ManufacturerBindingModel CreateModel(string? id = null, string manufacturerName = "name")
=> new()
{
Id = id ?? Guid.NewGuid().ToString(),
ManufacturerName = manufacturerName
};
private static void AssertElement(Manufacturer? actual, ManufacturerBindingModel expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.ManufacturerName, Is.EqualTo(expected.ManufacturerName));
});
}
}

View File

@@ -0,0 +1,471 @@
using SmallSoftwareContracts.BindingModels;
using SmallSoftwareContracts.Enums;
using SmallSoftwareContracts.ViewModels;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
using System.Net;
namespace SmallSoftwareTests.WebApiControllersApi;
[TestFixture]
internal class PostControllerTests : BaseWebApiControllerTest
{
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.RemovePostsFromDatabase();
}
[Test]
public async Task GetRecords_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postName: "name 1");
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postName: "name 2");
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postName: "name 3");
//Act
var response = await HttpClient.GetAsync("/api/posts");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<PostViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
});
AssertElement(data.First(x => x.Id == post.PostId), post);
}
[Test]
public async Task GetRecords_WhenNoRecords_ShouldSuccess_Test()
{
//Act
var response = await HttpClient.GetAsync("/api/posts");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<ManufacturerViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task GetHistory_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var postId = Guid.NewGuid().ToString();
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postName: "name 1", isActual: true);
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postId, "name 2", isActual: true);
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postId, "name 2", isActual: false);
//Act
var response = await HttpClient.GetAsync($"/api/posthistory/{postId}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<PostViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(2));
});
AssertElement(data.First(x => x.Id == post.PostId), post);
}
[Test]
public async Task GetHistory_WhenNoRecords_ShouldSuccess_Test()
{
//Arrange
var postId = Guid.NewGuid().ToString();
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postName: "name 1", isActual: true);
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postId, "name 2", isActual: true);
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postId, "name 2", isActual: false);
//Act
var response = await HttpClient.GetAsync($"/api/posthistory/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<PostViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task GetHistory_WhenWrongData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/posthistory/id");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetElement_ById_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/posts/{post.PostId}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
AssertElement(await GetModelFromResponseAsync<PostViewModel>(response), post);
}
[Test]
public async Task GetElement_ById_WhenNoRecord_ShouldNotFound_Test()
{
//Arrange
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/posts/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ById_WhenRecordWasDeleted_ShouldNotFound_Test()
{
//Arrange
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(isActual: false);
//Act
var response = await HttpClient.GetAsync($"/api/posts/{post.PostId}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ByName_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/posts/{post.PostName}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
AssertElement(await GetModelFromResponseAsync<PostViewModel>(response), post);
}
[Test]
public async Task GetElement_ByName_WhenNoRecord_ShouldNotFound_Test()
{
//Arrange
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/posts/New%20Name");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ByName_WhenRecordWasDeleted_ShouldNotFound_Test()
{
//Arrange
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(isActual: false);
//Act
var response = await HttpClient.GetAsync($"/api/posts/{post.PostName}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task Post_ShouldSuccess_Test()
{
//Arrange
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
var postModel = CreateModel();
//Act
var response = await HttpClient.PostAsync($"/api/posts", MakeContent(postModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
AssertElement(SmallSoftwareDbContext.GetPostFromDatabaseByPostId(postModel.Id!), postModel);
}
[Test]
public async Task Post_WhenHaveRecordWithSameId_ShouldBadRequest_Test()
{
//Arrange
var postModel = CreateModel();
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postModel.Id);
//Act
var response = await HttpClient.PostAsync($"/api/posts", MakeContent(postModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenHaveRecordWithSameName_ShouldBadRequest_Test()
{
//Arrange
var postModel = CreateModel(postName: "unique name");
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postName: postModel.PostName!);
//Act
var response = await HttpClient.PostAsync($"/api/posts", MakeContent(postModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenDataIsIncorrect_ShouldBadRequest_Test()
{
//Arrange
var postModelWithIdIncorrect = new PostBindingModel { Id = "Id", PostName = "name", PostType = PostType.Supervisor.ToString(), Salary = 10 };
var postModelWithNameIncorrect = new PostBindingModel { Id = Guid.NewGuid().ToString(), PostName = string.Empty, PostType = PostType.Supervisor.ToString(), Salary = 10 };
var postModelWithPostTypeIncorrect = new PostBindingModel { Id = Guid.NewGuid().ToString(), PostName = string.Empty, PostType = string.Empty, Salary = 10 };
var postModelWithSalaryIncorrect = new PostBindingModel { Id = Guid.NewGuid().ToString(), PostName = string.Empty, PostType = PostType.Supervisor.ToString(), Salary = -10 };
//Act
var responseWithIdIncorrect = await HttpClient.PostAsync($"/api/posts", MakeContent(postModelWithIdIncorrect));
var responseWithNameIncorrect = await HttpClient.PostAsync($"/api/posts", MakeContent(postModelWithNameIncorrect));
var responseWithPostTypeIncorrect = await HttpClient.PostAsync($"/api/posts", MakeContent(postModelWithPostTypeIncorrect));
var responseWithSalaryIncorrect = await HttpClient.PostAsync($"/api/posts", MakeContent(postModelWithSalaryIncorrect));
//Assert
Assert.Multiple(() =>
{
Assert.That(responseWithIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Id is incorrect");
Assert.That(responseWithNameIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Name is incorrect");
Assert.That(responseWithPostTypeIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Type is incorrect");
Assert.That(responseWithSalaryIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Salary is incorrect");
});
}
[Test]
public async Task Post_WhenSendEmptyData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/posts", MakeContent(string.Empty));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/posts", MakeContent(new { Data = "test", Position = 10 }));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_ShouldSuccess_Test()
{
//Arrange
var postModel = CreateModel();
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postModel.Id);
//Act
var response = await HttpClient.PutAsync($"/api/posts", MakeContent(postModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
SmallSoftwareDbContext.ChangeTracker.Clear();
AssertElement(SmallSoftwareDbContext.GetPostFromDatabaseByPostId(postModel.Id!), postModel);
}
[Test]
public async Task Put_WhenNoFoundRecord_ShouldBadRequest_Test()
{
//Arrange
var postModel = CreateModel();
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
//Act
var response = await HttpClient.PutAsync($"/api/posts", MakeContent(postModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenRecordWasDeleted_ShouldBadRequest_Test()
{
//Arrange
var postModel = CreateModel();
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postModel.Id, isActual: false);
//Act
var response = await HttpClient.PutAsync($"/api/posts", MakeContent(postModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenHaveRecordWithSameName_ShouldBadRequest_Test()
{
//Arrange
var postModel = CreateModel(postName: "unique name");
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postModel.Id);
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(postName: postModel.PostName!);
//Act
var response = await HttpClient.PutAsync($"/api/posts", MakeContent(postModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenDataIsIncorrect_ShouldBadRequest_Test()
{
//Arrange
var postModelWithIdIncorrect = new PostBindingModel { Id = "Id", PostName = "name", PostType = PostType.Supervisor.ToString(), Salary = 10 };
var postModelWithNameIncorrect = new PostBindingModel { Id = Guid.NewGuid().ToString(), PostName = string.Empty, PostType = PostType.Supervisor.ToString(), Salary = 10 };
var postModelWithPostTypeIncorrect = new PostBindingModel { Id = Guid.NewGuid().ToString(), PostName = string.Empty, PostType = string.Empty, Salary = 10 };
var postModelWithSalaryIncorrect = new PostBindingModel { Id = Guid.NewGuid().ToString(), PostName = string.Empty, PostType = PostType.Supervisor.ToString(), Salary = -10 };
//Act
var responseWithIdIncorrect = await HttpClient.PutAsync($"/api/posts", MakeContent(postModelWithIdIncorrect));
var responseWithNameIncorrect = await HttpClient.PutAsync($"/api/posts", MakeContent(postModelWithNameIncorrect));
var responseWithPostTypeIncorrect = await HttpClient.PutAsync($"/api/posts", MakeContent(postModelWithPostTypeIncorrect));
var responseWithSalaryIncorrect = await HttpClient.PutAsync($"/api/posts", MakeContent(postModelWithSalaryIncorrect));
//Assert
Assert.Multiple(() =>
{
Assert.That(responseWithIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Id is incorrect");
Assert.That(responseWithNameIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Name is incorrect");
Assert.That(responseWithPostTypeIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Type is incorrect");
Assert.That(responseWithSalaryIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Salary is incorrect");
});
}
[Test]
public async Task Put_WhenSendEmptyData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PutAsync($"/api/posts", MakeContent(string.Empty));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PutAsync($"/api/posts", MakeContent(new { Data = "test", Position = 10 }));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_ShouldSuccess_Test()
{
//Arrange
var postId = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn().PostId;
//Act
var response = await HttpClient.DeleteAsync($"/api/posts/{postId}");
//Assert
Assert.Multiple(() =>
{
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
Assert.That(SmallSoftwareDbContext.GetPostFromDatabaseByPostId(postId), Is.Null);
});
}
[Test]
public async Task Delete_WhenNoFoundRecord_ShouldBadRequest_Test()
{
//Arrange
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
//Act
var response = await HttpClient.DeleteAsync($"/api/posts/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_WhenRecordWasDeleted_Test()
{
//Arrange
var postId = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(isActual: false).PostId;
//Act
var response = await HttpClient.DeleteAsync($"/api/posts/{postId}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.DeleteAsync($"/api/posts/id");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Patch_ShouldSuccess_Test()
{
//Arrange
var postId = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(isActual: false).PostId;
//Act
var response = await HttpClient.PatchAsync($"/api/posts/{postId}", null);
//Assert
Assert.Multiple(() =>
{
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
Assert.That(SmallSoftwareDbContext.GetPostFromDatabaseByPostId(postId), Is.Not.Null);
});
}
[Test]
public async Task Patch_WhenNoFoundRecord_ShouldBadRequest_Test()
{
//Arrange
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
//Act
var response = await HttpClient.PatchAsync($"/api/posts/{Guid.NewGuid()}", null);
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Patch_WhenRecordNotWasDeleted_ShouldSuccess_Test()
{
//Arrange
var postId = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn().PostId;
//Act
var response = await HttpClient.PatchAsync($"/api/posts/{postId}", null);
//Assert
Assert.Multiple(() =>
{
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
Assert.That(SmallSoftwareDbContext.GetPostFromDatabaseByPostId(postId), Is.Not.Null);
});
}
[Test]
public async Task Patch_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PatchAsync($"/api/posts/id", null);
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
private static void AssertElement(PostViewModel? actual, Post expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.PostId));
Assert.That(actual.PostName, Is.EqualTo(expected.PostName));
Assert.That(actual.PostType, Is.EqualTo(expected.PostType.ToString()));
Assert.That(actual.Salary, Is.EqualTo(expected.Salary));
});
}
private static PostBindingModel CreateModel(string? postId = null, string postName = "name", PostType postType = PostType.Supervisor, double salary = 10)
=> new()
{
Id = postId ?? Guid.NewGuid().ToString(),
PostName = postName,
PostType = postType.ToString(),
Salary = salary
};
private static void AssertElement(Post? actual, PostBindingModel expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.PostId, Is.EqualTo(expected.Id));
Assert.That(actual.PostName, Is.EqualTo(expected.PostName));
Assert.That(actual.PostType.ToString(), Is.EqualTo(expected.PostType));
Assert.That(actual.Salary, Is.EqualTo(expected.Salary));
});
}
}

View File

@@ -0,0 +1,18 @@
{
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information"
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "../logs/smallsoftware-.log",
"rollingInterval": "Day",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} { CorrelationId } { Level:u3} { Username } { Message: lj} { Exception } { NewLine }"
}
}
]
}
}

View File

@@ -0,0 +1,195 @@
using AutoMapper;
using SmallSoftwareContracts.AdapterContracts;
using SmallSoftwareContracts.AdapterContracts.OperationResponses;
using SmallSoftwareContracts.BindingModels;
using SmallSoftwareContracts.BusinessLogicsContracts;
using SmallSoftwareContracts.DataModels;
using SmallSoftwareContracts.Exceptions;
using SmallSoftwareContracts.ViewModels;
namespace SmallSoftwareWebApi.Adapters;
public class ManufacturerAdapter : IManufacturerAdapter
{
private readonly IManufacturerBusinessLogicContract _manufacturerBusinessLogicContract;
private readonly ILogger _logger;
private readonly Mapper _mapper;
public ManufacturerAdapter(IManufacturerBusinessLogicContract manufacturerBusinessLogicContract, ILogger<ManufacturerAdapter> logger)
{
_manufacturerBusinessLogicContract = manufacturerBusinessLogicContract;
_logger = logger;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<ManufacturerBindingModel, ManufacturerDataModel>();
cfg.CreateMap<ManufacturerDataModel, ManufacturerViewModel>();
});
_mapper = new Mapper(config);
}
public ManufacturerOperationResponse GetList()
{
try
{
return ManufacturerOperationResponse.OK([..
_manufacturerBusinessLogicContract.GetAllManufacturers().Select(x =>
_mapper.Map<ManufacturerViewModel>(x))]);
}
catch (NullListException)
{
_logger.LogError("NullListException");
return ManufacturerOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return
ManufacturerOperationResponse.InternalServerError($"Error while working with data storage: { ex.InnerException!.Message} ");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
ManufacturerOperationResponse.InternalServerError(ex.Message);
}
}
public ManufacturerOperationResponse GetElement(string data)
{
try
{
return
ManufacturerOperationResponse.OK(_mapper.Map<ManufacturerViewModel>(_manufacturerBusinessLogicContract.GetManufacturerByData(data)));
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return ManufacturerOperationResponse.BadRequest("Data is empty");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return ManufacturerOperationResponse.NotFound($"Not found element by data { data} ");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return
ManufacturerOperationResponse.InternalServerError($"Error while working with data storage: { ex.InnerException!.Message} ");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
ManufacturerOperationResponse.InternalServerError(ex.Message);
}
}
public ManufacturerOperationResponse
RegisterManufacturer(ManufacturerBindingModel manufacturerModel)
{
try
{
_manufacturerBusinessLogicContract.InsertManufacturer(_mapper.Map < ManufacturerDataModel > (manufacturerModel));
return ManufacturerOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return ManufacturerOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return ManufacturerOperationResponse.BadRequest($"Incorrect data transmitted: { ex.Message} ");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return ManufacturerOperationResponse.BadRequest(ex.Message);
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return ManufacturerOperationResponse.BadRequest($"Error while working with data storage: { ex.InnerException!.Message} ");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
ManufacturerOperationResponse.InternalServerError(ex.Message);
}
}
public ManufacturerOperationResponse
ChangeManufacturerInfo(ManufacturerBindingModel manufacturerModel)
{
try
{
_manufacturerBusinessLogicContract.UpdateManufacturer(_mapper.Map < ManufacturerDataModel > (manufacturerModel));
return ManufacturerOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return ManufacturerOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return ManufacturerOperationResponse.BadRequest($"Incorrect data transmitted: { ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return ManufacturerOperationResponse.BadRequest($"Not found element by Id { manufacturerModel.Id} ");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return ManufacturerOperationResponse.BadRequest(ex.Message);
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return ManufacturerOperationResponse
.BadRequest($"Error while working with data storage: { ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
ManufacturerOperationResponse.InternalServerError(ex.Message);
}
}
public ManufacturerOperationResponse RemoveManufacturer(string id)
{
try
{
_manufacturerBusinessLogicContract.DeleteManufacturer(id);
return ManufacturerOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return ManufacturerOperationResponse.BadRequest("Id is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return ManufacturerOperationResponse.BadRequest($"Incorrect data transmitted: { ex.Message} ");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return ManufacturerOperationResponse.BadRequest($"Not found element by id: { id} ");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return ManufacturerOperationResponse
.BadRequest($"Error while working with data storage: { ex.InnerException!.Message} ");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
ManufacturerOperationResponse.InternalServerError(ex.Message);
}
}
}

View File

@@ -0,0 +1,269 @@
using AutoMapper;
using SmallSoftwareContracts.AdapterContracts;
using SmallSoftwareContracts.AdapterContracts.OperationResponses;
using SmallSoftwareContracts.BindingModels;
using SmallSoftwareContracts.BusinessLogicsContracts;
using SmallSoftwareContracts.DataModels;
using SmallSoftwareContracts.Exceptions;
using SmallSoftwareContracts.ViewModels;
namespace SmallSoftwareWebApi.Adapters;
public class PostAdapter : IPostAdapter
{
private readonly IPostBusinessLogicContract _postBusinessLogicContract;
private readonly ILogger _logger;
private readonly Mapper _mapper;
public PostAdapter(IPostBusinessLogicContract postBusinessLogicContract, ILogger<PostAdapter> logger)
{
_postBusinessLogicContract = postBusinessLogicContract;
_logger = logger;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<PostBindingModel, PostDataModel>();
cfg.CreateMap<PostDataModel, PostViewModel>();
});
_mapper = new Mapper(config);
}
public PostOperationResponse GetList()
{
try
{
return PostOperationResponse
.OK([.. _postBusinessLogicContract.GetAllPosts().Select(x => _mapper.Map<PostViewModel>(x))]);
}
catch (NullListException)
{
_logger.LogError("NullListException");
return PostOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.InternalServerError($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse GetHistory(string id)
{
try
{
return PostOperationResponse.OK([.. _postBusinessLogicContract.GetAllDataOfPost(id).Select(x => _mapper.Map<PostViewModel>(x))]);
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return PostOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.InternalServerError($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse GetElement(string data)
{
try
{
return PostOperationResponse.OK(_mapper.Map<PostViewModel>(_postBusinessLogicContract.GetPostByData(data)));
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Data is empty");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return PostOperationResponse.NotFound($"Not found element by data {data}");
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return PostOperationResponse.BadRequest($"Element by data: {data} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.InternalServerError($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse RegisterPost(PostBindingModel postModel)
{
try
{
_postBusinessLogicContract.InsertPost(_mapper.Map<PostDataModel>(postModel));
return PostOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return PostOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return PostOperationResponse.BadRequest(ex.Message);
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.BadRequest($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse ChangePostInfo(PostBindingModel postModel)
{
try
{
_postBusinessLogicContract.UpdatePost(_mapper.Map<PostDataModel>(postModel));
return PostOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return PostOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return PostOperationResponse.BadRequest($"Not found element by Id {postModel.Id}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return PostOperationResponse.BadRequest(ex.Message);
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return PostOperationResponse.BadRequest($"Element by id: {postModel.Id} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.BadRequest($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse RemovePost(string id)
{
try
{
_postBusinessLogicContract.DeletePost(id);
return PostOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Id is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return PostOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return PostOperationResponse.BadRequest($"Not found element by id: {id}");
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return PostOperationResponse.BadRequest($"Element by id: {id} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.BadRequest($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse RestorePost(string id)
{
try
{
_postBusinessLogicContract.RestorePost(id);
return PostOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Id is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return PostOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return PostOperationResponse.BadRequest($"Not found element by id: {id}");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.BadRequest($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
}

View File

@@ -0,0 +1,13 @@
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace SmallSoftwareWebApi;
public class AuthOptions
{
public const string ISSUER = "CatHasPaws_AuthServer"; // издатель токена
public const string AUDIENCE = "CatHasPaws_AuthClient"; // потребитель токена
const string KEY = "catsecret_secretsecretsecretkey!123"; // ключ для шифрации
public static SymmetricSecurityKey GetSymmetricSecurityKey() => new(Encoding.UTF8.GetBytes(KEY));
}

View File

@@ -0,0 +1,44 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SmallSoftwareContracts.AdapterContracts;
using SmallSoftwareContracts.BindingModels;
namespace SmallSoftwareWebApi.Controllers;
[Authorize]
[Route("api/[controller]")]
[ApiController]
[Produces("application/json")]
public class ManufacturersController(IManufacturerAdapter adapter) :
ControllerBase
{
private readonly IManufacturerAdapter _adapter = adapter;
[HttpGet]
public IActionResult GetAllRecords()
{
return _adapter.GetList().GetResponse(Request, Response);
}
[HttpGet("{data}")]
public IActionResult GetRecord(string data)
{
return _adapter.GetElement(data).GetResponse(Request, Response);
}
[HttpPost]
public IActionResult Register([FromBody] ManufacturerBindingModel model)
{
return _adapter.RegisterManufacturer(model).GetResponse(Request,
Response);
}
[HttpPut]
public IActionResult ChangeInfo([FromBody] ManufacturerBindingModel model)
{
return _adapter.ChangeManufacturerInfo(model).GetResponse(Request,
Response);
}
[HttpDelete("{id}")]
public IActionResult Delete(string id)
{
return _adapter.RemoveManufacturer(id).GetResponse(Request,
Response);
}
}

View File

@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SmallSoftwareContracts.AdapterContracts;
namespace SmallSoftwareWebApi.Controllers;
[Authorize]
[Route("api/[controller]")]
[ApiController]
[Produces("application/json")]
public class PostHistoryController(IPostAdapter adapter) : ControllerBase
{
private readonly IPostAdapter _adapter = adapter;
[HttpGet("{id}")]
public IActionResult GetHistory(string id)
{
return _adapter.GetHistory(id).GetResponse(Request, Response);
}
}

View File

@@ -0,0 +1,46 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SmallSoftwareContracts.AdapterContracts;
using SmallSoftwareContracts.BindingModels;
namespace SmallSoftwareWebApi.Controllers;
[Authorize]
[Route("api/[controller]")]
[ApiController]
[Produces("application/json")]
public class PostsController(IPostAdapter adapter) : ControllerBase
{
private readonly IPostAdapter _adapter = adapter;
[HttpGet]
public IActionResult GetRecords()
{
return _adapter.GetList().GetResponse(Request, Response);
}
[HttpGet("{data}")]
public IActionResult GetRecord(string data)
{
return _adapter.GetElement(data).GetResponse(Request, Response);
}
[HttpPost]
public IActionResult Register([FromBody] PostBindingModel model)
{
return _adapter.RegisterPost(model).GetResponse(Request, Response);
}
[HttpPut]
public IActionResult ChangeInfo([FromBody] PostBindingModel model)
{
return _adapter.ChangePostInfo(model).GetResponse(Request, Response);
}
[HttpDelete("{id}")]
public IActionResult Delete(string id)
{
return _adapter.RemovePost(id).GetResponse(Request, Response);
}
[HttpPatch("{id}")]
public IActionResult Restore(string id)
{
return _adapter.RestorePost(id).GetResponse(Request, Response);
}
}

View File

@@ -0,0 +1,35 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace SmallSoftwareWebApi.Controllers
{
[ApiController]
[Authorize]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}

View File

@@ -0,0 +1,16 @@
using Microsoft.Extensions.Configuration;
using SmallSoftwareContracts.Infrastructure;
namespace SmallSoftwareWebApi.Infrastructure;
public class ConfigurationDatabase(IConfiguration configuration) : IConfigurationDatabase
{
private readonly Lazy<DataBaseSettings> _dataBaseSettings = new(() =>
{
return configuration.GetValue<DataBaseSettings>("DataBaseSettings")
?? throw new InvalidDataException(nameof(DataBaseSettings));
});
public string ConnectionString => _dataBaseSettings.Value.ConnectionString;
}

View File

@@ -0,0 +1,6 @@
namespace SmallSoftwareWebApi.Infrastructure;
public class DataBaseSettings
{
public required string ConnectionString { get; set; }
}

View File

@@ -0,0 +1,109 @@
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Serilog;
using SmallSoftwareBusinessLogic.Implementations;
using SmallSoftwareContracts.AdapterContracts;
using SmallSoftwareContracts.BusinessLogicsContracts;
using SmallSoftwareContracts.Infrastructure;
using SmallSoftwareContracts.StoragesContracts;
using SmallSoftwareDatabase;
using SmallSoftwareDatabase.Implementations;
using SmallSoftwareWebApi;
using SmallSoftwareWebApi.Adapters;
using SmallSoftwareWebApi.Infrastructure;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
using var loggerFactory = new LoggerFactory();
loggerFactory.AddSerilog(new LoggerConfiguration().ReadFrom.Configuration(builder.Configuration).CreateLogger());
builder.Services.AddSingleton(loggerFactory.CreateLogger("Any"));
builder.Services.AddAuthorization();
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ValidateIssuer = true,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ValidIssuer = AuthOptions.ISSUER,
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ValidateAudience = true,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ValidAudience = AuthOptions.AUDIENCE,
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ValidateLifetime = true,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey(),
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ValidateIssuerSigningKey = true,
};
});
builder.Services.AddSingleton<IConfigurationDatabase, ConfigurationDatabase>();
builder.Services.AddTransient<IManufacturerBusinessLogicContract, ManufacturerBusinessLogicContract>();
builder.Services.AddTransient<IPostBusinessLogicContract, PostBusinessLogicContract>();
builder.Services.AddTransient<ISoftwareBusinessLogicContract, SoftwareBusinessLogicContract>();
builder.Services.AddTransient<ISalaryBusinessLogicContract, SalaryBusinessLogicContract>();
builder.Services.AddTransient<IRequestBusinessLogicContract, RequestBusinessLogicContract>();
builder.Services.AddTransient<IWorkerBusinessLogicContract, WorkerBusinessLogicContract>();
builder.Services.AddTransient<SmallSoftwareDbContext>();
builder.Services.AddTransient<IManufacturerStorageContract, ManufacturerStorageContract>();
builder.Services.AddTransient<IPostStorageContract, PostStorageContract>();
builder.Services.AddTransient<ISoftwareStorageContract, SoftwareStorageContract>();
builder.Services.AddTransient<ISalaryStorageContract, SalaryStorageContract>();
builder.Services.AddTransient<IRequestStorageContract, RequestStorageContract>();
builder.Services.AddTransient<IWorkerStorageContract, WorkerStorageContract>();
builder.Services.AddTransient<IManufacturerAdapter, ManufacturerAdapter>();
builder.Services.AddTransient<IPostAdapter, PostAdapter>();
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
}
if (app.Environment.IsProduction())
{
var dbContext = app.Services.GetRequiredService<SmallSoftwareDbContext>();
if (dbContext.Database.CanConnect())
{
dbContext.Database.EnsureCreated();
dbContext.Database.Migrate();
}
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.Map("/login/{username}", (string username) =>
{
return new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken(
issuer: AuthOptions.ISSUER,
audience: AuthOptions.AUDIENCE,
claims: [new(ClaimTypes.Name, username)],
expires: DateTime.UtcNow.Add(TimeSpan.FromMinutes(2)),
signingCredentials: new SigningCredentials(AuthOptions.GetSymmetricSecurityKey(),
SecurityAlgorithms.HmacSha256)));
});
app.MapControllers();
app.Run();

View File

@@ -0,0 +1,23 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "http://localhost:5273",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "https://localhost:7214;http://localhost:5273",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.3" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.2" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SmallSoftwareBusinessLogic\SmallSoftwareBusinessLogic.csproj" />
<ProjectReference Include="..\SmallSoftwareContracts\SmallSoftwareContracts.csproj" />
<ProjectReference Include="..\SmallSoftwareDatabase\SmallSoftwareDatabase.csproj" />
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="SmallSoftwareTests" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,6 @@
@SmallSoftwareWebApi_HostAddress = http://localhost:5273
GET {{SmallSoftwareWebApi_HostAddress}}/weatherforecast/
Accept: application/json
###

View File

@@ -0,0 +1,13 @@
namespace SmallSoftwareWebApi
{
public class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
}
}

View File

@@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@@ -0,0 +1,28 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information"
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "../logs/smallsoftware-.log",
"rollingInterval": "Day",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} { CorrelationId } { Level:u3} { Username } { Message: lj} { Exception } { NewLine }"
}
}
]
},
"AllowedHosts": "*",
"DataBaseSettings": {
"ConnectionString": ""
}
}