public async Task<AccountSession> AuthenticateWithDiscoveryService(
            MockAuthenticationContextWrapper.AuthenticationResultCallback authenticationResultCallback,
            MockAuthenticationContextWrapper.AuthenticationResultSilentCallback authenticationResultSilentCallback,
            DiscoveryServiceResponse discoveryServiceResponse = null)
        {
            const string serviceEndpointUri = "https://localhost";
            const string serviceResourceId = "https://localhost/resource/";

            if (discoveryServiceResponse == null)
            {
                discoveryServiceResponse = new DiscoveryServiceResponse
                {
                    Value = new List<DiscoveryService>
                    {
                        new DiscoveryService
                        {
                            Capability = Constants.Authentication.MyFilesCapability,
                            ServiceApiVersion = this.serviceInfo.OneDriveServiceEndpointVersion,
                            ServiceEndpointUri = serviceEndpointUri,
                            ServiceResourceId = serviceResourceId,
                        }
                    }
                };
            }

            var requestBodyString = this.serializer.SerializeObject(discoveryServiceResponse);

            AccountSession accountSession;

            using (var stringContent = new StringContent(requestBodyString))
            {
                this.httpResponseMessage.Content = stringContent;
                this.authenticationProvider.authenticationContextWrapper = new MockAuthenticationContextWrapper
                {
                    AcquireTokenAsyncCallback = authenticationResultCallback,
                    AcquireTokenSilentAsyncCallback = authenticationResultSilentCallback,
                };

                accountSession = await this.authenticationProvider.AuthenticateAsync();
            }

            return accountSession;
        }
        public async Task<AccountSession> AuthenticateWithDiscoveryService(
            MockAuthenticationContextWrapper mockAuthenticationContextWrapper,
            DiscoveryServiceResponse discoveryServiceResponse = null)
        {
            var mockAuthenticationResult = new MockAuthenticationResult();
            mockAuthenticationResult.SetupGet(result => result.AccessToken).Returns("discoveryResource");

            mockAuthenticationContextWrapper.Setup(wrapper => wrapper.AcquireTokenSilentAsync(
                It.Is<string>(resource => resource.Equals(Constants.Authentication.ActiveDirectoryDiscoveryResource)),
                It.Is<string>(clientId => clientId.Equals(this.serviceInfo.AppId)))).Throws(new Exception());

            mockAuthenticationContextWrapper.Setup(wrapper => wrapper.AcquireToken(
                It.Is<string>(resource => resource.Equals(Constants.Authentication.ActiveDirectoryDiscoveryResource)),
                It.Is<string>(clientId => clientId.Equals(this.serviceInfo.AppId)),
                It.Is<Uri>(returnUri => returnUri.ToString().Equals(this.serviceInfo.ReturnUrl)),
                PromptBehavior.Always)).Returns(mockAuthenticationResult.Object);

            if (discoveryServiceResponse == null)
            {
                discoveryServiceResponse = new DiscoveryServiceResponse
                {
                    Value = new List<DiscoveryService>
                    {
                        new DiscoveryService
                        {
                            Capability = Constants.Authentication.MyFilesCapability,
                            ServiceApiVersion = this.serviceInfo.OneDriveServiceEndpointVersion,
                            ServiceEndpointUri = serviceEndpointUri,
                            ServiceResourceId = serviceResourceId,
                        }
                    }
                };
            }

            var requestBodyString = this.serializer.SerializeObject(discoveryServiceResponse);

            AccountSession accountSession;

            using (var stringContent = new StringContent(requestBodyString))
            {
                this.httpResponseMessage.Content = stringContent;
                this.authenticationProvider.authenticationContextWrapper = mockAuthenticationContextWrapper.Object;

                accountSession = await this.authenticationProvider.AuthenticateAsync();
            }

            return accountSession;
        }
        public async Task AuthenticateAsync_AuthenticateWithDiscoveryService(
            IAuthenticationResult authenticationResult,
            MockAuthenticationContextWrapper.AuthenticationResultCallback authenticationResultCallback,
            MockAuthenticationContextWrapper.AuthenticationResultSilentCallback authenticationResultSilentCallback)
        {
            const string serviceEndpointUri = "https://localhost";
            const string serviceResourceId = "https://localhost/resource/";

            var discoveryServiceResponse = new DiscoveryServiceResponse
            {
                Value = new List<DiscoveryService>
                {
                    new DiscoveryService
                    {
                        Capability = Constants.Authentication.MyFilesCapability,
                        ServiceApiVersion = this.serviceInfo.OneDriveServiceEndpointVersion,
                        ServiceEndpointUri = serviceEndpointUri,
                        ServiceResourceId = serviceResourceId,
                    }
                }
            };

            var accountSession = await this.AuthenticateWithDiscoveryService(
                authenticationResultCallback,
                authenticationResultSilentCallback);

            Assert.AreEqual(serviceEndpointUri, this.serviceInfo.BaseUrl, "Base URL not set.");
            Assert.AreEqual(serviceResourceId, this.serviceInfo.ServiceResource, "Service resource not set.");
            Assert.AreEqual(authenticationResult.AccessToken, accountSession.AccessToken, "Unexpected access token set.");
            Assert.AreEqual(authenticationResult.AccessTokenType, accountSession.AccessTokenType, "Unexpected access token type set.");
            Assert.AreEqual(AccountType.ActiveDirectory, accountSession.AccountType, "Unexpected account type set.");
            Assert.IsTrue(accountSession.CanSignOut, "CanSignOut set to false.");
            Assert.AreEqual(this.serviceInfo.AppId, accountSession.ClientId, "Unexpected client ID set.");
            Assert.AreEqual(authenticationResult.ExpiresOn, accountSession.ExpiresOnUtc, "Unexpected expiration set.");
            Assert.IsNull(accountSession.UserId, "Unexpected user ID set.");
        }