1import Foundation2import Testing34@testable import Haven56@Suite("API models")7struct ModelsTests {8 @Test("Wallpaper round-trips through Codable")9 func wallpaperCodableRoundTrip() throws {10 let wallpaper = makeWallpaper()1112 let data = try JSONEncoder().encode(wallpaper)13 let decoded = try JSONDecoder().decode(Wallpaper.self, from: data)1415 #expect(decoded.id == wallpaper.id)16 #expect(decoded.url == wallpaper.url)17 #expect(decoded.path == wallpaper.path)18 #expect(decoded.resolution == wallpaper.resolution)19 #expect(decoded.file_size == wallpaper.file_size)20 #expect(decoded.thumbs == wallpaper.thumbs)21 }2223 @Test("Wallpaper identity equality is based on Wallhaven ID")24 func wallpaperEqualityUsesID() {25 let first = makeWallpaper(id: "same", path: "https://example.com/first.jpg")26 let second = makeWallpaper(id: "same", path: "https://example.com/second.jpg")27 let third = makeWallpaper(id: "different")2829 #expect(first == second)30 #expect(first != third)31 }3233 @Test("Optional API metadata may be absent")34 func responseWithoutMetadataDecodes() throws {35 let data = try JSONSerialization.data(withJSONObject: [36 "data": [37 [38 "id": "abc123",39 "url": "https://wallhaven.cc/w/abc123",40 "path": "https://w.wallhaven.cc/full/ab/wallhaven-abc123.jpg",41 "resolution": "1920x1080",42 "purity": "sfw",43 "thumbs": [44 "large": "https://example.com/large.jpg",45 "original": "https://example.com/original.jpg",46 "small": "https://example.com/small.jpg",47 ],48 ]49 ]50 ])5152 let decoded = try JSONDecoder().decode(WallhavenResponse.self, from: data)5354 #expect(decoded.data.count == 1)55 #expect(decoded.data[0].file_size == nil)56 #expect(decoded.meta == nil)57 }5859 @Test("Metadata uses the API's snake-case keys")60 func metadataDecodesSnakeCaseKeys() throws {61 let data = Data(62 #"{"data":[],"meta":{"current_page":3,"last_page":7,"per_page":24,"total":150}}"#.utf8)6364 let decoded = try JSONDecoder().decode(WallhavenResponse.self, from: data)6566 #expect(decoded.meta?.current_page == 3)67 #expect(decoded.meta?.last_page == 7)68 #expect(decoded.meta?.per_page == 24)69 #expect(decoded.meta?.total == 150)70 }71}