@@ -38,6 +38,7 @@ final class GenerativeModelTests: XCTestCase {
3838 urlSession = try XCTUnwrap ( URLSession ( configuration: configuration) )
3939 model = GenerativeModel (
4040 name: " my-model " ,
41+ projectID: " my-project-id " ,
4142 apiKey: " API_KEY " ,
4243 tools: nil ,
4344 requestOptions: RequestOptions ( ) ,
@@ -180,6 +181,7 @@ final class GenerativeModelTests: XCTestCase {
180181 let model = GenerativeModel (
181182 // Model name is prefixed with "models/".
182183 name: " models/test-model " ,
184+ projectID: " my-project-id " ,
183185 apiKey: " API_KEY " ,
184186 tools: nil ,
185187 requestOptions: RequestOptions ( ) ,
@@ -299,6 +301,7 @@ final class GenerativeModelTests: XCTestCase {
299301 let appCheckToken = " test-valid-token "
300302 model = GenerativeModel (
301303 name: " my-model " ,
304+ projectID: " my-project-id " ,
302305 apiKey: " API_KEY " ,
303306 tools: nil ,
304307 requestOptions: RequestOptions ( ) ,
@@ -319,6 +322,7 @@ final class GenerativeModelTests: XCTestCase {
319322 func testGenerateContent_appCheck_tokenRefreshError( ) async throws {
320323 model = GenerativeModel (
321324 name: " my-model " ,
325+ projectID: " my-project-id " ,
322326 apiKey: " API_KEY " ,
323327 tools: nil ,
324328 requestOptions: RequestOptions ( ) ,
@@ -340,6 +344,7 @@ final class GenerativeModelTests: XCTestCase {
340344 let authToken = " test-valid-token "
341345 model = GenerativeModel (
342346 name: " my-model " ,
347+ projectID: " my-project-id " ,
343348 apiKey: " API_KEY " ,
344349 tools: nil ,
345350 requestOptions: RequestOptions ( ) ,
@@ -360,6 +365,7 @@ final class GenerativeModelTests: XCTestCase {
360365 func testGenerateContent_auth_nilAuthToken( ) async throws {
361366 model = GenerativeModel (
362367 name: " my-model " ,
368+ projectID: " my-project-id " ,
363369 apiKey: " API_KEY " ,
364370 tools: nil ,
365371 requestOptions: RequestOptions ( ) ,
@@ -380,6 +386,7 @@ final class GenerativeModelTests: XCTestCase {
380386 func testGenerateContent_auth_authTokenRefreshError( ) async throws {
381387 model = GenerativeModel (
382388 name: " my-model " ,
389+ projectID: " my-project-id " ,
383390 apiKey: " API_KEY " ,
384391 tools: nil ,
385392 requestOptions: RequestOptions ( ) ,
@@ -441,6 +448,29 @@ final class GenerativeModelTests: XCTestCase {
441448 }
442449 }
443450
451+ func testGenerateContent_failure_firebaseMLAPINotEnabled( ) async throws {
452+ let expectedStatusCode = 403
453+ MockURLProtocol
454+ . requestHandler = try httpRequestHandler (
455+ forResource: " unary-failure-firebaseml-api-not-enabled " ,
456+ withExtension: " json " ,
457+ statusCode: expectedStatusCode
458+ )
459+
460+ do {
461+ _ = try await model. generateContent ( testPrompt)
462+ XCTFail ( " Should throw GenerateContentError.internalError; no error thrown. " )
463+ } catch let GenerateContentError . internalError( error as RPCError ) {
464+ XCTAssertEqual ( error. httpResponseCode, expectedStatusCode)
465+ XCTAssertEqual ( error. status, . permissionDenied)
466+ XCTAssertTrue ( error. message. starts ( with: " Firebase ML API has not been used in project " ) )
467+ XCTAssertTrue ( error. isFirebaseMLServiceDisabledError ( ) )
468+ return
469+ } catch {
470+ XCTFail ( " Should throw GenerateContentError.internalError(RPCError); error thrown: \( error) " )
471+ }
472+ }
473+
444474 func testGenerateContent_failure_emptyContent( ) async throws {
445475 MockURLProtocol
446476 . requestHandler = try httpRequestHandler (
@@ -701,6 +731,7 @@ final class GenerativeModelTests: XCTestCase {
701731 let requestOptions = RequestOptions ( timeout: expectedTimeout)
702732 model = GenerativeModel (
703733 name: " my-model " ,
734+ projectID: " my-project-id " ,
704735 apiKey: " API_KEY " ,
705736 tools: nil ,
706737 requestOptions: requestOptions,
@@ -738,6 +769,31 @@ final class GenerativeModelTests: XCTestCase {
738769 XCTFail ( " Should have caught an error. " )
739770 }
740771
772+ func testGenerateContentStream_failure_firebaseMLAPINotEnabled( ) async throws {
773+ let expectedStatusCode = 403
774+ MockURLProtocol
775+ . requestHandler = try httpRequestHandler (
776+ forResource: " unary-failure-firebaseml-api-not-enabled " ,
777+ withExtension: " json " ,
778+ statusCode: expectedStatusCode
779+ )
780+
781+ do {
782+ let stream = model. generateContentStream ( testPrompt)
783+ for try await _ in stream {
784+ XCTFail ( " No content is there, this shouldn't happen. " )
785+ }
786+ } catch let GenerateContentError . internalError( error as RPCError ) {
787+ XCTAssertEqual ( error. httpResponseCode, expectedStatusCode)
788+ XCTAssertEqual ( error. status, . permissionDenied)
789+ XCTAssertTrue ( error. message. starts ( with: " Firebase ML API has not been used in project " ) )
790+ XCTAssertTrue ( error. isFirebaseMLServiceDisabledError ( ) )
791+ return
792+ }
793+
794+ XCTFail ( " Should have caught an error. " )
795+ }
796+
741797 func testGenerateContentStream_failureEmptyContent( ) async throws {
742798 MockURLProtocol
743799 . requestHandler = try httpRequestHandler (
@@ -912,6 +968,7 @@ final class GenerativeModelTests: XCTestCase {
912968 let appCheckToken = " test-valid-token "
913969 model = GenerativeModel (
914970 name: " my-model " ,
971+ projectID: " my-project-id " ,
915972 apiKey: " API_KEY " ,
916973 tools: nil ,
917974 requestOptions: RequestOptions ( ) ,
@@ -933,6 +990,7 @@ final class GenerativeModelTests: XCTestCase {
933990 func testGenerateContentStream_appCheck_tokenRefreshError( ) async throws {
934991 model = GenerativeModel (
935992 name: " my-model " ,
993+ projectID: " my-project-id " ,
936994 apiKey: " API_KEY " ,
937995 tools: nil ,
938996 requestOptions: RequestOptions ( ) ,
@@ -1078,6 +1136,7 @@ final class GenerativeModelTests: XCTestCase {
10781136 let requestOptions = RequestOptions ( timeout: expectedTimeout)
10791137 model = GenerativeModel (
10801138 name: " my-model " ,
1139+ projectID: " my-project-id " ,
10811140 apiKey: " API_KEY " ,
10821141 tools: nil ,
10831142 requestOptions: requestOptions,
@@ -1155,6 +1214,7 @@ final class GenerativeModelTests: XCTestCase {
11551214 let requestOptions = RequestOptions ( timeout: expectedTimeout)
11561215 model = GenerativeModel (
11571216 name: " my-model " ,
1217+ projectID: " my-project-id " ,
11581218 apiKey: " API_KEY " ,
11591219 tools: nil ,
11601220 requestOptions: requestOptions,
@@ -1176,6 +1236,7 @@ final class GenerativeModelTests: XCTestCase {
11761236
11771237 model = GenerativeModel (
11781238 name: modelName,
1239+ projectID: " my-project-id " ,
11791240 apiKey: " API_KEY " ,
11801241 tools: nil ,
11811242 requestOptions: RequestOptions ( ) ,
@@ -1191,6 +1252,7 @@ final class GenerativeModelTests: XCTestCase {
11911252
11921253 model = GenerativeModel (
11931254 name: modelResourceName,
1255+ projectID: " my-project-id " ,
11941256 apiKey: " API_KEY " ,
11951257 tools: nil ,
11961258 requestOptions: RequestOptions ( ) ,
@@ -1206,6 +1268,7 @@ final class GenerativeModelTests: XCTestCase {
12061268
12071269 model = GenerativeModel (
12081270 name: tunedModelResourceName,
1271+ projectID: " my-project-id " ,
12091272 apiKey: " API_KEY " ,
12101273 tools: nil ,
12111274 requestOptions: RequestOptions ( ) ,
0 commit comments