private static void ValidateArgs(AccessTokenRequestArgs args)
 {
     if (args == null)
     {
         throw new ArgumentNullException(nameof(args));
     }
 }
        public async Task <string> GetAsync(AccessTokenRequestArgs args, CancellationToken token = default)
        {
            ValidateArgs(args);

            try
            {
                var accessToken = await _storage.GetAsync(args.RequestUri, token);

                if (accessToken != null)
                {
                    return(accessToken);
                }

                var accessTokenResponse = await _client.SendRequestAsync(args, token);

                EnsureValidAccessToken(accessTokenResponse);

                await _storage.AddAsync(args.RequestUri, accessTokenResponse, token);

                return(accessTokenResponse.AccessToken);
            }
            catch (Exception e)
            {
                throw new AuthenticationException("Could not retrieve an access token.", e);
            }
        }
        public void GetAsync_ArgsEqNull_Throws()
        {
            AccessTokenRequestArgs args = null;

            Func <Task> act = () => _sut.GetAsync(args);

            act.Should().Throw <ArgumentNullException>();
        }
        public async Task <AccessTokenResponse> SendRequestAsync(AccessTokenRequestArgs args, CancellationToken token)
        {
            var requestBody = CreateBody(args.ClientId, args.ClientAssertion);

            var response = await _httpClient.PostAsync(RemoveSlashSuffix(args.RequestUri), requestBody, token);

            response.EnsureSuccessStatusCode();

            return(await AccessTokenResponse.FromHttpContentAsync(response.Content));
        }