1
1
import Foundation
2
2
import XCTest
3
- import JWT
3
+ @ testable import JWT
4
4
5
5
class DecodeTests : XCTestCase {
6
- func testDecodingValidJWTAsClaimSet( ) throws {
7
- let jwt = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiS3lsZSJ9.zxm7xcp1eZtZhp4t-nlw09ATQnnFKIiSN83uG8u6cAg "
8
-
9
- let claims : ClaimSet = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
10
- XCTAssertEqual ( claims [ " name " ] as? String , " Kyle " )
11
- }
12
-
13
6
func testDecodingValidJWT( ) throws {
14
7
let jwt = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiS3lsZSJ9.zxm7xcp1eZtZhp4t-nlw09ATQnnFKIiSN83uG8u6cAg "
15
8
16
- let claims : ClaimSet = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
9
+ let claims = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
17
10
XCTAssertEqual ( claims [ " name " ] as? String , " Kyle " )
18
11
}
19
12
@@ -25,15 +18,15 @@ class DecodeTests: XCTestCase {
25
18
26
19
func testDisablingVerify( ) throws {
27
20
let jwt = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.2_8pWJfyPup0YwOXK7g9Dn0cF1E3pdn299t4hSeJy5w "
28
- _ = try decode ( jwt, algorithm: . none, verify: false , issuer: " fuller.li " ) as ClaimSet
21
+ _ = try decode ( jwt, algorithm: . none, verify: false , issuer: " fuller.li " )
29
22
}
30
23
31
24
// MARK: Issuer claim
32
25
33
26
func testSuccessfulIssuerValidation( ) throws {
34
27
let jwt = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmdWxsZXIubGkifQ.d7B7PAQcz1E6oNhrlxmHxHXHgg39_k7X7wWeahl8kSQ "
35
28
36
- let claims : ClaimSet = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
29
+ let claims = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
37
30
XCTAssertEqual ( claims. issuer, " fuller.li " )
38
31
}
39
32
@@ -54,7 +47,7 @@ class DecodeTests: XCTestCase {
54
47
XCTAssertThrowsError ( try decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) ) )
55
48
}
56
49
57
- func testInvalidExpiaryClaim ( ) {
50
+ func testInvalidExpiryClaim ( ) {
58
51
let jwt = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOlsiMTQyODE4ODQ5MSJdfQ.OwF-wd3THjxrEGUhh6IdnNhxQZ7ydwJ3Z6J_dfl9MBs "
59
52
XCTAssertThrowsError ( try decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) ) )
60
53
}
@@ -63,15 +56,15 @@ class DecodeTests: XCTestCase {
63
56
// If this just started failing, hello 2024!
64
57
let jwt = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgxODg0OTF9.EW7k-8Mvnv0GpvOKJalFRLoCB3a3xGG3i7hAZZXNAz0 "
65
58
66
- let claims : ClaimSet = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
67
- XCTAssertEqual ( claims. expiration? . timeIntervalSince1970, 1728188491 )
59
+ let claims = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
60
+ XCTAssertEqual ( claims. expiration? . timeIntervalSince1970, 1728188491 )
68
61
}
69
62
70
63
func testUnexpiredClaimString( ) throws {
71
64
// If this just started failing, hello 2024!
72
65
let jwt = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNzI4MTg4NDkxIn0.y4w7lNLrfRRPzuNUfM-ZvPkoOtrTU_d8ZVYasLdZGpk "
73
66
74
- let claims : ClaimSet = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
67
+ let claims = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
75
68
XCTAssertEqual ( claims. expiration? . timeIntervalSince1970, 1728188491 )
76
69
}
77
70
@@ -80,14 +73,14 @@ class DecodeTests: XCTestCase {
80
73
func testNotBeforeClaim( ) throws {
81
74
let jwt = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0MjgxODk3MjB9.jFT0nXAJvEwyG6R7CMJlzNJb7FtZGv30QRZpYam5cvs "
82
75
83
- let claims : ClaimSet = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
76
+ let claims = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
84
77
XCTAssertEqual ( claims. notBefore? . timeIntervalSince1970, 1428189720 )
85
78
}
86
79
87
80
func testNotBeforeClaimString( ) throws {
88
81
let jwt = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOiIxNDI4MTg5NzIwIn0.qZsj36irdmIAeXv6YazWDSFbpuxHtEh4Deof5YTpnVI "
89
82
90
- let claims : ClaimSet = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
83
+ let claims = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
91
84
XCTAssertEqual ( claims. notBefore? . timeIntervalSince1970, 1428189720 )
92
85
}
93
86
@@ -107,14 +100,14 @@ class DecodeTests: XCTestCase {
107
100
func testIssuedAtClaimInThePast( ) throws {
108
101
let jwt = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MjgxODk3MjB9.I_5qjRcCUZVQdABLwG82CSuu2relSdIyJOyvXWUAJh4 "
109
102
110
- let claims : ClaimSet = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
103
+ let claims = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
111
104
XCTAssertEqual ( claims. issuedAt? . timeIntervalSince1970, 1428189720 )
112
105
}
113
106
114
107
func testIssuedAtClaimInThePastString( ) throws {
115
108
let jwt = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOiIxNDI4MTg5NzIwIn0.M8veWtsY52oBwi7LRKzvNnzhjK0QBS8Su1r0atlns2k "
116
109
117
- let claims : ClaimSet = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
110
+ let claims = try JWT . decode ( jwt, algorithm: . hs256( " secret " . data ( using: . utf8) !) )
118
111
XCTAssertEqual ( claims. issuedAt? . timeIntervalSince1970, 1428189720 )
119
112
}
120
113
@@ -185,24 +178,24 @@ class DecodeTests: XCTestCase {
185
178
186
179
func testHS512Algorithm( ) {
187
180
let jwt = " eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.WTzLzFO079PduJiFIyzrOah54YaM8qoxH9fLMQoQhKtw3_fMGjImIOokijDkXVbyfBqhMo2GCNu4w9v7UXvnpA "
188
- assertSuccess ( try decode ( jwt, algorithm: . hs512( " secret " . data ( using: . utf8) !) ) ) { payload in
189
- XCTAssertEqual ( payload as! [ String : String ] , [ " some " : " payload " ] )
181
+ assertSuccess ( try decode ( jwt, algorithm: . hs512( " secret " . data ( using: . utf8) !) ) ) { claims in
182
+ XCTAssertEqual ( claims as! [ String : String ] , [ " some " : " payload " ] )
190
183
}
191
184
}
192
185
}
193
186
194
187
// MARK: Helpers
195
188
196
- func assertSuccess( _ decoder: @autoclosure ( ) throws -> Payload , closure: ( ( Payload ) -> Void ) ? = nil ) {
189
+ func assertSuccess( _ decoder: @autoclosure ( ) throws -> ClaimSet , closure: ( ( [ String : Any ] ) -> Void ) ? = nil ) {
197
190
do {
198
- let payload = try decoder ( )
199
- closure ? ( payload )
191
+ let claims = try decoder ( )
192
+ closure ? ( claims . claims as [ String : Any ] )
200
193
} catch {
201
194
XCTFail ( " Failed to decode while expecting success. \( error) " )
202
195
}
203
196
}
204
197
205
- func assertFailure( _ decoder: @autoclosure ( ) throws -> Payload , closure: ( ( InvalidToken ) -> Void ) ? = nil ) {
198
+ func assertFailure( _ decoder: @autoclosure ( ) throws -> ClaimSet , closure: ( ( InvalidToken ) -> Void ) ? = nil ) {
206
199
do {
207
200
_ = try decoder ( )
208
201
XCTFail ( " Decoding succeeded, expected a failure. " )
@@ -213,7 +206,7 @@ func assertFailure(_ decoder: @autoclosure () throws -> Payload, closure: ((Inva
213
206
}
214
207
}
215
208
216
- func assertDecodeError( _ decoder: @autoclosure ( ) throws -> Payload , error: String ) {
209
+ func assertDecodeError( _ decoder: @autoclosure ( ) throws -> ClaimSet , error: String ) {
217
210
assertFailure ( try decoder ( ) ) { failure in
218
211
switch failure {
219
212
case . decodeError( let decodeError) :
0 commit comments