diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml new file mode 100644 index 00000000..50c54c74 --- /dev/null +++ b/.github/workflows/package.yml @@ -0,0 +1,23 @@ +name: Package +on: + push: + branches: + - main + paths: + - 'CleanArchitecture.nuspec' +jobs: + publish: + name: Publish to NuGet.org + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: nuget/setup-nuget@v1 + with: + nuget-version: '6.x' + + - name: Create the package + run: nuget pack CleanArchitecture.nuspec -NoDefaultExcludes + + - name: Publish the package + run: nuget push *.nupkg -Source 'https://api.nuget.org/v3/index.json' -ApiKey ${{secrets.NUGET_API_KEY}} diff --git a/.template.config/template.json b/.template.config/template.json new file mode 100644 index 00000000..f66b7dc7 --- /dev/null +++ b/.template.config/template.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json.schemastore.org/template", + "author": "SSW", + "classifications": [ + "Web", + "SPA", + "API", + ".NET", + "ASP.NET Core", + "EF Core", + "SSW", + "Clean Architecture" + ], + "name": "SSW Clean Architecture Solution", + "description": "", + "identity": "SSW.Clean.Architecture.Solution.CSharp", + "groupIdentity": "SSW.Clean.Architecture.Solution", + "shortName": "ssw-ca", + "tags": { + "language": "C#", + "type": "project" + }, + "sourceName": "SSW.CleanArchitecture", + "preferNameDirectory": true, + "sources": [ + { + "source": "./", + "target": "./", + "exclude": [ + "README.md", + "**/[Bb]in/**", + "**/[Oo]bj/**", + ".template.config/**/*", + ".vs/**/*", + "**/*.filelist", + "**/*.user", + "**/*.lock.json", + "**/.git/**", + "*.nuspec", + "**/node_modules/**" + ] + } + ] +} \ No newline at end of file diff --git a/CleanArchitecture.nuspec b/CleanArchitecture.nuspec new file mode 100644 index 00000000..9848dcf0 --- /dev/null +++ b/CleanArchitecture.nuspec @@ -0,0 +1,35 @@ + + + + + SSW.CleanArchitecture.Template + 0.2.3 + SSW Clean Architecture Template + SSW + SSW Clean Architecture Solution Template for .NET. + + This is a solution template for creating a WebAPI with ASP.NET Core following the principles of Clean Architecture. + + + + + https://github.com/SSWConsulting/CleanArchitectureV2 + + + MIT + false + clean-architecture project template csharp dotnet ssw + README.md + + + + + + + + + + + + + \ No newline at end of file diff --git a/CleanArchitecture.sln b/CleanArchitecture.sln index 3ceeb2c6..459078b6 100644 --- a/CleanArchitecture.sln +++ b/CleanArchitecture.sln @@ -15,6 +15,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig .gitignore = .gitignore + CleanArchitecture.nuspec = CleanArchitecture.nuspec Directory.Build.Props = Directory.Build.Props docker-compose.yml = docker-compose.yml global.json = global.json diff --git a/README.md b/README.md index 945cadc9..59293fdb 100644 --- a/README.md +++ b/README.md @@ -102,3 +102,13 @@ - you will know when your tests pass when they should have failed - Inserts bugs into the production code to make sure our tests are effective and testing the right behavior - Using [Stryker Mutator](https://stryker-mutator.io/) + +## Publishing Template + +Template will be published to NuGet.org when changes are made to `CleanArchitecture.nuspec` on the `main` branch. + +### Process + +1. Update the `version` attribute in `CleanArchitecture.nuspec` +2. Merge your PR +3. `package` GitHub Action will run and publish the new version to NuGet.org diff --git a/src/Application/Application.csproj b/src/Application/Application.csproj index 69845b22..265cb52f 100644 --- a/src/Application/Application.csproj +++ b/src/Application/Application.csproj @@ -2,6 +2,8 @@ net7.0 + SSW.CleanArchitecture.Application + SSW.CleanArchitecture.Application enable enable diff --git a/src/Application/Common/Behaviours/LoggingBehaviour.cs b/src/Application/Common/Behaviours/LoggingBehaviour.cs index b45cf31b..93871b24 100644 --- a/src/Application/Common/Behaviours/LoggingBehaviour.cs +++ b/src/Application/Common/Behaviours/LoggingBehaviour.cs @@ -1,8 +1,8 @@ -using Application.Common.Interfaces; +using SSW.CleanArchitecture.Application.Common.Interfaces; using MediatR.Pipeline; using Microsoft.Extensions.Logging; -namespace CleanArchitecture.Application.Common.Behaviours; +namespace SSW.CleanArchitecture.Application.Common.Behaviours; public class LoggingBehaviour : IRequestPreProcessor where TRequest : notnull { diff --git a/src/Application/Common/Behaviours/PerformanceBehaviour.cs b/src/Application/Common/Behaviours/PerformanceBehaviour.cs index de9f2303..61ddee2b 100644 --- a/src/Application/Common/Behaviours/PerformanceBehaviour.cs +++ b/src/Application/Common/Behaviours/PerformanceBehaviour.cs @@ -1,8 +1,8 @@ using System.Diagnostics; -using Application.Common.Interfaces; using Microsoft.Extensions.Logging; +using SSW.CleanArchitecture.Application.Common.Interfaces; -namespace CleanArchitecture.Application.Common.Behaviours; +namespace SSW.CleanArchitecture.Application.Common.Behaviours; public class PerformanceBehaviour : IPipelineBehavior where TRequest : notnull { diff --git a/src/Application/Common/Behaviours/UnhandledExceptionBehaviour.cs b/src/Application/Common/Behaviours/UnhandledExceptionBehaviour.cs index fe79da1f..901cfe10 100644 --- a/src/Application/Common/Behaviours/UnhandledExceptionBehaviour.cs +++ b/src/Application/Common/Behaviours/UnhandledExceptionBehaviour.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Logging; -namespace CleanArchitecture.Application.Common.Behaviours; +namespace SSW.CleanArchitecture.Application.Common.Behaviours; public class UnhandledExceptionBehaviour : IPipelineBehavior where TRequest : notnull { diff --git a/src/Application/Common/Behaviours/ValidationBehaviour.cs b/src/Application/Common/Behaviours/ValidationBehaviour.cs index f12f675f..7d2a9eb7 100644 --- a/src/Application/Common/Behaviours/ValidationBehaviour.cs +++ b/src/Application/Common/Behaviours/ValidationBehaviour.cs @@ -1,4 +1,4 @@ -namespace CleanArchitecture.Application.Common.Behaviours; +namespace SSW.CleanArchitecture.Application.Common.Behaviours; public class ValidationBehaviour : IPipelineBehavior where TRequest : notnull diff --git a/src/Application/Common/Exceptions/NotFoundException.cs b/src/Application/Common/Exceptions/NotFoundException.cs index 89a36704..b2fe6b9f 100644 --- a/src/Application/Common/Exceptions/NotFoundException.cs +++ b/src/Application/Common/Exceptions/NotFoundException.cs @@ -1,4 +1,4 @@ -namespace CleanArchitecture.Application.Common.Exceptions; +namespace SSW.CleanArchitecture.Application.Common.Exceptions; public class NotFoundException : Exception { diff --git a/src/Application/Common/Exceptions/ValidationException.cs b/src/Application/Common/Exceptions/ValidationException.cs index 3a398836..20aab707 100644 --- a/src/Application/Common/Exceptions/ValidationException.cs +++ b/src/Application/Common/Exceptions/ValidationException.cs @@ -1,6 +1,6 @@ using FluentValidation.Results; -namespace CleanArchitecture.Application.Common.Exceptions; +namespace SSW.CleanArchitecture.Application.Common.Exceptions; public class ValidationException : Exception { diff --git a/src/Application/Common/Interfaces/ICurrentUserService.cs b/src/Application/Common/Interfaces/ICurrentUserService.cs index 32a74261..49b177f2 100644 --- a/src/Application/Common/Interfaces/ICurrentUserService.cs +++ b/src/Application/Common/Interfaces/ICurrentUserService.cs @@ -1,4 +1,4 @@ -namespace Application.Common.Interfaces; +namespace SSW.CleanArchitecture.Application.Common.Interfaces; public interface ICurrentUserService { diff --git a/src/Application/Common/Interfaces/IDateTime.cs b/src/Application/Common/Interfaces/IDateTime.cs index 589948ae..440aa84f 100644 --- a/src/Application/Common/Interfaces/IDateTime.cs +++ b/src/Application/Common/Interfaces/IDateTime.cs @@ -1,4 +1,4 @@ -namespace Application.Common.Interfaces; +namespace SSW.CleanArchitecture.Application.Common.Interfaces; public interface IDateTime { diff --git a/src/Application/DependencyInjection.cs b/src/Application/DependencyInjection.cs index 7eb19ee1..3002d244 100644 --- a/src/Application/DependencyInjection.cs +++ b/src/Application/DependencyInjection.cs @@ -1,7 +1,7 @@ -using CleanArchitecture.Application.Common.Behaviours; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; +using SSW.CleanArchitecture.Application.Common.Behaviours; -namespace Application; +namespace SSW.CleanArchitecture.Application; public static class DependencyInjection { diff --git a/src/Application/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemCommand.cs b/src/Application/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemCommand.cs index dbb53898..349689b2 100644 --- a/src/Application/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemCommand.cs +++ b/src/Application/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemCommand.cs @@ -1,9 +1,9 @@ -using Application.Features.TodoItems.Specifications; -using Ardalis.Specification; -using Domain.Entities; -using Domain.Events; +using Ardalis.Specification; +using SSW.CleanArchitecture.Application.Features.TodoItems.Specifications; +using SSW.CleanArchitecture.Domain.Events; +using SSW.CleanArchitecture.Domain.Entities; -namespace Application.Features.TodoItems.Commands.CreateTodoItem; +namespace SSW.CleanArchitecture.Application.Features.TodoItems.Commands.CreateTodoItem; public record CreateTodoItemCommand(string? Title) : IRequest; diff --git a/src/Application/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemMapping.cs b/src/Application/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemMapping.cs index abe0326f..1bbc8f7d 100644 --- a/src/Application/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemMapping.cs +++ b/src/Application/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemMapping.cs @@ -1,9 +1,11 @@ -namespace Application.Features.TodoItems.Commands.CreateTodoItem; +using SSW.CleanArchitecture.Domain.Entities; + +namespace SSW.CleanArchitecture.Application.Features.TodoItems.Commands.CreateTodoItem; public class CreateTodoItemMapping : Profile { public CreateTodoItemMapping() { - CreateMap(); + CreateMap(); } } \ No newline at end of file diff --git a/src/Application/Features/TodoItems/EventHandlers/TodoItemCreatedEventHandler.cs b/src/Application/Features/TodoItems/EventHandlers/TodoItemCreatedEventHandler.cs index 014e6ac5..5ff14bad 100644 --- a/src/Application/Features/TodoItems/EventHandlers/TodoItemCreatedEventHandler.cs +++ b/src/Application/Features/TodoItems/EventHandlers/TodoItemCreatedEventHandler.cs @@ -1,8 +1,7 @@ -using Application.Features.TodoItems.Commands.CreateTodoItem; -using Domain.Events; -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; +using SSW.CleanArchitecture.Domain.Events; -namespace Application.Features.TodoItems.EventHandlers; +namespace SSW.CleanArchitecture.Application.Features.TodoItems.EventHandlers; public class TodoItemCreatedEventHandler : INotificationHandler { diff --git a/src/Application/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsMapping.cs b/src/Application/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsMapping.cs index 633fa061..d9a52c05 100644 --- a/src/Application/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsMapping.cs +++ b/src/Application/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsMapping.cs @@ -1,10 +1,12 @@ -namespace Application.Features.TodoItems.Queries.GetAllTodoItems; +using SSW.CleanArchitecture.Domain.Entities; + +namespace SSW.CleanArchitecture.Application.Features.TodoItems.Queries.GetAllTodoItems; public class GetAllTodoItemsMapping : Profile { public GetAllTodoItemsMapping() { - CreateMap() + CreateMap() .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id.Value)); } } \ No newline at end of file diff --git a/src/Application/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsQuery.cs b/src/Application/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsQuery.cs index 32d2b69c..dca41005 100644 --- a/src/Application/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsQuery.cs +++ b/src/Application/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsQuery.cs @@ -1,8 +1,8 @@ -using Application.Features.TodoItems.Specifications; using Ardalis.Specification; -using Domain.Entities; +using SSW.CleanArchitecture.Application.Features.TodoItems.Specifications; +using SSW.CleanArchitecture.Domain.Entities; -namespace Application.Features.TodoItems.Queries.GetAllTodoItems; +namespace SSW.CleanArchitecture.Application.Features.TodoItems.Queries.GetAllTodoItems; public record GetAllTodoItemsQuery : IRequest>; diff --git a/src/Application/Features/TodoItems/Queries/GetAllTodoItems/TodoItemDto.cs b/src/Application/Features/TodoItems/Queries/GetAllTodoItems/TodoItemDto.cs index f38a406e..03407a66 100644 --- a/src/Application/Features/TodoItems/Queries/GetAllTodoItems/TodoItemDto.cs +++ b/src/Application/Features/TodoItems/Queries/GetAllTodoItems/TodoItemDto.cs @@ -1,4 +1,4 @@ -namespace Application.Features.TodoItems.Queries.GetAllTodoItems; +namespace SSW.CleanArchitecture.Application.Features.TodoItems.Queries.GetAllTodoItems; public class TodoItemDto { diff --git a/src/Application/Features/TodoItems/Specifications/AllTodoItemSpec.cs b/src/Application/Features/TodoItems/Specifications/AllTodoItemSpec.cs index f767d504..011aa963 100644 --- a/src/Application/Features/TodoItems/Specifications/AllTodoItemSpec.cs +++ b/src/Application/Features/TodoItems/Specifications/AllTodoItemSpec.cs @@ -1,7 +1,7 @@ using Ardalis.Specification; -using Domain.Entities; +using SSW.CleanArchitecture.Domain.Entities; -namespace Application.Features.TodoItems.Specifications; +namespace SSW.CleanArchitecture.Application.Features.TodoItems.Specifications; public sealed class AllTodoItemSpec : Specification { diff --git a/src/Application/Features/TodoItems/Specifications/TodoItemByTitleSpec.cs b/src/Application/Features/TodoItems/Specifications/TodoItemByTitleSpec.cs index 61069906..325d2bcf 100644 --- a/src/Application/Features/TodoItems/Specifications/TodoItemByTitleSpec.cs +++ b/src/Application/Features/TodoItems/Specifications/TodoItemByTitleSpec.cs @@ -1,7 +1,7 @@ using Ardalis.Specification; -using Domain.Entities; +using SSW.CleanArchitecture.Domain.Entities; -namespace Application.Features.TodoItems.Specifications; +namespace SSW.CleanArchitecture.Application.Features.TodoItems.Specifications; public sealed class TodoItemByTitleSpec : Specification { diff --git a/src/Domain/Common/AuditableEntity.cs b/src/Domain/Common/AuditableEntity.cs index c66d5700..7b2344b8 100644 --- a/src/Domain/Common/AuditableEntity.cs +++ b/src/Domain/Common/AuditableEntity.cs @@ -1,4 +1,4 @@ -namespace Domain.Common; +namespace SSW.CleanArchitecture.Domain.Common; public abstract class AuditableEntity { diff --git a/src/Domain/Common/BaseEntity.cs b/src/Domain/Common/BaseEntity.cs index eca47ef9..d3d3d697 100644 --- a/src/Domain/Common/BaseEntity.cs +++ b/src/Domain/Common/BaseEntity.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations.Schema; -namespace Domain.Common; +namespace SSW.CleanArchitecture.Domain.Common; public abstract class BaseEntity : AuditableEntity, IDomainEvents { diff --git a/src/Domain/Common/BaseEvent.cs b/src/Domain/Common/BaseEvent.cs index d9169d48..2c5106b9 100644 --- a/src/Domain/Common/BaseEvent.cs +++ b/src/Domain/Common/BaseEvent.cs @@ -1,5 +1,5 @@ using MediatR; -namespace Domain.Common; +namespace SSW.CleanArchitecture.Domain.Common; public record BaseEvent : INotification; diff --git a/src/Domain/Common/IDomainEvents.cs b/src/Domain/Common/IDomainEvents.cs index f6831b07..118b5b02 100644 --- a/src/Domain/Common/IDomainEvents.cs +++ b/src/Domain/Common/IDomainEvents.cs @@ -1,4 +1,4 @@ -namespace Domain.Common; +namespace SSW.CleanArchitecture.Domain.Common; public interface IDomainEvents { diff --git a/src/Domain/Domain.csproj b/src/Domain/Domain.csproj index 82d921ba..6e84c1fb 100644 --- a/src/Domain/Domain.csproj +++ b/src/Domain/Domain.csproj @@ -3,6 +3,8 @@ net7.0 enable + SSW.CleanArchitecture.Domain + SSW.CleanArchitecture.Domain enable diff --git a/src/Domain/Entities/TodoItem.cs b/src/Domain/Entities/TodoItem.cs index e8e63da7..003fd146 100644 --- a/src/Domain/Entities/TodoItem.cs +++ b/src/Domain/Entities/TodoItem.cs @@ -1,4 +1,7 @@ -namespace Domain.Entities; +using SSW.CleanArchitecture.Domain.Common; +using SSW.CleanArchitecture.Domain.Enum; + +namespace SSW.CleanArchitecture.Domain.Entities; public record TodoItemId(Guid Value); diff --git a/src/Domain/Enum/PriorityLevel.cs b/src/Domain/Enum/PriorityLevel.cs index 1d57a275..7e27ba02 100644 --- a/src/Domain/Enum/PriorityLevel.cs +++ b/src/Domain/Enum/PriorityLevel.cs @@ -1,4 +1,4 @@ -namespace Domain.Enum; +namespace SSW.CleanArchitecture.Domain.Enum; public enum PriorityLevel { diff --git a/src/Domain/Events/TodoItemCreatedEvent.cs b/src/Domain/Events/TodoItemCreatedEvent.cs index 4d81a747..aa4d5f0c 100644 --- a/src/Domain/Events/TodoItemCreatedEvent.cs +++ b/src/Domain/Events/TodoItemCreatedEvent.cs @@ -1,5 +1,6 @@ -using Domain.Entities; +using SSW.CleanArchitecture.Domain.Common; +using SSW.CleanArchitecture.Domain.Entities; -namespace Domain.Events; +namespace SSW.CleanArchitecture.Domain.Events; public record TodoItemCreatedEvent(TodoItem Item) : BaseEvent; diff --git a/src/Domain/GlobalUsing.cs b/src/Domain/GlobalUsing.cs index daeb3dbd..c06b5d4f 100644 --- a/src/Domain/GlobalUsing.cs +++ b/src/Domain/GlobalUsing.cs @@ -1,2 +1,2 @@ -global using Domain.Common; -global using Domain.Enum; +global using SSW.CleanArchitecture.Domain.Common; +global using SSW.CleanArchitecture.Domain.Enum; diff --git a/src/Infrastructure/DependencyInjection.cs b/src/Infrastructure/DependencyInjection.cs index 8c5246d6..f3358d3a 100644 --- a/src/Infrastructure/DependencyInjection.cs +++ b/src/Infrastructure/DependencyInjection.cs @@ -1,13 +1,13 @@ -using Application.Common.Interfaces; -using Ardalis.Specification; -using Infrastructure.Persistence; -using Infrastructure.Persistence.Interceptors; -using Infrastructure.Services; +using Ardalis.Specification; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using SSW.CleanArchitecture.Application.Common.Interfaces; +using SSW.CleanArchitecture.Infrastructure.Persistence; +using SSW.CleanArchitecture.Infrastructure.Persistence.Interceptors; +using SSW.CleanArchitecture.Infrastructure.Services; -namespace Infrastructure; +namespace SSW.CleanArchitecture.Infrastructure; public static class DependencyInjection { diff --git a/src/Infrastructure/Infrastructure.csproj b/src/Infrastructure/Infrastructure.csproj index 9c31a43e..ebb216e9 100644 --- a/src/Infrastructure/Infrastructure.csproj +++ b/src/Infrastructure/Infrastructure.csproj @@ -2,6 +2,8 @@ net7.0 + SSW.CleanArchitecture.Infrastructure + SSW.CleanArchitecture.Infrastructure enable enable diff --git a/src/Infrastructure/Persistence/ApplicationDbContext.cs b/src/Infrastructure/Persistence/ApplicationDbContext.cs index d132e757..a6009b6a 100644 --- a/src/Infrastructure/Persistence/ApplicationDbContext.cs +++ b/src/Infrastructure/Persistence/ApplicationDbContext.cs @@ -1,9 +1,9 @@ -using Domain.Entities; -using Infrastructure.Persistence.Interceptors; -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using SSW.CleanArchitecture.Domain.Entities; +using SSW.CleanArchitecture.Infrastructure.Persistence.Interceptors; using System.Reflection; -namespace Infrastructure.Persistence; +namespace SSW.CleanArchitecture.Infrastructure.Persistence; public class ApplicationDbContext : DbContext { diff --git a/src/Infrastructure/Persistence/ApplicationDbContextInitializer.cs b/src/Infrastructure/Persistence/ApplicationDbContextInitializer.cs index 4d25b0f3..b0ef6eb7 100644 --- a/src/Infrastructure/Persistence/ApplicationDbContextInitializer.cs +++ b/src/Infrastructure/Persistence/ApplicationDbContextInitializer.cs @@ -1,9 +1,9 @@ -using Domain.Entities; -using Domain.Enum; +using SSW.CleanArchitecture.Domain.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; +using SSW.CleanArchitecture.Domain.Enum; -namespace Infrastructure.Persistence; +namespace SSW.CleanArchitecture.Infrastructure.Persistence; public class ApplicationDbContextInitializer { @@ -21,9 +21,7 @@ public async Task InitializeAsync() try { if (_dbContext.Database.IsSqlServer()) - { await _dbContext.Database.MigrateAsync(); - } } catch (Exception e) { @@ -37,9 +35,7 @@ public async Task SeedAsync() try { if (_dbContext.TodoItems.Any()) - { return; - } _dbContext.TodoItems.Add(new TodoItem() { diff --git a/src/Infrastructure/Persistence/Configuration/TodoItemConfiguration.cs b/src/Infrastructure/Persistence/Configuration/TodoItemConfiguration.cs index 36ae808e..27a7cd7d 100644 --- a/src/Infrastructure/Persistence/Configuration/TodoItemConfiguration.cs +++ b/src/Infrastructure/Persistence/Configuration/TodoItemConfiguration.cs @@ -1,9 +1,9 @@ -using Domain.Entities; -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SSW.CleanArchitecture.Domain.Entities; -namespace Infrastructure.Persistence.Configuration; +namespace SSW.CleanArchitecture.Infrastructure.Persistence.Configuration; public class TodoItemConfiguration : IEntityTypeConfiguration { @@ -14,10 +14,10 @@ public void Configure(EntityTypeBuilder builder) { builder.HasKey(t => t.Id); builder.Property(t => t.Id) - .HasConversion(x => x.Value, + .HasConversion(x => x.Value, x => new TodoItemId(x)) .ValueGeneratedOnAdd(); - + builder.Property(t => t.Title) .HasMaxLength(200) .IsRequired(); diff --git a/src/Infrastructure/Persistence/DbSetRepository.cs b/src/Infrastructure/Persistence/DbSetRepository.cs index e9c82b39..019e7053 100644 --- a/src/Infrastructure/Persistence/DbSetRepository.cs +++ b/src/Infrastructure/Persistence/DbSetRepository.cs @@ -1,6 +1,6 @@ using Ardalis.Specification.EntityFrameworkCore; -namespace Infrastructure.Persistence; +namespace SSW.CleanArchitecture.Infrastructure.Persistence; public class DbSetRepository : RepositoryBase where T : class { diff --git a/src/Infrastructure/Persistence/Interceptors/DispatchDomainEventsInterceptor.cs b/src/Infrastructure/Persistence/Interceptors/DispatchDomainEventsInterceptor.cs index dde3d242..bcd85d83 100644 --- a/src/Infrastructure/Persistence/Interceptors/DispatchDomainEventsInterceptor.cs +++ b/src/Infrastructure/Persistence/Interceptors/DispatchDomainEventsInterceptor.cs @@ -1,9 +1,9 @@ -using Domain.Common; -using MediatR; +using MediatR; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; +using SSW.CleanArchitecture.Domain.Common; -namespace Infrastructure.Persistence.Interceptors; +namespace SSW.CleanArchitecture.Infrastructure.Persistence.Interceptors; public class DispatchDomainEventsInterceptor : SaveChangesInterceptor { diff --git a/src/Infrastructure/Persistence/Interceptors/EntitySaveChangesInterceptor.cs b/src/Infrastructure/Persistence/Interceptors/EntitySaveChangesInterceptor.cs index 522b3b5b..92d49c42 100644 --- a/src/Infrastructure/Persistence/Interceptors/EntitySaveChangesInterceptor.cs +++ b/src/Infrastructure/Persistence/Interceptors/EntitySaveChangesInterceptor.cs @@ -1,10 +1,10 @@ -using Application.Common.Interfaces; -using Domain.Common; -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Diagnostics; +using SSW.CleanArchitecture.Application.Common.Interfaces; +using SSW.CleanArchitecture.Domain.Common; -namespace Infrastructure.Persistence.Interceptors; +namespace SSW.CleanArchitecture.Infrastructure.Persistence.Interceptors; public class EntitySaveChangesInterceptor : SaveChangesInterceptor { @@ -34,12 +34,9 @@ public override ValueTask> SavingChangesAsync(DbContextE public void UpdateEntities(DbContext? context) { if (context is null) - { return; - } foreach (var entry in context.ChangeTracker.Entries()) - { if (entry.State is EntityState.Added) { entry.Entity.CreatedAt = _dateTime.Now; @@ -51,7 +48,6 @@ public void UpdateEntities(DbContext? context) entry.Entity.UpdatedAt = _dateTime.Now; entry.Entity.UpdatedBy = _currentUserService.UserId; } - } } } diff --git a/src/Infrastructure/Persistence/Migrations/20230315031155_Initial.Designer.cs b/src/Infrastructure/Persistence/Migrations/20230315031155_Initial.Designer.cs index 8bfc059b..149f9b25 100644 --- a/src/Infrastructure/Persistence/Migrations/20230315031155_Initial.Designer.cs +++ b/src/Infrastructure/Persistence/Migrations/20230315031155_Initial.Designer.cs @@ -1,11 +1,11 @@ // using System; -using Infrastructure.Persistence; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SSW.CleanArchitecture.Infrastructure.Persistence; #nullable disable diff --git a/src/Infrastructure/Persistence/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Infrastructure/Persistence/Migrations/ApplicationDbContextModelSnapshot.cs index 0c6c62fb..95c367c7 100644 --- a/src/Infrastructure/Persistence/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/src/Infrastructure/Persistence/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1,10 +1,10 @@ // using System; -using Infrastructure.Persistence; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SSW.CleanArchitecture.Infrastructure.Persistence; #nullable disable diff --git a/src/Infrastructure/Services/DateTimeService.cs b/src/Infrastructure/Services/DateTimeService.cs index 98c95980..5777dfdb 100644 --- a/src/Infrastructure/Services/DateTimeService.cs +++ b/src/Infrastructure/Services/DateTimeService.cs @@ -1,5 +1,5 @@ -using Application.Common.Interfaces; +using SSW.CleanArchitecture.Application.Common.Interfaces; -namespace Infrastructure.Services; +namespace SSW.CleanArchitecture.Infrastructure.Services; public class DateTimeService : IDateTime { } \ No newline at end of file diff --git a/src/WebApi/DependencyInjection.cs b/src/WebApi/DependencyInjection.cs index d8feca2f..c16c556a 100644 --- a/src/WebApi/DependencyInjection.cs +++ b/src/WebApi/DependencyInjection.cs @@ -1,8 +1,8 @@ -using Application.Common.Interfaces; -using Infrastructure.Persistence; -using WebApi.Services; +using SSW.CleanArchitecture.Application.Common.Interfaces; +using SSW.CleanArchitecture.Infrastructure.Persistence; +using SSW.CleanArchitecture.WebApi.Services; -namespace WebApi; +namespace SSW.CleanArchitecture.WebApi; public static class DependencyInjection { diff --git a/src/WebApi/Extensions/EndpointRouteBuilderExt.cs b/src/WebApi/Extensions/EndpointRouteBuilderExt.cs index 22020302..cfb61444 100644 --- a/src/WebApi/Extensions/EndpointRouteBuilderExt.cs +++ b/src/WebApi/Extensions/EndpointRouteBuilderExt.cs @@ -1,4 +1,4 @@ -namespace WebApi.Extensions; +namespace SSW.CleanArchitecture.WebApi.Extensions; public static class EndpointRouteBuilderExt { diff --git a/src/WebApi/Features/TodoItemEndpoints.cs b/src/WebApi/Features/TodoItemEndpoints.cs index 6e6a1104..0fa0b50d 100644 --- a/src/WebApi/Features/TodoItemEndpoints.cs +++ b/src/WebApi/Features/TodoItemEndpoints.cs @@ -1,10 +1,9 @@ -using Application.Features.TodoItems.Commands.CreateTodoItem; -using Application.Features.TodoItems.Queries.GetAllTodoItems; -using MediatR; +using MediatR; +using SSW.CleanArchitecture.Application.Features.TodoItems.Commands.CreateTodoItem; +using SSW.CleanArchitecture.Application.Features.TodoItems.Queries.GetAllTodoItems; +using SSW.CleanArchitecture.WebApi.Extensions; -using WebApi.Extensions; - -namespace WebApi.Features; +namespace SSW.CleanArchitecture.WebApi.Features; public static class TodoItemEndpoints { @@ -20,7 +19,7 @@ public static void MapTodoItemEndpoints(this WebApplication app) => sender.Send(new GetAllTodoItemsQuery(), ct)) .WithName("GetTodoItems") .ProducesGet(); - + // TODO: Investigate examples for swagger docs. i.e. better docs than: // myWeirdField: "string" vs myWeirdField: "this-silly-string" diff --git a/src/WebApi/Filters/ExceptionFilter.cs b/src/WebApi/Filters/ExceptionFilter.cs index 3038a56b..ff16ee04 100644 --- a/src/WebApi/Filters/ExceptionFilter.cs +++ b/src/WebApi/Filters/ExceptionFilter.cs @@ -1,7 +1,7 @@ -using CleanArchitecture.Application.Common.Exceptions; -using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Diagnostics; +using SSW.CleanArchitecture.Application.Common.Exceptions; -namespace WebApi.Filters; +namespace SSW.CleanArchitecture.WebApi.Filters; public static class ExceptionFilter { diff --git a/src/WebApi/Program.cs b/src/WebApi/Program.cs index ea9126d8..b0070db1 100644 --- a/src/WebApi/Program.cs +++ b/src/WebApi/Program.cs @@ -1,9 +1,9 @@ -using Application; -using Infrastructure; -using Infrastructure.Persistence; -using WebApi; -using WebApi.Features; -using WebApi.Filters; +using SSW.CleanArchitecture.Application; +using SSW.CleanArchitecture.Infrastructure; +using SSW.CleanArchitecture.Infrastructure.Persistence; +using SSW.CleanArchitecture.WebApi; +using SSW.CleanArchitecture.WebApi.Features; +using SSW.CleanArchitecture.WebApi.Filters; var builder = WebApplication.CreateBuilder(args); @@ -42,4 +42,6 @@ app.MapTodoItemEndpoints(); -app.Run(); \ No newline at end of file +app.Run(); + +public partial class Program { } \ No newline at end of file diff --git a/src/WebApi/Services/CurrentUserService.cs b/src/WebApi/Services/CurrentUserService.cs index 0fee73c2..c5198041 100644 --- a/src/WebApi/Services/CurrentUserService.cs +++ b/src/WebApi/Services/CurrentUserService.cs @@ -1,7 +1,7 @@ -using Application.Common.Interfaces; +using SSW.CleanArchitecture.Application.Common.Interfaces; using System.Security.Claims; -namespace WebApi.Services; +namespace SSW.CleanArchitecture.WebApi.Services; public class CurrentUserService : ICurrentUserService { diff --git a/src/WebApi/WebApi.csproj b/src/WebApi/WebApi.csproj index 99896953..fa80b8bb 100644 --- a/src/WebApi/WebApi.csproj +++ b/src/WebApi/WebApi.csproj @@ -2,6 +2,8 @@ net7.0 + SSW.CleanArchitecture.WebApi + SSW.CleanArchitecture.WebApi enable enable fc525b0c-3d84-4847-9b4f-840f8db76d87 @@ -46,7 +48,6 @@        -    diff --git a/tests/Application.IntegrationTests/Application.IntegrationTests.csproj b/tests/Application.IntegrationTests/Application.IntegrationTests.csproj index f801170e..9b2d05b5 100644 --- a/tests/Application.IntegrationTests/Application.IntegrationTests.csproj +++ b/tests/Application.IntegrationTests/Application.IntegrationTests.csproj @@ -1,36 +1,37 @@ - - net7.0 - enable - enable + + net7.0 + SSW.CleanArchitecture.Application.IntegrationTests + SSW.CleanArchitecture.Application.IntegrationTests + enable + enable + false + - false - + + + + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + - - - - - - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - + + + diff --git a/tests/Application.IntegrationTests/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemCommandTests.cs b/tests/Application.IntegrationTests/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemCommandTests.cs index 03e59436..50382eb0 100644 --- a/tests/Application.IntegrationTests/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemCommandTests.cs +++ b/tests/Application.IntegrationTests/Features/TodoItems/Commands/CreateTodoItem/CreateTodoItemCommandTests.cs @@ -1,21 +1,22 @@ -using Application.Features.TodoItems.Commands.CreateTodoItem; -using Application.IntegrationTests.TestHelpers; -using CleanArchitecture.Application.Common.Exceptions; -using Domain.Entities; +using SSW.CleanArchitecture.Application.Features.TodoItems.Commands.CreateTodoItem; +using SSW.CleanArchitecture.Domain.Entities; +using SSW.CleanArchitecture.Application.Common.Exceptions; +using SSW.CleanArchitecture.Application.IntegrationTests; +using SSW.CleanArchitecture.Application.IntegrationTests.TestHelpers; -namespace Application.IntegrationTests.Features.TodoItems.Commands.CreateTodoItem; +namespace SSW.CleanArchitecture.Application.IntegrationTests.Features.TodoItems.Commands.CreateTodoItem; public class CreateTodoItemCommandTests : IntegrationTestBase { public CreateTodoItemCommandTests(TestingDatabaseFixture fixture) : base(fixture) { } - + [Fact] public async Task ShouldRequireUniqueTitle() { await Mediator.Send(new CreateTodoItemCommand("Shopping")); var command = new CreateTodoItemCommand("Shopping"); - + await FluentActions.Invoking(() => Mediator.Send(command)).Should().ThrowAsync(); } @@ -27,7 +28,7 @@ public async Task ShouldCreateTodoItem() var id = await Mediator.Send(command); - TodoItem item = (await Context.TodoItems.FindAsync(new TodoItemId(id)))!; + var item = (await Context.TodoItems.FindAsync(new TodoItemId(id)))!; item.Should().NotBeNull(); item.Title.Should().Be(command.Title); diff --git a/tests/Application.IntegrationTests/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsQueryTests.cs b/tests/Application.IntegrationTests/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsQueryTests.cs index 8326413f..d072f6fe 100644 --- a/tests/Application.IntegrationTests/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsQueryTests.cs +++ b/tests/Application.IntegrationTests/Features/TodoItems/Queries/GetAllTodoItems/GetAllTodoItemsQueryTests.cs @@ -1,9 +1,10 @@ -using Application.Features.TodoItems.Queries.GetAllTodoItems; -using Application.IntegrationTests.TestHelpers; using Bogus; -using Domain.Entities; +using SSW.CleanArchitecture.Application.Features.TodoItems.Queries.GetAllTodoItems; +using SSW.CleanArchitecture.Application.IntegrationTests; +using SSW.CleanArchitecture.Application.IntegrationTests.TestHelpers; +using SSW.CleanArchitecture.Domain.Entities; -namespace Application.IntegrationTests.Features.TodoItems.Queries.GetAllTodoItems; +namespace SSW.CleanArchitecture.Application.IntegrationTests.Features.TodoItems.Queries.GetAllTodoItems; public class GetAllTodoItemsQueryTests : IntegrationTestBase { diff --git a/tests/Application.IntegrationTests/IntegrationTestBase.cs b/tests/Application.IntegrationTests/IntegrationTestBase.cs index 1342a0eb..279f6d85 100644 --- a/tests/Application.IntegrationTests/IntegrationTestBase.cs +++ b/tests/Application.IntegrationTests/IntegrationTestBase.cs @@ -1,9 +1,9 @@ -using Application.IntegrationTests.TestHelpers; -using Infrastructure.Persistence; using MediatR; using Microsoft.Extensions.DependencyInjection; +using SSW.CleanArchitecture.Application.IntegrationTests.TestHelpers; +using SSW.CleanArchitecture.Infrastructure.Persistence; -namespace Application.IntegrationTests; +namespace SSW.CleanArchitecture.Application.IntegrationTests; [Collection(TestingDatabaseFixture.DatabaseCollectionDefinition)] public abstract class IntegrationTestBase : IAsyncLifetime diff --git a/tests/Application.IntegrationTests/TestHelpers/DatabaseContainer.cs b/tests/Application.IntegrationTests/TestHelpers/DatabaseContainer.cs index 92dee742..ec5a2979 100644 --- a/tests/Application.IntegrationTests/TestHelpers/DatabaseContainer.cs +++ b/tests/Application.IntegrationTests/TestHelpers/DatabaseContainer.cs @@ -1,6 +1,6 @@ using Testcontainers.SqlEdge; -namespace Application.IntegrationTests.TestHelpers; +namespace SSW.CleanArchitecture.Application.IntegrationTests.TestHelpers; public class DatabaseContainer { diff --git a/tests/Application.IntegrationTests/TestHelpers/IntegrationTestWebApplicationFactory.cs b/tests/Application.IntegrationTests/TestHelpers/IntegrationTestWebApplicationFactory.cs index 830e6265..5aea0830 100644 --- a/tests/Application.IntegrationTests/TestHelpers/IntegrationTestWebApplicationFactory.cs +++ b/tests/Application.IntegrationTests/TestHelpers/IntegrationTestWebApplicationFactory.cs @@ -1,17 +1,17 @@ -using Infrastructure.Persistence; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.AspNetCore.TestHost; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using SSW.CleanArchitecture.Infrastructure.Persistence; -namespace Application.IntegrationTests.TestHelpers; +namespace SSW.CleanArchitecture.Application.IntegrationTests.TestHelpers; internal class IntegrationTestWebApplicationFactory : WebApplicationFactory { public DatabaseContainer Database { get; } - + public IntegrationTestWebApplicationFactory() { Database = new DatabaseContainer(); @@ -19,14 +19,14 @@ public IntegrationTestWebApplicationFactory() protected override void ConfigureWebHost(IWebHostBuilder webHostBuilder) { - webHostBuilder.ConfigureTestServices((services) => + webHostBuilder.ConfigureTestServices((services) => { services .RemoveAll>() .RemoveAll() .AddDbContext((_, options) => options.UseSqlServer( - Database.ConnectionString, + Database.ConnectionString, b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); }); } diff --git a/tests/Application.IntegrationTests/TestHelpers/TestingDatabaseFixture.cs b/tests/Application.IntegrationTests/TestHelpers/TestingDatabaseFixture.cs index 033fc483..d53b210e 100644 --- a/tests/Application.IntegrationTests/TestHelpers/TestingDatabaseFixture.cs +++ b/tests/Application.IntegrationTests/TestHelpers/TestingDatabaseFixture.cs @@ -1,15 +1,15 @@ using Microsoft.Extensions.DependencyInjection; using Respawn; -namespace Application.IntegrationTests.TestHelpers; +namespace SSW.CleanArchitecture.Application.IntegrationTests.TestHelpers; public class TestingDatabaseFixture : IAsyncLifetime { public const string DatabaseCollectionDefinition = "Database collection"; - + private readonly IntegrationTestWebApplicationFactory _factory; private Respawner _checkpoint = default!; - + public IServiceScopeFactory ScopeFactory { get; private set; } = default!; private string ConnectionString => _factory.Database.ConnectionString!; diff --git a/tests/Application.UnitTests/Application.UnitTests.csproj b/tests/Application.UnitTests/Application.UnitTests.csproj index d9ae3637..9d01755a 100644 --- a/tests/Application.UnitTests/Application.UnitTests.csproj +++ b/tests/Application.UnitTests/Application.UnitTests.csproj @@ -1,30 +1,31 @@ - - net7.0 - enable - enable + + net7.0 + SSW.CleanArchitecture.Application.UnitTests + SSW.CleanArchitecture.Application.UnitTests + enable + enable + false + - false - + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - + + + diff --git a/tests/Application.UnitTests/Features/TodoItems/Specifications/AllTodoItemSpecTests.cs b/tests/Application.UnitTests/Features/TodoItems/Specifications/AllTodoItemSpecTests.cs index 834de06a..5d9b69e8 100644 --- a/tests/Application.UnitTests/Features/TodoItems/Specifications/AllTodoItemSpecTests.cs +++ b/tests/Application.UnitTests/Features/TodoItems/Specifications/AllTodoItemSpecTests.cs @@ -1,8 +1,8 @@ -using Application.Features.TodoItems.Specifications; using Bogus; -using Domain.Entities; +using SSW.CleanArchitecture.Application.Features.TodoItems.Specifications; +using SSW.CleanArchitecture.Domain.Entities; -namespace Application.UnitTests.Features.TodoItems.Specifications; +namespace SSW.CleanArchitecture.Application.UnitTests.Features.TodoItems.Specifications; public class AllTodoItemSpecTests { diff --git a/tests/Application.UnitTests/Features/TodoItems/Specifications/TodoItemByTitleSpecTests.cs b/tests/Application.UnitTests/Features/TodoItems/Specifications/TodoItemByTitleSpecTests.cs index 7698b1c6..9abee236 100644 --- a/tests/Application.UnitTests/Features/TodoItems/Specifications/TodoItemByTitleSpecTests.cs +++ b/tests/Application.UnitTests/Features/TodoItems/Specifications/TodoItemByTitleSpecTests.cs @@ -1,13 +1,12 @@ -using Application.Features.TodoItems.Specifications; -using Bogus; -using Domain.Entities; +using SSW.CleanArchitecture.Application.Features.TodoItems.Specifications; +using SSW.CleanArchitecture.Domain.Entities; -namespace Application.UnitTests.Features.TodoItems.Specifications; +namespace SSW.CleanArchitecture.Application.UnitTests.Features.TodoItems.Specifications; public class TodoItemByTitleSpecTests { private readonly List _entities; - + public TodoItemByTitleSpecTests() { _entities = new List() diff --git a/tests/Architecture.Tests/Architecture.Tests.csproj b/tests/Architecture.Tests/Architecture.Tests.csproj index aa540a0c..b438797b 100644 --- a/tests/Architecture.Tests/Architecture.Tests.csproj +++ b/tests/Architecture.Tests/Architecture.Tests.csproj @@ -1,33 +1,34 @@ - - net7.0 - enable - enable + + net7.0 + SSW.CleanArchitecture.Architecture.UnitTests + SSW.CleanArchitecture.Architecture.UnitTests + enable + enable + false + - false - + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - - + + + + + + diff --git a/tests/Architecture.Tests/DatabaseEntitiesTest.cs b/tests/Architecture.Tests/DatabaseEntitiesTest.cs index 0b7dff1e..bc656417 100644 --- a/tests/Architecture.Tests/DatabaseEntitiesTest.cs +++ b/tests/Architecture.Tests/DatabaseEntitiesTest.cs @@ -1,16 +1,17 @@ -using Domain.Common; using FluentAssertions; using Microsoft.EntityFrameworkCore; using NetArchTest.Rules; +using SSW.CleanArchitecture.Domain.Common; +using SSW.CleanArchitecture.Infrastructure; -namespace Architecture.Tests; +namespace SSW.CleanArchitecture.Architecture.UnitTests; public class DatabaseEntities { [Fact] public void Entities_Should_Inherits_BaseComponent() { - var entityTypes = Types.InAssembly(typeof(Infrastructure.DependencyInjection).Assembly) + var entityTypes = Types.InAssembly(typeof(DependencyInjection).Assembly) .That() .Inherit(typeof(DbContext)) .GetTypes() @@ -25,7 +26,7 @@ public void Entities_Should_Inherits_BaseComponent() .HaveName(entityTypes) .Should() .Inherit(typeof(BaseEntity<>)); - + result.GetTypes().Count().Should().BePositive(); result.GetResult().IsSuccessful.Should().BeTrue(); } diff --git a/tests/Domain.UnitTests/Domain.UnitTests.csproj b/tests/Domain.UnitTests/Domain.UnitTests.csproj index 5d838aca..6cb9c28b 100644 --- a/tests/Domain.UnitTests/Domain.UnitTests.csproj +++ b/tests/Domain.UnitTests/Domain.UnitTests.csproj @@ -1,29 +1,36 @@ - - net7.0 - enable - enable + + net7.0 + SSW.CleanArchitecture.Domain.UnitTests + SSW.CleanArchitecture.Domain.UnitTests + enable + enable + false + - false - + + + + + - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + - - - + + + diff --git a/tests/Domain.UnitTests/Entities/TodoItemTests.cs b/tests/Domain.UnitTests/Entities/TodoItemTests.cs index 936b24a3..194a4247 100644 --- a/tests/Domain.UnitTests/Entities/TodoItemTests.cs +++ b/tests/Domain.UnitTests/Entities/TodoItemTests.cs @@ -1,6 +1,6 @@ -using Domain.Entities; +using SSW.CleanArchitecture.Domain.Entities; -namespace Domain.UnitTests.Entities; +namespace SSW.CleanArchitecture.Domain.UnitTests.Entities; public class TodoItemTests {