1
+ // Copyright (c) Duende Software. All rights reserved.
2
+ // See LICENSE in the project root for license information.
3
+
4
+ using Microsoft . Extensions . DependencyInjection ;
5
+ using Microsoft . Extensions . Logging ;
6
+ using RichardSzalay . MockHttp ;
7
+
8
+ namespace Duende . AccessTokenManagement . Tests ;
9
+
10
+ public class AccessTokenHandlerTests
11
+ {
12
+ TestDPoPProofService _testDPoPProofService = new TestDPoPProofService ( ) ;
13
+ TestHttpMessageHandler _testHttpMessageHandler = new TestHttpMessageHandler ( ) ;
14
+
15
+ AccessTokenHandlerSubject _subject ;
16
+
17
+ public AccessTokenHandlerTests ( )
18
+ {
19
+ _subject = new AccessTokenHandlerSubject ( _testDPoPProofService , new TestDPoPNonceStore ( ) , new TestLoggerProvider ( ) . CreateLogger ( "AccessTokenHandlerSubject" ) ) ;
20
+ _subject . InnerHandler = _testHttpMessageHandler ;
21
+ }
22
+
23
+ [ Fact ]
24
+ public async Task lower_case_token_type_should_be_converted_to_case_sensitive ( )
25
+ {
26
+ var client = new HttpClient ( _subject ) ;
27
+
28
+ {
29
+ _subject . AccessToken . AccessTokenType = "bearer" ;
30
+
31
+ var response = await client . GetAsync ( "https://test/api" ) ;
32
+
33
+ _testHttpMessageHandler . Request ! . Headers . Authorization ! . Scheme . ShouldBe ( "Bearer" ) ;
34
+ }
35
+
36
+ {
37
+ _subject . AccessToken . AccessTokenType = "dpop" ;
38
+
39
+ var response = await client . GetAsync ( "https://test/api" ) ;
40
+
41
+ _testHttpMessageHandler . Request ! . Headers . Authorization ! . Scheme . ShouldBe ( "DPoP" ) ;
42
+ }
43
+ }
44
+
45
+ public class TestHttpMessageHandler : HttpMessageHandler
46
+ {
47
+ public HttpRequestMessage ? Request { get ; set ; }
48
+ public HttpResponseMessage Response { get ; set ; } = new HttpResponseMessage ( System . Net . HttpStatusCode . NoContent ) ;
49
+
50
+ protected override Task < HttpResponseMessage > SendAsync ( HttpRequestMessage request , CancellationToken cancellationToken )
51
+ {
52
+ Request = request ;
53
+ return Task . FromResult ( Response ) ;
54
+ }
55
+ }
56
+
57
+ public class AccessTokenHandlerSubject : AccessTokenHandler
58
+ {
59
+ public ClientCredentialsToken AccessToken { get ; set ; } = new ClientCredentialsToken
60
+ {
61
+ AccessToken = "at" ,
62
+ AccessTokenType = "bearer" ,
63
+ } ;
64
+
65
+ public AccessTokenHandlerSubject ( IDPoPProofService dPoPProofService , IDPoPNonceStore dPoPNonceStore , ILogger logger ) : base ( dPoPProofService , dPoPNonceStore , logger )
66
+ {
67
+ }
68
+
69
+ protected override Task < ClientCredentialsToken > GetAccessTokenAsync ( bool forceRenewal , CancellationToken cancellationToken )
70
+ {
71
+ return Task . FromResult ( AccessToken ) ;
72
+ }
73
+ }
74
+ }
0 commit comments