public void Ctor()
        {
            var httpClient = new HttpClient();
            var options    = Options.Create(new AuditTrailClientOptions {
                DeliveryEndpoint = "https://example.com"
            });
            var tokenClientOptions = options.Value.TokenClientOptions;
            var sink          = new TestTokenSink(true);
            var store         = new TestTokenStore();
            var tokenAcquirer = new DefaultAccessTokenAcquirer(new TestLogger <DefaultAccessTokenAcquirer>(), new TokenClient(httpClient, options.Value.TokenClientOptions), options);
            var logger        = new TestLogger <AuditTrailClient>();
            var env           = new TestHostEnvironment();

            var client = new AuditTrailClient("https://example.com", "api", tokenClientOptions);

            client = new AuditTrailClient(httpClient, options, sink, store, logger, tokenAcquirer, env);
            client = new AuditTrailClient(httpClient, options, sink, store, logger, tokenAcquirer);

            Assert.Throws <ArgumentNullException>("eventEndpoint", () => new AuditTrailClient(null !, "api", tokenClientOptions));
            Assert.Throws <ArgumentNullException>("scope", () => new AuditTrailClient("https://example.com", null !, tokenClientOptions));
            Assert.Throws <ArgumentNullException>("tokenClientOptions", () => new AuditTrailClient("https://example.com", "api", null !));
            Assert.Throws <ArgumentNullException>("httpClient", () => new AuditTrailClient(null !, options, sink, store, logger, tokenAcquirer, env));
            Assert.Throws <ArgumentNullException>("options", () => new AuditTrailClient(httpClient, null !, sink, store, logger, tokenAcquirer, env));
            Assert.Throws <ArgumentNullException>("sink", () => new AuditTrailClient(httpClient, options, null !, store, logger, tokenAcquirer, env));
            Assert.Throws <ArgumentNullException>("store", () => new AuditTrailClient(httpClient, options, sink, null !, logger, tokenAcquirer, env));
            Assert.Throws <ArgumentNullException>("logger", () => new AuditTrailClient(httpClient, options, sink, store, null !, tokenAcquirer, env));
            Assert.Throws <ArgumentNullException>("tokenAcquirer", () => new AuditTrailClient(httpClient, options, sink, store, logger, null !, env));
            Assert.Throws <ArgumentException>("options", () => new AuditTrailClient(httpClient, Options.Create(new AuditTrailClientOptions()), sink, store, logger, tokenAcquirer, env));
        }
        public async Task AcquireAccessToken_HttpError_Fail()
        {
            var tokenClient = new TokenClient(new HttpClient(new TestHttpMessageHandler(new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new FailingHttpContent(typeof(HttpRequestException))
            })), new TokenClientOptions()
            {
                Address = "https://example.com"
            });

            var acquirer = new DefaultAccessTokenAcquirer(new TestLogger <DefaultAccessTokenAcquirer>(), tokenClient, Options.Create(new AuditTrailClientOptions()));

            await Assert.ThrowsAsync <HttpRequestException>(() => acquirer.AcquireAccessTokenAsync());
        }
        public async Task AcquireAccessToken_ProtocolError_Fail()
        {
            var tokenClient = new TokenClient(new HttpClient(new TestHttpMessageHandler(new HttpResponseMessage(HttpStatusCode.BadRequest)
            {
                Content = new StringContent(@"{
                   ""error"":""invalid_request""
                }")
            })), new TokenClientOptions()
            {
                Address = "https://example.com"
            });

            var acquirer = new DefaultAccessTokenAcquirer(new TestLogger <DefaultAccessTokenAcquirer>(), tokenClient, Options.Create(new AuditTrailClientOptions()));

            await Assert.ThrowsAsync <HttpRequestException>(() => acquirer.AcquireAccessTokenAsync());
        }
        public async Task AcquireAccessToken_Success()
        {
            var tokenClient = new TokenClient(new HttpClient(new TestHttpMessageHandler(new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(@"{
                   ""access_token"":""2YotnFZFEjr1zCsicMWpAA"",
                   ""token_type"":""example"",
                   ""expires_in"":3600,
                   ""refresh_token"":""tGzv3JOkF0XG5Qx2TlKWIA"",
                }")
            })), new TokenClientOptions()
            {
                Address = "https://example.com"
            });

            var acquirer = new DefaultAccessTokenAcquirer(new TestLogger <DefaultAccessTokenAcquirer>(), tokenClient, Options.Create(new AuditTrailClientOptions()));
            var token    = await acquirer.AcquireAccessTokenAsync();

            Assert.Equal("2YotnFZFEjr1zCsicMWpAA", token);
        }