Пример #1
0
def test_algorithm_job_update_status():
    alg = AlgorithmFactory()
    user = UserFactory()
    editor = UserFactory()

    alg.add_user(user)
    alg.add_editor(editor)

    ai = AlgorithmImageFactory(algorithm=alg)
    job = AlgorithmJobFactory(algorithm_image=ai, creator=user)

    for status, _ in Job.STATUS_CHOICES:
        job.update_status(status=status)
        job.refresh_from_db()
        assert job.status == status

    remaining_recipients = {user.email, editor.email}
    for email in mail.outbox:
        remaining_recipients -= set(email.to)
        assert (
            email.subject ==
            f"[{Site.objects.get_current().domain.lower()}] [{alg.title.lower()}] Job Failed"
        )
        assert (
            f"Unfortunately your job for algorithm '{alg.title}' failed with an error"
            in email.body)
    assert remaining_recipients == set()
Пример #2
0
def test_update_started_adds_time():
    j = AlgorithmJobFactory()
    assert j.started_at is None
    assert j.completed_at is None

    j.update_status(status=j.EXECUTING)

    j.refresh_from_db()
    assert j.started_at is not None
    assert j.completed_at is None

    j.update_status(status=j.SUCCESS)

    j.refresh_from_db()
    assert j.started_at is not None
    assert j.completed_at is not None
Пример #3
0
def test_mark_long_running_jobs_failed():
    # Started jobs should be unaffected
    j1 = EvaluationFactory()
    j1.update_status(status=EvaluationJob.STARTED)

    # Long running jobs should be marked as failed
    j2 = EvaluationFactory()
    j2.update_status(status=EvaluationJob.STARTED)
    j2.started_at = timezone.now() - timedelta(days=1)
    j2.save()

    # A job that has not been started should not be marked as failed, even if
    # if it is outside the celery task limit
    j3 = EvaluationFactory()
    j3.created -= timedelta(days=1)
    j3.save()

    # Algorithm jobs should not be affected
    a = AlgorithmJobFactory()
    a.update_status(status=AlgorithmJob.STARTED)

    assert EvaluationJob.objects.all().count() == 3
    assert (
        AlgorithmJob.objects.filter(status=AlgorithmJob.STARTED).count() == 1
    )
    assert (
        EvaluationJob.objects.filter(status=EvaluationJob.FAILURE).count() == 0
    )

    assert j1.status == EvaluationJob.STARTED
    assert j2.status == EvaluationJob.STARTED
    assert j3.status == EvaluationJob.PENDING
    assert a.status == AlgorithmJob.STARTED

    mark_long_running_jobs_failed(
        app_label="evaluation", model_name="evaluation"
    )

    j1.refresh_from_db()
    j2.refresh_from_db()
    j3.refresh_from_db()
    a.refresh_from_db()

    assert j1.status == EvaluationJob.STARTED
    assert j2.status == EvaluationJob.FAILURE
    assert j3.status == EvaluationJob.PENDING
    assert a.status == AlgorithmJob.STARTED