From 078e20d80e25348ba064a8259c75b9ca218fedc2 Mon Sep 17 00:00:00 2001 From: prtsie Date: Sun, 22 Sep 2024 19:54:03 +0300 Subject: [PATCH] tests --- .../Requests/PlaceOfWorkModelFaker.cs | 1 - .../Fakers/VisaApplications/PastVisaFaker.cs | 4 +- .../Fakers/VisaApplications/PastVisitFaker.cs | 4 +- .../PermissionToDestCountryFaker.cs | 10 +- .../Requests/PastVisaModelFaker.cs | 28 ++++ .../Requests/PastVisitModelFaker.cs | 28 ++++ .../PermissionToDestCountryModelFaker.cs | 17 +++ .../Requests/ReentryPermitModelFaker.cs | 21 +++ .../Auth/RegisterRequestValidatorTests.cs | 1 - .../PastVisaModelValidatorTests.cs | 140 +++++++++++++++++ .../PastVisitModelValidatorTests.cs | 142 ++++++++++++++++++ ...missionToDestCountryModelValidatorTests.cs | 110 ++++++++++++++ .../ReentryPermitModelValidatorTests.cs | 110 ++++++++++++++ 13 files changed, 605 insertions(+), 11 deletions(-) create mode 100644 SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PastVisaModelFaker.cs create mode 100644 SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PastVisitModelFaker.cs create mode 100644 SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PermissionToDestCountryModelFaker.cs create mode 100644 SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/ReentryPermitModelFaker.cs create mode 100644 SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PastVisaModelValidatorTests.cs create mode 100644 SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PastVisitModelValidatorTests.cs create mode 100644 SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PermissionToDestCountryModelValidatorTests.cs create mode 100644 SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/ReentryPermitModelValidatorTests.cs diff --git a/SchengenVisaApi/VisaApiTests/Fakers/Applicants/Requests/PlaceOfWorkModelFaker.cs b/SchengenVisaApi/VisaApiTests/Fakers/Applicants/Requests/PlaceOfWorkModelFaker.cs index eab2af5..1b42aab 100644 --- a/SchengenVisaApi/VisaApiTests/Fakers/Applicants/Requests/PlaceOfWorkModelFaker.cs +++ b/SchengenVisaApi/VisaApiTests/Fakers/Applicants/Requests/PlaceOfWorkModelFaker.cs @@ -1,6 +1,5 @@ using ApplicationLayer.Services.Applicants.Models; using Bogus; -using Domains.ApplicantDomain; namespace VisaApi.Fakers.Applicants.Requests; diff --git a/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PastVisaFaker.cs b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PastVisaFaker.cs index f853eb3..1ac6c60 100644 --- a/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PastVisaFaker.cs +++ b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PastVisaFaker.cs @@ -21,8 +21,8 @@ public sealed class PastVisaFaker : Faker public PastVisa GenerateValid() { var result = Generate(); - result.IssueDate = dateTimeProvider.Now().AddDays(Random.Shared.Next(11, 900)); + result.IssueDate = dateTimeProvider.Now().AddDays(-Random.Shared.Next(11, 900)); result.ExpirationDate = result.IssueDate.AddDays(Random.Shared.Next(1, 11)); return result; } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PastVisitFaker.cs b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PastVisitFaker.cs index 183f1ba..96183c2 100644 --- a/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PastVisitFaker.cs +++ b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PastVisitFaker.cs @@ -21,8 +21,8 @@ public sealed class PastVisitFaker : Faker public PastVisit GenerateValid() { var result = Generate(); - result.StartDate = dateTimeProvider.Now().AddDays(Random.Shared.Next(11, 900)); + result.StartDate = dateTimeProvider.Now().AddDays(-Random.Shared.Next(11, 900)); result.EndDate = result.StartDate.AddDays(Random.Shared.Next(1, 11)); return result; } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PermissionToDestCountryFaker.cs b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PermissionToDestCountryFaker.cs index 73bb3f6..8ca6846 100644 --- a/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PermissionToDestCountryFaker.cs +++ b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/PermissionToDestCountryFaker.cs @@ -11,9 +11,9 @@ public sealed class PermissionToDestCountryFaker : Faker p.Issuer, f => f.Company.CompanyName()); + RuleFor(p => p.Issuer, f => f.Company.CompanyName()); - RuleFor(p => p.ExpirationDate, - f => f.Date.Future(4, dateTimeProvider.Now())); - } -} \ No newline at end of file + RuleFor(p => p.ExpirationDate, + f => f.Date.Future(4, dateTimeProvider.Now())); + } +} diff --git a/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PastVisaModelFaker.cs b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PastVisaModelFaker.cs new file mode 100644 index 0000000..1b9ff0d --- /dev/null +++ b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PastVisaModelFaker.cs @@ -0,0 +1,28 @@ +using ApplicationLayer.InfrastructureServicesInterfaces; +using ApplicationLayer.Services.VisaApplications.Models; +using Bogus; + +namespace VisaApi.Fakers.VisaApplications.Requests; + +/// +/// Generates past visas +/// +public sealed class PastVisaModelFaker : Faker +{ + private IDateTimeProvider dateTimeProvider; + + public PastVisaModelFaker(IDateTimeProvider dateTimeProvider) + { + this.dateTimeProvider = dateTimeProvider; + + RuleFor(pv => pv.Name, f => f.Random.Words()); + } + + public PastVisaModel GenerateValid() + { + var result = Generate(); + result.IssueDate = dateTimeProvider.Now().AddDays(-Random.Shared.Next(11, 900)); + result.ExpirationDate = result.IssueDate.AddDays(Random.Shared.Next(1, 11)); + return result; + } +} diff --git a/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PastVisitModelFaker.cs b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PastVisitModelFaker.cs new file mode 100644 index 0000000..e975d08 --- /dev/null +++ b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PastVisitModelFaker.cs @@ -0,0 +1,28 @@ +using ApplicationLayer.InfrastructureServicesInterfaces; +using ApplicationLayer.Services.VisaApplications.Models; +using Bogus; + +namespace VisaApi.Fakers.VisaApplications.Requests; + +/// +/// Generates past visas +/// +public sealed class PastVisitModelFaker : Faker +{ + private IDateTimeProvider dateTimeProvider; + + public PastVisitModelFaker(IDateTimeProvider dateTimeProvider) + { + this.dateTimeProvider = dateTimeProvider; + + RuleFor(pv => pv.DestinationCountry, f => f.Address.Country()); + } + + public PastVisitModel GenerateValid() + { + var result = Generate(); + result.StartDate = dateTimeProvider.Now().AddDays(-Random.Shared.Next(11, 900)); + result.EndDate = result.StartDate.AddDays(Random.Shared.Next(1, 11)); + return result; + } +} diff --git a/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PermissionToDestCountryModelFaker.cs b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PermissionToDestCountryModelFaker.cs new file mode 100644 index 0000000..719bb49 --- /dev/null +++ b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/PermissionToDestCountryModelFaker.cs @@ -0,0 +1,17 @@ +using ApplicationLayer.InfrastructureServicesInterfaces; +using ApplicationLayer.Services.VisaApplications.Models; +using Bogus; + +namespace VisaApi.Fakers.VisaApplications.Requests +{ + public sealed class PermissionToDestCountryModelFaker : Faker + { + public PermissionToDestCountryModelFaker(IDateTimeProvider dateTimeProvider) + { + RuleFor(p => p.Issuer, f => f.Company.CompanyName()); + + RuleFor(p => p.ExpirationDate, + f => f.Date.Future(4, dateTimeProvider.Now())); + } + } +} diff --git a/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/ReentryPermitModelFaker.cs b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/ReentryPermitModelFaker.cs new file mode 100644 index 0000000..4efcd47 --- /dev/null +++ b/SchengenVisaApi/VisaApiTests/Fakers/VisaApplications/Requests/ReentryPermitModelFaker.cs @@ -0,0 +1,21 @@ +using ApplicationLayer.InfrastructureServicesInterfaces; +using ApplicationLayer.Services.VisaApplications.Models; +using Bogus; +using Domains; + +namespace VisaApi.Fakers.VisaApplications.Requests; + +/// +/// Generates re-entry permissions +/// +public sealed class ReentryPermitModelFaker : Faker +{ + public ReentryPermitModelFaker(IDateTimeProvider dateTimeProvider) + { + RuleFor(p => p.Number, + f => f.Random.String(ConfigurationConstraints.ReentryPermitNumberLength, 'a', 'z')); + + RuleFor(p => p.ExpirationDate, + f => f.Date.Future(4, dateTimeProvider.Now())); + } +} diff --git a/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/Auth/RegisterRequestValidatorTests.cs b/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/Auth/RegisterRequestValidatorTests.cs index 74eb02f..5165e3c 100644 --- a/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/Auth/RegisterRequestValidatorTests.cs +++ b/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/Auth/RegisterRequestValidatorTests.cs @@ -1,4 +1,3 @@ -using ApplicationLayer.InfrastructureServicesInterfaces; using ApplicationLayer.Services.AuthServices.Common; using ApplicationLayer.Services.AuthServices.Requests; using ApplicationLayer.Services.AuthServices.Requests.Validation; diff --git a/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PastVisaModelValidatorTests.cs b/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PastVisaModelValidatorTests.cs new file mode 100644 index 0000000..a40a3f2 --- /dev/null +++ b/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PastVisaModelValidatorTests.cs @@ -0,0 +1,140 @@ +using System.Text; +using ApplicationLayer.InfrastructureServicesInterfaces; +using ApplicationLayer.Services.VisaApplications.Models; +using ApplicationLayer.Services.VisaApplications.Models.Validation; +using Domains; +using FluentAssertions; +using FluentValidation; +using VisaApi.Fakers.VisaApplications.Requests; +using VisaApi.Services; +using Xunit; + +namespace VisaApi.Tests.Application.Validation.VisaApplications +{ + public class PastVisaModelValidatorTests + { + private readonly static IDateTimeProvider dateTimeProvider = new TestDateTimeProvider(); + private readonly static IValidator validator = new PastVisaModelValidator(dateTimeProvider); + private readonly static PastVisaModelFaker faker = new(dateTimeProvider); + + /// + /// Test for validator that should return error for empty expiration date + /// + [Fact] + private async Task ValidateForEmptyExpirationDateShouldReturnError() + { + var model = faker.GenerateValid(); + model.ExpirationDate = new(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.ExpirationDate)) + .Should().HaveCount(2); //expected error + error because of expiration date less than issue date + } + + /// + /// Test for validator that should return error for expiration date less than issue date + /// + [Fact] + private async Task ValidateForExpirationDateLessThanIssueDateShouldReturnError() + { + var model = faker.GenerateValid(); + model.ExpirationDate = model.IssueDate.AddDays(-4); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.ExpirationDate)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for empty issue date + /// + [Fact] + private async Task ValidateForEmptyIssueDateShouldReturnError() + { + var model = faker.GenerateValid(); + model.IssueDate = new(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.IssueDate)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for issue date greater than current date + /// + [Fact] + private async Task ValidateForIssueDateGreaterThanCurrentDateShouldReturnError() + { + var model = faker.GenerateValid(); + model.IssueDate = dateTimeProvider.Now().AddDays(4); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.IssueDate)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for empty name + /// + [Fact] + private async Task ValidateForEmptyNameShouldReturnError() + { + var model = faker.GenerateValid(); + model.Name = string.Empty; + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.Name)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for too long name + /// + [Fact] + private async Task ValidateForTooLongNameShouldReturnError() + { + var model = faker.GenerateValid(); + var stringBuilder = new StringBuilder(); + stringBuilder.Append('d', ConfigurationConstraints.VisaNameLength + 1); + model.Name = stringBuilder.ToString(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.Name)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for not valid name + /// + [Fact] + private async Task ValidateForNotValidNameShouldReturnError() + { + var model = faker.GenerateValid(); + model.Name = "|}{%^&"; + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.Name)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return no errors for valid model + /// + [Fact] + private async Task ValidateForValidShouldReturnNoErrors() + { + var model = faker.GenerateValid(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Should().BeEmpty(); + } + } +} diff --git a/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PastVisitModelValidatorTests.cs b/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PastVisitModelValidatorTests.cs new file mode 100644 index 0000000..d04cbf1 --- /dev/null +++ b/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PastVisitModelValidatorTests.cs @@ -0,0 +1,142 @@ +using System.Text; +using ApplicationLayer.InfrastructureServicesInterfaces; +using ApplicationLayer.Services.VisaApplications.Models; +using ApplicationLayer.Services.VisaApplications.Models.Validation; +using Domains; +using FluentAssertions; +using FluentValidation; +using VisaApi.Fakers.VisaApplications.Requests; +using VisaApi.Services; +using Xunit; + +namespace VisaApi.Tests.Application.Validation.VisaApplications +{ + public class PastVisitModelValidatorTests + { + private readonly static IDateTimeProvider dateTimeProvider = new TestDateTimeProvider(); + private readonly static IValidator validator = new PastVisitModelValidator(dateTimeProvider); + private readonly static PastVisitModelFaker faker = new(dateTimeProvider); + + /// + /// Test for validator that should return error for empty start date + /// + [Fact] + private async Task ValidateForEmptyStartDateShouldReturnError() + { + var model = faker.GenerateValid(); + model.StartDate = new(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.StartDate)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for start date greater than end date + /// + [Fact] + private async Task ValidateForStartDateGreaterThanEndDateShouldReturnError() + { + var model = faker.GenerateValid(); + model.EndDate = dateTimeProvider.Now().AddDays(-10); + model.StartDate = model.EndDate.AddDays(4); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.StartDate)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for empty end date + /// + [Fact] + private async Task ValidateForEmptyEndDateShouldReturnError() + { + var model = faker.GenerateValid(); + model.EndDate = new(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.EndDate)) + .Should().HaveCount(1); //expected error + error because of end date less than start date + } + + /// + /// Test for validator that should return error for start date greater than current date + /// + [Fact] + private async Task ValidateForStartDateGreaterThanCurrentDateShouldReturnError() + { + var model = faker.GenerateValid(); + model.StartDate = dateTimeProvider.Now().AddDays(4); + model.EndDate = model.StartDate.AddDays(4); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.StartDate)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for empty destination Country + /// + [Fact] + private async Task ValidateForEmptyDestinationCountryShouldReturnError() + { + var model = faker.GenerateValid(); + model.DestinationCountry = string.Empty; + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.DestinationCountry)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for too long destination Country + /// + [Fact] + private async Task ValidateForTooLongDestinationCountryShouldReturnError() + { + var model = faker.GenerateValid(); + var stringBuilder = new StringBuilder(); + stringBuilder.Append('d', ConfigurationConstraints.CountryNameLength + 1); + model.DestinationCountry = stringBuilder.ToString(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.DestinationCountry)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for not valid destination Country + /// + [Fact] + private async Task ValidateForNotValidDestinationCountryShouldReturnError() + { + var model = faker.GenerateValid(); + model.DestinationCountry = "|}{%^&"; + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.DestinationCountry)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return no errors for valid model + /// + [Fact] + private async Task ValidateForValidShouldReturnNoErrors() + { + var model = faker.GenerateValid(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Should().BeEmpty(); + } + } +} diff --git a/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PermissionToDestCountryModelValidatorTests.cs b/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PermissionToDestCountryModelValidatorTests.cs new file mode 100644 index 0000000..37a55a2 --- /dev/null +++ b/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/PermissionToDestCountryModelValidatorTests.cs @@ -0,0 +1,110 @@ +using System.Text; +using ApplicationLayer.InfrastructureServicesInterfaces; +using ApplicationLayer.Services.VisaApplications.Models; +using ApplicationLayer.Services.VisaApplications.Models.Validation; +using Domains; +using FluentAssertions; +using FluentValidation; +using VisaApi.Fakers.VisaApplications.Requests; +using VisaApi.Services; +using Xunit; + +namespace VisaApi.Tests.Application.Validation.VisaApplications +{ + public class PermissionToDestCountryModelValidatorTests + { + private readonly static IDateTimeProvider dateTimeProvider = new TestDateTimeProvider(); + private readonly static IValidator validator = new PermissionToDestCountryModelValidator(dateTimeProvider); + private readonly static PermissionToDestCountryModelFaker faker = new(dateTimeProvider); + + /// + /// Test for validator that should return error for empty expiration date + /// + [Fact] + private async Task ValidateForEmptyExpirationDateShouldReturnError() + { + var model = faker.Generate(); + model.ExpirationDate = new(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.ExpirationDate)) + .Should().HaveCount(2); //expected error + error because of expired + } + + /// + /// Test for validator that should return error for expiration date less than current date + /// + [Fact] + private async Task ValidateForExpirationDateLessThanCurrentDateShouldReturnError() + { + var model = faker.Generate(); + model.ExpirationDate = dateTimeProvider.Now().AddDays(-1); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.ExpirationDate)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for empty issuer + /// + [Fact] + private async Task ValidateForEmptyIssuerShouldReturnError() + { + var model = faker.Generate(); + model.Issuer = string.Empty; + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.Issuer)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for not valid issuer + /// + [Fact] + private async Task ValidateForNotValidIssuerShouldReturnError() + { + var model = faker.Generate(); + model.Issuer = "}{)(*&*^%#!#!:"; + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.Issuer)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for too long issuer + /// + [Fact] + private async Task ValidateForTooLongIssuerShouldReturnError() + { + var model = faker.Generate(); + var stringBuilder = new StringBuilder(); + stringBuilder.Append('g', ConfigurationConstraints.IssuerNameLength + 1); + model.Issuer = stringBuilder.ToString(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.Issuer)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return no errors for valid model + /// + [Fact] + private async Task ValidateForValidShouldReturnNoErrors() + { + var model = faker.Generate(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Should().BeEmpty(); + } + } +} diff --git a/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/ReentryPermitModelValidatorTests.cs b/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/ReentryPermitModelValidatorTests.cs new file mode 100644 index 0000000..b4613cb --- /dev/null +++ b/SchengenVisaApi/VisaApiTests/Tests/Application/Validation/VisaApplications/ReentryPermitModelValidatorTests.cs @@ -0,0 +1,110 @@ +using System.Text; +using ApplicationLayer.InfrastructureServicesInterfaces; +using ApplicationLayer.Services.VisaApplications.Models; +using ApplicationLayer.Services.VisaApplications.Models.Validation; +using Domains; +using FluentAssertions; +using FluentValidation; +using VisaApi.Fakers.VisaApplications.Requests; +using VisaApi.Services; +using Xunit; + +namespace VisaApi.Tests.Application.Validation.VisaApplications +{ + public class ReentryPermitModelValidatorTests + { + private readonly static IDateTimeProvider dateTimeProvider = new TestDateTimeProvider(); + private readonly static IValidator validator = new ReentryPermitModelValidator(dateTimeProvider); + private readonly static ReentryPermitModelFaker faker = new(dateTimeProvider); + + /// + /// Test for validator that should return error for empty expiration date + /// + [Fact] + private async Task ValidateForEmptyExpirationDateShouldReturnError() + { + var model = faker.Generate(); + model.ExpirationDate = new(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.ExpirationDate)) + .Should().HaveCount(2); //expected error + error because of expired + } + + /// + /// Test for validator that should return error for expiration date less than current date + /// + [Fact] + private async Task ValidateForExpirationDateLessThanCurrentDateShouldReturnError() + { + var model = faker.Generate(); + model.ExpirationDate = dateTimeProvider.Now().AddDays(-1); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.ExpirationDate)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for empty number + /// + [Fact] + private async Task ValidateForEmptyNumberShouldReturnError() + { + var model = faker.Generate(); + model.Number = string.Empty; + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.Number)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for not valid number + /// + [Fact] + private async Task ValidateForNotValidNumberShouldReturnError() + { + var model = faker.Generate(); + model.Number = "}{)(*&*^%#!#!:"; + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.Number)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return error for too long number + /// + [Fact] + private async Task ValidateForTooLongNumberShouldReturnError() + { + var model = faker.Generate(); + var stringBuilder = new StringBuilder(); + stringBuilder.Append('g', ConfigurationConstraints.ReentryPermitNumberLength + 1); + model.Number = stringBuilder.ToString(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Where(error => error.PropertyName == nameof(model.Number)) + .Should().HaveCount(1); + } + + /// + /// Test for validator that should return no errors for valid model + /// + [Fact] + private async Task ValidateForValidShouldReturnNoErrors() + { + var model = faker.Generate(); + + var result = await validator.ValidateAsync(model); + + result.Errors.Should().BeEmpty(); + } + } +}