@@ -38,6 +38,7 @@ final class GenerativeModelTests: XCTestCase {
38
38
urlSession = try XCTUnwrap ( URLSession ( configuration: configuration) )
39
39
model = GenerativeModel (
40
40
name: " my-model " ,
41
+ projectID: " my-project-id " ,
41
42
apiKey: " API_KEY " ,
42
43
tools: nil ,
43
44
requestOptions: RequestOptions ( ) ,
@@ -180,6 +181,7 @@ final class GenerativeModelTests: XCTestCase {
180
181
let model = GenerativeModel (
181
182
// Model name is prefixed with "models/".
182
183
name: " models/test-model " ,
184
+ projectID: " my-project-id " ,
183
185
apiKey: " API_KEY " ,
184
186
tools: nil ,
185
187
requestOptions: RequestOptions ( ) ,
@@ -299,6 +301,7 @@ final class GenerativeModelTests: XCTestCase {
299
301
let appCheckToken = " test-valid-token "
300
302
model = GenerativeModel (
301
303
name: " my-model " ,
304
+ projectID: " my-project-id " ,
302
305
apiKey: " API_KEY " ,
303
306
tools: nil ,
304
307
requestOptions: RequestOptions ( ) ,
@@ -319,6 +322,7 @@ final class GenerativeModelTests: XCTestCase {
319
322
func testGenerateContent_appCheck_tokenRefreshError( ) async throws {
320
323
model = GenerativeModel (
321
324
name: " my-model " ,
325
+ projectID: " my-project-id " ,
322
326
apiKey: " API_KEY " ,
323
327
tools: nil ,
324
328
requestOptions: RequestOptions ( ) ,
@@ -340,6 +344,7 @@ final class GenerativeModelTests: XCTestCase {
340
344
let authToken = " test-valid-token "
341
345
model = GenerativeModel (
342
346
name: " my-model " ,
347
+ projectID: " my-project-id " ,
343
348
apiKey: " API_KEY " ,
344
349
tools: nil ,
345
350
requestOptions: RequestOptions ( ) ,
@@ -360,6 +365,7 @@ final class GenerativeModelTests: XCTestCase {
360
365
func testGenerateContent_auth_nilAuthToken( ) async throws {
361
366
model = GenerativeModel (
362
367
name: " my-model " ,
368
+ projectID: " my-project-id " ,
363
369
apiKey: " API_KEY " ,
364
370
tools: nil ,
365
371
requestOptions: RequestOptions ( ) ,
@@ -380,6 +386,7 @@ final class GenerativeModelTests: XCTestCase {
380
386
func testGenerateContent_auth_authTokenRefreshError( ) async throws {
381
387
model = GenerativeModel (
382
388
name: " my-model " ,
389
+ projectID: " my-project-id " ,
383
390
apiKey: " API_KEY " ,
384
391
tools: nil ,
385
392
requestOptions: RequestOptions ( ) ,
@@ -441,6 +448,29 @@ final class GenerativeModelTests: XCTestCase {
441
448
}
442
449
}
443
450
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
+
444
474
func testGenerateContent_failure_emptyContent( ) async throws {
445
475
MockURLProtocol
446
476
. requestHandler = try httpRequestHandler (
@@ -701,6 +731,7 @@ final class GenerativeModelTests: XCTestCase {
701
731
let requestOptions = RequestOptions ( timeout: expectedTimeout)
702
732
model = GenerativeModel (
703
733
name: " my-model " ,
734
+ projectID: " my-project-id " ,
704
735
apiKey: " API_KEY " ,
705
736
tools: nil ,
706
737
requestOptions: requestOptions,
@@ -738,6 +769,31 @@ final class GenerativeModelTests: XCTestCase {
738
769
XCTFail ( " Should have caught an error. " )
739
770
}
740
771
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
+
741
797
func testGenerateContentStream_failureEmptyContent( ) async throws {
742
798
MockURLProtocol
743
799
. requestHandler = try httpRequestHandler (
@@ -912,6 +968,7 @@ final class GenerativeModelTests: XCTestCase {
912
968
let appCheckToken = " test-valid-token "
913
969
model = GenerativeModel (
914
970
name: " my-model " ,
971
+ projectID: " my-project-id " ,
915
972
apiKey: " API_KEY " ,
916
973
tools: nil ,
917
974
requestOptions: RequestOptions ( ) ,
@@ -933,6 +990,7 @@ final class GenerativeModelTests: XCTestCase {
933
990
func testGenerateContentStream_appCheck_tokenRefreshError( ) async throws {
934
991
model = GenerativeModel (
935
992
name: " my-model " ,
993
+ projectID: " my-project-id " ,
936
994
apiKey: " API_KEY " ,
937
995
tools: nil ,
938
996
requestOptions: RequestOptions ( ) ,
@@ -1078,6 +1136,7 @@ final class GenerativeModelTests: XCTestCase {
1078
1136
let requestOptions = RequestOptions ( timeout: expectedTimeout)
1079
1137
model = GenerativeModel (
1080
1138
name: " my-model " ,
1139
+ projectID: " my-project-id " ,
1081
1140
apiKey: " API_KEY " ,
1082
1141
tools: nil ,
1083
1142
requestOptions: requestOptions,
@@ -1155,6 +1214,7 @@ final class GenerativeModelTests: XCTestCase {
1155
1214
let requestOptions = RequestOptions ( timeout: expectedTimeout)
1156
1215
model = GenerativeModel (
1157
1216
name: " my-model " ,
1217
+ projectID: " my-project-id " ,
1158
1218
apiKey: " API_KEY " ,
1159
1219
tools: nil ,
1160
1220
requestOptions: requestOptions,
@@ -1176,6 +1236,7 @@ final class GenerativeModelTests: XCTestCase {
1176
1236
1177
1237
model = GenerativeModel (
1178
1238
name: modelName,
1239
+ projectID: " my-project-id " ,
1179
1240
apiKey: " API_KEY " ,
1180
1241
tools: nil ,
1181
1242
requestOptions: RequestOptions ( ) ,
@@ -1191,6 +1252,7 @@ final class GenerativeModelTests: XCTestCase {
1191
1252
1192
1253
model = GenerativeModel (
1193
1254
name: modelResourceName,
1255
+ projectID: " my-project-id " ,
1194
1256
apiKey: " API_KEY " ,
1195
1257
tools: nil ,
1196
1258
requestOptions: RequestOptions ( ) ,
@@ -1206,6 +1268,7 @@ final class GenerativeModelTests: XCTestCase {
1206
1268
1207
1269
model = GenerativeModel (
1208
1270
name: tunedModelResourceName,
1271
+ projectID: " my-project-id " ,
1209
1272
apiKey: " API_KEY " ,
1210
1273
tools: nil ,
1211
1274
requestOptions: RequestOptions ( ) ,
0 commit comments