Skip to content

Commit 46ce668

Browse files
committed
Added MiddlewareFilterAttribute test builder
1 parent e1c856c commit 46ce668

File tree

10 files changed

+299
-2
lines changed

10 files changed

+299
-2
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
namespace MyTested.AspNetCore.Mvc.Builders.Attributes
2+
{
3+
using Microsoft.AspNetCore.Mvc;
4+
using Contracts.Attributes;
5+
using System;
6+
using Internal.TestContexts;
7+
using Utilities;
8+
9+
/// <summary>
10+
/// Used for testing <see cref="MiddlewareFilterAttribute"/>.
11+
/// </summary>
12+
public class MiddlewareFilterAttributeTestBuilder : BaseAttributeTestBuilderWithOrder<MiddlewareFilterAttribute>,
13+
IAndMiddlewareFilterAttributeTestBuilder
14+
{
15+
/// <summary>
16+
/// Initializes a new instance of the <see cref="MiddlewareFilterAttributeTestBuilder"/> class.
17+
/// </summary>
18+
/// <param name="testContext"><see cref="ComponentTestContext"/> containing data about the currently executed assertion chain.</param>
19+
/// <param name="failedValidationAction">Action to call in case of failed validation.</param>
20+
public MiddlewareFilterAttributeTestBuilder(
21+
ComponentTestContext testContext,
22+
Action<string, string> failedValidationAction)
23+
: base(testContext, nameof(MiddlewareFilterAttribute), failedValidationAction)
24+
=> this.Attribute = new MiddlewareFilterAttribute(typeof(object));
25+
26+
/// <inheritdoc />
27+
public IAndMiddlewareFilterAttributeTestBuilder WithType(Type configurationType)
28+
{
29+
this.Attribute = new MiddlewareFilterAttribute(configurationType);
30+
this.Validations.Add((expected, actual) =>
31+
{
32+
var expectedType = expected.ConfigurationType;
33+
var actualType = actual.ConfigurationType;
34+
35+
if (Reflection.AreDifferentTypes(expectedType, actualType))
36+
{
37+
this.FailedValidationAction(
38+
$"{this.ExceptionMessagePrefix}'{expectedType.ToFriendlyTypeName()}' type",
39+
$"in fact found '{actualType.ToFriendlyTypeName()}'");
40+
}
41+
});
42+
43+
return this;
44+
}
45+
46+
public IAndMiddlewareFilterAttributeTestBuilder WithOrder(int order)
47+
{
48+
this.ValidateOrder(order);
49+
return this;
50+
}
51+
52+
/// <inheritdoc />
53+
public IMiddlewareFilterAttributeTestBuilder AndAlso() => this;
54+
}
55+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace MyTested.AspNetCore.Mvc.Builders.Contracts.Attributes
2+
{
3+
/// <summary>
4+
/// Used for adding AndAlso() method to the <see cref="Microsoft.AspNetCore.Mvc.MiddlewareFilterAttribute"/> tests.
5+
/// </summary>
6+
public interface IAndMiddlewareFilterAttributeTestBuilder : IMiddlewareFilterAttributeTestBuilder
7+
{
8+
/// <summary>
9+
/// AndAlso method for better readability when testing <see cref="Microsoft.AspNetCore.Mvc.MiddlewareFilterAttribute"/>.
10+
/// </summary>
11+
/// <returns>The same <see cref="IMiddlewareFilterAttributeTestBuilder"/>.</returns>
12+
IMiddlewareFilterAttributeTestBuilder AndAlso();
13+
}
14+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace MyTested.AspNetCore.Mvc.Builders.Contracts.Attributes
2+
{
3+
using System;
4+
5+
/// <summary>
6+
/// Used for testing <see cref="Microsoft.AspNetCore.Mvc.MiddlewareFilterAttribute"/>.
7+
/// </summary>
8+
public interface IMiddlewareFilterAttributeTestBuilder : IBaseAttributeTestBuilderWithOrder<IAndMiddlewareFilterAttributeTestBuilder>
9+
{
10+
/// <summary>
11+
/// Tests whether a <see cref="Microsoft.AspNetCore.Mvc.MiddlewareFilterAttribute"/>
12+
/// has the same <see cref="Microsoft.AspNetCore.Mvc.MiddlewareFilterAttribute.ConfigurationType"/> value as the provided one.
13+
/// </summary>
14+
/// <param name="type">Expected type value.</param>
15+
/// <returns>The same <see cref="IMiddlewareFilterAttributeTestBuilder"/>.</returns>
16+
IAndMiddlewareFilterAttributeTestBuilder WithType(Type type);
17+
}
18+
}

src/MyTested.AspNetCore.Mvc.Controllers.Attributes/ControllerActionAttributesTestBuilderExtensions.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,57 @@ public static TAttributesTestBuilder SpecifyingProduction<TAttributesTestBuilder
345345
return actualBuilder.AttributesTestBuilder;
346346
}
347347

348+
/// <summary>
349+
/// Tests whether the collected attributes contain <see cref="MiddlewareFilterAttribute"/>.
350+
/// </summary>
351+
/// <param name="controllerActionAttributesTestBuilder">
352+
/// Instance of <see cref="IControllerActionAttributesTestBuilder{TAttributesTestBuilder}"/> type.
353+
/// </param>
354+
/// <param name="configurationType">A type which configures a middleware pipeline.</param>
355+
/// <returns>The same attributes test builder.</returns>
356+
public static TAttributesTestBuilder SpecifyingMiddleware<TAttributesTestBuilder>(
357+
this IControllerActionAttributesTestBuilder<TAttributesTestBuilder> controllerActionAttributesTestBuilder,
358+
Type configurationType)
359+
where TAttributesTestBuilder : IControllerActionAttributesTestBuilder<TAttributesTestBuilder>
360+
=> controllerActionAttributesTestBuilder
361+
.SpecifyingMiddleware(middleware =>
362+
middleware.WithType(configurationType));
363+
364+
/// <summary>
365+
/// Tests whether the collected attributes contain <see cref="MiddlewareFilterAttribute"/>.
366+
/// </summary>
367+
/// <param name="controllerActionAttributesTestBuilder">
368+
/// Instance of <see cref="IControllerActionAttributesTestBuilder{TAttributesTestBuilder}"/> type.
369+
/// </param>
370+
/// <param name="middlewareFilterAttributeBuilder">Expected <see cref="MiddlewareFilterAttribute"/> builder.</param>
371+
/// <returns>The same attributes test builder.</returns>
372+
public static TAttributesTestBuilder SpecifyingMiddleware<TAttributesTestBuilder>(
373+
this IControllerActionAttributesTestBuilder<TAttributesTestBuilder> controllerActionAttributesTestBuilder,
374+
Action<IMiddlewareFilterAttributeTestBuilder> middlewareFilterAttributeBuilder)
375+
where TAttributesTestBuilder : IControllerActionAttributesTestBuilder<TAttributesTestBuilder>
376+
{
377+
var actualBuilder = (BaseAttributesTestBuilder<TAttributesTestBuilder>)controllerActionAttributesTestBuilder;
378+
379+
actualBuilder.ContainingAttributeOfType<MiddlewareFilterAttribute>();
380+
381+
actualBuilder.Validations.Add(attrs =>
382+
{
383+
var newMiddlewareFilterAttributeBuilder = new MiddlewareFilterAttributeTestBuilder(
384+
actualBuilder.TestContext,
385+
actualBuilder.ThrowNewAttributeAssertionException);
386+
387+
middlewareFilterAttributeBuilder(newMiddlewareFilterAttributeBuilder);
388+
389+
var expectedAttribute = newMiddlewareFilterAttributeBuilder.GetAttribute();
390+
var actualAttribute = actualBuilder.GetAttributeOfType<MiddlewareFilterAttribute>(attrs);
391+
392+
var validations = newMiddlewareFilterAttributeBuilder.GetAttributeValidations();
393+
validations.ForEach(v => v(expectedAttribute, actualAttribute));
394+
});
395+
396+
return actualBuilder.AttributesTestBuilder;
397+
}
398+
348399
/// <summary>
349400
/// Tests whether the collected attributes contain <see cref="RequireHttpsAttribute"/>.
350401
/// </summary>

test/MyTested.AspNetCore.Mvc.Abstractions.Test/UtilitiesTests/ExpressionParserTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ public void GetMethodAttributesShouldReturnProperAttributes()
153153
};
154154

155155
Assert.NotNull(attributes);
156-
Assert.Equal(8, attributes.Count);
156+
Assert.Equal(9, attributes.Count);
157157

158158
var allAttributesArePresent = expectedTypes.All(attributes.Contains);
159159
Assert.True(allAttributesArePresent);

test/MyTested.AspNetCore.Mvc.Controllers.Attributes.Test/BuildersTests/AttributesTests/ActionAttributesTestBuilderTests.cs

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using Exceptions;
55
using Microsoft.AspNetCore.Mvc;
6+
using Setups.Pipelines;
67
using Setups;
78
using Setups.Controllers;
89
using Setups.Models;
@@ -549,6 +550,140 @@ public void SpecifyingProductionShouldThrowExceptionWithCorrectAttributeAndWrong
549550
"When calling Post action in ApiController expected action to have ProducesAttribute with order of 1, but in fact found 2.");
550551
}
551552

553+
[Fact]
554+
public void SpecifyingMiddlewareShouldNotThrowExceptionWithCorrectAttribute()
555+
{
556+
MyController<MvcController>
557+
.Instance()
558+
.Calling(c => c.VariousAttributesAction())
559+
.ShouldHave()
560+
.ActionAttributes(attributes => attributes
561+
.SpecifyingMiddleware(typeof(MyPipeline)));
562+
}
563+
564+
[Fact]
565+
public void SpecifyingMiddlewareShouldThrowExceptionWithMissingAttribute()
566+
{
567+
Test.AssertException<AttributeAssertionException>(
568+
() =>
569+
{
570+
MyController<MvcController>
571+
.Instance()
572+
.Calling(c => c.NormalActionWithAttributes())
573+
.ShouldHave()
574+
.ActionAttributes(attributes => attributes
575+
.SpecifyingMiddleware(typeof(MyPipeline)));
576+
},
577+
"When calling NormalActionWithAttributes action in MvcController expected action to have MiddlewareFilterAttribute, but in fact such was not found.");
578+
}
579+
580+
[Fact]
581+
public void SpecifyingMiddlewareShouldThrowExceptionWithCorrectAttributeAndWrongConfigurationType()
582+
{
583+
Test.AssertException<AttributeAssertionException>(
584+
() =>
585+
{
586+
MyController<MvcController>
587+
.Instance()
588+
.Calling(c => c.VariousAttributesAction())
589+
.ShouldHave()
590+
.ActionAttributes(attributes => attributes
591+
.SpecifyingMiddleware(typeof(MyOtherPipeline)));
592+
},
593+
"When calling VariousAttributesAction action in MvcController expected action to have MiddlewareFilterAttribute with 'MyOtherPipeline' type, but in fact found 'MyPipeline'.");
594+
}
595+
596+
[Fact]
597+
public void SpecifyingMiddlewareShouldNotThrowExceptionWithCorrectAttributeConfigurationType()
598+
{
599+
MyController<MvcController>
600+
.Instance()
601+
.Calling(c => c.VariousAttributesAction())
602+
.ShouldHave()
603+
.ActionAttributes(attributes => attributes
604+
.SpecifyingMiddleware(middleware =>
605+
middleware.WithType(typeof(MyPipeline))));
606+
}
607+
608+
[Fact]
609+
public void SpecifyingMiddlewareShouldThrowExceptionWithWrongConfigurationType()
610+
{
611+
Test.AssertException<AttributeAssertionException>(
612+
() =>
613+
{
614+
MyController<MvcController>
615+
.Instance()
616+
.Calling(c => c.VariousAttributesAction())
617+
.ShouldHave()
618+
.ActionAttributes(attributes => attributes
619+
.SpecifyingMiddleware(middleware =>
620+
middleware.WithType(typeof(MyOtherPipeline))));
621+
},
622+
"When calling VariousAttributesAction action in MvcController expected action to have MiddlewareFilterAttribute with 'MyOtherPipeline' type, but in fact found 'MyPipeline'.");
623+
}
624+
625+
[Fact]
626+
public void SpecifyingMiddlewareShouldThrowExceptionWithCorrectAttributeAndWrongOrder()
627+
{
628+
Test.AssertException<AttributeAssertionException>(
629+
() =>
630+
{
631+
MyController<MvcController>
632+
.Instance()
633+
.Calling(c => c.VariousAttributesAction())
634+
.ShouldHave()
635+
.ActionAttributes(attributes => attributes
636+
.SpecifyingMiddleware(middleware =>
637+
middleware.WithOrder(1)));
638+
},
639+
"When calling VariousAttributesAction action in MvcController expected action to have MiddlewareFilterAttribute with order of 1, but in fact found 2.");
640+
}
641+
642+
[Fact]
643+
public void SpecifyingMiddlewareShouldNotThrowExceptionWithCorrectAttributeTypeAndUsingBuilderForOrder()
644+
{
645+
MyController<MvcController>
646+
.Instance()
647+
.Calling(c => c.VariousAttributesAction())
648+
.ShouldHave()
649+
.ActionAttributes(attributes => attributes
650+
.SpecifyingMiddleware(middleware =>
651+
middleware.WithOrder(2)));
652+
}
653+
654+
[Fact]
655+
public void SpecifyingMiddlewareShouldNotThrowExceptionWithCorrectAttributeConfigTypeAndUsingBuilderForOrder()
656+
{
657+
MyController<MvcController>
658+
.Instance()
659+
.Calling(c => c.VariousAttributesAction())
660+
.ShouldHave()
661+
.ActionAttributes(attributes => attributes
662+
.SpecifyingMiddleware(middleware => middleware
663+
.WithType(typeof(MyPipeline))
664+
.AndAlso()
665+
.WithOrder(2)));
666+
}
667+
668+
[Fact]
669+
public void SpecifyingMiddlewareShouldThrowExceptionWithCorrectAttributeConfigTypeAndUsingBuilderForOrderWithWrongOrder()
670+
{
671+
Test.AssertException<AttributeAssertionException>(
672+
() =>
673+
{
674+
MyController<MvcController>
675+
.Instance()
676+
.Calling(c => c.VariousAttributesAction())
677+
.ShouldHave()
678+
.ActionAttributes(attributes => attributes
679+
.SpecifyingMiddleware(middleware => middleware
680+
.WithType(typeof(MyPipeline))
681+
.AndAlso()
682+
.WithOrder(1)));
683+
},
684+
"When calling VariousAttributesAction action in MvcController expected action to have MiddlewareFilterAttribute with order of 1, but in fact found 2.");
685+
}
686+
552687
[Fact]
553688
public void RequiringHttpsShouldNotThrowExceptionWithTheAttribute()
554689
{

test/MyTested.AspNetCore.Mvc.Controllers.Test/BuildersTests/AndTests/AndProvideTestBuilderTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public void AndProvideShouldReturnProperActionAttributes()
4747
.AndAlso()
4848
.ShouldPassForThe<ActionAttributes>(attributes =>
4949
{
50-
Assert.Equal(8, attributes.Count());
50+
Assert.Equal(9, attributes.Count());
5151
});
5252
}
5353

test/MyTested.AspNetCore.Mvc.Test.Setups/Controllers/MvcController.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using Microsoft.Extensions.FileProviders;
2020
using Microsoft.Net.Http.Headers;
2121
using Models;
22+
using Pipelines;
2223
using Newtonsoft.Json;
2324
using Services;
2425

@@ -328,6 +329,7 @@ public IActionResult NormalActionWithAttributes()
328329
VaryByQueryKeys = new[] { "FirstQuery", "SecondQuery" },
329330
NoStore = true,
330331
Order = 2)]
332+
[MiddlewareFilter(typeof(MyPipeline), Order = 2)]
331333
public IActionResult VariousAttributesAction()
332334
{
333335
return this.Ok();
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace MyTested.AspNetCore.Mvc.Test.Setups.Pipelines
2+
{
3+
using Microsoft.AspNetCore.Builder;
4+
5+
public class MyOtherPipeline
6+
{
7+
public void Configure(IApplicationBuilder applicationBuilder)
8+
{
9+
}
10+
}
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace MyTested.AspNetCore.Mvc.Test.Setups.Pipelines
2+
{
3+
using Microsoft.AspNetCore.Builder;
4+
5+
public class MyPipeline
6+
{
7+
public void Configure(IApplicationBuilder applicationBuilder)
8+
{
9+
}
10+
}
11+
}

0 commit comments

Comments
 (0)