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)
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, )
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"
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
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
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
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
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
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)
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
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
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)
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
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
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
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)