from __future__ import annotations import pytest from apps.sources.models import Source, SourceRun from apps.sources.services.fetcher import FetchedDocument from apps.sources.services.manual_import import ManualImportError, import_manual_source def test_manual_import_url_uses_fetch_and_succeeds(monkeypatch, user): def fake_fetch(*_args, **_kwargs): return FetchedDocument( requested_url="https://jobs.example.org/jobs", final_url="https://jobs.example.org/jobs", status_code=200, headers={ "content-type": "text/html; charset=utf-8", "etag": "abc", "last-modified": "Mon, 01 Jan 2000 00:00:00 GMT", }, content=b"
vacature", ) def fake_process(document): return { "extracted": 2, "created": 1, "updated": 1, "duplicates": 0, "parser": "manual-test", "warnings": [], } monkeypatch.setattr("apps.sources.services.manual_import.fetch_url", fake_fetch) monkeypatch.setattr("apps.sources.services.manual_import.process_raw_document", fake_process) summary = import_manual_source(actor=user, source_url="https://jobs.example.org/jobs") source = Source.objects.get(pk=summary.source_id) assert summary.mode == "url" assert summary.extracted_count == 2 assert summary.created_count == 1 assert source.source_type == Source.Type.MANUAL assert source.domain == "jobs.example.org" assert SourceRun.objects.filter(source=source, status=SourceRun.Status.SUCCESS).exists() def test_manual_import_paste_text_sanitizes_and_skips_fetch(monkeypatch, user): def fail_fetch(*_args, **_kwargs): raise AssertionError("Fetcher should not be called for pasted text.") def fake_process(document): return { "extracted": 0, "created": 0, "updated": 0, "duplicates": 0, "parser": "manual-test", "warnings": ["noop"], } monkeypatch.setattr("apps.sources.services.manual_import.fetch_url", fail_fetch) monkeypatch.setattr("apps.sources.services.manual_import.process_raw_document", fake_process) summary = import_manual_source( actor=user, pasted_text="\nVacaturetekst" ) source = Source.objects.get(pk=summary.source_id) assert summary.mode == "paste" assert source.source_type == Source.Type.MANUAL assert source.base_url.startswith("https://manual-") def test_manual_import_rejects_denied_domain(user): with pytest.raises(ManualImportError): import_manual_source(actor=user, source_url="https://linkedin.com/jobs/123") def test_manual_import_rejects_paste_payload_when_too_large(user, settings): settings.MANUAL_IMPORT_PASTE_MAX_BYTES = 12 huge_text = "a" * 20 with pytest.raises(ManualImportError): import_manual_source(actor=user, pasted_text=huge_text)