package scan import ( "context" "errors" "testing" ) func TestDiscoverer_DirectWorkdayURL(t *testing.T) { d := &Discoverer{} out, err := d.Discover(context.Background(), "https://accenture.wd3.myworkdayjobs.com/en-US/AccentureCareers") if err != nil { t.Fatalf("Discover: %v", err) } if out.Host != "https://accenture.wd3.myworkdayjobs.com" { t.Errorf("host = %q", out.Host) } if out.Tenant != "accenture" { t.Errorf("tenant = %q", out.Tenant) } if out.Site != "AccentureCareers" { t.Errorf("site = %q", out.Site) } if out.Source != "url" { t.Errorf("source = %q, want url", out.Source) } } func TestDiscoverer_InvalidInput(t *testing.T) { d := &Discoverer{} if _, err := d.Discover(context.Background(), ""); err == nil { t.Fatal("empty input must error") } if _, err := d.Discover(context.Background(), "not a url"); err == nil { t.Fatal("bad url must error") } } func TestDiscoverer_NoScript_NoMatch(t *testing.T) { d := &Discoverer{} _, err := d.Discover(context.Background(), "https://careers.example.com/jobs") if !errors.Is(err, ErrNoDiscovery) { t.Fatalf("expected ErrNoDiscovery, got %v", err) } } func TestParseDiscoverOutput_PullsWorkdayFromYAML(t *testing.T) { raw := `...some preamble... - name: KPMG careers_url: https://kpmg.wd5.myworkdayjobs.com/Global workday: host: https://kpmg.wd5.myworkdayjobs.com tenant: kpmg site: Global enabled: true` d := parseDiscoverOutput("https://kpmg.com/careers", raw) if d.Host != "https://kpmg.wd5.myworkdayjobs.com" { t.Errorf("host = %q", d.Host) } if d.Tenant != "kpmg" { t.Errorf("tenant = %q", d.Tenant) } if d.Site != "Global" { t.Errorf("site = %q", d.Site) } } func TestYAMLSnippet_IncludesAllFields(t *testing.T) { d := WorkdayDiscovery{ Host: "https://acme.wd3.myworkdayjobs.com", Tenant: "acme", Site: "Careers", } snip := d.YAMLSnippet("Acme Corp") for _, want := range []string{ "name: Acme Corp", "tenant: acme", "site: Careers", "host: https://acme.wd3.myworkdayjobs.com", "enabled: true", } { if !contains(snip, want) { t.Errorf("snippet missing %q: %s", want, snip) } } } // contains is a thin wrapper so I don't drag strings.Contains into every test. func contains(haystack, needle string) bool { return len(haystack) >= len(needle) && indexOf(haystack, needle) >= 0 } func indexOf(haystack, needle string) int { for i := 0; i+len(needle) <= len(haystack); i++ { if haystack[i:i+len(needle)] == needle { return i } } return -1 }