public async Task RetrieveToken_IsInCache_ReturnedFromCache()
        {
            var accessToken = "token1";
            var token       = new OioIdwsToken
            {
                CertificateThumbprint = "cert1",
                ExpiresUtc            = DateTimeOffset.UtcNow.AddHours(1),
            };

            var cacheMock = new Mock <ITokenCache>();

            cacheMock
            .Setup(x => x.RetrieveAsync(accessToken))
            .ReturnsAsync(token);

            Func <HttpClient> clientFactory = () => new HttpClient();
            var sut = new RestTokenProvider(clientFactory, cacheMock.Object);

            sut.Initialize(null, null, new Mock <ILogger>().Object);
            var tokenResult = await sut.RetrieveTokenAsync(accessToken);

            Assert.IsTrue(tokenResult.Success);
            Assert.AreEqual(token.CertificateThumbprint, tokenResult.Result.CertificateThumbprint);
            cacheMock.Verify(x => x.RetrieveAsync(accessToken));
        }
        public async Task RetrieveToken_ExpiredAccessToken_ReturnsExpired()
        {
            var accessToken = "token1";

            var cacheMock = new Mock <ITokenCache>();

            var handler = TokenHandler.ExpiredToken();

            Func <HttpClient> clientFactory = () => new HttpClient(handler)
            {
                BaseAddress = new Uri("http://dummy")
            };

            var sut = new RestTokenProvider(clientFactory, cacheMock.Object);

            sut.Initialize(null, null, new Mock <ILogger>().Object);
            var tokenResult = await sut.RetrieveTokenAsync(accessToken);

            Assert.IsFalse(tokenResult.Success);
            Assert.IsTrue(tokenResult.Expired);
        }
        public async Task RetrieveToken_UnknownAccessToken_ReturnsNothing()
        {
            var accessToken = "token1";

            var cacheMock = new Mock <ITokenCache>();

            var handler = new TokenHandler(null); //no token returned, i.e 404

            Func <HttpClient> clientFactory = () => new HttpClient(handler)
            {
                BaseAddress = new Uri("http://dummy")
            };

            var sut = new RestTokenProvider(clientFactory, cacheMock.Object);

            sut.Initialize(null, null, new Mock <ILogger>().Object);
            var tokenResult = await sut.RetrieveTokenAsync(accessToken);

            Assert.IsFalse(tokenResult.Success);
            Assert.IsFalse(tokenResult.Expired);
            Assert.IsNull(tokenResult.Result);
        }
        public async Task RetrieveToken_IsInCacheButExpired_ReturnedFromRestInvocation()
        {
            var accessToken  = "token1";
            var expiredToken = new OioIdwsToken
            {
                CertificateThumbprint = "cert1",
                ExpiresUtc            = DateTimeOffset.UtcNow.AddHours(-1),
            };

            var validToken = new OioIdwsToken
            {
                CertificateThumbprint = "cert2",
                ExpiresUtc            = DateTimeOffset.UtcNow.AddHours(1),
            };

            var cacheMock = new Mock <ITokenCache>();

            cacheMock
            .Setup(x => x.RetrieveAsync(accessToken))
            .ReturnsAsync(expiredToken);

            var handler = new TokenHandler(validToken);

            Func <HttpClient> clientFactory = () => new HttpClient(handler)
            {
                BaseAddress = new Uri("http://dummy")
            };

            var sut = new RestTokenProvider(clientFactory, cacheMock.Object);

            sut.Initialize(null, null, new Mock <ILogger>().Object);
            var tokenResult = await sut.RetrieveTokenAsync(accessToken);

            Assert.IsTrue(tokenResult.Success);
            Assert.AreEqual(validToken.CertificateThumbprint, tokenResult.Result.CertificateThumbprint);
            cacheMock.Verify(x => x.RetrieveAsync(accessToken));
        }