示例#1
0
        public async Task RespectDownstreamHttpVersionRouteSetting()
        {
            // Arrange
            const string version     = "v1";
            const string key         = "projects";
            HttpContext  httpContext = GetHttpContext(requestPath: $"/{version}/{key}");

            var next = new TestRequestDelegate();

            // What is being tested
            var swaggerForOcelotOptions = new SwaggerForOcelotUIOptions();
            TestSwaggerEndpointOptions swaggerEndpointOptions = CreateSwaggerEndpointOptions(key, version);
            var routeOptions = new TestRouteOptions(new List <RouteOptions>
            {
                new RouteOptions
                {
                    SwaggerKey             = "projects",
                    UpstreamPathTemplate   = "/api/projects/Projects",
                    DownstreamPathTemplate = "/api/Projects",
                    DownstreamHttpVersion  = "2.0",
                }
            });

            // downstreamSwagger is returned when client.GetStringAsync is called by the middleware.
            string downstreamSwagger = await GetBaseOpenApi("OpenApiWithVersionPlaceholderBase");

            HttpClient httClientMock     = GetHttpClient(downstreamSwagger);
            var        httpClientFactory = new TestHttpClientFactory(httClientMock);

            var swaggerJsonTransformerMock = new Mock <ISwaggerJsonTransformer>();

            swaggerJsonTransformerMock
            .Setup(x => x.Transform(
                       It.IsAny <string>(),
                       It.IsAny <IEnumerable <RouteOptions> >(),
                       It.IsAny <string>()))
            .Returns((
                         string swaggerJson,
                         IEnumerable <RouteOptions> routeOptions,
                         string serverOverride) => new SwaggerJsonTransformer()
                     .Transform(swaggerJson, routeOptions, serverOverride));
            var swaggerForOcelotMiddleware = new SwaggerForOcelotMiddleware(
                next.Invoke,
                swaggerForOcelotOptions,
                routeOptions,
                swaggerJsonTransformerMock.Object);

            // Act
            await swaggerForOcelotMiddleware.Invoke(
                httpContext,
                new SwaggerEndPointProvider(swaggerEndpointOptions, OcelotSwaggerGenOptions.Default),
                new DownstreamSwaggerDocsRepository(Microsoft.Extensions.Options.Options.Create(swaggerForOcelotOptions),
                                                    httpClientFactory, DummySwaggerServiceDiscoveryProvider.Default));

            httpContext.Response.Body.Seek(0, SeekOrigin.Begin);

            // Assert
            httClientMock.DefaultRequestVersion.Should().BeEquivalentTo(new Version(2, 0));
        }
示例#2
0
        public async Task AllowUserDefinedUpstreamTransformer()
        {
            // Arrange
            const string version     = "v1";
            const string key         = "projects";
            HttpContext  httpContext = GetHttpContext(requestPath: $"/{version}/{key}");

            var next = new TestRequestDelegate();

            // What is being tested
            var swaggerForOcelotOptions = new SwaggerForOcelotUIOptions()
            {
                ReConfigureUpstreamSwaggerJson = ExampleUserDefinedUpstreamTransformer
            };
            TestSwaggerEndpointOptions testSwaggerEndpointOptions = CreateSwaggerEndpointOptions(key, version);
            var routeOptions = new TestRouteOptions();

            // downstreamSwagger is returned when client.GetStringAsync is called by the middleware.
            string downstreamSwagger = await GetBaseOpenApi("OpenApiBase");

            HttpClient httClientMock     = GetHttpClient(downstreamSwagger);
            var        httpClientFactory = new TestHttpClientFactory(httClientMock);

            // upstreamSwagger is returned after swaggerJsonTransformer transforms the downstreamSwagger
            string upstreamSwagger = await GetBaseOpenApi("OpenApiBaseTransformed");

            var swaggerJsonTransformer = new TestSwaggerJsonTransformer(upstreamSwagger);

            var swaggerForOcelotMiddleware = new SwaggerForOcelotMiddleware(
                next.Invoke,
                swaggerForOcelotOptions,
                routeOptions,
                swaggerJsonTransformer,
                Substitute.For <ISwaggerProvider>());

            // Act
            await swaggerForOcelotMiddleware.Invoke(
                httpContext,
                new SwaggerEndPointProvider(testSwaggerEndpointOptions, OcelotSwaggerGenOptions.Default),
                new DownstreamSwaggerDocsRepository(Microsoft.Extensions.Options.Options.Create(swaggerForOcelotOptions),
                                                    httpClientFactory, DummySwaggerServiceDiscoveryProvider.Default));

            httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
            string transformedUpstreamSwagger = await new StreamReader(httpContext.Response.Body).ReadToEndAsync();

            // Assert
            AreEqual(transformedUpstreamSwagger, upstreamSwagger);
        }
示例#3
0
        public async Task AllowVersionPlaceholder()
        {
            // Arrange
            const string version     = "v1";
            const string key         = "projects";
            HttpContext  httpContext = GetHttpContext(requestPath: $"/{version}/{key}");

            var next = new TestRequestDelegate();

            // What is being tested
            var swaggerForOcelotOptions = new SwaggerForOcelotUIOptions();
            TestSwaggerEndpointOptions swaggerEndpointOptions = CreateSwaggerEndpointOptions(key, version);
            var routeOptions = new TestRouteOptions(new List <RouteOptions>
            {
                new RouteOptions
                {
                    SwaggerKey             = "projects",
                    UpstreamPathTemplate   = "/api/{version}/projects/Values/{everything}",
                    DownstreamPathTemplate = "/api/{version}/Values/{everything}",
                },
                new RouteOptions
                {
                    SwaggerKey             = "projects",
                    UpstreamPathTemplate   = "/api/projects/Projects",
                    DownstreamPathTemplate = "/api/Projects",
                },
                new RouteOptions
                {
                    SwaggerKey             = "projects",
                    UpstreamPathTemplate   = "/api/projects/Projects/{everything}",
                    DownstreamPathTemplate = "/api/Projects/{everything}",
                }
            });

            // downstreamSwagger is returned when client.GetStringAsync is called by the middleware.
            string downstreamSwagger = await GetBaseOpenApi("OpenApiWithVersionPlaceholderBase");

            HttpClient httClientMock     = GetHttpClient(downstreamSwagger);
            var        httpClientFactory = new TestHttpClientFactory(httClientMock);

            // upstreamSwagger is returned after swaggerJsonTransformer transforms the downstreamSwagger
            string expectedSwagger = await GetBaseOpenApi("OpenApiWithVersionPlaceholderBaseTransformed");

            var swaggerJsonTransformerMock = new Mock <ISwaggerJsonTransformer>();

            swaggerJsonTransformerMock
            .Setup(x => x.Transform(
                       It.IsAny <string>(),
                       It.IsAny <IEnumerable <RouteOptions> >(),
                       It.IsAny <string>(),
                       It.IsAny <bool>()))
            .Returns((
                         string swaggerJson,
                         IEnumerable <RouteOptions> routeOptions,
                         string serverOverride,
                         bool servers) => new SwaggerJsonTransformer()
                     .Transform(swaggerJson, routeOptions, serverOverride, servers));
            var swaggerForOcelotMiddleware = new SwaggerForOcelotMiddleware(
                next.Invoke,
                swaggerForOcelotOptions,
                routeOptions,
                swaggerJsonTransformerMock.Object);

            // Act
            await swaggerForOcelotMiddleware.Invoke(
                httpContext,
                new SwaggerEndPointProvider(swaggerEndpointOptions, OcelotSwaggerGenOptions.Default),
                new DownstreamSwaggerDocsRepository(Microsoft.Extensions.Options.Options.Create(swaggerForOcelotOptions),
                                                    httpClientFactory, DummySwaggerServiceDiscoveryProvider.Default));

            httpContext.Response.Body.Seek(0, SeekOrigin.Begin);

            // Assert
            using (var streamReader = new StreamReader(httpContext.Response.Body))
            {
                string transformedUpstreamSwagger = await streamReader.ReadToEndAsync();

                AreEqual(transformedUpstreamSwagger, expectedSwagger);
            }
            swaggerJsonTransformerMock.Verify(x => x.Transform(
                                                  It.IsAny <string>(),
                                                  It.IsAny <IEnumerable <RouteOptions> >(),
                                                  It.IsAny <string>(), It.IsAny <bool>()), Times.Once);
        }