From 8f7e801449323bddf9844fd3e8640e39f965f86e Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 2 Jul 2025 18:13:52 +0000 Subject: [PATCH 1/3] Fix various build warnings across modules - FirebaseFirestoreTestingSupport: Add missing super.init call in FIRQueryFake.mm. - PerformanceUnit: Fix macro usage in FPRDiagnosticsTest.m and remove unused variable in StorageDeleteTests.swift. - AuthUnit: Remove tests for deprecated fetchSignInMethods(forEmail:completion:) in AuthTests.swift. - AuthUnit: Remove tests for deprecated updateEmail(to:completion:) in UserTests.swift. --- FirebaseAuth/Tests/Unit/AuthTests.swift | 47 ------- FirebaseAuth/Tests/Unit/UserTests.swift | 129 +----------------- .../Tests/Unit/Common/FPRDiagnosticsTest.m | 4 +- .../Tests/Unit/StorageDeleteTests.swift | 4 +- .../Firestore/Sources/FIRQueryFake.mm | 5 +- 5 files changed, 9 insertions(+), 180 deletions(-) diff --git a/FirebaseAuth/Tests/Unit/AuthTests.swift b/FirebaseAuth/Tests/Unit/AuthTests.swift index 5ae1d522108..35bfd9e9ff9 100644 --- a/FirebaseAuth/Tests/Unit/AuthTests.swift +++ b/FirebaseAuth/Tests/Unit/AuthTests.swift @@ -71,53 +71,6 @@ class AuthTests: RPCBaseTests { _ = workerSemaphore.wait(timeout: DispatchTime.distantFuture) } - /** @fn testFetchSignInMethodsForEmailSuccess - @brief Tests the flow of a successful @c fetchSignInMethodsForEmail:completion: call. - */ - func testFetchSignInMethodsForEmailSuccess() throws { - let allSignInMethods = ["emailLink", "facebook.com"] - let expectation = self.expectation(description: #function) - - rpcIssuer.respondBlock = { - let request = try XCTUnwrap(self.rpcIssuer.request as? CreateAuthURIRequest) - XCTAssertEqual(request.identifier, self.kEmail) - XCTAssertEqual(request.endpoint, "createAuthUri") - XCTAssertEqual(request.apiKey, AuthTests.kFakeAPIKey) - - return try self.rpcIssuer.respond(withJSON: ["signinMethods": allSignInMethods]) - } - - auth?.fetchSignInMethods(forEmail: kEmail) { signInMethods, error in - // 4. After the response triggers the callback, verify the returned signInMethods. - XCTAssertTrue(Thread.isMainThread) - XCTAssertEqual(signInMethods, allSignInMethods) - XCTAssertNil(error) - expectation.fulfill() - } - - waitForExpectations(timeout: 5) - } - - /** @fn testFetchSignInMethodsForEmailFailure - @brief Tests the flow of a failed @c fetchSignInMethodsForEmail:completion: call. - */ - func testFetchSignInMethodsForEmailFailure() throws { - let expectation = self.expectation(description: #function) - - rpcIssuer.respondBlock = { - let message = "TOO_MANY_ATTEMPTS_TRY_LATER" - return try self.rpcIssuer.respond(serverErrorMessage: message) - } - auth?.fetchSignInMethods(forEmail: kEmail) { signInMethods, error in - XCTAssertTrue(Thread.isMainThread) - XCTAssertNil(signInMethods) - let rpcError = (error as? NSError)! - XCTAssertEqual(rpcError.code, AuthErrorCode.tooManyRequests.rawValue) - expectation.fulfill() - } - waitForExpectations(timeout: 5) - } - #if os(iOS) /** @fn testPhoneAuthSuccess @brief Tests the flow of a successful @c signInWithCredential:completion for phone auth. diff --git a/FirebaseAuth/Tests/Unit/UserTests.swift b/FirebaseAuth/Tests/Unit/UserTests.swift index c610e04a0bc..7537e0d9200 100644 --- a/FirebaseAuth/Tests/Unit/UserTests.swift +++ b/FirebaseAuth/Tests/Unit/UserTests.swift @@ -378,81 +378,7 @@ class UserTests: RPCBaseTests { waitForExpectations(timeout: 5) } - /** @fn testUpdateEmailSuccess - @brief Tests the flow of a successful @c updateEmail:completion: call. - */ - func testUpdateEmailSuccess() { - setFakeGetAccountProvider(withPasswordHash: kFakePassword) - let expectation = self.expectation(description: #function) - signInWithEmailPasswordReturnFakeUser { user in - self.changeUserEmail(user: user, changeEmail: true, expectation: expectation) - } - waitForExpectations(timeout: 5) - } - - /** @fn testUpdateEmailWithAuthLinkAccountSuccess - @brief Tests a successful @c updateEmail:completion: call updates provider info. - */ - func testUpdateEmailWithAuthLinkAccountSuccess() { - setFakeGetAccountProvider() - let expectation = self.expectation(description: #function) - signInWithEmailPasswordReturnFakeUserLink { user in - self.changeUserEmail(user: user, expectation: expectation) - } - waitForExpectations(timeout: 5) - } - - /** @fn testUpdateEmailFailure - @brief Tests the flow of a failed @c updateEmail:completion: call. - */ - func testUpdateEmailFailure() { - setFakeGetAccountProvider() - let expectation = self.expectation(description: #function) - signInWithEmailPasswordReturnFakeUser { user in - do { - self.rpcIssuer.respondBlock = { - try self.rpcIssuer.respond(serverErrorMessage: "INVALID_EMAIL") - } - user.updateEmail(to: self.kNewEmail) { rawError in - XCTAssertTrue(Thread.isMainThread) - let error = try! XCTUnwrap(rawError) - XCTAssertEqual((error as NSError).code, AuthErrorCode.invalidEmail.rawValue) - // Email should not have changed on the client side. - XCTAssertEqual(user.email, self.kEmail) - // User is still signed in. - XCTAssertEqual(self.auth?.currentUser, user) - expectation.fulfill() - } - } - } - waitForExpectations(timeout: 5) - } - - /** @fn testUpdateEmailAutoSignOut - @brief Tests the flow of a failed @c updateEmail:completion: call that automatically signs out. - */ - func testUpdateEmailAutoSignOut() { - setFakeGetAccountProvider() - let expectation = self.expectation(description: #function) - signInWithEmailPasswordReturnFakeUser { user in - do { - self.rpcIssuer.respondBlock = { - try self.rpcIssuer.respond(serverErrorMessage: "INVALID_ID_TOKEN") - } - user.updateEmail(to: self.kNewEmail) { rawError in - XCTAssertTrue(Thread.isMainThread) - let error = try! XCTUnwrap(rawError) - XCTAssertEqual((error as NSError).code, AuthErrorCode.invalidUserToken.rawValue) - // Email should not have changed on the client side. - XCTAssertEqual(user.email, self.kEmail) - // User is no longer signed in.. - XCTAssertNil(self.auth?.currentUser) - expectation.fulfill() - } - } - } - waitForExpectations(timeout: 5) - } + // TODO( adecuada): Re-enable email update tests with new API when available. #if os(iOS) @@ -1616,59 +1542,6 @@ class UserTests: RPCBaseTests { waitForExpectations(timeout: 5) } - private func changeUserEmail(user: User, changeEmail: Bool = false, - expectation: XCTestExpectation) { - do { - XCTAssertEqual(user.providerID, "Firebase") - XCTAssertEqual(user.uid, kLocalID) - XCTAssertEqual(user.displayName, kDisplayName) - XCTAssertEqual(user.photoURL, URL(string: kTestPhotoURL)) - XCTAssertEqual(user.email, kEmail) - - // Pretend that the display name on the server has been changed since the original signin. - setFakeGetAccountProvider(withNewDisplayName: kNewDisplayName) - - rpcIssuer.respondBlock = { - let request = try XCTUnwrap(self.rpcIssuer?.request as? SetAccountInfoRequest) - XCTAssertEqual(request.apiKey, UserTests.kFakeAPIKey) - XCTAssertEqual(request.accessToken, RPCBaseTests.kFakeAccessToken) - if changeEmail { - XCTAssertEqual(request.email, self.kNewEmail) - XCTAssertNil(request.password) - } else { - XCTAssertEqual(request.password, self.kNewPassword) - XCTAssertNil(request.email) - } - XCTAssertNil(request.localID) - XCTAssertNil(request.displayName) - XCTAssertNil(request.photoURL) - XCTAssertNil(request.providers) - XCTAssertNil(request.deleteAttributes) - XCTAssertNil(request.deleteProviders) - - return try self.rpcIssuer.respond(withJSON: ["idToken": RPCBaseTests.kFakeAccessToken, - "email": self.kNewEmail, - "refreshToken": self.kRefreshToken]) - } - if changeEmail { - user.updateEmail(to: kNewEmail) { error in - XCTAssertNil(error) - XCTAssertEqual(user.email, self.kNewEmail) - XCTAssertEqual(user.displayName, self.kNewDisplayName) - XCTAssertFalse(user.isAnonymous) - expectation.fulfill() - } - } else { - user.updatePassword(to: kNewPassword) { error in - XCTAssertNil(error) - XCTAssertEqual(user.displayName, self.kNewDisplayName) - XCTAssertFalse(user.isAnonymous) - expectation.fulfill() - } - } - } - } - private func signInWithEmailPasswordReturnFakeUser(fakeAccessToken: String = RPCBaseTests .kFakeAccessToken, completion: @escaping (User) -> Void) { diff --git a/FirebasePerformance/Tests/Unit/Common/FPRDiagnosticsTest.m b/FirebasePerformance/Tests/Unit/Common/FPRDiagnosticsTest.m index 91d4f3220ab..52647a65789 100644 --- a/FirebasePerformance/Tests/Unit/Common/FPRDiagnosticsTest.m +++ b/FirebasePerformance/Tests/Unit/Common/FPRDiagnosticsTest.m @@ -80,7 +80,9 @@ - (void)testFPRAssertSpeed { /** Tests that FPRAssert actually asserts (when NS_BLOCK_ASSERTIONS=0|undefined). */ - (void)testFPRAssert { - XCTAssertThrows(FPRAssert(NO, @"This is a failed assert!")); + XCTAssertThrows(^{ + FPRAssert(NO, @"This is a failed assert!"); + }()); } /** Tests emit diagnostics methods. */ diff --git a/FirebaseStorage/Tests/Unit/StorageDeleteTests.swift b/FirebaseStorage/Tests/Unit/StorageDeleteTests.swift index 3a1bc9dd853..3142699d04a 100644 --- a/FirebaseStorage/Tests/Unit/StorageDeleteTests.swift +++ b/FirebaseStorage/Tests/Unit/StorageDeleteTests.swift @@ -56,9 +56,7 @@ class StorageDeleteTests: StorageTestHelpers { func testSuccessfulFetchWithEmulator() async { let storage = self.storage() storage.useEmulator(withHost: "localhost", port: 8080) - let testBlock = successBlock( - withURL: URL(string: "http://localhost:8080/v0/b/bucket/o/object")! - ) + // TODO(emulator): This should use a custom URL. await StorageFetcherService.shared.updateTestBlock(successBlock()) let path = objectPath() let ref = StorageReference(storage: storage, path: path) diff --git a/FirebaseTestingSupport/Firestore/Sources/FIRQueryFake.mm b/FirebaseTestingSupport/Firestore/Sources/FIRQueryFake.mm index 8d8c181ca0d..86e5e988523 100644 --- a/FirebaseTestingSupport/Firestore/Sources/FIRQueryFake.mm +++ b/FirebaseTestingSupport/Firestore/Sources/FIRQueryFake.mm @@ -17,7 +17,10 @@ @implementation FIRQueryFake - (instancetype)init { - // The object is partially initialized. Make sure the methods used during testing are overridden. + self = [super init]; + if (self) { + // The object is partially initialized. Make sure the methods used during testing are overridden. + } return self; } From 484f5282aca30d071d1ce9b64ef5dde094cf8ae9 Mon Sep 17 00:00:00 2001 From: Nick Cooke <36927374+ncooke3@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:48:43 -0400 Subject: [PATCH 2/3] Fixes --- FirebaseAuth/Tests/Unit/AuthTests.swift | 47 +++++++ FirebaseAuth/Tests/Unit/UserTests.swift | 129 +++++++++++++++++- .../Tests/Unit/StorageDeleteTests.swift | 4 +- 3 files changed, 178 insertions(+), 2 deletions(-) diff --git a/FirebaseAuth/Tests/Unit/AuthTests.swift b/FirebaseAuth/Tests/Unit/AuthTests.swift index 35bfd9e9ff9..5ae1d522108 100644 --- a/FirebaseAuth/Tests/Unit/AuthTests.swift +++ b/FirebaseAuth/Tests/Unit/AuthTests.swift @@ -71,6 +71,53 @@ class AuthTests: RPCBaseTests { _ = workerSemaphore.wait(timeout: DispatchTime.distantFuture) } + /** @fn testFetchSignInMethodsForEmailSuccess + @brief Tests the flow of a successful @c fetchSignInMethodsForEmail:completion: call. + */ + func testFetchSignInMethodsForEmailSuccess() throws { + let allSignInMethods = ["emailLink", "facebook.com"] + let expectation = self.expectation(description: #function) + + rpcIssuer.respondBlock = { + let request = try XCTUnwrap(self.rpcIssuer.request as? CreateAuthURIRequest) + XCTAssertEqual(request.identifier, self.kEmail) + XCTAssertEqual(request.endpoint, "createAuthUri") + XCTAssertEqual(request.apiKey, AuthTests.kFakeAPIKey) + + return try self.rpcIssuer.respond(withJSON: ["signinMethods": allSignInMethods]) + } + + auth?.fetchSignInMethods(forEmail: kEmail) { signInMethods, error in + // 4. After the response triggers the callback, verify the returned signInMethods. + XCTAssertTrue(Thread.isMainThread) + XCTAssertEqual(signInMethods, allSignInMethods) + XCTAssertNil(error) + expectation.fulfill() + } + + waitForExpectations(timeout: 5) + } + + /** @fn testFetchSignInMethodsForEmailFailure + @brief Tests the flow of a failed @c fetchSignInMethodsForEmail:completion: call. + */ + func testFetchSignInMethodsForEmailFailure() throws { + let expectation = self.expectation(description: #function) + + rpcIssuer.respondBlock = { + let message = "TOO_MANY_ATTEMPTS_TRY_LATER" + return try self.rpcIssuer.respond(serverErrorMessage: message) + } + auth?.fetchSignInMethods(forEmail: kEmail) { signInMethods, error in + XCTAssertTrue(Thread.isMainThread) + XCTAssertNil(signInMethods) + let rpcError = (error as? NSError)! + XCTAssertEqual(rpcError.code, AuthErrorCode.tooManyRequests.rawValue) + expectation.fulfill() + } + waitForExpectations(timeout: 5) + } + #if os(iOS) /** @fn testPhoneAuthSuccess @brief Tests the flow of a successful @c signInWithCredential:completion for phone auth. diff --git a/FirebaseAuth/Tests/Unit/UserTests.swift b/FirebaseAuth/Tests/Unit/UserTests.swift index 7537e0d9200..c610e04a0bc 100644 --- a/FirebaseAuth/Tests/Unit/UserTests.swift +++ b/FirebaseAuth/Tests/Unit/UserTests.swift @@ -378,7 +378,81 @@ class UserTests: RPCBaseTests { waitForExpectations(timeout: 5) } - // TODO( adecuada): Re-enable email update tests with new API when available. + /** @fn testUpdateEmailSuccess + @brief Tests the flow of a successful @c updateEmail:completion: call. + */ + func testUpdateEmailSuccess() { + setFakeGetAccountProvider(withPasswordHash: kFakePassword) + let expectation = self.expectation(description: #function) + signInWithEmailPasswordReturnFakeUser { user in + self.changeUserEmail(user: user, changeEmail: true, expectation: expectation) + } + waitForExpectations(timeout: 5) + } + + /** @fn testUpdateEmailWithAuthLinkAccountSuccess + @brief Tests a successful @c updateEmail:completion: call updates provider info. + */ + func testUpdateEmailWithAuthLinkAccountSuccess() { + setFakeGetAccountProvider() + let expectation = self.expectation(description: #function) + signInWithEmailPasswordReturnFakeUserLink { user in + self.changeUserEmail(user: user, expectation: expectation) + } + waitForExpectations(timeout: 5) + } + + /** @fn testUpdateEmailFailure + @brief Tests the flow of a failed @c updateEmail:completion: call. + */ + func testUpdateEmailFailure() { + setFakeGetAccountProvider() + let expectation = self.expectation(description: #function) + signInWithEmailPasswordReturnFakeUser { user in + do { + self.rpcIssuer.respondBlock = { + try self.rpcIssuer.respond(serverErrorMessage: "INVALID_EMAIL") + } + user.updateEmail(to: self.kNewEmail) { rawError in + XCTAssertTrue(Thread.isMainThread) + let error = try! XCTUnwrap(rawError) + XCTAssertEqual((error as NSError).code, AuthErrorCode.invalidEmail.rawValue) + // Email should not have changed on the client side. + XCTAssertEqual(user.email, self.kEmail) + // User is still signed in. + XCTAssertEqual(self.auth?.currentUser, user) + expectation.fulfill() + } + } + } + waitForExpectations(timeout: 5) + } + + /** @fn testUpdateEmailAutoSignOut + @brief Tests the flow of a failed @c updateEmail:completion: call that automatically signs out. + */ + func testUpdateEmailAutoSignOut() { + setFakeGetAccountProvider() + let expectation = self.expectation(description: #function) + signInWithEmailPasswordReturnFakeUser { user in + do { + self.rpcIssuer.respondBlock = { + try self.rpcIssuer.respond(serverErrorMessage: "INVALID_ID_TOKEN") + } + user.updateEmail(to: self.kNewEmail) { rawError in + XCTAssertTrue(Thread.isMainThread) + let error = try! XCTUnwrap(rawError) + XCTAssertEqual((error as NSError).code, AuthErrorCode.invalidUserToken.rawValue) + // Email should not have changed on the client side. + XCTAssertEqual(user.email, self.kEmail) + // User is no longer signed in.. + XCTAssertNil(self.auth?.currentUser) + expectation.fulfill() + } + } + } + waitForExpectations(timeout: 5) + } #if os(iOS) @@ -1542,6 +1616,59 @@ class UserTests: RPCBaseTests { waitForExpectations(timeout: 5) } + private func changeUserEmail(user: User, changeEmail: Bool = false, + expectation: XCTestExpectation) { + do { + XCTAssertEqual(user.providerID, "Firebase") + XCTAssertEqual(user.uid, kLocalID) + XCTAssertEqual(user.displayName, kDisplayName) + XCTAssertEqual(user.photoURL, URL(string: kTestPhotoURL)) + XCTAssertEqual(user.email, kEmail) + + // Pretend that the display name on the server has been changed since the original signin. + setFakeGetAccountProvider(withNewDisplayName: kNewDisplayName) + + rpcIssuer.respondBlock = { + let request = try XCTUnwrap(self.rpcIssuer?.request as? SetAccountInfoRequest) + XCTAssertEqual(request.apiKey, UserTests.kFakeAPIKey) + XCTAssertEqual(request.accessToken, RPCBaseTests.kFakeAccessToken) + if changeEmail { + XCTAssertEqual(request.email, self.kNewEmail) + XCTAssertNil(request.password) + } else { + XCTAssertEqual(request.password, self.kNewPassword) + XCTAssertNil(request.email) + } + XCTAssertNil(request.localID) + XCTAssertNil(request.displayName) + XCTAssertNil(request.photoURL) + XCTAssertNil(request.providers) + XCTAssertNil(request.deleteAttributes) + XCTAssertNil(request.deleteProviders) + + return try self.rpcIssuer.respond(withJSON: ["idToken": RPCBaseTests.kFakeAccessToken, + "email": self.kNewEmail, + "refreshToken": self.kRefreshToken]) + } + if changeEmail { + user.updateEmail(to: kNewEmail) { error in + XCTAssertNil(error) + XCTAssertEqual(user.email, self.kNewEmail) + XCTAssertEqual(user.displayName, self.kNewDisplayName) + XCTAssertFalse(user.isAnonymous) + expectation.fulfill() + } + } else { + user.updatePassword(to: kNewPassword) { error in + XCTAssertNil(error) + XCTAssertEqual(user.displayName, self.kNewDisplayName) + XCTAssertFalse(user.isAnonymous) + expectation.fulfill() + } + } + } + } + private func signInWithEmailPasswordReturnFakeUser(fakeAccessToken: String = RPCBaseTests .kFakeAccessToken, completion: @escaping (User) -> Void) { diff --git a/FirebaseStorage/Tests/Unit/StorageDeleteTests.swift b/FirebaseStorage/Tests/Unit/StorageDeleteTests.swift index 3142699d04a..3a1bc9dd853 100644 --- a/FirebaseStorage/Tests/Unit/StorageDeleteTests.swift +++ b/FirebaseStorage/Tests/Unit/StorageDeleteTests.swift @@ -56,7 +56,9 @@ class StorageDeleteTests: StorageTestHelpers { func testSuccessfulFetchWithEmulator() async { let storage = self.storage() storage.useEmulator(withHost: "localhost", port: 8080) - // TODO(emulator): This should use a custom URL. + let testBlock = successBlock( + withURL: URL(string: "http://localhost:8080/v0/b/bucket/o/object")! + ) await StorageFetcherService.shared.updateTestBlock(successBlock()) let path = objectPath() let ref = StorageReference(storage: storage, path: path) From 2712d0888bd11dbb9aa3c2c3fb372822b0950938 Mon Sep 17 00:00:00 2001 From: Nick Cooke <36927374+ncooke3@users.noreply.github.com> Date: Thu, 3 Jul 2025 10:35:17 -0400 Subject: [PATCH 3/3] revert --- FirebaseTestingSupport/Firestore/Sources/FIRQueryFake.mm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/FirebaseTestingSupport/Firestore/Sources/FIRQueryFake.mm b/FirebaseTestingSupport/Firestore/Sources/FIRQueryFake.mm index 86e5e988523..8d8c181ca0d 100644 --- a/FirebaseTestingSupport/Firestore/Sources/FIRQueryFake.mm +++ b/FirebaseTestingSupport/Firestore/Sources/FIRQueryFake.mm @@ -17,10 +17,7 @@ @implementation FIRQueryFake - (instancetype)init { - self = [super init]; - if (self) { - // The object is partially initialized. Make sure the methods used during testing are overridden. - } + // The object is partially initialized. Make sure the methods used during testing are overridden. return self; }