// // SearchCriteriaInterpretationTests.swift // indeed_ai_job_searchTests // import XCTest @testable import indeed_ai_job_search final class SearchCriteriaInterpretationTests: XCTestCase { func testDecodesStructuredCriteriaJSON() throws { let json = """ { "jobTitle": "iOS Developer", "keywords": "SwiftUI", "exactPhrase": false, "excludedKeywords": "Flutter", "country": "Pakistan", "city": "Lahore", "remoteTypes": ["remote", "hybrid"], "employmentTypes": ["fullTime"], "experienceLevels": ["senior"], "salaryFloor": 2000000, "dateFreshnessDays": 7, "confidenceNote": "Clear remote senior iOS intent." } """ let dto = try JSONDecoder().decode( SearchCriteriaInterpretationDTO.self, from: Data(json.utf8) ) let criteria = dto.toSearchCriteria() XCTAssertEqual(criteria.jobTitle, "iOS Developer") XCTAssertEqual(criteria.keywords, "SwiftUI") XCTAssertEqual(criteria.excludedKeywords, "Flutter") XCTAssertEqual(criteria.country, "Pakistan") XCTAssertEqual(criteria.city, "Lahore") XCTAssertEqual(criteria.remoteTypes, Set([.remote, .hybrid])) XCTAssertEqual(criteria.employmentTypes, Set([.fullTime])) XCTAssertEqual(criteria.experienceLevels, Set([.senior])) XCTAssertEqual(criteria.salaryFloor, 2_000_000) XCTAssertEqual(criteria.dateFreshnessDays, 7) XCTAssertEqual(dto.confidenceNote, "Clear remote senior iOS intent.") } func testMapsAlternateRemoteSpelling() { let dto = SearchCriteriaInterpretationDTO( remoteTypes: ["on-site", "Remote"] ) let criteria = dto.toSearchCriteria() XCTAssertEqual(criteria.remoteTypes, Set([.onsite, .remote])) } func testObfuscationRoundTrip() { let sample = "sk-proj-test-key-not-real" let obfuscated = SecretsProvider.obfuscateForConfig(sample) let restored = SecretsProvider.deobfuscate(obfuscated) XCTAssertEqual(restored, sample) } }