from io import StringIO import pytest from django.core.management import call_command from apps.sources.models import Source @pytest.mark.django_db def test_discover_sources_command_runs_for_all_modes_and_is_replayable(): out = StringIO() call_command( "discover_sources", "html", "--input", "fixtures/discovery/html_candidate_discovery.html", "--base-url", "https://example.org/", stdout=out, ) call_command( "discover_sources", "sitemap", "--input", "fixtures/discovery/sitemap_index.xml", "--base-url", "https://jobs.example.org/", stdout=out, ) call_command( "discover_sources", "feed", "--input", "fixtures/discovery/feed_jobs.xml", "--base-url", "https://jobs.example.org/feed/jobs", stdout=out, ) call_command( "discover_sources", "email", "--input", "fixtures/emails/sample_alert.eml", stdout=out, ) source_types = { (source.domain, source.source_type) for source in Source.objects.filter(status=Source.Status.CANDIDATE) } assert ("example.org", Source.Type.EMPLOYER) in source_types assert ("jobs.example.org", Source.Type.EMPLOYER) in source_types assert ("example.org", Source.Type.RSS) in source_types assert ("jobs.example.org", Source.Type.SITEMAP) in source_types assert ("jobs.example.org", Source.Type.RSS) in source_types assert "Persist result" in out.getvalue() out.seek(0) out.truncate(0) call_command( "discover_sources", "html", "--input", "fixtures/discovery/html_candidate_discovery.html", "--base-url", "https://example.org/", stdout=out, ) assert Source.objects.filter(status=Source.Status.CANDIDATE).count() == 5 @pytest.mark.django_db def test_discover_sources_dry_run_keeps_db_empty(): out = StringIO() call_command( "discover_sources", "feed", "--input", "fixtures/discovery/feed_jobs.xml", "--base-url", "https://jobs.example.org/feed/jobs", "--dry-run", stdout=out, ) assert Source.objects.count() == 0 assert "Dry-run modus" in out.getvalue()