Skip to content

Commit 35e2b32

Browse files
committed
RUM-11242 Make mimeType non-optional
1 parent ba7510d commit 35e2b32

5 files changed

Lines changed: 95 additions & 10 deletions

File tree

Datadog/Datadog.xcodeproj/project.pbxproj

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@
442442
49D8C0BE2AC5F2BC0075E427 /* Logs+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49D8C0B92AC5F21F0075E427 /* Logs+Internal.swift */; };
443443
5B0A9B8B2E3BB98E00A8131C /* GraphicsFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0A9B8A2E3BB98500A8131C /* GraphicsFilter.swift */; };
444444
5B0A9B8D2E3BBB4500A8131C /* GraphicsFilter+Reflection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0A9B8C2E3BBB3D00A8131C /* GraphicsFilter+Reflection.swift */; };
445+
5B3AF8AA2E4B3AE9009E5375 /* EnrichedResourceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B3AF8A92E4B3AE6009E5375 /* EnrichedResourceTests.swift */; };
445446
5B9B20C52E460A0600C95B6C /* ShapeResourceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B9B20C42E4609FC00C95B6C /* ShapeResourceTests.swift */; };
446447
5B9CB9E32E41F6F9005485E6 /* ImageRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B9CB9E22E41F6F6005485E6 /* ImageRepresentable.swift */; };
447448
5B9CB9E52E41FD60005485E6 /* Drawing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B9CB9E42E41FD5C005485E6 /* Drawing.swift */; };
@@ -2442,6 +2443,7 @@
24422443
49D8C0B92AC5F21F0075E427 /* Logs+Internal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Logs+Internal.swift"; sourceTree = "<group>"; };
24432444
5B0A9B8A2E3BB98500A8131C /* GraphicsFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphicsFilter.swift; sourceTree = "<group>"; };
24442445
5B0A9B8C2E3BBB3D00A8131C /* GraphicsFilter+Reflection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GraphicsFilter+Reflection.swift"; sourceTree = "<group>"; };
2446+
5B3AF8A92E4B3AE6009E5375 /* EnrichedResourceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnrichedResourceTests.swift; sourceTree = "<group>"; };
24452447
5B9B20C42E4609FC00C95B6C /* ShapeResourceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShapeResourceTests.swift; sourceTree = "<group>"; };
24462448
5B9CB9E22E41F6F6005485E6 /* ImageRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRepresentable.swift; sourceTree = "<group>"; };
24472449
5B9CB9E42E41FD5C005485E6 /* Drawing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Drawing.swift; sourceTree = "<group>"; };
@@ -4008,6 +4010,14 @@
40084010
path = WatchdogTerminations;
40094011
sourceTree = "<group>";
40104012
};
4013+
5B3AF8A82E4B3A7F009E5375 /* Models */ = {
4014+
isa = PBXGroup;
4015+
children = (
4016+
5B3AF8A92E4B3AE6009E5375 /* EnrichedResourceTests.swift */,
4017+
);
4018+
path = Models;
4019+
sourceTree = "<group>";
4020+
};
40114021
61020C272757AD63005EEAEA /* BackgroundEvents */ = {
40124022
isa = PBXGroup;
40134023
children = (
@@ -4041,18 +4051,19 @@
40414051
61054E022A6EE0DB00AAA894 /* DatadogSessionReplayTests */ = {
40424052
isa = PBXGroup;
40434053
children = (
4044-
960B26C12D03611400D7196F /* Resources */,
4045-
96E863712C9C547B0023BF78 /* SessionReplayOverrideTests.swift */,
4046-
61054F482A6EE1B900AAA894 /* SessionReplayTests.swift */,
4047-
61054F3D2A6EE1B900AAA894 /* SessionReplayConfigurationTests.swift */,
4048-
D2A434AD2A8E426C0028E329 /* DDSessionReplayTests.swift */,
4049-
96E863752C9C7E800023BF78 /* DDSessionReplayOverridesTests.swift */,
40504054
61054F882A6EE1BA00AAA894 /* Feature */,
40514055
61054F922A6EE1BA00AAA894 /* Helpers */,
4056+
5B3AF8A82E4B3A7F009E5375 /* Models */,
40524057
61054F4E2A6EE1BA00AAA894 /* Processor */,
40534058
61054F592A6EE1BA00AAA894 /* Recorder */,
4059+
960B26C12D03611400D7196F /* Resources */,
40544060
61054F3E2A6EE1B900AAA894 /* Utilities */,
40554061
61054F492A6EE1BA00AAA894 /* Writer */,
4062+
96E863712C9C547B0023BF78 /* SessionReplayOverrideTests.swift */,
4063+
61054F482A6EE1B900AAA894 /* SessionReplayTests.swift */,
4064+
61054F3D2A6EE1B900AAA894 /* SessionReplayConfigurationTests.swift */,
4065+
D2A434AD2A8E426C0028E329 /* DDSessionReplayTests.swift */,
4066+
96E863752C9C7E800023BF78 /* DDSessionReplayOverridesTests.swift */,
40564067
);
40574068
name = DatadogSessionReplayTests;
40584069
path = ../DatadogSessionReplay/Tests;
@@ -8544,6 +8555,7 @@
85448555
61054FB52A6EE1BA00AAA894 /* UISliderRecorderTests.swift in Sources */,
85458556
5B9B20C52E460A0600C95B6C /* ShapeResourceTests.swift in Sources */,
85468557
61054FB22A6EE1BA00AAA894 /* UILabelRecorderTests.swift in Sources */,
8558+
5B3AF8AA2E4B3AE9009E5375 /* EnrichedResourceTests.swift in Sources */,
85478559
D2C5D52D2B84F6D800B63F36 /* WebViewRecordReceiverTests.swift in Sources */,
85488560
61054FBA2A6EE1BA00AAA894 /* UIImageViewRecorderTests.swift in Sources */,
85498561
61054FC02A6EE1BA00AAA894 /* UITextViewRecorderTests.swift in Sources */,

DatadogSessionReplay/Sources/Feature/RequestBuilders/ResourceRequestBuilder.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ internal struct ResourceRequestBuilder: FeatureRequestBuilder {
7575
name: "image",
7676
filename: $0.identifier,
7777
data: $0.data,
78-
mimeType: $0.mimeType ?? "image/png"
78+
mimeType: $0.mimeType
7979
)
8080
}
8181
if let context = resources.first?.context {

DatadogSessionReplay/Sources/Models/EnrichedResource.swift

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,31 @@ internal struct EnrichedResource: Codable, Equatable {
2323
}
2424
internal var identifier: String
2525
internal var data: Data
26-
internal var mimeType: String?
26+
internal var mimeType: String
2727
internal var context: Context
2828

2929
internal init(
3030
identifier: String,
3131
data: Data,
32-
mimeType: String?,
32+
mimeType: String,
3333
context: Context
3434
) {
3535
self.identifier = identifier
3636
self.data = data
3737
self.mimeType = mimeType
3838
self.context = context
3939
}
40+
41+
init(from decoder: any Decoder) throws {
42+
let container = try decoder.container(keyedBy: CodingKeys.self)
43+
44+
self.identifier = try container.decode(String.self, forKey: .identifier)
45+
self.data = try container.decode(Data.self, forKey: .data)
46+
self.context = try container.decode(EnrichedResource.Context.self, forKey: .context)
47+
48+
// Maintain backward compatibility:
49+
// Before introducing `mimeType` all resources where PNG images
50+
self.mimeType = try container.decodeIfPresent(String.self, forKey: .mimeType) ?? "image/png"
51+
}
4052
}
4153
#endif
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
3+
* This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
* Copyright 2019-Present Datadog, Inc.
5+
*/
6+
7+
#if os(iOS)
8+
9+
import XCTest
10+
@testable import DatadogSessionReplay
11+
12+
final class EnrichedResourceTests: XCTestCase {
13+
func testDecodingWithMimeType() throws {
14+
let json = """
15+
{
16+
"identifier": "test-resource-123",
17+
"data": "aGVsbG8gd29ybGQ=",
18+
"mimeType": "image/svg+xml",
19+
"context": {
20+
"type": "resource",
21+
"application": {
22+
"id": "test-app-123"
23+
}
24+
}
25+
}
26+
""".data(using: .utf8)!
27+
28+
let resource = try JSONDecoder().decode(EnrichedResource.self, from: json)
29+
30+
XCTAssertEqual(resource.identifier, "test-resource-123")
31+
XCTAssertEqual(resource.data, Data(base64Encoded: "aGVsbG8gd29ybGQ=")!)
32+
XCTAssertEqual(resource.mimeType, "image/svg+xml")
33+
XCTAssertEqual(resource.context.type, "resource")
34+
XCTAssertEqual(resource.context.application.id, "test-app-123")
35+
}
36+
37+
func testDecodingWithoutMimeTypeUsesDefaultPNG() throws {
38+
let json = """
39+
{
40+
"identifier": "legacy-resource-456",
41+
"data": "aW1hZ2VieXRlcw==",
42+
"context": {
43+
"type": "resource",
44+
"application": {
45+
"id": "test-app-123"
46+
}
47+
}
48+
}
49+
""".data(using: .utf8)!
50+
51+
let resource = try JSONDecoder().decode(EnrichedResource.self, from: json)
52+
53+
XCTAssertEqual(resource.identifier, "legacy-resource-456")
54+
XCTAssertEqual(resource.data, Data(base64Encoded: "aW1hZ2VieXRlcw==")!)
55+
XCTAssertEqual(resource.mimeType, "image/png", "Should default to PNG for backward compatibility")
56+
XCTAssertEqual(resource.context.type, "resource")
57+
XCTAssertEqual(resource.context.application.id, "test-app-123")
58+
}
59+
}
60+
61+
#endif

TestUtilities/Sources/Mocks/DatadogSessionReplay/ResourceMocks.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ extension EnrichedResource: RandomMockable, AnyMockable {
2121
public static func mockWith(
2222
identifier: String = .mockAny(),
2323
data: Data = .mockAny(),
24-
mimeType: String? = .mockAny(),
24+
mimeType: String = .mockAny(),
2525
context: Context = .mockAny()
2626
) -> EnrichedResource {
2727
return .init(

0 commit comments

Comments
 (0)