elsa-core/test/shared/Elsa.Testing.Shared/AutoFixture/Attributes/ElsaHostBuilderBuilderCustomizeAttributeBase.cs
Craig Fowler d285b8b505 WIP composing customize attributes
This isn't really related to #751 - it's a refactor of some of
our test logic, to avoid bloat of semi-repeated autofixture
customization attributes.

By switching to a behaviour-driven model, it's possible to
compose them, which means that there's no need to part-duplicate
between them.  It should also reduce the overall number of them,
as combinations can be put together on-demand, rather than needing
a new attribute of their own.
2021-04-02 11:12:21 +01:00

64 lines
2.5 KiB
C#

using System;
using System.Reflection;
using AutoFixture;
using AutoFixture.Kernel;
using AutoFixture.Xunit2;
using Elsa.Testing.Shared.AutoFixture.Specifications;
using Elsa.Testing.Shared.Helpers;
namespace Elsa.Testing.Shared.AutoFixture.Attributes
{
public abstract class ElsaHostBuilderBuilderCustomizeAttributeBase : CustomizeAttribute
{
public abstract Action<ElsaHostBuilderBuilder> GetBuilderCustomizer();
public override ICustomization GetCustomization(ParameterInfo parameter)
=> new ElsaHostBuilderBuilderCustomization(GetBuilderCustomizer());
class ElsaHostBuilderBuilderCustomization : ICustomization
{
readonly Action<ElsaHostBuilderBuilder> builderCustomizer;
public void Customize(IFixture fixture)
{
fixture.Behaviors.Add(new ElsaHostBuilderBuilderTransformation(builderCustomizer));
}
public ElsaHostBuilderBuilderCustomization(Action<ElsaHostBuilderBuilder> builderCustomizer)
{
this.builderCustomizer = builderCustomizer ?? throw new ArgumentNullException(nameof(builderCustomizer));
}
}
class ElsaHostBuilderBuilderTransformation : ISpecimenBuilderTransformation
{
readonly Action<ElsaHostBuilderBuilder> builderCustomizer;
public ISpecimenBuilderNode Transform(ISpecimenBuilder builder)
{
return new Postprocessor(builder, new ElsaHostBuilderBuilderCommand(builderCustomizer), new IsAnElsaHostBuilderBuilderSpec());
}
public ElsaHostBuilderBuilderTransformation(Action<ElsaHostBuilderBuilder> builderCustomizer)
{
this.builderCustomizer = builderCustomizer ?? throw new ArgumentNullException(nameof(builderCustomizer));
}
}
class ElsaHostBuilderBuilderCommand : ISpecimenCommand
{
readonly Action<ElsaHostBuilderBuilder> builderCustomizer;
public void Execute(object specimen, ISpecimenContext context)
{
var builder = (ElsaHostBuilderBuilder) specimen;
builderCustomizer(builder);
}
public ElsaHostBuilderBuilderCommand(Action<ElsaHostBuilderBuilder> builderCustomizer)
{
this.builderCustomizer = builderCustomizer ?? throw new ArgumentNullException(nameof(builderCustomizer));
}
}
}
}