using System.Text; using ApplicationLayer.Services.Applicants.Models; using ApplicationLayer.Services.Applicants.Models.Validation; using Domains; using FluentAssertions; using FluentValidation; using VisaApi.Fakers.Applicants.Requests; using Xunit; namespace VisaApi.Tests.Application.Validation.Applicants; public class NameModelValidatorTests { private readonly static IValidator validator = new NameModelValidator(); private readonly static NameModelFaker faker = new(); /// /// Test for validator that should throw for empty first name /// [Fact] private async Task ValidateForEmptyFirstNameShouldThrow() { var name = faker.Generate(); name.FirstName = null!; var result = await validator.ValidateAsync(name); result.Errors.Where(error => error.PropertyName == nameof(name.FirstName)) .Should().HaveCount(1); } /// /// Test for validator that should throw for empty surname /// [Fact] private async Task ValidateForEmptySurnameShouldThrow() { var name = faker.Generate(); name.Surname = null!; var result = await validator.ValidateAsync(name); result.Errors.Where(error => error.PropertyName == nameof(name.Surname)) .Should().HaveCount(1); } /// /// Test for validator that should return no errors for empty patronymic /// [Fact] private async Task ValidateForEmptyPatronymicShouldReturnNoErrors() { var name = faker.Generate(); name.Patronymic = null; var result = await validator.ValidateAsync(name); result.Errors.Where(error => error.PropertyName == nameof(name.Patronymic)) .Should().BeEmpty(); } /// /// Test for validator that should return error for too long first name /// [Fact] private async Task ValidateForLongFirstNameShouldReturnError() { var name = faker.Generate(); var stringBuilder = new StringBuilder(); stringBuilder.Append('h', ConfigurationConstraints.NameLength + 1); name.FirstName = stringBuilder.ToString(); var result = await validator.ValidateAsync(name); result.Errors.Where(error => error.PropertyName == nameof(name.FirstName)) .Should().HaveCount(1); } /// /// Test for validator that should return error for too long surname /// [Fact] private async Task ValidateForLongSurnameShouldReturnError() { var name = faker.Generate(); var stringBuilder = new StringBuilder(); stringBuilder.Append('h', ConfigurationConstraints.NameLength + 1); name.Surname = stringBuilder.ToString(); var result = await validator.ValidateAsync(name); result.Errors.Where(error => error.PropertyName == nameof(name.Surname)) .Should().HaveCount(1); } /// /// Test for validator that should return error for too long patronymic /// [Fact] private async Task ValidateForLongPatronymicShouldReturnError() { var name = faker.Generate(); var stringBuilder = new StringBuilder(); stringBuilder.Append('h', ConfigurationConstraints.NameLength + 1); name.Patronymic = stringBuilder.ToString(); var result = await validator.ValidateAsync(name); result.Errors.Where(error => error.PropertyName == nameof(name.Patronymic)) .Should().HaveCount(1); } /// /// Test for validator that should return error for not valid firstname /// [Fact] private async Task ValidateForNotValidFirstNameShouldReturnError() { var name = faker.Generate(); name.FirstName = "&&7!**|"; var result = await validator.ValidateAsync(name); result.Errors.Where(error => error.PropertyName == nameof(name.FirstName)) .Should().HaveCount(1); } /// /// Test for validator that should return error for not valid surname /// [Fact] private async Task ValidateForNotValidSurnameShouldReturnError() { var name = faker.Generate(); name.Surname = "&&7!**|"; var result = await validator.ValidateAsync(name); result.Errors.Where(error => error.PropertyName == nameof(name.Surname)) .Should().HaveCount(1); } /// /// Test for validator that should return error for not valid patronymic /// [Fact] private async Task ValidateForNotValidPatronymicShouldReturnError() { var name = faker.Generate(); name.Patronymic = "&&7!**|"; var result = await validator.ValidateAsync(name); result.Errors.Where(error => error.PropertyName == nameof(name.Patronymic)) .Should().HaveCount(1); } /// /// Test for validator that should return no errors for valid name /// [Fact] private async Task ValidateForValidNameShouldReturnNoErrors() { var name = faker.Generate(); var result = await validator.ValidateAsync(name); result.Errors.Should().BeEmpty(); } }