@@ -259,4 +259,61 @@ final class GitServiceTests: XCTestCase {
259259 // Then
260260 XCTAssertEqual ( mockRunner. executedScript, " cd /workspace && git commit -m 'feat: it' \" ' \" 's done' " )
261261 }
262+
263+ func testGitFileChangeEncodingExcludesUIOnlyID( ) throws {
264+ // Given
265+ let model = GitFileChange ( path: " Sources/Zero/main.swift " , changeType: . modified)
266+
267+ // When
268+ let encoded = try JSONEncoder ( ) . encode ( model)
269+ let payload = try jsonObject ( from: encoded)
270+
271+ // Then
272+ XCTAssertNil ( payload [ " id " ] )
273+ XCTAssertEqual ( payload [ " path " ] as? String , " Sources/Zero/main.swift " )
274+ XCTAssertEqual ( payload [ " changeType " ] as? String , " M " )
275+ }
276+
277+ func testGitBranchEncodingExcludesUIOnlyID( ) throws {
278+ // Given
279+ let model = GitBranch (
280+ name: " main " ,
281+ isCurrent: true ,
282+ isRemote: false ,
283+ commitHash: " abc123 " ,
284+ commitMessage: " initial "
285+ )
286+
287+ // When
288+ let encoded = try JSONEncoder ( ) . encode ( model)
289+ let payload = try jsonObject ( from: encoded)
290+
291+ // Then
292+ XCTAssertNil ( payload [ " id " ] )
293+ XCTAssertEqual ( payload [ " name " ] as? String , " main " )
294+ XCTAssertEqual ( payload [ " isCurrent " ] as? Bool , true )
295+ }
296+
297+ func testGitStashEncodingExcludesUIOnlyID( ) throws {
298+ // Given
299+ let model = GitStash ( index: 0 , hash: " def456 " , message: " WIP " )
300+
301+ // When
302+ let encoded = try JSONEncoder ( ) . encode ( model)
303+ let payload = try jsonObject ( from: encoded)
304+
305+ // Then
306+ XCTAssertNil ( payload [ " id " ] )
307+ XCTAssertEqual ( payload [ " index " ] as? Int , 0 )
308+ XCTAssertEqual ( payload [ " hash " ] as? String , " def456 " )
309+ }
310+
311+ private func jsonObject( from data: Data ) throws -> [ String : Any ] {
312+ let object = try JSONSerialization . jsonObject ( with: data)
313+ guard let dictionary = object as? [ String : Any ] else {
314+ XCTFail ( " Expected dictionary JSON object " )
315+ return [ : ]
316+ }
317+ return dictionary
318+ }
262319}
0 commit comments