diff --git a/apiserver/tests/factories/models/code.py b/apiserver/tests/factories/models/code.py index 74da50796..465a81624 100644 --- a/apiserver/tests/factories/models/code.py +++ b/apiserver/tests/factories/models/code.py @@ -80,6 +80,7 @@ def get_pull_request_event( created_at=None, idempotency_key=None, org_repo_id=None, + data=None, ): return PullRequestEvent( id=id or uuid4(), @@ -89,7 +90,9 @@ def get_pull_request_event( "user": {"login": reviewer or "User"}, "state": state or "APPROVED", "author_association": "NONE", - }, + } + if not data + else data, created_at=created_at or time_now(), idempotency_key=idempotency_key or str(randint(10, 100)), org_repo_id=org_repo_id or uuid4(), diff --git a/apiserver/tests/factories/models/exapi/github.py b/apiserver/tests/factories/models/exapi/github.py index d1fa08e03..0c3c71879 100644 --- a/apiserver/tests/factories/models/exapi/github.py +++ b/apiserver/tests/factories/models/exapi/github.py @@ -1,10 +1,17 @@ +from dataclasses import dataclass +from datetime import datetime +from typing import Dict + +from dora.utils.time import time_now + + def get_github_commit_dict( sha: str = "123456789098765", author_login: str = "author_abc", url: str = "https://github.com/123456789098765", message: str = "[abc 315] avoid mapping edit state", created_at: str = "2022-06-29T10:53:15Z", -): +) -> Dict: return { "sha": sha, "commit": { @@ -19,3 +26,29 @@ def get_github_commit_dict( }, "html_url": url, } + + +@dataclass +class GithubPullRequestReview: + id: str + submitted_at: datetime + user_login: str + + @property + def raw_data(self): + return { + "id": self.id, + "submitted_at": self.submitted_at, + "user": { + "login": self.user_login, + }, + } + + +def get_github_pull_request_review( + review_id: str = "123456", + submitted_at: datetime = time_now(), + user_login: str = "abc", +) -> GithubPullRequestReview: + + return GithubPullRequestReview(review_id, submitted_at, user_login) diff --git a/apiserver/tests/service/code/sync/test_etl_github_handler.py b/apiserver/tests/service/code/sync/test_etl_github_handler.py index 38fe62144..fb11c7180 100644 --- a/apiserver/tests/service/code/sync/test_etl_github_handler.py +++ b/apiserver/tests/service/code/sync/test_etl_github_handler.py @@ -4,13 +4,93 @@ from dora.service.code.sync.etl_github_handler import GithubETLHandler from dora.utils.string import uuid4_str -from tests.factories.models import get_pull_request, get_pull_request_commit -from tests.factories.models.exapi.github import get_github_commit_dict +from tests.factories.models import ( + get_pull_request, + get_pull_request_commit, + get_pull_request_event, +) +from tests.factories.models.exapi.github import ( + get_github_commit_dict, + get_github_pull_request_review, +) from tests.utilities import compare_objects_as_dicts ORG_ID = uuid4_str() +def test__to_pr_events_given_an_empty_list_of_events_returns_an_empty_list(): + pr_model = get_pull_request() + assert GithubETLHandler._to_pr_events([], pr_model, []) == [] + + +def test__to_pr_events_given_a_list_of_only_new_events_returns_a_list_of_pr_events(): + pr_model = get_pull_request() + event1 = get_github_pull_request_review() + event2 = get_github_pull_request_review() + events = [event1, event2] + + pr_events = GithubETLHandler._to_pr_events(events, pr_model, []) + + expected_pr_events = [ + get_pull_request_event( + pull_request_id=str(pr_model.id), + org_repo_id=pr_model.repo_id, + data=event1.raw_data, + created_at=event1.submitted_at, + type="REVIEW", + idempotency_key=event1.id, + reviewer=event1.user_login, + ), + get_pull_request_event( + pull_request_id=str(pr_model.id), + org_repo_id=pr_model.repo_id, + data=event2.raw_data, + created_at=event2.submitted_at, + type="REVIEW", + idempotency_key=event2.id, + reviewer=event2.user_login, + ), + ] + + for event, expected_event in zip(pr_events, expected_pr_events): + assert compare_objects_as_dicts(event, expected_event, ["id"]) is True + + +def test__to_pr_events_given_a_list_of_new_events_and_old_events_returns_a_list_of_pr_events(): + pr_model = get_pull_request() + event1 = get_github_pull_request_review() + event2 = get_github_pull_request_review() + events = [event1, event2] + + old_event = get_pull_request_event( + pull_request_id=str(pr_model.id), + org_repo_id=pr_model.repo_id, + data=event1.raw_data, + created_at=event1.submitted_at, + type="REVIEW", + idempotency_key=event1.id, + reviewer=event1.user_login, + ) + + pr_events = GithubETLHandler._to_pr_events(events, pr_model, [old_event]) + + expected_pr_events = [ + old_event, + get_pull_request_event( + pull_request_id=str(pr_model.id), + org_repo_id=pr_model.repo_id, + data=event2.raw_data, + created_at=event2.submitted_at, + type="REVIEW", + idempotency_key=event2.id, + reviewer=event2.user_login, + ), + ] + + for event, expected_event in zip(pr_events, expected_pr_events): + assert compare_objects_as_dicts(event, expected_event, ["id"]) is True + + def test__to_pr_commits_given_an_empty_list_of_commits_returns_an_empty_list(): pr_model = get_pull_request() github_etl_handler = GithubETLHandler(ORG_ID, None, None, None, None)