Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
6.3 KiB
JSON
1 line
6.3 KiB
JSON
{"repo": "ashutosh7859/job-prep", "files": {"tests/server/providers/harvestConfirmation.test.ts": {"eb29af87a28190b2cc47e82f86764b3c15a825b2": {"t": 1786068281.1924014, "n": 6042, "h": "6f67df18c11bcebd", "c": "import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest';\nimport { confirmHarvestJobs } from '@/server/providers/harvestConfirmation';\n\nconst generateJsonMock = vi.fn();\n\nvi.mock('@/server/llm', () => ({\n generateJson: (...args: any[]) => generateJsonMock(...args),\n Type: {\n OBJECT: 'object',\n ARRAY: 'array',\n STRING: 'string',\n NUMBER: 'number',\n BOOLEAN: 'boolean',\n },\n}));\n\nconst LLM_ENV_KEYS = ['GROQ_API_KEY', 'GEMINI_API_KEY', 'KIMI_K2_API_KEY', 'DEEPSEEK_API_KEY'] as const;\nconst savedEnv = Object.fromEntries(LLM_ENV_KEYS.map((k) => [k, process.env[k]]));\n\nfunction makeJob(overrides: Record<string, unknown> = {}) {\n return {\n job_id: 'job-1',\n title: 'Software Engineer',\n company_name: 'Acme Corp',\n location: 'Remote',\n description: 'Build great software products for millions of users.',\n sourceUrl: 'https://jobs.example.com/1',\n ...overrides,\n };\n}\n\ndescribe('confirmHarvestJobs', () => {\n beforeEach(() => {\n vi.restoreAllMocks();\n generateJsonMock.mockReset();\n for (const key of LLM_ENV_KEYS) delete process.env[key];\n });\n\n afterAll(() => {\n for (const [k, v] of Object.entries(savedEnv)) {\n if (v === undefined) delete process.env[k];\n else process.env[k] = v;\n }\n });\n\n it('returns all jobs with gate.enabled=false when disabled', async () => {\n const jobs = [makeJob()];\n const result = await confirmHarvestJobs({ jobs, enabled: false });\n\n expect(result.jobs).toEqual(jobs);\n expect(result.gate.enabled).toBe(false);\n expect(result.gate.skippedReason).toBe('disabled');\n expect(generateJsonMock).not.toHaveBeenCalled();\n });\n\n it('skips gate with no-llm-key when no LLM key is set', async () => {\n const jobs = [makeJob()];\n const result = await confirmHarvestJobs({ jobs });\n\n expect(result.jobs).toEqual(jobs);\n expect(result.gate.enabled).toBe(true);\n expect(result.gate.used).toBe(false);\n expect(result.gate.skippedReason).toBe('no-llm-key');\n expect(generateJsonMock).not.toHaveBeenCalled();\n });\n\n it('skips gate with no-jobs when jobs array is empty', async () => {\n process.env.GROQ_API_KEY = 'test-key';\n const result = await confirmHarvestJobs({ jobs: [] });\n\n expect(result.jobs).toEqual([]);\n expect(result.gate.skippedReason).toBe('no-jobs');\n expect(generateJsonMock).not.toHaveBeenCalled();\n });\n\n it('falls back with groq-check-failed when generateJson throws', async () => {\n process.env.GROQ_API_KEY = 'test-key';\n generateJsonMock.mockRejectedValue(new Error('LLM unavailable'));\n const jobs = [makeJob()];\n const result = await confirmHarvestJobs({ jobs });\n\n expect(result.jobs).toEqual(jobs);\n expect(result.gate.used).toBe(false);\n expect(result.gate.skippedReason).toBe('groq-check-failed');\n });\n\n it('triggers over-filtered-fallback when LLM would drop all jobs', async () => {\n process.env.GROQ_API_KEY = 'test-key';\n generateJsonMock.mockResolvedValue({\n decisions: [\n { job_id: 'job-1', keep: false, confidence: 0.95, reason: 'navigation page noise' },\n ],\n });\n const jobs = [makeJob()];\n const result = await confirmHarvestJobs({ jobs });\n\n expect(result.jobs).toEqual(jobs);\n expect(result.gate.used).toBe(true);\n expect(result.gate.kept).toBe(1);\n expect(result.gate.skippedReason).toBe('over-filtered-fallback');\n });\n\n it('triggers drop-ratio-guard when more than 50% of jobs would be dropped', async () => {\n process.env.GROQ_API_KEY = 'test-key';\n generateJsonMock.mockResolvedValue({\n decisions: [\n { job_id: 'job-1', keep: false, confidence: 0.95, reason: 'navigation page noise' },\n { job_id: 'job-2', keep: false, confidence: 0.95, reason: 'listing page aggregator' },\n { job_id: 'job-3', keep: true, confidence: 0.8, reason: 'valid job posting' },\n ],\n });\n const jobs = [makeJob({ job_id: 'job-1' }), makeJob({ job_id: 'job-2' }), makeJob({ job_id: 'job-3' })];\n const result = await confirmHarvestJobs({ jobs });\n\n expect(result.jobs).toEqual(jobs);\n expect(result.gate.used).toBe(true);\n expect(result.gate.kept).toBe(3);\n expect(result.gate.skippedReason).toBe('drop-ratio-guard');\n });\n\n it('filters a job when strict reject conditions are met (keep=false, confidence>=0.9, matching reason)', async () => {\n process.env.GROQ_API_KEY = 'test-key';\n generateJsonMock.mockResolvedValue({\n decisions: [\n { job_id: 'job-1', keep: false, confidence: 0.95, reason: 'navigation page noise' },\n { job_id: 'job-2', keep: true, confidence: 0.9, reason: 'valid job posting' },\n ],\n });\n const jobs = [makeJob({ job_id: 'job-1' }), makeJob({ job_id: 'job-2' })];\n const result = await confirmHarvestJobs({ jobs });\n\n expect(result.jobs).toHaveLength(1);\n expect(result.jobs[0].job_id).toBe('job-2');\n expect(result.gate.kept).toBe(1);\n expect(result.gate.total).toBe(2);\n expect(result.gate.skippedReason).toBeUndefined();\n });\n\n it('keeps job when reject confidence is below MIN_REJECT_CONFIDENCE threshold (0.9)', async () => {\n process.env.GROQ_API_KEY = 'test-key';\n generateJsonMock.mockResolvedValue({\n decisions: [\n { job_id: 'job-1', keep: false, confidence: 0.7, reason: 'navigation page noise' },\n ],\n });\n const jobs = [makeJob()];\n const result = await confirmHarvestJobs({ jobs });\n\n expect(result.jobs).toEqual(jobs);\n expect(result.gate.kept).toBe(1);\n expect(result.gate.skippedReason).toBeUndefined();\n });\n\n it('keeps job when reason does not match any strict reject pattern', async () => {\n process.env.GROQ_API_KEY = 'test-key';\n generateJsonMock.mockResolvedValue({\n decisions: [\n { job_id: 'job-1', keep: false, confidence: 0.95, reason: 'seems like a low quality posting' },\n ],\n });\n const jobs = [makeJob()];\n const result = await confirmHarvestJobs({ jobs });\n\n expect(result.jobs).toEqual(jobs);\n expect(result.gate.kept).toBe(1);\n });\n});\n"}}}} |