public async Task Starts_And_Stops()
        {
            // arrange
            var config = new ConfigurationBuilder()
                         .AddInMemoryCollection(new Dictionary <string, string>
            {
            })
                         .Build();

            // act
            var api = new SupportApiHostedService(
                config,
                Mock.Of <ILoggerProvider>(_ => _.CreateLogger(It.IsAny <string>()) == Mock.Of <ILogger>()),
                Mock.Of <IClusterClient>(),
                Mock.Of <INetworkPortFinder>());

            // assert - white box
            var host = api.GetType().GetField("_host", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(api) as IWebHost;

            Assert.NotNull(host);

            // assert the service starts
            await api.StartAsync(new CancellationToken());

            // assert the api stops
            await api.StopAsync(new CancellationToken());

            // if it did not crash yet we are good
            Assert.True(true);
        }
        public void Uses_ApiOptions()
        {
            // arrange
            var config = new ConfigurationBuilder()
                         .AddInMemoryCollection(new Dictionary <string, string>
            {
                { "Api:Title", "SomeTitle" }
            })
                         .Build();

            // act
            var api = new SupportApiHostedService(
                config,
                Mock.Of <ILoggerProvider>(),
                Mock.Of <IClusterClient>(),
                Mock.Of <INetworkPortFinder>());

            // assert - white box
            var host = api.GetType().GetField("_host", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(api) as IWebHost;

            Assert.NotNull(host);

            // assert the cluster client is there
            var options = host.Services.GetService <IOptions <SupportApiOptions> >();

            Assert.Equal("SomeTitle", options.Value.Title);
        }
        public void Uses_Kestrel()
        {
            // arrange
            var config = new ConfigurationBuilder()
                         .AddInMemoryCollection(new Dictionary <string, string>
            {
                { "Api:Port:Start", "55555" },
                { "Api:Port:End", "55555" }
            })
                         .Build();

            // act
            var api = new SupportApiHostedService(
                config,
                Mock.Of <ILoggerProvider>(),
                Mock.Of <IClusterClient>(),
                Mock.Of <INetworkPortFinder>(_ => _.GetAvailablePortFrom(55555, 55555) == 55555));

            // assert - white box
            var host = api.GetType().GetField("_host", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(api) as IWebHost;

            Assert.NotNull(host);

            // assert kestrel is there
            Assert.NotNull(host.Services.GetService <IOptions <KestrelServerOptions> >());
        }
        public void Uses_ClusterClient()
        {
            // arrange
            var config = new ConfigurationBuilder()
                         .AddInMemoryCollection(new Dictionary <string, string>
            {
            })
                         .Build();
            var client = Mock.Of <IClusterClient>();

            // act
            var api = new SupportApiHostedService(
                config,
                Mock.Of <ILoggerProvider>(),
                client,
                Mock.Of <INetworkPortFinder>());

            // assert - white box
            var host = api.GetType().GetField("_host", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(api) as IWebHost;

            Assert.NotNull(host);

            // assert the cluster client is there
            Assert.Same(client, host.Services.GetService <IClusterClient>());
        }