public void GetAuthTokenWithNullRequest_ExceptionThrown()
        {
            DTO.Request.PKCETokenRequest tokenRequest = null;
            Func <Task> act = async() => await sut.GetPKCEAuthToken(tokenRequest);

            act.Should().Throw <Exception>().WithMessage("Token request is null.");
        }
        public async Task <DTO.PKCETokenResponse> GetPKCEAuthToken([FromQuery] DTO.Request.PKCETokenRequest request)
        {
            if (request == null)
            {
                throw new System.Exception("Token request is null.");
            }

            RandomNumberGenerator rng = new RNGCryptoServiceProvider();

            byte[] buffer0 = new byte[100];
            byte[] buffer1 = new byte[100];
            rng.GetBytes(buffer0);
            string accessToken = Convert.ToBase64String(buffer0);

            rng.GetBytes(buffer1);
            string refreshToken = Convert.ToBase64String(buffer1);


            var TokenResponse = new DTO.PKCETokenResponse
            {
                AccessToken  = accessToken,
                CreatedAt    = DateTime.UtcNow,
                ExpiresIn    = 3600,
                RefreshToken = refreshToken,
                Scope        = "UserReadPrivate, UserReadRecentlyPlayed",
                TokenType    = "Bearer"
            };

            await Task.Delay(0);

            return(TokenResponse);
        }
        public void GetAuthToken_AuthTokenIsValid()
        {
            var(verifier, challenge) = PKCEUtil.GenerateCodes();
            var tokenRequest = new DTO.Request.PKCETokenRequest
            {
                ClientId     = ClientId,
                Code         = "0",
                CodeVerifier = verifier,
                RedirectUri  = new Uri("localhost:5000/callback")
            };
            var retrievedToken = sut.GetPKCEAuthToken(tokenRequest);

            retrievedToken.Result.AccessToken.Should().NotBeNullOrEmpty();
            retrievedToken.Result.RefreshToken.Should().NotBeNullOrEmpty();
            retrievedToken.Result.AccessToken.Should().NotBeSameAs(retrievedToken.Result.RefreshToken);
            retrievedToken.Result.TokenType.Should().Be("Bearer");
            retrievedToken.Result.IsExpired.Should().Be(false);
            retrievedToken.Result.Scope.Should().Contain("UserReadRecentlyPlayed");
            retrievedToken.Result.ExpiresIn.Should().Be(3600);
            retrievedToken.Result.CreatedAt.Should().BeBefore(DateTime.Now);
        }