import Foundation import Testing @testable import Haven @Suite("API models") struct ModelsTests { @Test("Wallpaper round-trips through Codable") func wallpaperCodableRoundTrip() throws { let wallpaper = makeWallpaper() let data = try JSONEncoder().encode(wallpaper) let decoded = try JSONDecoder().decode(Wallpaper.self, from: data) #expect(decoded.id == wallpaper.id) #expect(decoded.url == wallpaper.url) #expect(decoded.path == wallpaper.path) #expect(decoded.resolution == wallpaper.resolution) #expect(decoded.file_size == wallpaper.file_size) #expect(decoded.thumbs == wallpaper.thumbs) } @Test("Wallpaper identity equality is based on Wallhaven ID") func wallpaperEqualityUsesID() { let first = makeWallpaper(id: "same", path: "https://example.com/first.jpg") let second = makeWallpaper(id: "same", path: "https://example.com/second.jpg") let third = makeWallpaper(id: "different") #expect(first == second) #expect(first != third) } @Test("Optional API metadata may be absent") func responseWithoutMetadataDecodes() throws { let data = try JSONSerialization.data(withJSONObject: [ "data": [ [ "id": "abc123", "url": "https://wallhaven.cc/w/abc123", "path": "https://w.wallhaven.cc/full/ab/wallhaven-abc123.jpg", "resolution": "1920x1080", "purity": "sfw", "thumbs": [ "large": "https://example.com/large.jpg", "original": "https://example.com/original.jpg", "small": "https://example.com/small.jpg", ], ] ] ]) let decoded = try JSONDecoder().decode(WallhavenResponse.self, from: data) #expect(decoded.data.count == 1) #expect(decoded.data[0].file_size == nil) #expect(decoded.meta == nil) } @Test("Metadata uses the API's snake-case keys") func metadataDecodesSnakeCaseKeys() throws { let data = Data( #"{"data":[],"meta":{"current_page":3,"last_page":7,"per_page":24,"total":150}}"#.utf8) let decoded = try JSONDecoder().decode(WallhavenResponse.self, from: data) #expect(decoded.meta?.current_page == 3) #expect(decoded.meta?.last_page == 7) #expect(decoded.meta?.per_page == 24) #expect(decoded.meta?.total == 150) } }