public async void BankIdFederatedLoginAsync__ShouldPostToGrandIdFederatedLogin_WithFormPayload()
        {
            // Arrange
            var messageHandlerMock = GetHttpClientMessageHandlerMock(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new StringContent("{ }", Encoding.Default, "application/json"),
            });

            var httpClient = new HttpClient(messageHandlerMock.Object)
            {
                BaseAddress = new Uri("https://grandid/")
            };
            var grandIdApiClient = new GrandIdApiClient(httpClient, new GrandIdApiClientConfiguration("ak", "bsk"));

            // Act
            await grandIdApiClient.BankIdFederatedLoginAsync(new BankIdFederatedLoginRequest("y"));

            // Assert
            Assert.Single(messageHandlerMock.Invocations);
            var request = messageHandlerMock.GetFirstArgumentOfFirstInvocation <HttpMessageHandler, HttpRequestMessage>();

            Assert.NotNull(request);

            Assert.Equal(HttpMethod.Post, request.Method);
            Assert.StartsWith("https://grandid/FederatedLogin", request.RequestUri.ToString());
            Assert.Equal(new MediaTypeHeaderValue("application/x-www-form-urlencoded"), request.Content.Headers.ContentType);
        }
        public async void LogoutAsync_WithGrandIdLogoutRequest__ShouldParseAndReturnSessionDeleted()
        {
            // Arrange
            var httpClient       = GetHttpClientMockWithOkResponse("{ \"sessiondeleted\": \"1\" }");
            var grandIdApiClient = new GrandIdApiClient(httpClient, new GrandIdApiClientConfiguration("x", "bsk"));

            // Act
            var result = await grandIdApiClient.LogoutAsync(new LogoutRequest("s"));

            // Assert
            Assert.NotNull(result);
            Assert.True(result.SessionDeleted);
        }
        public async void ErrorResponse_WithBadRequestResult__ShouldThrowException_WithErrorCode_AndMessage()
        {
            // Arrange
            var httpClient      = GetHttpClientMockWithBadRequestResponse("{ \"errorObject\": { \"code\": \"FieldsNotValid\", \"message\": \"m\" } }");
            var bankIdApiClient = new GrandIdApiClient(httpClient, new GrandIdApiClientConfiguration("x", "bsk"));

            // Act
            var exception = await Assert.ThrowsAsync <GrandIdApiException>(() => bankIdApiClient.BankIdFederatedLoginAsync(new BankIdFederatedLoginRequest("http://c/")));

            // Assert
            Assert.Equal(ErrorCode.FieldsNotValid, exception.ErrorCode);
            Assert.Equal("m", exception.ErrorDetails);
        }
        public async void BankIdGetSessionAsync_WithBankIdGetSessionRequest__ShouldParseAndReturnSignatureXml()
        {
            // Arrange
            var httpClient       = GetHttpClientMockWithOkResponse("{ \"userAttributes\": { \"signature\": \"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHNhbXBsZT48dmFsdWU+SGk8L3ZhbHVlPjxjb250ZW50PkJ5ZTwvY29uZW50Pjwvc2FtcGxlPg==\" } }");
            var grandIdApiClient = new GrandIdApiClient(httpClient, new GrandIdApiClientConfiguration("x", "bsk"));

            // Act
            var result = await grandIdApiClient.BankIdGetSessionAsync(new BankIdGetSessionRequest("y"));

            // Assert
            Assert.NotNull(result);
            Assert.NotNull(result.UserAttributes);
            Assert.Equal("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><sample><value>Hi</value><content>Bye</conent></sample>", result.UserAttributes.GetSignatureXml());
        }
        public async void BankIdFederatedLoginAsync_WithBankIdFederatedLoginRequest__ShouldParseAndReturnOrderRef_AndAutoStartToken()
        {
            // Arrange
            var httpClient       = GetHttpClientMockWithOkResponse("{ \"sessionId\": \"s\", \"redirectUrl\": \"https://r/\" }");
            var grandIdApiClient = new GrandIdApiClient(httpClient, new GrandIdApiClientConfiguration("x", "bsk"));

            // Act
            var result = await grandIdApiClient.BankIdFederatedLoginAsync(new BankIdFederatedLoginRequest("https://c/"));

            // Assert
            Assert.NotNull(result);
            Assert.Equal("s", result.SessionId);
            Assert.Equal("https://r/", result.RedirectUrl);
        }
        public async void BankIdGetSessionAsync_WithBankIdGetSessionRequest__ShouldParseAndReturnNotBefore_AndNotAfter()
        {
            // Arrange
            var httpClient       = GetHttpClientMockWithOkResponse("{ \"userAttributes\": { \"notBefore\": \"2018-12-25T00:00:00.000+02:00\", \"notAfter\": \"2018-12-26T00:00:00.000+02:00\" } }");
            var grandIdApiClient = new GrandIdApiClient(httpClient, new GrandIdApiClientConfiguration("x", "bsk"));

            // Act
            var result = await grandIdApiClient.BankIdGetSessionAsync(new BankIdGetSessionRequest("y"));

            // Assert
            Assert.NotNull(result);
            Assert.NotNull(result.UserAttributes);
            Assert.Equal(new DateTime(2018, 12, 24, 22, 00, 00, DateTimeKind.Local), result.UserAttributes.GetNotBeforeDateTime());
            Assert.Equal(new DateTime(2018, 12, 25, 22, 00, 00, DateTimeKind.Utc), result.UserAttributes.GetNotAfterDateTime());
        }
        public GrandIdApiClient_Tests()
        {
            _messageHandlerMock = GetHttpClientMessageHandlerMock(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new StringContent("{ }", Encoding.Default, "application/json"),
            });

            var httpClient = new HttpClient(_messageHandlerMock.Object)
            {
                BaseAddress = new Uri("https://grandid/")
            };

            _grandIdApiClient = new GrandIdApiClient(httpClient, new GrandIdApiClientConfiguration("x", "bsk"));
        }
        public async void BankIdGetSessionAsync_WithBankIdGetSessionRequest__ShouldParseAndReturnGetSessionResponse()
        {
            // Arrange
            var httpClient       = GetHttpClientMockWithOkResponse("{ \"sessionId\": \"s\", \"username\": \"u\", \"userAttributes\": { \"givenName\": \"ugn\", \"surname\": \"usn\", \"name\": \"un\", \"personalNumber\": \"upn\", \"ipAddress\": \"uip\" } }");
            var grandIdApiClient = new GrandIdApiClient(httpClient, new GrandIdApiClientConfiguration("x", "bsk"));

            // Act
            var result = await grandIdApiClient.BankIdGetSessionAsync(new BankIdGetSessionRequest("y"));

            // Assert
            Assert.NotNull(result);
            Assert.Equal("s", result.SessionId);
            Assert.Equal("u", result.Username);

            Assert.NotNull(result.UserAttributes);
            Assert.Equal("ugn", result.UserAttributes.GivenName);
            Assert.Equal("usn", result.UserAttributes.Surname);
            Assert.Equal("un", result.UserAttributes.Name);
            Assert.Equal("upn", result.UserAttributes.PersonalIdentityNumber);
            Assert.Equal("uip", result.UserAttributes.IpAddress);
        }
        public async void BankIdFederatedLoginAsync_WithApiKey__ShouldPostToGrandIdFederatedLogin_WithApiKey()
        {
            // Arrange
            var messageHandlerMock = GetHttpClientMessageHandlerMock(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new StringContent("{ }", Encoding.Default, "application/json"),
            });

            var httpClient = new HttpClient(messageHandlerMock.Object)
            {
                BaseAddress = new Uri("https://grandid/")
            };
            var grandIdApiClient = new GrandIdApiClient(httpClient, new GrandIdApiClientConfiguration("ak", "bsk"));

            // Act
            await grandIdApiClient.BankIdFederatedLoginAsync(new BankIdFederatedLoginRequest("https://c/"));

            // Assert
            var request = messageHandlerMock.GetFirstArgumentOfFirstInvocation <HttpMessageHandler, HttpRequestMessage>();

            Assert.Contains("apiKey=ak", request.RequestUri.ToString());
        }