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_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
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_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
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
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
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
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
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