Skip to content

Commit faf78f6

Browse files
authored
test(auth): increase code coverage (#648)
1 parent 3053599 commit faf78f6

File tree

12 files changed

+1785
-111
lines changed

12 files changed

+1785
-111
lines changed

.swiftpm/xcode/xcshareddata/xcschemes/Auth.xcscheme

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
33
LastUpgradeVersion = "1530"
4-
version = "1.7">
4+
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"
77
buildImplicitDependencies = "YES"
@@ -27,8 +27,29 @@
2727
buildConfiguration = "Debug"
2828
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
2929
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
30-
shouldUseLaunchSchemeArgsEnv = "YES">
30+
shouldUseLaunchSchemeArgsEnv = "YES"
31+
codeCoverageEnabled = "YES"
32+
onlyGenerateCoverageForSpecifiedTargets = "YES">
33+
<CodeCoverageTargets>
34+
<BuildableReference
35+
BuildableIdentifier = "primary"
36+
BlueprintIdentifier = "Auth"
37+
BuildableName = "Auth"
38+
BlueprintName = "Auth"
39+
ReferencedContainer = "container:">
40+
</BuildableReference>
41+
</CodeCoverageTargets>
3142
<Testables>
43+
<TestableReference
44+
skipped = "NO">
45+
<BuildableReference
46+
BuildableIdentifier = "primary"
47+
BlueprintIdentifier = "AuthTests"
48+
BuildableName = "AuthTests"
49+
BlueprintName = "AuthTests"
50+
ReferencedContainer = "container:">
51+
</BuildableReference>
52+
</TestableReference>
3253
</Testables>
3354
</TestAction>
3455
<LaunchAction

Sources/Auth/AuthClient.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public final class AuthClient: Sendable {
2929
private var eventEmitter: AuthStateChangeEventEmitter { Dependencies[clientID].eventEmitter }
3030
private var logger: (any SupabaseLogger)? { Dependencies[clientID].configuration.logger }
3131
private var sessionStorage: SessionStorage { Dependencies[clientID].sessionStorage }
32+
private var pkce: PKCE { Dependencies[clientID].pkce }
3233

3334
/// Returns the session, refreshing it if necessary.
3435
///
@@ -1310,10 +1311,10 @@ public final class AuthClient: Sendable {
13101311
return (nil, nil)
13111312
}
13121313

1313-
let codeVerifier = PKCE.generateCodeVerifier()
1314+
let codeVerifier = pkce.generateCodeVerifier()
13141315
codeVerifierStorage.set(codeVerifier)
13151316

1316-
let codeChallenge = PKCE.generateCodeChallenge(from: codeVerifier)
1317+
let codeChallenge = pkce.generateCodeChallenge(codeVerifier)
13171318
let codeChallengeMethod = codeVerifier == codeChallenge ? "plain" : "s256"
13181319

13191320
return (codeChallenge, codeChallengeMethod)

Sources/Auth/AuthMFA.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public struct AuthMFA: Sendable {
5454
///
5555
/// - Parameter params: The parameters for verifying the MFA factor.
5656
/// - Returns: An authentication response after verifying the factor.
57+
@discardableResult
5758
public func verify(params: MFAVerifyParams) async throws -> AuthMFAVerifyResponse {
5859
let response: AuthMFAVerifyResponse = try await api.authorizedExecute(
5960
HTTPRequest(

Sources/Auth/Internal/Dependencies.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ struct Dependencies: Sendable {
1414
var date: @Sendable () -> Date = { Date() }
1515

1616
var urlOpener: URLOpener = .live
17+
var pkce: PKCE = .live
1718

1819
var encoder: JSONEncoder { configuration.encoder }
1920
var decoder: JSONDecoder { configuration.decoder }

Sources/Auth/Internal/PKCE.swift

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
import Crypto
22
import Foundation
33

4-
enum PKCE {
5-
static func generateCodeVerifier() -> String {
6-
let buffer = [UInt8].random(count: 64)
7-
return Data(buffer).pkceBase64EncodedString()
8-
}
4+
struct PKCE {
5+
var generateCodeVerifier: @Sendable () -> String
6+
var generateCodeChallenge: @Sendable (_ codeVerifier: String) -> String
7+
}
98

10-
static func generateCodeChallenge(from string: String) -> String {
11-
guard let data = string.data(using: .utf8) else {
12-
preconditionFailure("provided string should be utf8 encoded.")
13-
}
9+
extension PKCE {
10+
static let live = PKCE(
11+
generateCodeVerifier: {
12+
let buffer = [UInt8].random(count: 64)
13+
return Data(buffer).pkceBase64EncodedString()
14+
},
15+
generateCodeChallenge: { codeVerifier in
16+
guard let data = codeVerifier.data(using: .utf8) else {
17+
preconditionFailure("provided string should be utf8 encoded.")
18+
}
1419

15-
var hasher = SHA256()
16-
hasher.update(data: data)
17-
let hashed = hasher.finalize()
18-
return Data(hashed).pkceBase64EncodedString()
19-
}
20+
var hasher = SHA256()
21+
hasher.update(data: data)
22+
let hashed = hasher.finalize()
23+
return Data(hashed).pkceBase64EncodedString()
24+
}
25+
)
2026
}
2127

2228
extension Data {

Tests/AuthTests/AuthClientMultipleInstancesTests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
// Created by Guilherme Souza on 05/07/24.
66
//
77

8-
@testable import Auth
98
import TestHelpers
109
import XCTest
1110

11+
@testable import Auth
12+
1213
final class AuthClientMultipleInstancesTests: XCTestCase {
1314
func testMultipleAuthClientInstances() {
1415
let url = URL(string: "http://localhost:54321/auth")!

0 commit comments

Comments
 (0)