Skip to content

Commit 600cba5

Browse files
committed
Added ServiceFilterAttributeTestBuilder
1 parent 2d7d6bb commit 600cba5

File tree

13 files changed

+520
-2
lines changed

13 files changed

+520
-2
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
namespace MyTested.AspNetCore.Mvc.Builders.Attributes
2+
{
3+
using System;
4+
using Microsoft.AspNetCore.Mvc;
5+
using Contracts.Attributes;
6+
using Internal.TestContexts;
7+
using Utilities;
8+
9+
/// <summary>
10+
/// Used for testing <see cref="ServiceFilterAttribute"/>.
11+
/// </summary>
12+
public class ServiceFilterAttributeTestBuilder : BaseAttributeTestBuilderWithOrder<ServiceFilterAttribute>,
13+
IAndServiceFilterAttributeTestBuilder
14+
{
15+
/// <summary>
16+
/// Initializes a new instance of the <see cref="ServiceFilterAttributeTestBuilder"/> 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 ServiceFilterAttributeTestBuilder(
21+
ComponentTestContext testContext,
22+
Action<string, string> failedValidationAction)
23+
: base(testContext, nameof(ServiceFilterAttribute), failedValidationAction)
24+
=> this.Attribute = new ServiceFilterAttribute(typeof(object));
25+
26+
/// <inheritdoc />
27+
public IAndServiceFilterAttributeTestBuilder OfType(Type type)
28+
{
29+
this.Attribute = new ServiceFilterAttribute(type);
30+
this.Validations.Add((expected, actual) =>
31+
{
32+
var expectedType = expected.ServiceType;
33+
var actualType = actual.ServiceType;
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+
/// <inheritdoc />
47+
public IAndServiceFilterAttributeTestBuilder WithOrder(int order)
48+
{
49+
this.ValidateOrder(order);
50+
return this;
51+
}
52+
53+
/// <inheritdoc />
54+
public IServiceFilterAttributeTestBuilder AndAlso() => this;
55+
}
56+
}
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.ServiceFilterAttribute"/> tests.
5+
/// </summary>
6+
public interface IAndServiceFilterAttributeTestBuilder : IServiceFilterAttributeTestBuilder
7+
{
8+
/// <summary>
9+
/// AndAlso method for better readability when testing <see cref="Microsoft.AspNetCore.Mvc.ServiceFilterAttribute"/>.
10+
/// </summary>
11+
/// <returns>The same <see cref="IServiceFilterAttributeTestBuilder"/>.</returns>
12+
IServiceFilterAttributeTestBuilder 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.ServiceFilterAttribute"/>.
7+
/// </summary>
8+
public interface IServiceFilterAttributeTestBuilder : IBaseAttributeTestBuilderWithOrder<IAndServiceFilterAttributeTestBuilder>
9+
{
10+
/// <summary>
11+
/// Tests whether a <see cref="Microsoft.AspNetCore.Mvc.ServiceFilterAttribute"/>
12+
/// has the same <see cref="Microsoft.AspNetCore.Mvc.ServiceFilterAttribute.ServiceType"/> value as the provided one.
13+
/// </summary>
14+
/// <param name="type">The <see cref="Type"/> of filter to find.</param>
15+
/// <returns>The same <see cref="IMiddlewareFilterAttributeTestBuilder"/>.</returns>
16+
IAndServiceFilterAttributeTestBuilder OfType(Type type);
17+
}
18+
}

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,56 @@ public static TAttributesTestBuilder SpecifyingMiddleware<TAttributesTestBuilder
395395
return actualBuilder.AttributesTestBuilder;
396396
}
397397

398+
/// <summary>
399+
/// Tests whether the collected attributes contain <see cref="ServiceFilterAttribute"/>.
400+
/// </summary>
401+
/// <param name="controllerActionAttributesTestBuilder">
402+
/// Instance of <see cref="IControllerActionAttributesTestBuilder{TAttributesTestBuilder}"/> type.
403+
/// </param>
404+
/// <param name="type">The <see cref="Type"/> of filter to find.</param>
405+
/// <returns>The same attributes test builder.</returns>
406+
public static TAttributesTestBuilder WithServiceFilter<TAttributesTestBuilder>(
407+
this IControllerActionAttributesTestBuilder<TAttributesTestBuilder> controllerActionAttributesTestBuilder,
408+
Type type)
409+
where TAttributesTestBuilder : IControllerActionAttributesTestBuilder<TAttributesTestBuilder>
410+
=> controllerActionAttributesTestBuilder
411+
.WithServiceFilter(filter => filter.OfType(type));
412+
413+
/// <summary>
414+
/// Tests whether the collected attributes contain <see cref="ServiceFilterAttribute"/>.
415+
/// </summary>
416+
/// <param name="controllerActionAttributesTestBuilder">
417+
/// Instance of <see cref="IControllerActionAttributesTestBuilder{TAttributesTestBuilder}"/> type.
418+
/// </param>
419+
/// <param name="serviceFilterAttributeBuilder">Expected <see cref="ServiceFilterAttribute"/> builder.</param>
420+
/// <returns>The same attributes test builder.</returns>
421+
public static TAttributesTestBuilder WithServiceFilter<TAttributesTestBuilder>(
422+
this IControllerActionAttributesTestBuilder<TAttributesTestBuilder> controllerActionAttributesTestBuilder,
423+
Action<IServiceFilterAttributeTestBuilder> serviceFilterAttributeBuilder)
424+
where TAttributesTestBuilder : IControllerActionAttributesTestBuilder<TAttributesTestBuilder>
425+
{
426+
var actualBuilder = (BaseAttributesTestBuilder<TAttributesTestBuilder>)controllerActionAttributesTestBuilder;
427+
428+
actualBuilder.ContainingAttributeOfType<ServiceFilterAttribute>();
429+
430+
actualBuilder.Validations.Add(attrs =>
431+
{
432+
var newServiceFilterAttributeBuilder = new ServiceFilterAttributeTestBuilder(
433+
actualBuilder.TestContext,
434+
actualBuilder.ThrowNewAttributeAssertionException);
435+
436+
serviceFilterAttributeBuilder(newServiceFilterAttributeBuilder);
437+
438+
var expectedAttribute = newServiceFilterAttributeBuilder.GetAttribute();
439+
var actualAttribute = actualBuilder.GetAttributeOfType<ServiceFilterAttribute>(attrs);
440+
441+
var validations = newServiceFilterAttributeBuilder.GetAttributeValidations();
442+
validations.ForEach(v => v(expectedAttribute, actualAttribute));
443+
});
444+
445+
return actualBuilder.AttributesTestBuilder;
446+
}
447+
398448
/// <summary>
399449
/// Tests whether the collected attributes contain <see cref="RequireHttpsAttribute"/>.
400450
/// </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(9, attributes.Count);
156+
Assert.Equal(10, 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: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Setups;
88
using Setups.Controllers;
99
using Setups.Models;
10+
using Setups.ActionFilters;
1011
using Xunit;
1112

1213
using HttpMethod = System.Net.Http.HttpMethod;
@@ -682,6 +683,174 @@ public void SpecifyingMiddlewareShouldThrowExceptionWithCorrectAttributeConfigTy
682683
"When calling VariousAttributesAction action in MvcController expected action to have MiddlewareFilterAttribute with order of 1, but in fact found 2.");
683684
}
684685

686+
[Fact]
687+
public void WithServiceFilterShouldNotThrowExceptionWithCorrectAttribute()
688+
{
689+
MyApplication.StartsFrom<TestStartup>();
690+
691+
MyController<MvcController>
692+
.Instance()
693+
.Calling(c => c.VariousAttributesAction())
694+
.ShouldHave()
695+
.ActionAttributes(attributes => attributes
696+
.WithServiceFilter(typeof(MyActionFilter)));
697+
698+
MyApplication.StartsFrom<DefaultStartup>();
699+
}
700+
701+
[Fact]
702+
public void WithServiceFilterShouldThrowExceptionWithMissingAttribute()
703+
{
704+
MyApplication.StartsFrom<TestStartup>();
705+
706+
Test.AssertException<AttributeAssertionException>(
707+
() =>
708+
{
709+
MyController<MvcController>
710+
.Instance()
711+
.Calling(c => c.NormalActionWithAttributes())
712+
.ShouldHave()
713+
.ActionAttributes(attributes => attributes
714+
.WithServiceFilter(typeof(MyActionFilter)));
715+
},
716+
"When calling NormalActionWithAttributes action in MvcController expected action to have ServiceFilterAttribute, but in fact such was not found.");
717+
718+
MyApplication.StartsFrom<DefaultStartup>();
719+
}
720+
721+
[Fact]
722+
public void WithServiceFilterShouldThrowExceptionWithCorrectAttributeAndWrongConfigurationType()
723+
{
724+
MyApplication.StartsFrom<TestStartup>();
725+
726+
Test.AssertException<AttributeAssertionException>(
727+
() =>
728+
{
729+
MyController<MvcController>
730+
.Instance()
731+
.Calling(c => c.VariousAttributesAction())
732+
.ShouldHave()
733+
.ActionAttributes(attributes => attributes
734+
.WithServiceFilter(typeof(MyOtherActionFilter)));
735+
},
736+
"When calling VariousAttributesAction action in MvcController expected action to have ServiceFilterAttribute with 'MyOtherActionFilter' type, but in fact found 'MyActionFilter'.");
737+
738+
MyApplication.StartsFrom<DefaultStartup>();
739+
}
740+
741+
[Fact]
742+
public void WithServiceFilterShouldNotThrowExceptionWithCorrectServiceFilterType()
743+
{
744+
MyApplication.StartsFrom<TestStartup>();
745+
746+
MyController<MvcController>
747+
.Instance()
748+
.Calling(c => c.VariousAttributesAction())
749+
.ShouldHave()
750+
.ActionAttributes(attributes => attributes
751+
.WithServiceFilter(filter => filter
752+
.OfType(typeof(MyActionFilter))));
753+
754+
MyApplication.StartsFrom<DefaultStartup>();
755+
}
756+
757+
[Fact]
758+
public void WithServiceFilterShouldThrowExceptionWithWrongServiceFilterType()
759+
{
760+
MyApplication.StartsFrom<TestStartup>();
761+
762+
Test.AssertException<AttributeAssertionException>(
763+
() =>
764+
{
765+
MyController<MvcController>
766+
.Instance()
767+
.Calling(c => c.VariousAttributesAction())
768+
.ShouldHave()
769+
.ActionAttributes(attributes => attributes
770+
.WithServiceFilter(filter => filter
771+
.OfType(typeof(MyOtherActionFilter))));
772+
},
773+
"When calling VariousAttributesAction action in MvcController expected action to have ServiceFilterAttribute with 'MyOtherActionFilter' type, but in fact found 'MyActionFilter'.");
774+
775+
MyApplication.StartsFrom<DefaultStartup>();
776+
}
777+
778+
[Fact]
779+
public void WithServiceFilterShouldThrowExceptionWithCorrectAttributeAndWrongOrder()
780+
{
781+
MyApplication.StartsFrom<TestStartup>();
782+
783+
Test.AssertException<AttributeAssertionException>(
784+
() =>
785+
{
786+
MyController<MvcController>
787+
.Instance()
788+
.Calling(c => c.VariousAttributesAction())
789+
.ShouldHave()
790+
.ActionAttributes(attributes => attributes
791+
.WithServiceFilter(filter => filter.WithOrder(1)));
792+
},
793+
"When calling VariousAttributesAction action in MvcController expected action to have ServiceFilterAttribute with order of 1, but in fact found 2.");
794+
795+
MyApplication.StartsFrom<DefaultStartup>();
796+
}
797+
798+
[Fact]
799+
public void WithServiceFilterShouldNotThrowExceptionWithCorrectAttributeTypeAndUsingBuilderForOrder()
800+
{
801+
MyApplication.StartsFrom<TestStartup>();
802+
803+
MyController<MvcController>
804+
.Instance()
805+
.Calling(c => c.VariousAttributesAction())
806+
.ShouldHave()
807+
.ActionAttributes(attributes => attributes
808+
.WithServiceFilter(filter => filter.WithOrder(2)));
809+
810+
MyApplication.StartsFrom<DefaultStartup>();
811+
}
812+
813+
[Fact]
814+
public void WithServiceFilterShouldNotThrowExceptionWithCorrectAttributeServiceTypeAndUsingBuilderForOrder()
815+
{
816+
MyApplication.StartsFrom<TestStartup>();
817+
818+
MyController<MvcController>
819+
.Instance()
820+
.Calling(c => c.VariousAttributesAction())
821+
.ShouldHave()
822+
.ActionAttributes(attributes => attributes
823+
.WithServiceFilter(filter => filter
824+
.OfType(typeof(MyActionFilter))
825+
.AndAlso()
826+
.WithOrder(2)));
827+
828+
MyApplication.StartsFrom<DefaultStartup>();
829+
}
830+
831+
[Fact]
832+
public void WithServiceFilterShouldThrowExceptionWithCorrectAttributeServiceTypeAndUsingBuilderForOrderWithWrongOrder()
833+
{
834+
MyApplication.StartsFrom<TestStartup>();
835+
836+
Test.AssertException<AttributeAssertionException>(
837+
() =>
838+
{
839+
MyController<MvcController>
840+
.Instance()
841+
.Calling(c => c.VariousAttributesAction())
842+
.ShouldHave()
843+
.ActionAttributes(attributes => attributes
844+
.WithServiceFilter(filter => filter
845+
.OfType(typeof(MyActionFilter))
846+
.AndAlso()
847+
.WithOrder(1)));
848+
},
849+
"When calling VariousAttributesAction action in MvcController expected action to have ServiceFilterAttribute with order of 1, but in fact found 2.");
850+
851+
MyApplication.StartsFrom<DefaultStartup>();
852+
}
853+
685854
[Fact]
686855
public void RequiringHttpsShouldNotThrowExceptionWithTheAttribute()
687856
{

0 commit comments

Comments
 (0)