@@ -16,14 +16,6 @@ import TSCTestSupport
16
16
17
17
final class AuthorizationProviderTests : XCTestCase {
18
18
func testBasicAPIs( ) {
19
- struct TestProvider : AuthorizationProvider {
20
- let map : [ URL : ( user: String , password: String ) ]
21
-
22
- func authentication( for url: URL ) -> ( user: String , password: String ) ? {
23
- return self . map [ url]
24
- }
25
- }
26
-
27
19
let url = URL ( string: " http:// \( UUID ( ) . uuidString) " ) !
28
20
let user = UUID ( ) . uuidString
29
21
let password = UUID ( ) . uuidString
@@ -98,10 +90,47 @@ final class AuthorizationProviderTests: XCTestCase {
98
90
#endif
99
91
}
100
92
93
+ func testComposite( ) throws {
94
+ let url = URL ( string: " http:// \( UUID ( ) . uuidString) " ) !
95
+ let user = UUID ( ) . uuidString
96
+ let passwordOne = UUID ( ) . uuidString
97
+ let passwordTwo = UUID ( ) . uuidString
98
+
99
+ let providerOne = TestProvider ( map: [ url: ( user: user, password: passwordOne) ] )
100
+ let providerTwo = TestProvider ( map: [ url: ( user: user, password: passwordTwo) ] )
101
+
102
+ do {
103
+ // providerOne's password is returned first
104
+ let provider = CompositeAuthorizationProvider ( providerOne, providerTwo)
105
+ self . assertAuthentication ( provider, for: url, expected: ( user, passwordOne) )
106
+ }
107
+
108
+ do {
109
+ // providerTwo's password is returned first
110
+ let provider = CompositeAuthorizationProvider ( providerTwo, providerOne)
111
+ self . assertAuthentication ( provider, for: url, expected: ( user, passwordTwo) )
112
+ }
113
+
114
+ do {
115
+ // Neither has password
116
+ let unknownURL = URL ( string: " http:// \( UUID ( ) . uuidString) " ) !
117
+ let provider = CompositeAuthorizationProvider ( providerOne, providerTwo)
118
+ XCTAssertNil ( provider. authentication ( for: unknownURL) )
119
+ }
120
+ }
121
+
101
122
private func assertAuthentication( _ provider: AuthorizationProvider , for url: Foundation . URL , expected: ( user: String , password: String ) ) {
102
123
let authentication = provider. authentication ( for: url)
103
124
XCTAssertEqual ( authentication? . user, expected. user)
104
125
XCTAssertEqual ( authentication? . password, expected. password)
105
126
XCTAssertEqual ( provider. httpAuthorizationHeader ( for: url) , " Basic " + " \( expected. user) : \( expected. password) " . data ( using: . utf8) !. base64EncodedString ( ) )
106
127
}
107
128
}
129
+
130
+ private struct TestProvider : AuthorizationProvider {
131
+ let map : [ URL : ( user: String , password: String ) ]
132
+
133
+ func authentication( for url: URL ) -> ( user: String , password: String ) ? {
134
+ return self . map [ url]
135
+ }
136
+ }
0 commit comments