Exemple #1
0
def test_user_build_list(
    client,
    sqla_assertions,
    default_login,
    default_repo,
    default_repo_access,
    default_revision,
    default_source,
):
    # unrelated build
    factories.BuildFactory(repository=default_repo)

    # "my" builds
    build2 = factories.BuildFactory(repository=default_repo, source=default_source)
    build1 = factories.BuildFactory(
        repository=default_repo,
        source=default_source,
        date_created=build2.date_created - timedelta(minutes=1),
    )

    # Queries:
    # - Tenant
    # - Builds
    # - Item Stats
    # - Build Count (paginator)
    with sqla_assertions.assert_statement_count(4):
        resp = client.get("/api/users/me/builds".format(default_repo.name))
    assert resp.status_code == 200
    data = resp.json()
    # newly created build should not be present due to author email
    assert len(data) == 2
    assert data[0]["id"] == str(build2.id)
    assert data[1]["id"] == str(build1.id)
Exemple #2
0
def default_build(default_source):
    return factories.BuildFactory(
        source=default_source,
        date_started=datetime.now(timezone.utc) - timedelta(minutes=6),
        date_finished=datetime.now(timezone.utc),
        passed=True,
    )
Exemple #3
0
def test_failing_tests_duplicate_reason(mocker, db_session, default_revision,
                                        default_tenant):
    build = factories.BuildFactory(revision=default_revision, in_progress=True)
    db_session.add(build)

    job = factories.JobFactory(build=build, passed=True)
    db_session.add(job)

    factories.TestCaseFactory(job=job, failed=True)

    db_session.add(
        FailureReason(
            build_id=build.id,
            reason=FailureReason.Reason.failing_tests,
            job_id=job.id,
            repository_id=job.repository_id,
        ))

    aggregate_build_stats_for_job(job.id)

    assert job.result == Result.failed

    reasons = list(FailureReason.query.filter(FailureReason.job_id == job.id))
    assert len(reasons) == 1
    assert reasons[0].reason == FailureReason.Reason.failing_tests
def test_new_artifact(client, default_source, default_repo, default_hook,
                      sample_xunit):
    build = factories.BuildFactory(source=default_source,
                                   provider=default_hook.provider,
                                   external_id="3")

    job = factories.JobFactory(build=build,
                               provider=default_hook.provider,
                               external_id="2",
                               in_progress=True)

    path = "/hooks/{}/{}/builds/{}/jobs/{}/artifacts".format(
        default_hook.id,
        default_hook.get_signature(),
        build.external_id,
        job.external_id,
    )

    resp = client.post(
        path,
        data={
            "name": "junit.xml",
            "file": (BytesIO(sample_xunit.encode("utf-8")), "junit.xml"),
            "type": "xunit",
        },
    )

    assert resp.status_code == 201, repr(resp.data)
    data = resp.json()
    artifact = Artifact.query.get(data["id"])
    assert artifact.file.filename.endswith("junit.xml")
    assert artifact.type == "xunit"
Exemple #5
0
def test_build_list_excludes_public(client, default_login):
    repo = factories.RepositoryFactory(public=True)
    factories.BuildFactory(repository=repo)
    resp = client.get("/api/builds")
    assert resp.status_code == 200
    data = resp.json()
    assert len(data) == 0
Exemple #6
0
def test_new_job(client, default_project, default_source, default_repo, default_hook):
    build = factories.BuildFactory(
        source=default_source,
        project=default_project,
        provider=default_hook.provider,
        external_id='3',
    )

    job_xid = '2'

    path = '/hooks/{}/{}/builds/{}/jobs/{}'.format(
        default_hook.id, default_hook.get_signature(), build.external_id, job_xid
    )

    payload = {
        'result': 'passed',
        'status': 'finished',
    }

    resp = client.post(
        path,
        json=payload,
    )
    assert resp.status_code == 200, repr(resp.data)

    job = Job.query.unrestricted_unsafe().get(resp.json()['id'])
    assert job
    assert job.build_id == build.id
    assert job.project_id == build.project_id
    assert job.organization_id == build.organization_id
    assert job.provider == default_hook.provider
    assert job.external_id == job_xid
    assert job.result == Result.passed
    assert job.status == Status.finished
Exemple #7
0
def test_existing_job(client, default_revision, default_repo, default_hook):
    build = factories.BuildFactory(
        revision=default_revision,
        provider=default_hook.get_provider().get_name(default_hook.config),
        external_id="3",
    )

    job = factories.JobFactory(
        build=build,
        provider=default_hook.get_provider().get_name(default_hook.config),
        external_id="2",
        in_progress=True,
    )

    path = "/hooks/{}/{}/builds/{}/jobs/{}".format(
        default_hook.id,
        default_hook.get_signature(),
        build.external_id,
        job.external_id,
    )

    payload = {"result": "passed", "status": "finished"}

    resp = client.post(path, json=payload)
    assert resp.status_code == 200, repr(resp.data)
    data = resp.json()
    assert data["result"] == "passed"
    assert data["status"] == "finished"

    job = Job.query.unrestricted_unsafe().get(job.id)

    assert job.result == Result.passed
    assert job.status == Status.finished
Exemple #8
0
def test_new_job(client, default_revision, default_repo, default_hook):
    build = factories.BuildFactory(
        revision=default_revision,
        provider=default_hook.get_provider().get_name(default_hook.config),
        external_id="3",
    )

    job_xid = "2"

    path = "/hooks/{}/{}/builds/{}/jobs/{}".format(
        default_hook.id, default_hook.get_signature(), build.external_id,
        job_xid)

    payload = {"result": "passed", "status": "finished"}

    resp = client.post(path, json=payload)
    assert resp.status_code == 200, repr(resp.data)

    job = Job.query.unrestricted_unsafe().get(resp.json()["id"])
    assert job
    assert job.build_id == build.id
    assert job.repository_id == build.repository_id
    assert job.provider == default_hook.get_provider().get_name(
        default_hook.config)
    assert job.external_id == job_xid
    assert job.result == Result.passed
    assert job.status == Status.finished
Exemple #9
0
def test_existing_job(client, default_project, default_source, default_repo, default_hook):
    build = factories.BuildFactory(
        source=default_source,
        project=default_project,
        provider=default_hook.provider,
        external_id='3',
    )

    job = factories.JobFactory(
        build=build,
        provider=default_hook.provider,
        external_id='2',
        in_progress=True,
    )

    path = '/hooks/{}/{}/builds/{}/jobs/{}'.format(
        default_hook.id, default_hook.get_signature(), build.external_id, job.external_id
    )

    payload = {
        'result': 'passed',
        'status': 'finished',
    }

    resp = client.post(
        path,
        json=payload,
    )
    assert resp.status_code == 200, repr(resp.data)

    job = Job.query.unrestricted_unsafe().get(job.id)

    assert job.result == Result.passed
    assert job.status == Status.finished
Exemple #10
0
def test_new_artifact(client, default_source, default_repo, default_hook,
                      sample_xunit):
    build = factories.BuildFactory(
        source=default_source,
        provider=default_hook.provider,
        external_id='3',
    )

    job = factories.JobFactory(
        build=build,
        provider=default_hook.provider,
        external_id='2',
        in_progress=True,
    )

    path = '/hooks/{}/{}/builds/{}/jobs/{}/artifacts'.format(
        default_hook.id, default_hook.get_signature(), build.external_id,
        job.external_id)

    resp = client.post(
        path,
        data={
            'name': 'junit.xml',
            'file': (BytesIO(sample_xunit.encode('utf-8')), 'junit.xml'),
            'type': 'xunit',
        },
    )

    assert resp.status_code == 201, repr(resp.data)
    data = resp.json()
    artifact = Artifact.query.get(data['id'])
    assert artifact.file.filename.endswith('junit.xml')
    assert artifact.type == 'xunit'
def test_repository_tests_history_by_build(
    client,
    default_login,
    default_build,
    default_testcase,
    default_repo,
    default_repo_access,
    default_revision,
):
    build2 = factories.BuildFactory(revision=default_revision, finished=True)
    job2 = factories.JobFactory(build=build2)
    factories.TestCaseFactory(job=job2,
                              name=default_testcase.name,
                              failed=True)

    build3 = factories.BuildFactory(revision=default_revision, finished=True)
    job3 = factories.JobFactory(build=build3)
    testcase2 = factories.TestCaseFactory(job=job3,
                                          passed=True,
                                          name=default_testcase.name + "2")

    build4 = factories.BuildFactory(revision=default_revision, finished=True)
    job4 = factories.JobFactory(build=build4)
    factories.TestCaseFactory(job=job4,
                              name=default_testcase.name,
                              passed=True)

    resp = client.get("/api/repos/{}/tests-by-build?results=3".format(
        default_repo.get_full_name()))
    assert resp.status_code == 200
    data = resp.json()
    assert data["tests"] == [
        {
            "name": default_testcase.name,
            "hash": default_testcase.hash,
            "results": ["passed", None, "failed"],
        },
        {
            "name": testcase2.name,
            "hash": testcase2.hash,
            "results": [None, "passed", None],
        },
    ]
    assert len(data["builds"]) == 3
    assert data["builds"][0]["id"] == str(build4.id)
    assert data["builds"][1]["id"] == str(build3.id)
    assert data["builds"][2]["id"] == str(build2.id)
Exemple #12
0
def default_build(default_revision):
    return factories.BuildFactory(
        revision=default_revision,
        authors=default_revision.authors,
        date_started=timezone.now() - timedelta(minutes=6),
        date_finished=timezone.now(),
        passed=True,
    )
def test_build_list_excludes_public(client, sqla_assertions,
                                    default_repo_access, default_login):
    repo = factories.RepositoryFactory(public=True)
    factories.BuildFactory(repository=repo)
    with sqla_assertions.assert_statement_count(3):
        resp = client.get("/api/builds")
        assert resp.status_code == 200
        data = resp.json()
        assert len(data) == 0
def test_repo_build_list_mine_without_match(client, default_login,
                                            default_repo, default_repo_access):
    revision = factories.RevisionFactory(repository=default_repo)
    factories.BuildFactory(revision=revision, authors=revision.authors)
    resp = client.get("/api/repos/{}/builds?user=me".format(
        default_repo.get_full_name()))
    assert resp.status_code == 200
    data = resp.json()
    assert len(data) == 0
def test_test_stats(mocker, db_session, default_source):
    auth.set_current_tenant(
        auth.Tenant(repository_ids=[default_source.repository_id]))

    build = factories.BuildFactory(source=default_source, in_progress=True)
    db_session.add(build)

    job = factories.JobFactory(build=build, passed=True)
    db_session.add(job)
    job2 = factories.JobFactory(build=build, passed=True)
    db_session.add(job2)

    db_session.add(
        factories.TestCaseFactory(
            job=job,
            name='foo',
            failed=True,
            duration=8,
        ))
    db_session.add(
        factories.TestCaseFactory(
            job=job,
            name='bar',
            passed=True,
            duration=2,
        ))

    db_session.add(
        factories.TestCaseFactory(
            job=job2,
            name='bar',
            failed=True,
            duration=2,
        ))

    aggregate_build_stats_for_job(job.id)
    aggregate_build_stats_for_job(job2.id)
    aggregate_build_stats(build.id)

    build_stats = {
        i.name: i.value
        for i in ItemStat.query.filter(ItemStat.item_id == build.id, )
    }
    assert build_stats['tests.count'] == 3
    assert build_stats['tests.count_unique'] == 2
    assert build_stats['tests.failures'] == 2
    assert build_stats['tests.failures_unique'] == 2
    assert build_stats['tests.duration'] == 12

    job_stats = {
        i.name: i.value
        for i in ItemStat.query.filter(ItemStat.item_id == job.id, )
    }
    assert job_stats['tests.count'] == 2
    assert job_stats['tests.failures'] == 1
    assert job_stats['tests.duration'] == 10
Exemple #16
0
def test_user_build_list(client, default_login, default_build, default_repo,
                         default_repo_access, default_revision):
    factories.BuildFactory(repository=default_repo, )

    resp = client.get('/api/users/me/builds'.format(default_repo.name))
    assert resp.status_code == 200
    data = resp.json()
    # newly created build should not be present due to author email
    assert len(data) == 1
    assert data[0]['id'] == str(default_build.id)
def test_builds_total(client, default_login, default_repo, default_revision):
    factories.BuildFactory(revision=default_revision, passed=True)

    resp = client.get("/api/install/stats?points=30&resolution=1d&stat=builds.total")
    assert resp.status_code == 200
    data = resp.json()
    assert len(data) == 30
    for item in data[1:]:
        assert item["value"] == 0
    assert data[0]["value"] == 1
Exemple #18
0
def test_repo_build_list_mine_without_match(client, default_login,
                                            default_repo, default_repo_access):
    revision = factories.RevisionFactory(repository=default_repo)
    source = factories.SourceFactory(revision=revision)
    factories.BuildFactory(source=source)
    resp = client.get('/api/repos/{}/builds?show=mine'.format(
        default_repo.get_full_name()))
    assert resp.status_code == 200
    data = resp.json()
    assert len(data) == 0
def test_sends_failure(mocker, db_session, default_revision, default_tenant):
    mock_send_email_notification = mocker.patch(
        "zeus.notifications.email.send_email_notification")

    build = factories.BuildFactory(revision=default_revision, failed=True)
    db_session.add(build)

    send_build_notifications(build.id)

    mock_send_email_notification.assert_called_once_with(build=build)
Exemple #20
0
def test_unfinished_job(mocker, db_session, default_revision, default_tenant):
    build = factories.BuildFactory(revision=default_revision, queued=True)
    db_session.add(build)

    job = factories.JobFactory(build=build, in_progress=True)
    db_session.add(job)

    aggregate_build_stats(build.id)

    assert build.status == Status.in_progress
    assert build.result == Result.unknown
def test_does_not_send_passing(mocker, db_session, default_revision,
                               default_tenant):
    mock_send_email_notification = mocker.patch(
        "zeus.notifications.email.send_email_notification")

    build = factories.BuildFactory(revision=default_revision, passed=True)
    db_session.add(build)

    send_build_notifications(build.id)

    assert not mock_send_email_notification.mock_calls
Exemple #22
0
def test_no_repo_access(mocker, db_session, default_user, default_repo,
                        default_source, outbox):
    auth.set_current_tenant(
        auth.Tenant(repository_ids=[default_source.repository_id]))

    build = factories.BuildFactory(source=default_source, failed=True)
    db_session.add(build)

    send_email_notification(build)

    assert len(outbox) == 0
Exemple #23
0
def test_failure_with_allow_failure(mocker, db_session, default_revision,
                                    default_tenant):
    build = factories.BuildFactory(revision=default_revision, in_progress=True)
    db_session.add(build)

    job = factories.JobFactory(build=build, failed=True, allow_failure=True)
    db_session.add(job)

    aggregate_build_stats(build.id)

    assert build.status == Status.finished
    assert build.result == Result.passed
Exemple #24
0
def test_repo_build_existing_entityt(client, default_login, default_source,
                                     default_repo, default_repo_access):
    existing_build = factories.BuildFactory(source=default_source, travis=True)

    resp = client.post('/api/repos/{}/builds'.format(
        default_repo.get_full_name()),
                       json={
                           'provider': existing_build.provider,
                           'external_id': existing_build.external_id,
                           'ref': default_source.revision_sha,
                           'label': 'test build',
                       })
    assert resp.status_code == 422, repr(resp.data)
def test_does_not_send_passing(mocker, db_session, default_source):
    auth.set_current_tenant(auth.Tenant(
        repository_ids=[default_source.repository_id]))

    mock_send_email_notification = mocker.patch(
        'zeus.notifications.email.send_email_notification')

    build = factories.BuildFactory(source=default_source, passed=True)
    db_session.add(build)

    send_build_notifications(build.id)

    assert not mock_send_email_notification.mock_calls
def test_time_aggregate(client, default_login, default_repo,
                        default_repo_access, default_revision):
    factories.BuildFactory(revision=default_revision, passed=True)

    resp = client.get(
        "/api/repos/{}/stats?aggregate=time&points=30&resolution=1d&stat=builds.total"
        .format(default_repo.get_full_name()))
    assert resp.status_code == 200
    data = resp.json()
    assert len(data) == 30
    for item in data[1:]:
        assert item["value"] == 0
    assert data[0]["value"] == 1
def test_sends_failure(mocker, db_session, default_source):
    auth.set_current_tenant(auth.Tenant(
        repository_ids=[default_source.repository_id]))

    mock_send_email_notification = mocker.patch(
        'zeus.notifications.email.send_email_notification')

    build = factories.BuildFactory(source=default_source, failed=True)
    db_session.add(build)

    send_build_notifications(build.id)

    mock_send_email_notification.assert_called_once_with(build=build)
def test_build_list_user(
    client,
    sqla_assertions,
    default_author,
    default_login,
    default_repo,
    default_repo_access,
    default_revision,
):
    # unrelated build
    factories.BuildFactory(repository=default_repo)

    # "my" builds
    build2 = factories.BuildFactory(repository=default_repo,
                                    revision=default_revision,
                                    authors=[default_author])
    build1 = factories.BuildFactory(
        repository=default_repo,
        revision=default_revision,
        date_created=build2.date_created - timedelta(minutes=1),
        authors=[default_author],
    )

    # Queries:
    # - Tenant
    # - Builds
    # - Build.authors
    # - Revision.authors
    # - Item Stats
    # - Build Count (paginator)
    with sqla_assertions.assert_statement_count(6):
        resp = client.get("/api/builds?user=me")
        assert resp.status_code == 200
        data = resp.json()
        # newly created build should not be present due to author email
        assert len(data) == 2
        assert data[0]["id"] == str(build2.id)
        assert data[1]["id"] == str(build1.id)
def test_unfinished_job(mocker, db_session, default_source):
    auth.set_current_tenant(
        auth.Tenant(repository_ids=[default_source.repository_id]))

    build = factories.BuildFactory(source=default_source, queued=True)
    db_session.add(build)

    job = factories.JobFactory(build=build, in_progress=True)
    db_session.add(job)

    aggregate_build_stats_for_job(job.id)

    assert build.status == Status.in_progress
    assert build.result == Result.unknown
def test_repo_build_existing_entityt(client, default_login, default_source,
                                     default_repo, default_repo_access):
    existing_build = factories.BuildFactory(source=default_source, travis=True)

    resp = client.post(
        "/api/repos/{}/builds".format(default_repo.get_full_name()),
        json={
            "provider": existing_build.provider,
            "external_id": existing_build.external_id,
            "ref": default_source.revision_sha,
            "label": "test build",
        },
    )
    assert resp.status_code == 422, repr(resp.data)