ModelsTests.swift

2.3 KB · raw

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}