| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- //
- // IndeedHTMLJobParserTests.swift
- // indeed_ai_job_searchTests
- //
- import XCTest
- @testable import indeed_ai_job_search
- final class IndeedHTMLJobParserTests: XCTestCase {
- func testDetectsCaptchaPage() {
- let html = """
- <html><title>Security Check - Indeed.com</title>
- <script>window.INDEED_CLOUDFLARE_STATIC_PAGE={PAGE_TYPE:"captcha"};</script>
- </html>
- """
- XCTAssertTrue(IndeedHTMLJobParser.isBlockedOrCaptcha(html))
- XCTAssertThrowsError(
- try IndeedHTMLJobParser.parse(
- html: html,
- pageURL: URL(string: "https://www.indeed.com/jobs")!
- )
- ) { error in
- guard case IndeedDataError.forbidden = error else {
- return XCTFail("Expected forbidden, got \(error)")
- }
- }
- }
- func testParsesEmbeddedJobKeyJSON() throws {
- let html = """
- <html><body>
- <script>
- var results = [
- {
- "jobkey": "5185d0dd8c286093",
- "displayTitle": "iOS Engineer",
- "company": "Tuyo",
- "formattedLocation": "Remote",
- "snippet": "Build SwiftUI apps",
- "link": "/viewjob?jk=5185d0dd8c286093",
- "jobTypes": ["Full-time"],
- "salarySnippet": { "text": "$120,000 - $160,000 a year" }
- },
- {
- "jobKey": "a1b2c3d4e5f60718",
- "title": "Senior iOS Developer",
- "companyName": "Acme Labs",
- "formattedLocation": "Lahore, Pakistan",
- "snippet": "PKR roles",
- "url": "https://pk.indeed.com/viewjob?jk=a1b2c3d4e5f60718"
- }
- ];
- </script>
- <div data-jk="5185d0dd8c286093"></div>
- </body></html>
- """
- let pageURL = URL(string: "https://www.indeed.com/jobs?q=iOS")!
- let dtos = try IndeedHTMLJobParser.parse(html: html, pageURL: pageURL)
- XCTAssertGreaterThanOrEqual(dtos.count, 2)
- let tuyo = try XCTUnwrap(dtos.first { $0.jobKey == "5185d0dd8c286093" })
- XCTAssertEqual(tuyo.title, "iOS Engineer")
- XCTAssertEqual(tuyo.company, "Tuyo")
- XCTAssertTrue(tuyo.url.contains("5185d0dd8c286093"))
- XCTAssertTrue(IndeedBrowseURLBuilder.isLikelyRealJobKey(tuyo.jobKey ?? ""))
- let mapped = try IndeedListingMapper.map(tuyo)
- XCTAssertEqual(mapped.company, "Tuyo")
- XCTAssertTrue(mapped.indeedURL.absoluteString.contains("viewjob"))
- XCTAssertFalse(IndeedBrowseURLBuilder.openableURL(for: mapped).usedBrowseFallback)
- }
- func testParsesDataJKHTMLCards() throws {
- let html = """
- <html><body>
- <div class="cardOutline" data-jk="abcdef0123456789">
- <h2 class="jobTitle"><a href="/viewjob?jk=abcdef0123456789">SwiftUI Developer</a></h2>
- <span data-testid="company-name">Nexlify Studio</span>
- <div data-testid="text-location">Lahore, Pakistan</div>
- <div data-testid="attribute_snippet_testid">Rs 1,800,000 - Rs 2,800,000 a year</div>
- </div>
- </body></html>
- """
- let dtos = try IndeedHTMLJobParser.parse(
- html: html,
- pageURL: URL(string: "https://pk.indeed.com/jobs")!
- )
- let job = try XCTUnwrap(dtos.first)
- XCTAssertEqual(job.jobKey, "abcdef0123456789")
- XCTAssertEqual(job.title, "SwiftUI Developer")
- XCTAssertEqual(job.company, "Nexlify Studio")
- XCTAssertEqual(job.salaryCurrency, "PKR")
- }
- }
- final class IndeedSearchURLBuilderTests: XCTestCase {
- func testBuildsPakistanHostFromCountry() {
- var criteria = SearchCriteria()
- criteria.jobTitle = "iOS Developer"
- criteria.country = "Pakistan"
- criteria.city = "Lahore"
- let url = IndeedSearchURLBuilder.searchURL(criteria: criteria, query: "iOS developer")
- XCTAssertEqual(url.host, "pk.indeed.com")
- XCTAssertTrue(url.path.contains("/jobs"))
- let q = URLComponents(url: url, resolvingAgainstBaseURL: false)?
- .queryItems?.first { $0.name == "q" }?.value
- XCTAssertEqual(q, "iOS Developer")
- }
- func testRemoteOnlySetsLocationRemote() {
- var criteria = SearchCriteria()
- criteria.jobTitle = "iOS"
- criteria.remoteTypes = [.remote]
- let url = IndeedSearchURLBuilder.searchURL(criteria: criteria, query: "iOS")
- let loc = URLComponents(url: url, resolvingAgainstBaseURL: false)?
- .queryItems?.first { $0.name == "l" }?.value
- XCTAssertEqual(loc, "Remote")
- }
- }
- final class JobListingFilterUnknownFieldTests: XCTestCase {
- func testKeepsListingWhenEmploymentUnknownButFilterSet() {
- var listing = JobListing(
- indeedJobKey: "5185d0dd8c286093",
- title: "iOS Developer",
- company: "Acme",
- location: "Remote",
- remoteType: .remote,
- employmentType: nil,
- postedAt: Date(),
- snippet: "Swift",
- indeedURL: URL(string: "https://www.indeed.com/viewjob?jk=5185d0dd8c286093")!
- )
- var criteria = SearchCriteria()
- criteria.jobTitle = "iOS"
- criteria.employmentTypes = [.fullTime]
- let filtered = JobListingFilter.filter([listing], criteria: criteria, query: "iOS")
- XCTAssertEqual(filtered.count, 1)
- listing.employmentType = .partTime
- let dropped = JobListingFilter.filter([listing], criteria: criteria, query: "iOS")
- XCTAssertTrue(dropped.isEmpty)
- }
- }
|