@@ -50,112 +50,85 @@ final class MetaDataMapperTests: XCTestCase {
5050 XCTAssertEqual ( metadata [ 6 ] , MetaData ( metadataID: 7 , key: " empty_field " , value: " " ) )
5151 }
5252
53- /// Tests that MetaDataMapper.decodeMetaData can decode from array format using KeyedDecodingContainer
53+ /// Tests that FlexibleMetaDataArray can decode from array format
5454 ///
55- func test_decodeMetaData_from_KeyedContainer_array_format ( ) throws {
55+ func test_FlexibleMetaDataArray_decodes_from_array_format ( ) throws {
5656 // Given - JSON with metadata as array
5757 let jsonString = """
58- {
59- " meta_data " : [
60- {
61- " id " : 1001,
62- " key " : " custom_field_1 " ,
63- " value " : " value1 "
64- },
65- {
66- " id " : 1002,
67- " key " : " _internal_field " ,
68- " value " : " internal_value "
69- },
70- {
71- " id " : 1003,
72- " key " : " custom_field_2 " ,
73- " value " : " value2 "
74- }
75- ]
76- }
77- """
78-
79- struct TestObject : Decodable {
80- let metadata : [ MetaData ]
81-
82- private enum CodingKeys : String , CodingKey {
83- case metadata = " meta_data "
84- }
85-
86- init ( from decoder: Decoder ) throws {
87- let container = try decoder. container ( keyedBy: CodingKeys . self)
88- self . metadata = MetaDataMapper . decodeMetaData ( from: container, forKey: . metadata)
58+ [
59+ {
60+ " id " : 1001,
61+ " key " : " custom_field_1 " ,
62+ " value " : " value1 "
63+ },
64+ {
65+ " id " : 1002,
66+ " key " : " _internal_field " ,
67+ " value " : " internal_value "
68+ },
69+ {
70+ " id " : 1003,
71+ " key " : " custom_field_2 " ,
72+ " value " : " value2 "
8973 }
90- }
74+ ]
75+ """
9176
9277 let data = jsonString. data ( using: . utf8) !
9378 let decoder = JSONDecoder ( )
9479
9580 // When
96- let testObject = try decoder. decode ( TestObject . self, from: data)
81+ let flexibleMetaData = try decoder. decode ( FlexibleMetaDataArray . self, from: data)
9782
9883 // Then
99- XCTAssertEqual ( testObject. metadata. count, 2 ) // Internal field should be filtered out
100- XCTAssertEqual ( testObject. metadata [ 0 ] . metadataID, 1001 )
101- XCTAssertEqual ( testObject. metadata [ 0 ] . key, " custom_field_1 " )
102- XCTAssertEqual ( testObject. metadata [ 0 ] . value. stringValue, " value1 " )
103- XCTAssertEqual ( testObject. metadata [ 1 ] . metadataID, 1003 )
104- XCTAssertEqual ( testObject. metadata [ 1 ] . key, " custom_field_2 " )
105- XCTAssertEqual ( testObject. metadata [ 1 ] . value. stringValue, " value2 " )
84+ XCTAssertEqual ( flexibleMetaData. metadata. count, 3 ) // All fields should be present (no internal filtering in wrapper)
85+ XCTAssertEqual ( flexibleMetaData. metadata [ 0 ] . metadataID, 1001 )
86+ XCTAssertEqual ( flexibleMetaData. metadata [ 0 ] . key, " custom_field_1 " )
87+ XCTAssertEqual ( flexibleMetaData. metadata [ 0 ] . value. stringValue, " value1 " )
88+ XCTAssertEqual ( flexibleMetaData. metadata [ 1 ] . metadataID, 1002 )
89+ XCTAssertEqual ( flexibleMetaData. metadata [ 1 ] . key, " _internal_field " )
90+ XCTAssertEqual ( flexibleMetaData. metadata [ 1 ] . value. stringValue, " internal_value " )
91+ XCTAssertEqual ( flexibleMetaData. metadata [ 2 ] . metadataID, 1003 )
92+ XCTAssertEqual ( flexibleMetaData. metadata [ 2 ] . key, " custom_field_2 " )
93+ XCTAssertEqual ( flexibleMetaData. metadata [ 2 ] . value. stringValue, " value2 " )
10694 }
10795
108- /// Tests that MetaDataMapper.decodeMetaData can decode from dictionary format using KeyedDecodingContainer
96+ /// Tests that FlexibleMetaDataArray can decode from dictionary format
10997 ///
110- func test_decodeMetaData_from_KeyedContainer_dictionary_format ( ) throws {
98+ func test_FlexibleMetaDataArray_decodes_from_dictionary_format ( ) throws {
11199 // Given - JSON with metadata as object keyed by index strings
112100 let jsonString = """
113101 {
114- " meta_data " : {
115- " 0 " : {
116- " id " : 2001,
117- " key " : " dict_field_1 " ,
118- " value " : " dict_value1 "
119- },
120- " 1 " : {
121- " id " : 2002,
122- " key " : " _internal_dict_field " ,
123- " value " : " internal_dict_value "
124- },
125- " 2 " : {
126- " id " : 2003,
127- " key " : " dict_field_2 " ,
128- " value " : " dict_value2 "
129- }
102+ " 0 " : {
103+ " id " : 2001,
104+ " key " : " dict_field_1 " ,
105+ " value " : " dict_value1 "
106+ },
107+ " 1 " : {
108+ " id " : 2002,
109+ " key " : " _internal_dict_field " ,
110+ " value " : " internal_dict_value "
111+ },
112+ " 2 " : {
113+ " id " : 2003,
114+ " key " : " dict_field_2 " ,
115+ " value " : " dict_value2 "
130116 }
131117 }
132118 """
133119
134- struct TestObject : Decodable {
135- let metadata : [ MetaData ]
136-
137- private enum CodingKeys : String , CodingKey {
138- case metadata = " meta_data "
139- }
140-
141- init ( from decoder: Decoder ) throws {
142- let container = try decoder. container ( keyedBy: CodingKeys . self)
143- self . metadata = MetaDataMapper . decodeMetaData ( from: container, forKey: . metadata)
144- }
145- }
146-
147120 let data = jsonString. data ( using: . utf8) !
148121 let decoder = JSONDecoder ( )
149122
150123 // When
151- let testObject = try decoder. decode ( TestObject . self, from: data)
124+ let flexibleMetaData = try decoder. decode ( FlexibleMetaDataArray . self, from: data)
152125
153126 // Then
154- XCTAssertEqual ( testObject . metadata. count, 2 ) // Internal field should be filtered out
155- let fieldNames = Set ( testObject . metadata. map { $0. key } )
127+ XCTAssertEqual ( flexibleMetaData . metadata. count, 3 ) // All fields should be present
128+ let fieldNames = Set ( flexibleMetaData . metadata. map { $0. key } )
156129 XCTAssertTrue ( fieldNames. contains ( " dict_field_1 " ) )
157130 XCTAssertTrue ( fieldNames. contains ( " dict_field_2 " ) )
158- XCTAssertFalse ( fieldNames. contains ( " _internal_dict_field " ) )
131+ XCTAssertTrue ( fieldNames. contains ( " _internal_dict_field " ) )
159132 }
160133
161134}
0 commit comments