Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Development #5

Merged
merged 20 commits into from
Feb 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<package>
<id>Intent.Application.MediatR.Behaviours</id>
<version>4.2.10-pre.1</version>
<version>4.2.10-pre.2</version>
<supportedClientVersions>[4.1.0-a, 5.0.0-a)</supportedClientVersions>
<summary>Additional MediatR middleware pipeline behaviours</summary>
<description>Additional MediatR middleware pipeline behaviours</description>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<package>
<id>Intent.AspNetCore.HealthChecks</id>
<version>2.0.2-pre.0</version>
<version>2.0.2-pre.1</version>
<supportedClientVersions>[4.1.0, 5.0.0-a)</supportedClientVersions>
<summary>Monitor various aspects of your application to determine if is responding to requests normally.</summary>
<description>Monitor various aspects of your application to determine if is responding to requests normally.</description>
Expand Down
10 changes: 10 additions & 0 deletions Modules/Intent.Modules.AspNetCore.HealthChecks/NugetPackage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,4 +104,14 @@ public static class NugetPackage
(7, 0) => "7.0.0",
_ => "8.0.0"
});

public static INugetPackageInfo AspNetCoreHealthChecksRedis(IOutputTarget outputTarget) => new NugetPackageInfo(
name: "AspNetCore.HealthChecks.Redis",
version: outputTarget.GetMaxNetAppVersion() switch
{
(5, 0) => "5.0.1",
(6, 0) => "6.0.2",
(7, 0) => "7.0.0",
_ => "8.0.0"
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,13 @@ private IEnumerable<CSharpStatement> GetKnownHealthConfigurationStatements(Infra
expression: "hcBuilder.AddOracle",
connectionStringNameVar: Infrastructure.Oracle.Property.ConnectionStringName,
connectionStringSettingPathVar: Infrastructure.Oracle.Property.ConnectionStringSettingPath);
case Infrastructure.Redis.Name:
AddNugetDependency(NugetPackage.AspNetCoreHealthChecksRedis(OutputTarget));
return GetDatabaseHealthCheckStatements(
@event: @event,
expression: "hcBuilder.AddRedis",
connectionStringNameVar: Infrastructure.Redis.Property.ConnectionStringName,
connectionStringSettingPathVar: Infrastructure.Redis.Property.ConnectionStringSettingPath);
default:
return Enumerable.Empty<CSharpInvocationStatement>();
}
Expand Down
41 changes: 40 additions & 1 deletion Modules/Intent.Modules.AspNetCore.IntegrationTesting/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ This module consumes your `Exposed HTTP Endpoints`, in the `Service Designer` an
- Adds Integration xUnit Testing project.
- Generates service proxies for all service end points, to use to interact with the Application under test.
- Add container support for `MS SQL Server`, `Postgres` and `CosmosDB`
- Generates test classes for each service end point.
- Generates test classes for each modelled service end point.

## Testing Isolation

Expand All @@ -55,3 +55,42 @@ If you are running `Shared Container`, you can set up specific Test Class's to r
...
}
```

## Testing against containerized data stores

If your application is using our `Intent.EntityFrameworkCore` module, the following providers are currently supported for containerization

- SQL Server
- Postgres

If your application is using our `Intent.CosmosDB` module, the tests will be run against a dockerized CosmosDB Emulator.

## Adding Tests

You can then simply add your integration tests to the test classes as required.
Our `Intent.AspNetCore.IntegrationTesting.CRUD` module can be used to generate integration test implementations for CRUD orientated services.

```csharp

[IntentManaged(Mode.Merge, Signature = Mode.Fully)]
[Collection("SharedContainer")]
public class MyCustomEndpointTests : BaseIntegrationTest
{
public MyCustomEndpointTests(IntegrationTestWebAppFactory factory) : base(factory)
{
}

[Fact]
public async Task MyCustomEndpoint_ShouldDoX()
{
//Arrange
var client = new MyCustomServiceHttpClient(CreateClient());

//Act
client.InvokeMyCustomEndpoint();

//Assert
...
}
}
```
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<authors>Intent Architect</authors>
<tags>csharp dotnet crud integration testing asp.net xunit</tags>
<releaseNotes>release-notes.md</releaseNotes>
<projectUrl>https://github.com/IntentArchitect/Intent.Modules.NET/blob/development/Modules/Intent.Modules.AspNetCore.IntegrationTesting.CRUD/README.md</projectUrl>
<iconUrl>data:image/png;base64,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</iconUrl>
<templates>
<template id="Intent.AspNetCore.IntegrationTests.CRUD.PopulateIdsSpecimenBuilder" externalReference="6cc9daf4-9b9d-45ef-bdac-912919be0654">
Expand Down
95 changes: 95 additions & 0 deletions Modules/Intent.Modules.AspNetCore.IntegrationTests.CRUD/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# Intent.AspNetCore.IntegrationTesting.CRUD

This module provides Integration Test implementation for Services which are CRUD orientated.

## What's in this module?

This module consumes your `Services` both `ServiceModel` and `CQRS`, in the `Service Designer` and generates an Integration test for each Endpoint.

For a service to be eligible is must implement at least

- Create{Entity} - returning either the `Primary Key` or a `DTO` with a mapped `Primary Key`.
- Get{Entity}ById - returning an `Entity` based `DTO` taking a single parameter of the `Entitiy`s primary key.

## Sample Tests

```csharp
[Fact]
public async Task CreateCustomer_ShouldCreateCustomer()
{
//Arrange
var client = new CustomersServiceHttpClient(CreateClient());

var dataFactory = new TestDataFactory(WebAppFactory);
await dataFactory.CreateCustomerDependencies();

var command = dataFactory.CreateCommand<CustomerCreateDto>();

//Act
var customerId = await client.CreateCustomerAsync(command);

//Assert
var customer = await client.FindCustomerByIdAsync(customerId);
Assert.NotNull(customer);
}
```

```csharp
[Fact]
public async Task FindCustomerById_ShouldFindCustomerById()
{
//Arrange
var client = new CustomersServiceHttpClient(CreateClient());

var dataFactory = new TestDataFactory(WebAppFactory);
var customerId = await dataFactory.CreateCustomer();

//Act
var customer = await client.FindCustomerByIdAsync(customerId);

//Assert
Assert.NotNull(customer);
}
```

```csharp
[Fact]
public async Task UpdateCustomer_ShouldUpdateCustomer()
{
//Arrange
var client = new CustomersServiceHttpClient(CreateClient());

var dataFactory = new TestDataFactory(WebAppFactory);
var customerId = await dataFactory.CreateCustomer();

var command = dataFactory.CreateCommand<CustomerUpdateDto>();
command.Id = customerId;

//Act
await client.UpdateCustomerAsync(customerId, command);

//Assert
var customer = await client.FindCustomerByIdAsync(customerId);
Assert.NotNull(customer);
Assert.Equal(command.Name, customer.Name);
}
```

```csharp
[Fact]
public async Task DeleteCustomer_ShouldDeleteCustomer()
{
//Arrange
var client = new CustomersServiceHttpClient(CreateClient());

var dataFactory = new TestDataFactory(WebAppFactory);
var customerId = await dataFactory.CreateCustomer();

//Act
await client.DeleteCustomerAsync(customerId);

//Assert
var exception = await Assert.ThrowsAsync<HttpClientRequestException>(() => client.FindCustomerByIdAsync(customerId));
Assert.Equal(HttpStatusCode.NotFound, exception.StatusCode);
}
```
11 changes: 11 additions & 0 deletions Modules/Intent.Modules.Constants/Infrastructure.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,15 @@ public static class Property
public const string ConnectionStringSettingPath = nameof(ConnectionStringSettingPath);
}
}

public static class Redis
{
public const string Name = nameof(Redis);

public static class Property
{
public const string ConnectionStringName = nameof(ConnectionStringName);
public const string ConnectionStringSettingPath = nameof(ConnectionStringSettingPath);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using Intent.Modelers.Domain.Api;
using Intent.Modules.Common.CSharp.Builder;
using Intent.Modules.Common.CSharp.Templates;
using Intent.Modules.DocumentDB.Shared;

namespace Intent.Modules.CosmosDB.FactoryExtensions;

public class CosmosDbPrimaryKeyInitStrategy : IPrimaryKeyInitStrategy
{
public bool ShouldInsertPkInitializationCode(ClassModel targetClass)
{
return true;
}

public string GetGetterInitExpression(ICSharpTemplate template, ClassModel targetClass, string fieldName, string fieldTypeName)
{
return fieldTypeName switch
{
"string" => $"{fieldName} ??= {template.UseType("System.Guid")}.NewGuid().ToString()",
"guid" => $"{fieldName} ??= {template.UseType("System.Guid")}.NewGuid()",
"int" or "long" => $"{fieldName} ?? throw new {template.UseType("System.NullReferenceException")}(\"{fieldName} has not been set\")",
_ => fieldName
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,9 @@ protected override void OnAfterTemplateRegistrations(IApplication application)
EntityFactoryExtensionHelper.Execute(
application: application,
dbProviderApplies: CosmosDbProvider.FilterDbProvider,
initializePrimaryKeyOnAggregateRoots: true,
primaryKeyInitStrategy: new CosmosDbPrimaryKeyInitStrategy(),
makeNonPersistentPropertiesVirtual: false);
RegisterServices(application);

}

private static void RegisterServices(IApplication application)
Expand Down
Loading