Beispiel #1
0
        public async Task Dispose_SetsStateToStopped()
        {
            var apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
            var apiSimulator = new ApiSimulator(apiBuilder);
            await apiSimulator.StartAsync();

            apiSimulator.Dispose();

            apiSimulator.State.ShouldBe(SimulatorState.Stopped);
        }
Beispiel #2
0
        public void Constructor_SetXmlSettingsFromApiBuilder()
        {
            var apiBuilder  = new ApiBuilder(Substitute.For <ISimulation>());
            var xmlSettings = new XmlWriterSettings();

            apiBuilder.SetXmlSettings(xmlSettings);

            var apiSimulator = new ApiSimulator(apiBuilder);

            apiSimulator.Settings.XmlSettings.ShouldBeSameAs(xmlSettings);
        }
Beispiel #3
0
        public void Constructor_SetDefaultHandlerFromApiBuilder()
        {
            var        apiBuilder = new ApiBuilder(Substitute.For <ISimulation>());
            ApiHandler handler    = _ => Task.FromResult <ApiResponse>(null);

            apiBuilder.SetDefaultHandler(handler);

            var apiSimulator = new ApiSimulator(apiBuilder);

            apiSimulator.Settings.DefaultHandler.ShouldBeSameAs(handler);
        }
Beispiel #4
0
        public void Constructor_SetJsonSettingsFromApiBuilder()
        {
            var apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
            var jsonSettings = new JsonSerializerOptions();

            apiBuilder.SetJsonSettings(jsonSettings);

            var apiSimulator = new ApiSimulator(apiBuilder);

            apiSimulator.Settings.JsonSettings.ShouldBeSameAs(jsonSettings);
        }
Beispiel #5
0
        public void StartAsync_Fails_WhenHostCannotBeBuilt()
        {
            ILoggerProvider fakeLogger = Substitute.For <ILoggerProvider>();

            fakeLogger.CreateLogger(Arg.Any <string>()).Returns(_ => throw new NotSupportedException());

            var apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
            var apiSimulator = new ApiSimulator(apiBuilder.SetLoggerProvider(fakeLogger));

            apiSimulator.StartAsync().ShouldThrow <NotSupportedException>();
            apiSimulator.State.ShouldBe(SimulatorState.Stopped);
        }
Beispiel #6
0
        public async Task Dispose_DoesNotThrow_WhenSimulatorRunning()
        {
            var apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
            var apiSimulator = new ApiSimulator(apiBuilder);

            await apiSimulator.StartAsync();

            await Task.Delay(100);

            Action action = () => apiSimulator.Dispose();

            action.ShouldNotThrow();
        }
Beispiel #7
0
        public void Dispose_DoesNotThrow_WhenCertificateNotSet()
        {
            ApiBuilder apiBuilder = new ApiBuilder(Substitute.For <ISimulation>())
                                    .SetCertificate(null);
            var apiSimulator = new ApiSimulator(apiBuilder);

            Action action = () => apiSimulator.Dispose();

            apiSimulator.ShouldSatisfyAllConditions(
                () => apiSimulator.Settings.Certificate.ShouldBeNull(),
                () => action.ShouldNotThrow()
                );
        }
Beispiel #8
0
        public void Dispose_DoesNotThrow_WhenCalledTwice()
        {
            var apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
            var apiSimulator = new ApiSimulator(apiBuilder);

            Action action = () =>
            {
                apiSimulator.Dispose();
                apiSimulator.Dispose();
            };

            action.ShouldNotThrow();
        }
Beispiel #9
0
        public void Constructor_SetsCopyOfHandlersFromApiBuilder()
        {
            var        apiBuilder = new ApiBuilder(Substitute.For <ISimulation>());
            ApiHandler handler    = _ => Task.FromResult <ApiResponse>(null);

            apiBuilder.AddHandler("GET /a", handler);
            var apiSimulator = new ApiSimulator(apiBuilder);

            apiBuilder.AddHandler("GET /b", handler);

            apiSimulator.Settings.Handlers["GET /a"].ShouldBeSameAs(handler);
            apiSimulator.Settings.Handlers["GET /b"].ShouldBeNull();
        }
Beispiel #10
0
        public async Task StartAsync_SetsStateToRunning()
        {
            var apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
            var apiSimulator = new ApiSimulator(apiBuilder);

            await apiSimulator.StartAsync();

            try
            {
                apiSimulator.State.ShouldBe(SimulatorState.Running);
            }
            finally
            {
                await apiSimulator.StopAsync();
            }
        }
Beispiel #11
0
        public async Task StartAsync_ReportsActiveLocation()
        {
            var apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
            var apiSimulator = new ApiSimulator(apiBuilder);

            await apiSimulator.StartAsync();

            try
            {
                apiSimulator.Location.ShouldNotBeNullOrEmpty();
            }
            finally
            {
                await apiSimulator.StopAsync();
            }
        }
Beispiel #12
0
        public async Task StartAsync_ReportsActivePort()
        {
            var apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
            var apiSimulator = new ApiSimulator(apiBuilder);

            await apiSimulator.StartAsync();

            try
            {
                apiSimulator.Port.ShouldNotBe(0);
            }
            finally
            {
                await apiSimulator.StopAsync();
            }
        }
Beispiel #13
0
        public async Task Abort_SetsStateToStopped()
        {
            var apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
            var apiSimulator = new ApiSimulator(apiBuilder);

            await apiSimulator.StartAsync();

            try
            {
                apiSimulator.Abort();
                apiSimulator.State.ShouldBe(SimulatorState.Stopped);
            }
            finally
            {
                await apiSimulator.StopAsync();
            }
        }
Beispiel #14
0
        public async Task ReceivedApiCalls_GetsAllRecordedApiCalls()
        {
            ApiBuilder apiBuilder = new ApiBuilder(Substitute.For <ISimulation>())
                                    .AddHandler("GET /api/v2/books", _ => throw new Exception());
            var apiSimulator = new ApiSimulator(apiBuilder);

            try
            {
                await apiSimulator.StartAsync();

                var port = apiSimulator.Port;

                using var httpClient = new HttpClient();
                var task1 = Task.Run(async() =>
                {
                    var request = new HttpRequestMessage(HttpMethod.Get, $"http://localhost:{port}/api/v2/books");
                    await httpClient.SendAsync(request);
                });
                var task2 = Task.Run(async() =>
                {
                    var request = new HttpRequestMessage(HttpMethod.Patch, $"http://localhost:{port}/api/v2/books/32")
                    {
                        Content = new StringContent("{\"title\":\"abc\"}", Encoding.UTF8, "application/json")
                    };
                    await httpClient.SendAsync(request);
                });
                await Task.WhenAll(task1, task2);
            }
            finally
            {
                await apiSimulator.StopAsync();
            }

            System.Collections.Generic.IReadOnlyCollection <ApiCall> apiCalls = apiSimulator.ReceivedApiCalls;
            ApiCall getCall = apiCalls.FirstOrDefault(call => call.Action == "GET /api/v2/books");

            apiCalls.ShouldSatisfyAllConditions(
                () => getCall.ShouldNotBeNull(),
                () => getCall.Exception.ShouldNotBeNull(),
                () => apiCalls.Count.ShouldBe(2),
                () => apiCalls
                .Single(call => call.Action == "PATCH /api/v2/books/32")
                .ShouldNotBeNull()
                );
        }
Beispiel #15
0
        public async Task StartAsync_DoesNotThrow_WhenCalledMultipleTimes()
        {
            var apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
            var apiSimulator = new ApiSimulator(apiBuilder);

            await apiSimulator.StartAsync();

            try
            {
                await apiSimulator.StartAsync();

                await Task.Delay(150);
            }
            finally
            {
                await apiSimulator.StopAsync();
            }
        }
Beispiel #16
0
        public async Task StartAsync_Fails_WhenPortAlreadyUsed()
        {
            var listener = new TcpListener(IPAddress.Loopback, 0);

            listener.Start();
            try
            {
                var usedPort     = ((IPEndPoint)listener.LocalEndpoint).Port;
                var apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
                var apiSimulator = new ApiSimulator(apiBuilder.SetPort(usedPort));

                await apiSimulator.StartAsync().ShouldThrowAsync <IOException>();
            }
            finally
            {
                listener.Stop();
            }
        }
Beispiel #17
0
        public async Task StartAsync_UsesCertificate_WhenSpecified()
        {
            using X509Certificate2 certificate = TestCertificate.Find();
            ApiBuilder apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>()).SetCertificate(certificate);
            var        apiSimulator = new ApiSimulator(apiBuilder);

            await apiSimulator.StartAsync();

            try
            {
                apiSimulator.Location.ShouldStartWith("https://");
            }
            finally
            {
                await apiSimulator.StopAsync();
            }

            certificate.Reset();
        }
Beispiel #18
0
        public void Request_InstantiatesMiddleware()
        {
            var         apiBuilder   = new ApiBuilder(Substitute.For <ISimulation>());
            var         apiSimulator = new ApiSimulator(apiBuilder);
            Func <Task> action       = async() =>
            {
                try
                {
                    await apiSimulator.StartAsync();

                    var port = apiSimulator.Port;

                    using var httpClient = new HttpClient();
                    var request = new HttpRequestMessage(HttpMethod.Get, $"http://localhost:{port}/version");
                    await httpClient.SendAsync(request);
                }
                finally
                {
                    await apiSimulator.StopAsync();
                }
            };

            action.ShouldNotThrow();
        }