public async Task apply_should_have_candidate_for_matched_api_version()
        {
            // arrange
            var feature = new Mock <IApiVersioningFeature>();
            var context = new EndpointSelectorContext();
            var items   = new object[]
            {
                new ActionDescriptor()
                {
                    Properties = { [typeof(ApiVersionModel)] = new ApiVersionModel(new ApiVersion(1, 0)) },
                },
            };
            var endpoint   = new Endpoint(c => CompletedTask, new EndpointMetadataCollection(items), default);
            var candidates = new CandidateSet(new[] { endpoint }, new[] { new RouteValueDictionary() }, new[] { 0 });
            var policy     = new ApiVersionMatcherPolicy(NewDefaultOptions(), NewReporter(), NewLoggerFactory());

            feature.SetupProperty(f => f.RequestedApiVersion, new ApiVersion(1, 0));

            var httpContext = NewHttpContext(feature);

            // act
            await policy.ApplyAsync(httpContext, context, candidates);

            // assert
            candidates.IsValidCandidate(0).Should().BeTrue();
        }
        public async Task apply_should_use_400_endpoint_for_ambiguous_api_version()
        {
            // arrange
            var feature        = new Mock <IApiVersioningFeature>();
            var errorResponses = new Mock <IErrorResponseProvider>();
            var result         = new Mock <IActionResult>();

            feature.SetupGet(f => f.RequestedApiVersion).Throws(new AmbiguousApiVersionException("Test", new[] { "1.0", "2.0" }));
            result.Setup(r => r.ExecuteResultAsync(It.IsAny <ActionContext>())).Returns(CompletedTask);
            errorResponses.Setup(er => er.CreateResponse(It.IsAny <ErrorResponseContext>())).Returns(result.Object);

            var options = Options.Create(new ApiVersioningOptions()
            {
                ErrorResponses = errorResponses.Object
            });
            var policy      = new ApiVersionMatcherPolicy(options, NewReporter(), NewLoggerFactory());
            var httpContext = NewHttpContext(feature);
            var context     = new EndpointSelectorContext();
            var candidates  = new CandidateSet(Empty <Endpoint>(), Empty <RouteValueDictionary>(), Empty <int>());

            // act
            await policy.ApplyAsync(httpContext, context, candidates);

            await context.Endpoint.RequestDelegate(httpContext);

            // assert
            result.Verify(r => r.ExecuteResultAsync(It.IsAny <ActionContext>()), Once());
            errorResponses.Verify(er => er.CreateResponse(It.Is <ErrorResponseContext>(c => c.StatusCode == 400 && c.ErrorCode == "AmbiguousApiVersion")), Once());
        }
 public void applies_to_endpoints_should_return_true_for_api_versioned_actions()
 {
     // arrange
     var policy = new ApiVersionMatcherPolicy(NewDefaultOptions(), NewReporter(), NewLoggerFactory());
     var items  = new object[]
     {
         new ActionDescriptor()
         {
             Properties = { [typeof(ApiVersionModel)] = ApiVersionModel.Default },
         },
     };
     var endpoints = new[]
        public async Task apply_should_use_400_endpoint_for_unmatched_api_version()
        {
            // arrange
            var feature        = new Mock <IApiVersioningFeature>();
            var errorResponses = new Mock <IErrorResponseProvider>();
            var result         = new Mock <IActionResult>();

            feature.SetupProperty(f => f.RawRequestedApiVersion, "2.0");
            feature.SetupProperty(f => f.RequestedApiVersion, new ApiVersion(2, 0));
            result.Setup(r => r.ExecuteResultAsync(It.IsAny <ActionContext>())).Returns(CompletedTask);
            errorResponses.Setup(er => er.CreateResponse(It.IsAny <ErrorResponseContext>())).Returns(result.Object);

            var options = Options.Create(new ApiVersioningOptions()
            {
                ErrorResponses = errorResponses.Object
            });
            var policy  = new ApiVersionMatcherPolicy(options, NewReporter(), NewLoggerFactory());
            var context = new EndpointSelectorContext();
            var items   = new object[]
            {
                new ActionDescriptor()
                {
                    DisplayName       = "Test",
                    ActionConstraints = new IActionConstraintMetadata[] { new HttpMethodActionConstraint(new[] { "GET" }) },
                    Properties        = { [typeof(ApiVersionModel)] = new ApiVersionModel(new ApiVersion(1, 0)) },
                },
            };
            var endpoint    = new Endpoint(c => CompletedTask, new EndpointMetadataCollection(items), default);
            var candidates  = new CandidateSet(new[] { endpoint }, new[] { new RouteValueDictionary() }, new[] { 0 });
            var httpContext = NewHttpContext(feature);

            // act
            await policy.ApplyAsync(httpContext, context, candidates);

            await context.Endpoint.RequestDelegate(httpContext);

            // assert
            result.Verify(r => r.ExecuteResultAsync(It.IsAny <ActionContext>()), Once());
            errorResponses.Verify(er => er.CreateResponse(It.Is <ErrorResponseContext>(c => c.StatusCode == 400 && c.ErrorCode == "UnsupportedApiVersion")), Once());
        }