Exemplo n.º 1
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
Exemplo n.º 2
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
def test_finished_job(mocker, db_session, default_project, default_source):
    auth.set_current_tenant(
        auth.Tenant(organization_ids=[default_project.organization_id],
                    project_ids=[default_project.id],
                    repository_ids=[default_source.repository_id]))

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

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

    aggregate_build_stats_for_job(job.id)

    assert build.status == Status.finished
    assert build.result == Result.failed
Exemplo n.º 5
0
def test_test_stats(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)
    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
Exemplo n.º 6
0
def test_failing_tests(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)

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

    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.Code.failing_tests
Exemplo n.º 7
0
def mock_build(repo: models.Repository, parent_revision: models.Revision=None,
               user_ids=(), file_list=()):
    if user_ids and randint(0, 1) == 0:
        chosen_user_id = choice(user_ids)
        author = mock_author(repo, chosen_user_id)
    else:
        author = None

    revision = factories.RevisionFactory.create(
        repository=repo,
        parents=[parent_revision.sha] if parent_revision else None,
        **{'author': author} if author else {}
    )
    source = factories.SourceFactory.create(
        revision=revision,
        patch=factories.PatchFactory(
            parent_revision=parent_revision,
        ) if parent_revision and random() > 0.8 else None,
    )
    parent_revision = revision

    build = factories.BuildFactory.create(source=source, travis=True)

    result = build_schema.dump(build)
    publish('builds', 'build.create', result.data)
    click.echo('Created {!r}'.format(build))

    # we need to find some filenames for the repo
    if file_list is None:
        file_list = find_files_in_repo(repo)

    for n in range(randint(0, 50)):
        try:
            with db.session.begin_nested():
                factories.FileCoverageFactory.create(
                    filename=choice(file_list),
                    build=build, in_diff=randint(0, 5) == 0)
        except IntegrityError:
            continue

    for n in range(1, 4):
        has_failure = randint(0, 2) == 0
        job = factories.JobFactory.create(
            build=build,
            failed=has_failure,
            passed=not has_failure,
            travis=True,
            allow_failure=n == 3,
        )

        for n in range(randint(0, 50)):
            test_failed = has_failure and randint(0, 5) == 0
            factories.TestCaseFactory.create(
                job=job,
                failed=test_failed,
                passed=not test_failed,
            )
            if has_failure and randint(0, 2) == 0:
                for n in range(1, 5):
                    factories.StyleViolationFactory.create(
                        job=job,
                    )

        for n in range(randint(0, 2)):
            bundle = factories.BundleFactory.create(
                job=job,
            )
            for n in range(randint(0, 4)):
                factories.BundleAssetFactory.create(
                    bundle=bundle,
                    job=job,
                )

        artifact_count = randrange(3) \
            if job.status == Status.finished and job.result == Result.passed \
            else 0
        for n in range(0, artifact_count):
            factories.ArtifactFactory.create(job=job, repository=repo)

        db.session.commit()

        aggregate_build_stats_for_job(job_id=job.id)

        result = build_schema.dump(build)
        publish('builds', 'build.create', result.data)
        click.echo('Created {!r}'.format(build))

    db.session.commit()
    return build
Exemplo n.º 8
0
def mock_build(
        repo: models.Repository,
        revision: models.Revision = None,
        parent_revision: models.Revision = None,
        user_ids=(),
        file_list=(),
        with_change_request=True,
) -> models.Build:
    if user_ids and randint(0, 1) == 0:
        chosen_user_id = choice(user_ids)
        author = mock_author(repo, chosen_user_id)
    else:
        author = None

    if not revision:
        revision, source = mock_revision(repo, parent_revision, author)
    else:
        for n in range(2):
            source = (models.Source.query.unrestricted_unsafe().filter(
                models.Source.repository_id == repo.id,
                models.Source.revision_sha == revision.sha,
            ).first())
            if source:
                break
            try_create(
                models.Source,
                {
                    "revision_sha": revision.sha,
                    "repository": repo,
                    "author_id": revision.author_id,
                },
            )
        else:
            raise NotImplementedError

    if with_change_request and parent_revision is None:
        parent_revision = factories.RevisionFactory.create(repository=repo)

    if with_change_request:
        factories.ChangeRequestFactory.create(
            repository=repo,
            head_revision=revision,
            head_revision_sha=revision.sha,
            parent_revision=parent_revision,
            github=True,
            **{"author": author} if author else {})

    parent_revision = revision

    build = factories.BuildFactory.create(source=source, travis=True)

    result = build_schema.dump(build)
    publish("builds", "build.create", result.data)
    click.echo("Created {!r}".format(build))

    # we need to find some filenames for the repo
    if file_list is None:
        file_list = find_files_in_repo(repo)

    for n in range(randint(0, 50)):
        try:
            with db.session.begin_nested():
                factories.FileCoverageFactory.create(
                    filename=choice(file_list),
                    build=build,
                    in_diff=randint(0, 5) == 0)
        except IntegrityError:
            continue

    for n in range(1, 4):
        has_failure = randint(0, 2) == 0
        job = factories.JobFactory.create(
            build=build,
            failed=has_failure,
            passed=not has_failure,
            travis=True,
            allow_failure=n == 3,
        )

        for n in range(randint(0, 50)):
            test_failed = has_failure and randint(0, 5) == 0
            factories.TestCaseFactory.create(job=job,
                                             failed=test_failed,
                                             passed=not test_failed)
            if has_failure and randint(0, 2) == 0:
                for n in range(1, 5):
                    factories.StyleViolationFactory.create(job=job)

        for n in range(randint(0, 2)):
            bundle = factories.BundleFactory.create(job=job)
            for n in range(randint(0, 4)):
                factories.BundleAssetFactory.create(bundle=bundle, job=job)

        artifact_count = (randrange(3) if job.status == Status.finished
                          and job.result == Result.passed else 0)
        for n in range(0, artifact_count):
            factories.ArtifactFactory.create(job=job,
                                             repository=repo,
                                             finished=True)

        db.session.commit()

        aggregate_build_stats_for_job(job_id=job.id)

        result = build_schema.dump(build)
        publish("builds", "build.update", result.data)
        click.echo("Created {!r}".format(job))

    db.session.commit()
    return build
Exemplo n.º 9
0
async def mock_build(
        repo: models.Repository,
        revision: models.Revision = None,
        parent_revision: models.Revision = None,
        user_ids=(),
        file_list=(),
        with_change_request=True,
) -> models.Build:
    author: Optional[models.Author] = None
    if user_ids and randint(0, 1) == 0:
        chosen_user_id = choice(user_ids)
        author = await mock_author(repo, chosen_user_id)

    if not revision:
        revision = await mock_revision(repo, parent_revision, author)

    if with_change_request and parent_revision is None:
        parent_revision = factories.RevisionFactory.create(repository=repo)

    if with_change_request:
        factories.ChangeRequestFactory.create(
            repository=repo,
            head_revision=revision,
            head_revision_sha=revision.sha,
            parent_revision=parent_revision,
            github=True,
            **{"authors": [author]} if author else {})

    parent_revision = revision

    build = factories.BuildFactory.create(revision=revision, travis=True)

    data = build_schema.dump(build)
    publish("builds", "build.create", data)
    click.echo("Created {!r}".format(build))

    # we need to find some filenames for the repo
    if file_list is None:
        file_list = find_files_in_repo(repo)

    for n in range(randint(0, 50)):
        try:
            with db.session.begin_nested():
                factories.FileCoverageFactory.create(
                    filename=choice(file_list),
                    build=build,
                    in_diff=randint(0, 5) == 0)
        except IntegrityError:
            continue

    for n in range(1, 4):
        has_failure = randint(0, 2) == 0
        job = factories.JobFactory.create(
            build=build,
            failed=has_failure,
            passed=not has_failure,
            travis=True,
            allow_failure=n == 3,
        )

        for n in range(randint(0, 50)):
            test_failed = has_failure and randint(0, 5) == 0
            factories.TestCaseFactory.create(job=job,
                                             failed=test_failed,
                                             passed=not test_failed)
            if has_failure and randint(0, 2) == 0:
                for n in range(1, 5):
                    factories.StyleViolationFactory.create(job=job)

        for n in range(randint(0, 2)):
            bundle = factories.BundleFactory.create(job=job)
            for n in range(randint(0, 4)):
                factories.BundleAssetFactory.create(bundle=bundle, job=job)

        factories.FailureReasonFactory.create(build=build,
                                              job=job,
                                              failing_tests=True)

        artifact_count = (randrange(3) if job.status == Status.finished
                          and job.result == Result.passed else 0)
        for n in range(0, artifact_count):
            factories.ArtifactFactory.create(job=job,
                                             repository=repo,
                                             finished=True)

        db.session.commit()

        aggregate_build_stats_for_job(job_id=job.id)

        data = build_schema.dump(build)
        publish("builds", "build.update", data)
        click.echo("Created {!r}".format(job))

    db.session.commit()
    return build