private IApiClient CreateClient(IAuthenticationHandler authenticationHandler = null)
        {
            if (authenticationHandler == null)
            {
                authenticationHandler = new MockAuthenticationHandler();
            }

            return(new ApiClient(new MockApiClientOptions(), authenticationHandler, new XunitLogger(TestOutputHelper), new MockAppInfo(), new MockDeviceInfo()));
        }
        public async Task GetsUserFromToken()
        {
            var authHandler = new MockAuthenticationHandler();
            var client      = CreateClient(authHandler);
            var user        = await client.GetUserAsync();

            Assert.True(authHandler.DidGetToken);
            Assert.NotNull(user);
            Assert.Equal("c652decb-374e-4a34-b6e0-c0d377436a71", user.Id);
            Assert.Equal("John", user.FirstName);
            Assert.Equal("Doe", user.LastName);
            Assert.Equal(new DateTime(2018, 1, 18, 1, 30, 22), user.IssuedAt);
        }
        public async Task AllowAnnonymousDoesNotInvokeAuthHandler()
        {
            using (new MockServer(MockApiClientOptions.TestPort, string.Empty, (req, rsp, prm) =>
            {
                Assert.DoesNotContain("Authorization", req.Headers.AllKeys);
            }))
            {
                var authHandler = new MockAuthenticationHandler();
                var client      = CreateClient(authHandler);

                Assert.False(authHandler.DidGetToken);
                var service = new MockApiService(client);
                await service.MockAnnonymousCall();

                Assert.False(authHandler.DidGetToken);
            }
        }
        public async Task AuthenticatedCallInvokesAuthHandler()
        {
            using (new MockServer(MockApiClientOptions.TestPort, string.Empty, (req, rsp, prm) =>
            {
                foreach (var key in req.Headers.AllKeys)
                {
                    TestOutputHelper.WriteLine(key);
                }
                Assert.Contains("Authorization", req.Headers.AllKeys);
            }))
            {
                var authHandler = new MockAuthenticationHandler();
                var client      = CreateClient(authHandler);

                Assert.False(authHandler.DidGetToken);
                var service = new MockApiService(client);
                await service.MockGet();

                Assert.True(authHandler.DidGetToken);
            }
        }
        public async Task RetriesBadRequest(int statusCode)
        {
            int count = 0;

            using (new MockServer(MockApiClientOptions.TestPort, string.Empty, (req, rsp, prm) =>
            {
                if (count++ < 2)
                {
                    rsp.StatusCode = statusCode;
                }
            }))
            {
                var authHandler = new MockAuthenticationHandler();
                var client      = CreateClient(authHandler);
                var service     = new MockApiService(client);
                var result      = await service.MockGet();

                Assert.True(authHandler.DidGetToken);
                Assert.True(result.IsSuccessStatusCode);
                Assert.Equal(1, authHandler.GetTokenCount);
                Assert.Equal(3, count);
            }
        }