@@ -56,6 +56,41 @@ final class GenerativeModelVertexAITests: XCTestCase {
5656 blocked: false
5757 ) ,
5858 ] . sorted ( )
59+ let safetyRatingsInvalidIgnored = [
60+ SafetyRating (
61+ category: . hateSpeech,
62+ probability: . negligible,
63+ probabilityScore: 0.00039444832 ,
64+ severity: . negligible,
65+ severityScore: 0.0 ,
66+ blocked: false
67+ ) ,
68+ SafetyRating (
69+ category: . dangerousContent,
70+ probability: . negligible,
71+ probabilityScore: 0.0010654529 ,
72+ severity: . negligible,
73+ severityScore: 0.0049325973 ,
74+ blocked: false
75+ ) ,
76+ SafetyRating (
77+ category: . harassment,
78+ probability: . negligible,
79+ probabilityScore: 0.00026658305 ,
80+ severity: . negligible,
81+ severityScore: 0.0 ,
82+ blocked: false
83+ ) ,
84+ SafetyRating (
85+ category: . sexuallyExplicit,
86+ probability: . negligible,
87+ probabilityScore: 0.0013701695 ,
88+ severity: . negligible,
89+ severityScore: 0.07626295 ,
90+ blocked: false
91+ ) ,
92+ // Ignored Invalid Safety Ratings: {},{},{},{}
93+ ] . sorted ( )
5994 let testModelName = " test-model "
6095 let testModelResourceName =
6196 " projects/test-project-id/locations/test-location/publishers/google/models/test-model "
@@ -399,6 +434,26 @@ final class GenerativeModelVertexAITests: XCTestCase {
399434 XCTAssertEqual ( text, " The sum of [1, 2, 3] is " )
400435 }
401436
437+ func testGenerateContent_success_image_invalidSafetyRatingsIgnored( ) async throws {
438+ MockURLProtocol . requestHandler = try GenerativeModelTestUtil . httpRequestHandler (
439+ forResource: " unary-success-image-invalid-safety-ratings " ,
440+ withExtension: " json " ,
441+ subdirectory: vertexSubdirectory
442+ )
443+
444+ let response = try await model. generateContent ( testPrompt)
445+
446+ XCTAssertEqual ( response. candidates. count, 1 )
447+ let candidate = try XCTUnwrap ( response. candidates. first)
448+ XCTAssertEqual ( candidate. content. parts. count, 1 )
449+ XCTAssertEqual ( candidate. safetyRatings. sorted ( ) , safetyRatingsInvalidIgnored)
450+ let inlineDataParts = response. inlineDataParts
451+ XCTAssertEqual ( inlineDataParts. count, 1 )
452+ let imagePart = try XCTUnwrap ( inlineDataParts. first)
453+ XCTAssertEqual ( imagePart. mimeType, " image/png " )
454+ XCTAssertGreaterThan ( imagePart. data. count, 0 )
455+ }
456+
402457 func testGenerateContent_appCheck_validToken( ) async throws {
403458 let appCheckToken = " test-valid-token "
404459 model = GenerativeModel (
@@ -1118,7 +1173,7 @@ final class GenerativeModelVertexAITests: XCTestCase {
11181173 responses += 1
11191174 }
11201175
1121- XCTAssertEqual ( responses, 6 )
1176+ XCTAssertEqual ( responses, 4 )
11221177 }
11231178
11241179 func testGenerateContentStream_successBasicReplyShort( ) async throws {
@@ -1220,6 +1275,31 @@ final class GenerativeModelVertexAITests: XCTestCase {
12201275 XCTAssertFalse ( citations. contains { $0. license? . isEmpty ?? false } )
12211276 }
12221277
1278+ func testGenerateContentStream_successWithInvalidSafetyRatingsIgnored( ) async throws {
1279+ MockURLProtocol . requestHandler = try GenerativeModelTestUtil . httpRequestHandler (
1280+ forResource: " streaming-success-image-invalid-safety-ratings " ,
1281+ withExtension: " txt " ,
1282+ subdirectory: vertexSubdirectory
1283+ )
1284+
1285+ let stream = try model. generateContentStream ( testPrompt)
1286+ var responses = [ GenerateContentResponse] ( )
1287+ for try await content in stream {
1288+ responses. append ( content)
1289+ }
1290+
1291+ let response = try XCTUnwrap ( responses. first)
1292+ XCTAssertEqual ( response. candidates. count, 1 )
1293+ let candidate = try XCTUnwrap ( response. candidates. first)
1294+ XCTAssertEqual ( candidate. safetyRatings. sorted ( ) , safetyRatingsInvalidIgnored)
1295+ XCTAssertEqual ( candidate. content. parts. count, 1 )
1296+ let inlineDataParts = response. inlineDataParts
1297+ XCTAssertEqual ( inlineDataParts. count, 1 )
1298+ let imagePart = try XCTUnwrap ( inlineDataParts. first)
1299+ XCTAssertEqual ( imagePart. mimeType, " image/png " )
1300+ XCTAssertGreaterThan ( imagePart. data. count, 0 )
1301+ }
1302+
12231303 func testGenerateContentStream_appCheck_validToken( ) async throws {
12241304 let appCheckToken = " test-valid-token "
12251305 model = GenerativeModel (
0 commit comments