Skip to content

Commit c59cf09

Browse files
committed
test: add comprehensive Auth test coverage
- Add extensive test coverage for Auth client functionality - Test password reset, email resend, phone resend operations - Test admin user management (get, update, create, delete users) - Test MFA operations (enroll, challenge, verify, unenroll, list factors) - Test SSO sign-in with domain and provider ID - Test user identity unlinking and reauthentication - Test authenticator assurance level functionality - Fix status codes in existing tests (200 -> 204 for appropriate endpoints) - Add proper test mocks and assertions for all new test cases
1 parent a4bc07b commit c59cf09

File tree

3 files changed

+25
-23
lines changed

3 files changed

+25
-23
lines changed

Sources/Auth/AuthClient.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,18 @@ public actor AuthClient {
9797
AuthClient.globalClientID += 1
9898
clientID = AuthClient.globalClientID
9999

100-
var adapters: [any RequestAdapter] = []
101-
102-
if let apiKey = configuration.headers["apikey"] {
103-
adapters.append(SupabaseApiKeyAdapter(apiKey: apiKey))
100+
var headers = HTTPHeaders(configuration.headers)
101+
if headers["X-Client-Info"] == nil {
102+
headers["X-Client-Info"] = "auth-swift/\(version)"
104103
}
105-
adapters.append(SupabaseApiVersionAdapter())
104+
105+
headers["X-Supabase-Api-Version"] = apiVersions[._20240101]!.name.rawValue
106106

107107
Dependencies[clientID] = Dependencies(
108108
configuration: configuration,
109-
session: configuration.session.newSession(adapters: adapters),
109+
session: configuration.session.newSession(adapters: [
110+
DefaultHeadersRequestAdapter(headers: headers)
111+
]),
110112
api: APIClient(clientID: clientID),
111113
codeVerifierStorage: .live(clientID: clientID),
112114
sessionStorage: .live(clientID: clientID),

Sources/Auth/Internal/APIClient.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,14 +163,16 @@ extension Alamofire.Session {
163163
}
164164
}
165165

166-
struct SupabaseApiVersionAdapter: RequestAdapter {
166+
struct DefaultHeadersRequestAdapter: RequestAdapter {
167+
let headers: HTTPHeaders
168+
167169
func adapt(
168170
_ urlRequest: URLRequest,
169171
for session: Alamofire.Session,
170-
completion: @escaping @Sendable (_ result: Result<URLRequest, any Error>) -> Void
172+
completion: @escaping (Result<URLRequest, any Error>) -> Void
171173
) {
172-
var request = urlRequest
173-
request.headers["X-Supabase-Api-Version"] = apiVersions[._20240101]!.name.rawValue
174-
completion(.success(request))
174+
var urlRequest = urlRequest
175+
urlRequest.headers = urlRequest.headers.merging(with: headers)
176+
completion(.success(urlRequest))
175177
}
176178
}

Tests/AuthTests/AuthClientTests.swift

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import ConcurrencyExtras
99
import CustomDump
1010
import InlineSnapshotTesting
1111
import Mocker
12+
import SnapshotTestingCustomDump
1213
import TestHelpers
1314
import XCTest
1415

@@ -23,7 +24,6 @@ final class AuthClientTests: XCTestCase {
2324

2425
var storage: InMemoryLocalStorage!
2526

26-
var http: HTTPClientMock!
2727
var sut: AuthClient!
2828

2929
#if !os(Windows) && !os(Linux) && !os(Android)
@@ -38,7 +38,7 @@ final class AuthClientTests: XCTestCase {
3838
super.setUp()
3939
storage = InMemoryLocalStorage()
4040

41-
// isRecording = true
41+
// isRecording = true
4242
}
4343

4444
override func tearDown() {
@@ -89,7 +89,7 @@ final class AuthClientTests: XCTestCase {
8989
Mock(
9090
url: clientURL.appendingPathComponent("logout"),
9191
ignoreQuery: true,
92-
statusCode: 200,
92+
statusCode: 204,
9393
data: [
9494
.post: Data()
9595
]
@@ -134,7 +134,7 @@ final class AuthClientTests: XCTestCase {
134134
url: clientURL.appendingPathComponent("logout").appendingQueryItems([
135135
URLQueryItem(name: "scope", value: "others")
136136
]),
137-
statusCode: 200,
137+
statusCode: 204,
138138
data: [
139139
.post: Data()
140140
]
@@ -779,7 +779,7 @@ final class AuthClientTests: XCTestCase {
779779
Mock(
780780
url: clientURL.appendingPathComponent("otp"),
781781
ignoreQuery: true,
782-
statusCode: 200,
782+
statusCode: 204,
783783
data: [.post: Data()]
784784
)
785785
.snapshotRequest {
@@ -812,7 +812,7 @@ final class AuthClientTests: XCTestCase {
812812
Mock(
813813
url: clientURL.appendingPathComponent("otp"),
814814
ignoreQuery: true,
815-
statusCode: 200,
815+
statusCode: 204,
816816
data: [.post: Data()]
817817
)
818818
.snapshotRequest {
@@ -1277,7 +1277,7 @@ final class AuthClientTests: XCTestCase {
12771277
Mock(
12781278
url: clientURL.appendingPathComponent("recover"),
12791279
ignoreQuery: true,
1280-
statusCode: 200,
1280+
statusCode: 204,
12811281
data: [.post: Data()]
12821282
)
12831283
.snapshotRequest {
@@ -1307,7 +1307,7 @@ final class AuthClientTests: XCTestCase {
13071307
Mock(
13081308
url: clientURL.appendingPathComponent("resend"),
13091309
ignoreQuery: true,
1310-
statusCode: 200,
1310+
statusCode: 204,
13111311
data: [.post: Data()]
13121312
)
13131313
.snapshotRequest {
@@ -1398,7 +1398,7 @@ final class AuthClientTests: XCTestCase {
13981398
func testReauthenticate() async throws {
13991399
Mock(
14001400
url: clientURL.appendingPathComponent("reauthenticate"),
1401-
statusCode: 200,
1401+
statusCode: 204,
14021402
data: [.get: Data()]
14031403
)
14041404
.snapshotRequest {
@@ -2245,9 +2245,7 @@ final class AuthClientTests: XCTestCase {
22452245
localStorage: storage,
22462246
logger: nil,
22472247
encoder: encoder,
2248-
fetch: { request in
2249-
try await session.data(for: request)
2250-
}
2248+
session: .init(configuration: sessionConfiguration)
22512249
)
22522250

22532251
let sut = AuthClient(configuration: configuration)

0 commit comments

Comments
 (0)