From 2a193b7084b18f3c2aead5b61488d6ea83d5e544 Mon Sep 17 00:00:00 2001 From: YASH PANDEY Date: Sun, 29 Dec 2024 19:59:56 +0530 Subject: [PATCH 01/10] Squash : Added Unit tests for github/models --- backend/tests/github/models/__init__.py | 0 backend/tests/github/models/issue_tests.py | 64 +++++++++++ backend/tests/github/models/label_tests.py | 40 +++++++ .../tests/github/models/mixins/__init__.py | 0 .../models/mixins/mixins_issue_tests.py | 54 +++++++++ .../mixins/mixins_organization_tests.py | 11 ++ .../models/mixins/mixins_repository_tests.py | 74 ++++++++++++ .../github/models/mixins/mixins_user_tests.py | 107 ++++++++++++++++++ .../tests/github/models/organization_tests.py | 41 +++++++ backend/tests/github/models/release_tests.py | 44 +++++++ .../models/repository_contributor_tests.py | 44 +++++++ .../tests/github/models/repository_tests.py | 87 ++++++++++++++ backend/tests/github/models/user_tests.py | 59 ++++++++++ backend/tests/github/utils_tests.py | 49 +++++++- 14 files changed, 671 insertions(+), 3 deletions(-) create mode 100644 backend/tests/github/models/__init__.py create mode 100644 backend/tests/github/models/issue_tests.py create mode 100644 backend/tests/github/models/label_tests.py create mode 100644 backend/tests/github/models/mixins/__init__.py create mode 100644 backend/tests/github/models/mixins/mixins_issue_tests.py create mode 100644 backend/tests/github/models/mixins/mixins_organization_tests.py create mode 100644 backend/tests/github/models/mixins/mixins_repository_tests.py create mode 100644 backend/tests/github/models/mixins/mixins_user_tests.py create mode 100644 backend/tests/github/models/organization_tests.py create mode 100644 backend/tests/github/models/release_tests.py create mode 100644 backend/tests/github/models/repository_contributor_tests.py create mode 100644 backend/tests/github/models/repository_tests.py create mode 100644 backend/tests/github/models/user_tests.py diff --git a/backend/tests/github/models/__init__.py b/backend/tests/github/models/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/backend/tests/github/models/issue_tests.py b/backend/tests/github/models/issue_tests.py new file mode 100644 index 000000000..71c2d7bfd --- /dev/null +++ b/backend/tests/github/models/issue_tests.py @@ -0,0 +1,64 @@ +from unittest.mock import Mock, patch + +import pytest + +from apps.github.models.issue import Issue +from apps.github.models.repository import Repository + + +class TestIssueModel: + def test_open_issues_count(self): + with patch("apps.github.models.issue.IndexBase.get_total_count") as mock_get_total_count: + Issue.open_issues_count() + mock_get_total_count.assert_called_once_with("issues") + + def test_bulk_save(self): + mock_issues = [Mock(id=None), Mock(id=1)] + with patch("apps.github.models.issue.BulkSaveModel.bulk_save") as mock_bulk_save: + Issue.bulk_save(mock_issues, fields=["name"]) + mock_bulk_save.assert_called_once_with(Issue, mock_issues, fields=["name"]) + + def test_repository_id(self): + repository = Repository() + issue = Issue(repository=repository) + assert issue.repository_id == repository.id + + @patch("apps.github.models.issue.Issue.objects.get") + def test_update_data_project_does_not_exist(self, mock_get): + mock_get.side_effect = Issue.DoesNotExist + gh_issue_mock = Mock() + gh_issue_mock.raw_data = {"node_id": "12345"} + + with patch.object(Issue, "save", return_value=None) as mock_save: + Issue.update_data(gh_issue_mock) + mock_save.assert_called_once() + + @pytest.mark.parametrize( + ("has_hint", "has_summary"), + [ + (True, True), + (False, True), + (True, False), + (False, False), + ], + ) + def test_save_method(self, has_hint, has_summary): + issue = Issue() + issue.generate_hint = Mock() + issue.generate_summary = Mock() + + issue.hint = "Test Hint" if has_hint else None + issue.summary = "Test Summary" if has_summary else None + + with patch("apps.github.models.issue.BulkSaveModel.save"): + issue.save() + + if has_hint: + issue.generate_hint.assert_not_called() + else: + issue.generate_hint.assert_called_once() + + if has_summary: + issue.generate_summary.assert_not_called() + else: + issue.generate_summary.assert_called_once() diff --git a/backend/tests/github/models/label_tests.py b/backend/tests/github/models/label_tests.py new file mode 100644 index 000000000..6b381b963 --- /dev/null +++ b/backend/tests/github/models/label_tests.py @@ -0,0 +1,40 @@ +from unittest.mock import Mock, patch + +from apps.github.models.label import Label + + +class TestLabelModel: + def test_bulk_save(self): + mock_labels = [Mock(id=None), Mock(id=1)] + with patch("apps.common.models.BulkSaveModel.bulk_save") as mock_bulk_save: + Label.bulk_save(mock_labels) + mock_bulk_save.assert_called_once_with(Label, mock_labels) + + def test_update_data(self, mocker): + gh_label = mocker.Mock() + gh_label.raw_data = {"node_id": "12345"} + + mock_label = mocker.Mock(spec=Label) + mock_label.node_id = "12345" + mocker.patch("apps.github.models.label.Label.objects.get", return_value=mock_label) + + label = Label() + label.from_github = mocker.Mock() + + updated_label = Label.update_data(gh_label) + + assert updated_label.node_id == mock_label.node_id + assert updated_label.from_github.call_count == 1 + + def test_from_github(self): + gh_label = Mock() + gh_label.color = "000000" + gh_label.description = "Description" + gh_label.name = "Name" + + label = Label() + label.from_github(gh_label) + + assert label.color == gh_label.color + assert label.description == gh_label.description + assert label.name == gh_label.name diff --git a/backend/tests/github/models/mixins/__init__.py b/backend/tests/github/models/mixins/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/backend/tests/github/models/mixins/mixins_issue_tests.py b/backend/tests/github/models/mixins/mixins_issue_tests.py new file mode 100644 index 000000000..6428a0c44 --- /dev/null +++ b/backend/tests/github/models/mixins/mixins_issue_tests.py @@ -0,0 +1,54 @@ +from apps.github.models.mixins.issue import IssueIndexMixin + + +class TestIssueIndexMixin: + def test_idx_created_at(self): + class MockModel(IssueIndexMixin): + created_at = "2021-09-01T00:00:00Z" + + mock_instance = MockModel() + assert mock_instance.idx_created_at == "2021-09-01T00:00:00Z" + + def test_idx_url(self): + class MockModel(IssueIndexMixin): + url = "url" + + mock_instance = MockModel() + assert mock_instance.idx_url == "url" + + def test_updated_at(self): + class MockModel(IssueIndexMixin): + updated_at = "2021-09-01T00:00:00Z" + + mock_instance = MockModel() + assert mock_instance.idx_updated_at == "2021-09-01T00:00:00Z" + + def test_idx_title(self): + class MockModel(IssueIndexMixin): + title = "title" + + mock_instance = MockModel() + assert mock_instance.idx_title == "title" + + def test_idx_summary(self): + class MockModel(IssueIndexMixin): + summary = "summary" + + mock_instance = MockModel() + assert mock_instance.idx_summary == "summary" + + def test_idx_hint(self): + class MockModel(IssueIndexMixin): + hint = "hint" + + mock_instance = MockModel() + assert mock_instance.idx_hint == "hint" + + def test_idx_comments_count(self): + default_comment_count = 5 + + class MockModel(IssueIndexMixin): + comments_count = default_comment_count + + mock_instance = MockModel() + assert mock_instance.idx_comments_count == default_comment_count diff --git a/backend/tests/github/models/mixins/mixins_organization_tests.py b/backend/tests/github/models/mixins/mixins_organization_tests.py new file mode 100644 index 000000000..4e2ec4aab --- /dev/null +++ b/backend/tests/github/models/mixins/mixins_organization_tests.py @@ -0,0 +1,11 @@ +from apps.github.models.organization import Organization + + +class TestOrganizationMixin: + def test_idx_name(self): + organization = Organization(name="Organization Name", login="login") + assert organization.idx_name == "Organization Name login" + + def test_idx_company(self): + organization = Organization(company="Company", location="Location") + assert organization.idx_company == "Company Location" diff --git a/backend/tests/github/models/mixins/mixins_repository_tests.py b/backend/tests/github/models/mixins/mixins_repository_tests.py new file mode 100644 index 000000000..11045be21 --- /dev/null +++ b/backend/tests/github/models/mixins/mixins_repository_tests.py @@ -0,0 +1,74 @@ +from apps.github.models.mixins.repository import RepositoryIndexMixin + + +class TestRepositoryMixin: + def test_idx_contributors_count(self): + default_contribution_value = 5 + + class MockModel(RepositoryIndexMixin): + contributors_count = default_contribution_value + + mock_instance = MockModel() + assert mock_instance.idx_contributors_count == default_contribution_value + + def test_idx_description(self): + class MockModel(RepositoryIndexMixin): + description = "Description" + + mock_instance = MockModel() + assert mock_instance.idx_description == "Description" + + def test_idx_forks_count(self): + default_value = 5 + + class MockModel(RepositoryIndexMixin): + forks_count = default_value + + mock_instance = MockModel() + assert mock_instance.idx_forks_count == default_value + + def test_idx_languages(self): + class MockModel(RepositoryIndexMixin): + top_languages = ["Python", "JavaScript"] + + mock_instance = MockModel() + assert mock_instance.idx_languages == ["Python", "JavaScript"] + + def test_idx_name(self): + class MockModel(RepositoryIndexMixin): + name = "Name" + + mock_instance = MockModel() + assert mock_instance.idx_name == "Name" + + def test_idx_open_issues_count(self): + default_value = 5 + + class MockModel(RepositoryIndexMixin): + open_issues_count = default_value + + mock_instance = MockModel() + assert mock_instance.idx_open_issues_count == default_value + + def test_idx_pushed_at(self): + class MockModel(RepositoryIndexMixin): + pushed_at = "2021-01-01" + + mock_instance = MockModel() + assert mock_instance.idx_pushed_at == "2021-01-01" + + def test_idx_stars_count(self): + default_value = 5 + + class MockModel(RepositoryIndexMixin): + stars_count = default_value + + mock_instance = MockModel() + assert mock_instance.idx_stars_count == default_value + + def test_idx_topics(self): + class MockModel(RepositoryIndexMixin): + topics = ["Topic1", "Topic2"] + + mock_instance = MockModel() + assert mock_instance.idx_topics == ["Topic1", "Topic2"] diff --git a/backend/tests/github/models/mixins/mixins_user_tests.py b/backend/tests/github/models/mixins/mixins_user_tests.py new file mode 100644 index 000000000..2ad3201e0 --- /dev/null +++ b/backend/tests/github/models/mixins/mixins_user_tests.py @@ -0,0 +1,107 @@ +from apps.github.models.mixins.user import UserIndexMixin + + +class TestUserIndexMixin: + def test_idx_avatar_url(self): + class MockModel(UserIndexMixin): + avatar_url = "https://avatars.githubusercontent.com/u/1" + + mock_instance = MockModel() + assert mock_instance.idx_avatar_url == "https://avatars.githubusercontent.com/u/1" + + def test_idx_bio(self): + class MockModel(UserIndexMixin): + bio = "Bio" + + mock_instance = MockModel() + assert mock_instance.idx_bio == "Bio" + + def test_idx_company(self): + class MockModel(UserIndexMixin): + company = "Company" + + mock_instance = MockModel() + assert mock_instance.idx_company == "Company" + + def test_idx_created_at(self): + class MockModel(UserIndexMixin): + created_at = "2021-01-01T00:00:00Z" + + mock_instance = MockModel() + assert mock_instance.idx_created_at == "2021-01-01T00:00:00Z" + + def test_idx_email(self): + class MockModel(UserIndexMixin): + email = "email@example.com" + + mock_instance = MockModel() + assert mock_instance.idx_email == "email@example.com" + + def test_idx_followers_count(self): + default_value = 5 + + class MockModel(UserIndexMixin): + followers_count = default_value + + mock_instance = MockModel() + assert mock_instance.idx_followers_count == default_value + + def test_idx_following_count(self): + default_follow_count = 3 + + class MockModel(UserIndexMixin): + following_count = default_follow_count + + mock_instance = MockModel() + assert mock_instance.idx_following_count == default_follow_count + + def test_idx_location(self): + class MockModel(UserIndexMixin): + location = "Earth" + + mock_instance = MockModel() + assert mock_instance.idx_location == "Earth" + + def test_idx_login(self): + class MockModel(UserIndexMixin): + login = "user_login" + + mock_instance = MockModel() + assert mock_instance.idx_login == "user_login" + + def test_idx_name(self): + class MockModel(UserIndexMixin): + name = "John Doe" + + mock_instance = MockModel() + assert mock_instance.idx_name == "John Doe" + + def test_idx_public_repositories_count(self): + default_repo_count = 42 + + class MockModel(UserIndexMixin): + public_repositories_count = default_repo_count + + mock_instance = MockModel() + assert mock_instance.idx_public_repositories_count == default_repo_count + + def test_idx_title(self): + class MockModel(UserIndexMixin): + title = "GitHub User" + + mock_instance = MockModel() + assert mock_instance.idx_title == "GitHub User" + + def test_idx_updated_at(self): + class MockModel(UserIndexMixin): + updated_at = "2021-12-31T23:59:59Z" + + mock_instance = MockModel() + assert mock_instance.idx_updated_at == "2021-12-31T23:59:59Z" + + def test_idx_url(self): + class MockModel(UserIndexMixin): + url = "https://api.github.com/users/user_login" + + mock_instance = MockModel() + assert mock_instance.idx_url == "https://api.github.com/users/user_login" diff --git a/backend/tests/github/models/organization_tests.py b/backend/tests/github/models/organization_tests.py new file mode 100644 index 000000000..147ec65fe --- /dev/null +++ b/backend/tests/github/models/organization_tests.py @@ -0,0 +1,41 @@ +from unittest.mock import Mock, patch + +from apps.github.models.organization import Organization + + +class TestOrganizationModel: + def test_str_representation(self): + organization = Organization(name="Organization Name") + assert str(organization) == "Organization Name" + + def test_bulk_save(self): + mock_org = [Mock(id=None), Mock(id=1)] + with patch("apps.common.models.BulkSaveModel.bulk_save") as mock_bulk_save: + Organization.bulk_save(mock_org) + mock_bulk_save.assert_called_once_with(Organization, mock_org) + + @patch("apps.github.models.organization.Organization.objects.get") + def test_update_data(self, mock_get): + # Mock the database behavior + mock_get.side_effect = Organization.DoesNotExist + + gh_organization_mock = Mock() + gh_organization_mock.raw_data = {"node_id": "12345"} + + with patch.object(Organization, "save", return_value=None) as mock_save, patch.object( + Organization, "from_github" + ) as mock_from_github: + Organization.update_data(gh_organization_mock) + + # Assert the appropriate calls + mock_save.assert_called_once() + mock_from_github.assert_called_once_with(gh_organization_mock) + + def test_from_github(self): + gh_organization = Mock() + gh_organization.description = "Description" + + organization = Organization() + organization.from_github(gh_organization) + + assert organization.description == gh_organization.description diff --git a/backend/tests/github/models/release_tests.py b/backend/tests/github/models/release_tests.py new file mode 100644 index 000000000..12721aaae --- /dev/null +++ b/backend/tests/github/models/release_tests.py @@ -0,0 +1,44 @@ +from unittest.mock import Mock + +from apps.github.models.release import Release + + +class TestReleaseModel: + def test_bulk_save(self, mocker): + mock_releases = [mocker.Mock(id=None), mocker.Mock(id=1)] + mock_bulk_save = mocker.patch("apps.common.models.BulkSaveModel.bulk_save") + Release.bulk_save(mock_releases) + mock_bulk_save.assert_called_once_with(Release, mock_releases) + + def test_update_data(self, mocker): + gh_release = mocker.Mock() + gh_release.raw_data = {"node_id": "12345"} + + mock_release = mocker.Mock(spec=Release) + mock_release.node_id = "12345" + mocker.patch("apps.github.models.release.Release.objects.get", return_value=mock_release) + + release = Release() + release.from_github = mocker.Mock() + + updated_release = Release.update_data(gh_release) + + assert updated_release.node_id == mock_release.node_id + assert updated_release.from_github.call_count == 1 + + def test_from_github(self): + gh_release = Mock() + gh_release.created_at = "2021-01-01T00:00:00Z" + gh_release.body = "Description" + gh_release.title = "Name" + gh_release.tag_name = "v1.0.0" + + release = Release() + release.from_github(gh_release) + + assert release.created_at == gh_release.created_at + assert release.description == gh_release.body + assert release.name == gh_release.title + assert release.tag_name == gh_release.tag_name + assert release.author is None + assert release.repository is None diff --git a/backend/tests/github/models/repository_contributor_tests.py b/backend/tests/github/models/repository_contributor_tests.py new file mode 100644 index 000000000..639302f07 --- /dev/null +++ b/backend/tests/github/models/repository_contributor_tests.py @@ -0,0 +1,44 @@ +from unittest.mock import MagicMock, Mock, patch + +from apps.github.models.repository_contributor import RepositoryContributor + + +class TestRepositoryContributor: + def test_from_github(self): + default_contribution_value = 5 + repository_contributor = RepositoryContributor() + gh_label = Mock(contributions=default_contribution_value) + repository_contributor.from_github(gh_label) + + assert repository_contributor.contributions_count == default_contribution_value + + def test_bulk_save(self): + repository_contributors = [Mock(id=None), Mock(id=1)] + with patch("apps.common.models.BulkSaveModel.bulk_save") as mock_bulk_save: + RepositoryContributor.bulk_save(repository_contributors) + mock_bulk_save.assert_called_once_with(RepositoryContributor, repository_contributors) + + def test_update_data(self, mocker): + gh_contributor = MagicMock() + gh_contributor.raw_data = {"node_id": "12345"} + repository = MagicMock() + user = MagicMock() + + mock_repository_contributor = mocker.Mock(spec=RepositoryContributor) + mock_repository_contributor.repository = repository + mock_repository_contributor.user = user + mocker.patch( + "apps.github.models.repository_contributor.RepositoryContributor.objects.get", + return_value=mock_repository_contributor, + ) + + repository_contributor = RepositoryContributor() + repository_contributor.from_github = mocker.Mock() + + updated_repository_contributor = RepositoryContributor.update_data( + gh_contributor, repository, user + ) + + assert updated_repository_contributor.repository == mock_repository_contributor.repository + assert updated_repository_contributor.user == mock_repository_contributor.user + assert updated_repository_contributor.from_github.call_count == 1 diff --git a/backend/tests/github/models/repository_tests.py b/backend/tests/github/models/repository_tests.py new file mode 100644 index 000000000..132b2301d --- /dev/null +++ b/backend/tests/github/models/repository_tests.py @@ -0,0 +1,87 @@ +from base64 import b64encode +from unittest.mock import MagicMock + +import pytest +from github.GithubException import GithubException + +from apps.github.models.repository import Repository + + +class TestRepositoryModel: + def test_update_data(self, mocker): + gh_repository = MagicMock() + gh_repository.raw_data = {"node_id": "12345"} + + mock_repository = mocker.Mock(spec=Repository) + mock_repository.node_id = "12345" + mocker.patch( + "apps.github.models.repository.Repository.objects.get", return_value=mock_repository + ) + + repository = Repository() + repository.from_github = mocker.Mock() + + updated_repository = Repository.update_data(gh_repository) + + assert updated_repository.node_id == mock_repository.node_id + assert updated_repository.from_github.call_count == 1 + + @pytest.fixture() + def mock_gh_repository(self): + """Fixture for a mocked GitHub repository.""" + gh_repository = MagicMock() + gh_repository.name = "TestRepo" + gh_repository.default_branch = "main" + gh_repository.description = "A test repository" + gh_repository.forks_count = 5 + gh_repository.archived = False + gh_repository.fork = False + gh_repository.is_template = False + gh_repository.open_issues_count = 3 + gh_repository.size = 1024 + gh_repository.stargazers_count = 10 + gh_repository.subscribers_count = 2 + gh_repository.topics = ["python", "django"] + gh_repository.updated_at = "2025-01-01" + gh_repository.license = MagicMock(name="MIT") + return gh_repository + + def test_is_indexable(self, mock_gh_repository): + mock_project_set = MagicMock() + mock_project_set.exists.return_value = True + mock_gh_repository.project_set = mock_project_set + + mock_gh_repository.is_indexable = True + assert mock_gh_repository.is_indexable is True + + mock_gh_repository.is_indexable = False + assert mock_gh_repository.is_indexable is False + + def test_from_github_with_missing_funding(self, mock_gh_repository, mocker): + mock_gh_repository.get_contents.side_effect = GithubException( + data={"status": "404"}, status=404 + ) + + repository = Repository() + repository.from_github(gh_repository=mock_gh_repository) + + assert repository.has_funding_yml is False + assert repository.is_funding_policy_compliant is True + + def test_from_github_with_funding(self, mock_gh_repository, mocker): + mock_gh_repository.get_contents.return_value = MagicMock( + content=b64encode(b"test: test").decode() + ) + + repository = Repository() + repository.from_github(gh_repository=mock_gh_repository) + + assert repository.has_funding_yml is True + assert repository.is_funding_policy_compliant is False + + def test_latest_release(self, mock_gh_repository): + mock_release = MagicMock() + mock_release.created_at = "2025-01-01" + + mock_gh_repository.latest_release = mock_release + assert mock_gh_repository.latest_release == mock_release diff --git a/backend/tests/github/models/user_tests.py b/backend/tests/github/models/user_tests.py new file mode 100644 index 000000000..db5858e7b --- /dev/null +++ b/backend/tests/github/models/user_tests.py @@ -0,0 +1,59 @@ +import pytest + +from apps.github.models.user import User + + +class TestUserModel: + @pytest.mark.parametrize( + ("name", "login", "expected_str"), + [ + ("John Doe", "johndoe", "John Doe"), + ("", "janedoe", "janedoe"), + (None, "ghost", "ghost"), + ], + ) + def test_str_representation(self, name, login, expected_str): + user = User(name=name, login=login) + assert str(user) == expected_str + + @pytest.mark.parametrize( + ("login", "expected_indexable"), + [ + ("johndoe", True), + ("janedoe", True), + ("ghost", False), + ], + ) + def test_is_indexable(self, login, expected_indexable): + user = User(login=login) + assert user.is_indexable == expected_indexable + + def test_from_github(self, mocker): + gh_user = mocker.Mock( + bio="Bio", + hireable=True, + twitter_username="twitter", + ) + + user = User() + user.from_github(gh_user) + + assert user.bio == "Bio" + assert user.is_hireable is True + assert user.twitter_username == "twitter" + + def test_update_data(self, mocker): + gh_user = mocker.Mock() + gh_user.raw_data = {"node_id": "12345"} + + mock_user = mocker.Mock(spec=User) + mock_user.node_id = "12345" + mocker.patch("apps.github.models.user.User.objects.get", return_value=mock_user) + + user = User() + user.from_github = mocker.Mock() + + updated_user = User.update_data(gh_user) + + assert updated_user.node_id == mock_user.node_id + assert updated_user.from_github.call_count == 1 diff --git a/backend/tests/github/utils_tests.py b/backend/tests/github/utils_tests.py index 384e352b4..bd7abed56 100644 --- a/backend/tests/github/utils_tests.py +++ b/backend/tests/github/utils_tests.py @@ -1,20 +1,40 @@ +from unittest.mock import MagicMock + import pytest -from apps.github.utils import check_funding_policy_compliance +from apps.github.utils import ( + check_funding_policy_compliance, + check_owasp_site_repository, + get_repository_file_content, + get_repository_path, + normalize_url, +) class TestUtils: + @pytest.mark.parametrize( + ("key", "as_expected"), + [ + ("www-chapter-abc", True), + ("www-committee-xyz", True), + ("www-event-123", True), + ("www-project-abc123", True), + ("www-random-site", False), + ("random-prefix", False), + ], + ) + def test_check_owasp_site_repository(self, key, as_expected): + assert check_owasp_site_repository(key) is as_expected + @pytest.mark.parametrize( ("platform", "target", "as_expected"), [ - # Compliant ("custom", "https://domain.owasp.org/sponsorship/", True), ("custom", "https://owasp.org/donate", True), ("github", "owasp", True), ("github", "OWASP", True), ("patreon", "", True), ("patreon", None, True), - # Non-compliant ("custom", "https://my-site.com/donate", False), ("custom", "https://my-site.com/owasp/donate", False), ("patreon", "username", False), @@ -22,3 +42,26 @@ class TestUtils: ) def test_check_funding_policy_compliance(self, platform, target, as_expected): assert check_funding_policy_compliance(platform, target) is as_expected + + @pytest.mark.parametrize( + ("url", "expected"), + [ + ("github.com/user/repo", None), + ], + ) + def test_get_repository_path(self, url, expected): + result = get_repository_path(url) + assert result == expected + + def test_get_repository_file_content(self, mocker): + url = "https://example.com/file.txt" + content = "Hello, World!" + response = MagicMock() + response.text = content + mocker.patch("requests.get", return_value=response) + result = get_repository_file_content(url) + assert result == content + + def test_normalize_url_with_invalid_url(self): + result = normalize_url("invalid-url") + assert result is None From a537c3fde468c06864f090f708671c4ba6cb0f57 Mon Sep 17 00:00:00 2001 From: YASH PANDEY Date: Sat, 4 Jan 2025 06:15:30 +0530 Subject: [PATCH 02/10] Resolving comments related updates --- .../tests/github/models/mixins/issue_tests.py | 23 ++++ .../models/mixins/mixins_issue_tests.py | 54 --------- .../mixins/mixins_organization_tests.py | 11 -- .../models/mixins/mixins_repository_tests.py | 74 ------------ .../github/models/mixins/mixins_user_tests.py | 107 ------------------ .../models/mixins/organization_tests.py | 14 +++ .../github/models/mixins/repository_tests.py | 27 +++++ .../tests/github/models/mixins/user_tests.py | 37 ++++++ .../tests/github/models/repository_tests.py | 12 +- backend/tests/github/models/user_tests.py | 4 +- 10 files changed, 109 insertions(+), 254 deletions(-) create mode 100644 backend/tests/github/models/mixins/issue_tests.py delete mode 100644 backend/tests/github/models/mixins/mixins_issue_tests.py delete mode 100644 backend/tests/github/models/mixins/mixins_organization_tests.py delete mode 100644 backend/tests/github/models/mixins/mixins_repository_tests.py delete mode 100644 backend/tests/github/models/mixins/mixins_user_tests.py create mode 100644 backend/tests/github/models/mixins/organization_tests.py create mode 100644 backend/tests/github/models/mixins/repository_tests.py create mode 100644 backend/tests/github/models/mixins/user_tests.py diff --git a/backend/tests/github/models/mixins/issue_tests.py b/backend/tests/github/models/mixins/issue_tests.py new file mode 100644 index 000000000..16c2ee4d1 --- /dev/null +++ b/backend/tests/github/models/mixins/issue_tests.py @@ -0,0 +1,23 @@ +from apps.github.models.mixins.issue import IssueIndexMixin + + +class TestIssueIndexMixin: + def test_issue_index(self): + class MockModel(IssueIndexMixin): + created_at = "2021-09-01T00:00:00Z" + updated_at = "2021-09-01T00:00:00Z" + url = "url" + title = "title" + summary = "summary" + hint = "hint" + comments_count = 5 + + mock_instance = MockModel() + + assert mock_instance.idx_created_at == "2021-09-01T00:00:00Z" + assert mock_instance.idx_updated_at == "2021-09-01T00:00:00Z" + assert mock_instance.idx_url == "url" + assert mock_instance.idx_title == "title" + assert mock_instance.idx_summary == "summary" + assert mock_instance.idx_hint == "hint" + assert mock_instance.idx_comments_count == 5 diff --git a/backend/tests/github/models/mixins/mixins_issue_tests.py b/backend/tests/github/models/mixins/mixins_issue_tests.py deleted file mode 100644 index 6428a0c44..000000000 --- a/backend/tests/github/models/mixins/mixins_issue_tests.py +++ /dev/null @@ -1,54 +0,0 @@ -from apps.github.models.mixins.issue import IssueIndexMixin - - -class TestIssueIndexMixin: - def test_idx_created_at(self): - class MockModel(IssueIndexMixin): - created_at = "2021-09-01T00:00:00Z" - - mock_instance = MockModel() - assert mock_instance.idx_created_at == "2021-09-01T00:00:00Z" - - def test_idx_url(self): - class MockModel(IssueIndexMixin): - url = "url" - - mock_instance = MockModel() - assert mock_instance.idx_url == "url" - - def test_updated_at(self): - class MockModel(IssueIndexMixin): - updated_at = "2021-09-01T00:00:00Z" - - mock_instance = MockModel() - assert mock_instance.idx_updated_at == "2021-09-01T00:00:00Z" - - def test_idx_title(self): - class MockModel(IssueIndexMixin): - title = "title" - - mock_instance = MockModel() - assert mock_instance.idx_title == "title" - - def test_idx_summary(self): - class MockModel(IssueIndexMixin): - summary = "summary" - - mock_instance = MockModel() - assert mock_instance.idx_summary == "summary" - - def test_idx_hint(self): - class MockModel(IssueIndexMixin): - hint = "hint" - - mock_instance = MockModel() - assert mock_instance.idx_hint == "hint" - - def test_idx_comments_count(self): - default_comment_count = 5 - - class MockModel(IssueIndexMixin): - comments_count = default_comment_count - - mock_instance = MockModel() - assert mock_instance.idx_comments_count == default_comment_count diff --git a/backend/tests/github/models/mixins/mixins_organization_tests.py b/backend/tests/github/models/mixins/mixins_organization_tests.py deleted file mode 100644 index 4e2ec4aab..000000000 --- a/backend/tests/github/models/mixins/mixins_organization_tests.py +++ /dev/null @@ -1,11 +0,0 @@ -from apps.github.models.organization import Organization - - -class TestOrganizationMixin: - def test_idx_name(self): - organization = Organization(name="Organization Name", login="login") - assert organization.idx_name == "Organization Name login" - - def test_idx_company(self): - organization = Organization(company="Company", location="Location") - assert organization.idx_company == "Company Location" diff --git a/backend/tests/github/models/mixins/mixins_repository_tests.py b/backend/tests/github/models/mixins/mixins_repository_tests.py deleted file mode 100644 index 11045be21..000000000 --- a/backend/tests/github/models/mixins/mixins_repository_tests.py +++ /dev/null @@ -1,74 +0,0 @@ -from apps.github.models.mixins.repository import RepositoryIndexMixin - - -class TestRepositoryMixin: - def test_idx_contributors_count(self): - default_contribution_value = 5 - - class MockModel(RepositoryIndexMixin): - contributors_count = default_contribution_value - - mock_instance = MockModel() - assert mock_instance.idx_contributors_count == default_contribution_value - - def test_idx_description(self): - class MockModel(RepositoryIndexMixin): - description = "Description" - - mock_instance = MockModel() - assert mock_instance.idx_description == "Description" - - def test_idx_forks_count(self): - default_value = 5 - - class MockModel(RepositoryIndexMixin): - forks_count = default_value - - mock_instance = MockModel() - assert mock_instance.idx_forks_count == default_value - - def test_idx_languages(self): - class MockModel(RepositoryIndexMixin): - top_languages = ["Python", "JavaScript"] - - mock_instance = MockModel() - assert mock_instance.idx_languages == ["Python", "JavaScript"] - - def test_idx_name(self): - class MockModel(RepositoryIndexMixin): - name = "Name" - - mock_instance = MockModel() - assert mock_instance.idx_name == "Name" - - def test_idx_open_issues_count(self): - default_value = 5 - - class MockModel(RepositoryIndexMixin): - open_issues_count = default_value - - mock_instance = MockModel() - assert mock_instance.idx_open_issues_count == default_value - - def test_idx_pushed_at(self): - class MockModel(RepositoryIndexMixin): - pushed_at = "2021-01-01" - - mock_instance = MockModel() - assert mock_instance.idx_pushed_at == "2021-01-01" - - def test_idx_stars_count(self): - default_value = 5 - - class MockModel(RepositoryIndexMixin): - stars_count = default_value - - mock_instance = MockModel() - assert mock_instance.idx_stars_count == default_value - - def test_idx_topics(self): - class MockModel(RepositoryIndexMixin): - topics = ["Topic1", "Topic2"] - - mock_instance = MockModel() - assert mock_instance.idx_topics == ["Topic1", "Topic2"] diff --git a/backend/tests/github/models/mixins/mixins_user_tests.py b/backend/tests/github/models/mixins/mixins_user_tests.py deleted file mode 100644 index 2ad3201e0..000000000 --- a/backend/tests/github/models/mixins/mixins_user_tests.py +++ /dev/null @@ -1,107 +0,0 @@ -from apps.github.models.mixins.user import UserIndexMixin - - -class TestUserIndexMixin: - def test_idx_avatar_url(self): - class MockModel(UserIndexMixin): - avatar_url = "https://avatars.githubusercontent.com/u/1" - - mock_instance = MockModel() - assert mock_instance.idx_avatar_url == "https://avatars.githubusercontent.com/u/1" - - def test_idx_bio(self): - class MockModel(UserIndexMixin): - bio = "Bio" - - mock_instance = MockModel() - assert mock_instance.idx_bio == "Bio" - - def test_idx_company(self): - class MockModel(UserIndexMixin): - company = "Company" - - mock_instance = MockModel() - assert mock_instance.idx_company == "Company" - - def test_idx_created_at(self): - class MockModel(UserIndexMixin): - created_at = "2021-01-01T00:00:00Z" - - mock_instance = MockModel() - assert mock_instance.idx_created_at == "2021-01-01T00:00:00Z" - - def test_idx_email(self): - class MockModel(UserIndexMixin): - email = "email@example.com" - - mock_instance = MockModel() - assert mock_instance.idx_email == "email@example.com" - - def test_idx_followers_count(self): - default_value = 5 - - class MockModel(UserIndexMixin): - followers_count = default_value - - mock_instance = MockModel() - assert mock_instance.idx_followers_count == default_value - - def test_idx_following_count(self): - default_follow_count = 3 - - class MockModel(UserIndexMixin): - following_count = default_follow_count - - mock_instance = MockModel() - assert mock_instance.idx_following_count == default_follow_count - - def test_idx_location(self): - class MockModel(UserIndexMixin): - location = "Earth" - - mock_instance = MockModel() - assert mock_instance.idx_location == "Earth" - - def test_idx_login(self): - class MockModel(UserIndexMixin): - login = "user_login" - - mock_instance = MockModel() - assert mock_instance.idx_login == "user_login" - - def test_idx_name(self): - class MockModel(UserIndexMixin): - name = "John Doe" - - mock_instance = MockModel() - assert mock_instance.idx_name == "John Doe" - - def test_idx_public_repositories_count(self): - default_repo_count = 42 - - class MockModel(UserIndexMixin): - public_repositories_count = default_repo_count - - mock_instance = MockModel() - assert mock_instance.idx_public_repositories_count == default_repo_count - - def test_idx_title(self): - class MockModel(UserIndexMixin): - title = "GitHub User" - - mock_instance = MockModel() - assert mock_instance.idx_title == "GitHub User" - - def test_idx_updated_at(self): - class MockModel(UserIndexMixin): - updated_at = "2021-12-31T23:59:59Z" - - mock_instance = MockModel() - assert mock_instance.idx_updated_at == "2021-12-31T23:59:59Z" - - def test_idx_url(self): - class MockModel(UserIndexMixin): - url = "https://api.github.com/users/user_login" - - mock_instance = MockModel() - assert mock_instance.idx_url == "https://api.github.com/users/user_login" diff --git a/backend/tests/github/models/mixins/organization_tests.py b/backend/tests/github/models/mixins/organization_tests.py new file mode 100644 index 000000000..8a76f3c90 --- /dev/null +++ b/backend/tests/github/models/mixins/organization_tests.py @@ -0,0 +1,14 @@ +from apps.github.models.organization import Organization + + +class TestOrganizationIndexMixin: + def test_organization_index(self): + organization = Organization( + name="Organization Name", + login="login", + company="Company", + location="Location" + ) + + assert organization.idx_name == "Organization Name login" + assert organization.idx_company == "Company Location" diff --git a/backend/tests/github/models/mixins/repository_tests.py b/backend/tests/github/models/mixins/repository_tests.py new file mode 100644 index 000000000..a75f4dee0 --- /dev/null +++ b/backend/tests/github/models/mixins/repository_tests.py @@ -0,0 +1,27 @@ +from apps.github.models.mixins.repository import RepositoryIndexMixin + + +class TestRepositoryIndexMixin: + def test_repository_index(self): + class MockModel(RepositoryIndexMixin): + contributors_count = 5 + description = "Description" + forks_count = 5 + top_languages = ["Python", "JavaScript"] + name = "Name" + open_issues_count = 5 + pushed_at = "2021-01-01" + stars_count = 5 + topics = ["Topic1", "Topic2"] + + mock_instance = MockModel() + + assert mock_instance.idx_contributors_count == 5 + assert mock_instance.idx_description == "Description" + assert mock_instance.idx_forks_count == 5 + assert mock_instance.idx_languages == ["Python", "JavaScript"] + assert mock_instance.idx_name == "Name" + assert mock_instance.idx_open_issues_count == 5 + assert mock_instance.idx_pushed_at == "2021-01-01" + assert mock_instance.idx_stars_count == 5 + assert mock_instance.idx_topics == ["Topic1", "Topic2"] diff --git a/backend/tests/github/models/mixins/user_tests.py b/backend/tests/github/models/mixins/user_tests.py new file mode 100644 index 000000000..4b1af4981 --- /dev/null +++ b/backend/tests/github/models/mixins/user_tests.py @@ -0,0 +1,37 @@ +from apps.github.models.mixins.user import UserIndexMixin + + +class TestUserIndexMixin: + def test_user_index(self): + class MockModel(UserIndexMixin): + avatar_url = "https://avatars.githubusercontent.com/u/1" + bio = "Bio" + company = "Company" + created_at = "2021-01-01T00:00:00Z" + email = "email@example.com" + followers_count = 5 + following_count = 3 + location = "Earth" + login = "user_login" + name = "John Doe" + public_repositories_count = 42 + title = "GitHub User" + updated_at = "2021-12-31T23:59:59Z" + url = "https://api.github.com/users/user_login" + + mock_instance = MockModel() + + assert mock_instance.idx_avatar_url == "https://avatars.githubusercontent.com/u/1" + assert mock_instance.idx_bio == "Bio" + assert mock_instance.idx_company == "Company" + assert mock_instance.idx_created_at == "2021-01-01T00:00:00Z" + assert mock_instance.idx_email == "email@example.com" + assert mock_instance.idx_followers_count == 5 + assert mock_instance.idx_following_count == 3 + assert mock_instance.idx_location == "Earth" + assert mock_instance.idx_login == "user_login" + assert mock_instance.idx_name == "John Doe" + assert mock_instance.idx_public_repositories_count == 42 + assert mock_instance.idx_title == "GitHub User" + assert mock_instance.idx_updated_at == "2021-12-31T23:59:59Z" + assert mock_instance.idx_url == "https://api.github.com/users/user_login" diff --git a/backend/tests/github/models/repository_tests.py b/backend/tests/github/models/repository_tests.py index 132b2301d..43f4a3eee 100644 --- a/backend/tests/github/models/repository_tests.py +++ b/backend/tests/github/models/repository_tests.py @@ -52,10 +52,10 @@ def test_is_indexable(self, mock_gh_repository): mock_gh_repository.project_set = mock_project_set mock_gh_repository.is_indexable = True - assert mock_gh_repository.is_indexable is True + assert mock_gh_repository.is_indexable mock_gh_repository.is_indexable = False - assert mock_gh_repository.is_indexable is False + assert not mock_gh_repository.is_indexable def test_from_github_with_missing_funding(self, mock_gh_repository, mocker): mock_gh_repository.get_contents.side_effect = GithubException( @@ -65,8 +65,8 @@ def test_from_github_with_missing_funding(self, mock_gh_repository, mocker): repository = Repository() repository.from_github(gh_repository=mock_gh_repository) - assert repository.has_funding_yml is False - assert repository.is_funding_policy_compliant is True + assert not repository.has_funding_yml + assert repository.is_funding_policy_compliant def test_from_github_with_funding(self, mock_gh_repository, mocker): mock_gh_repository.get_contents.return_value = MagicMock( @@ -76,8 +76,8 @@ def test_from_github_with_funding(self, mock_gh_repository, mocker): repository = Repository() repository.from_github(gh_repository=mock_gh_repository) - assert repository.has_funding_yml is True - assert repository.is_funding_policy_compliant is False + assert repository.has_funding_yml + assert not repository.is_funding_policy_compliant def test_latest_release(self, mock_gh_repository): mock_release = MagicMock() diff --git a/backend/tests/github/models/user_tests.py b/backend/tests/github/models/user_tests.py index db5858e7b..5cd9e3601 100644 --- a/backend/tests/github/models/user_tests.py +++ b/backend/tests/github/models/user_tests.py @@ -26,7 +26,7 @@ def test_str_representation(self, name, login, expected_str): ) def test_is_indexable(self, login, expected_indexable): user = User(login=login) - assert user.is_indexable == expected_indexable + assert user.is_indexable is expected_indexable def test_from_github(self, mocker): gh_user = mocker.Mock( @@ -39,7 +39,7 @@ def test_from_github(self, mocker): user.from_github(gh_user) assert user.bio == "Bio" - assert user.is_hireable is True + assert user.is_hireable assert user.twitter_username == "twitter" def test_update_data(self, mocker): From c03deca143355920b8988e3abeac13f8518bca61 Mon Sep 17 00:00:00 2001 From: YASH PANDEY Date: Sat, 4 Jan 2025 06:27:35 +0530 Subject: [PATCH 03/10] fixes in pre-commit --- .../tests/github/models/mixins/issue_tests.py | 36 ++++++---- .../models/mixins/organization_tests.py | 5 +- .../github/models/mixins/repository_tests.py | 46 +++++++----- .../tests/github/models/mixins/user_tests.py | 71 +++++++++++-------- 4 files changed, 94 insertions(+), 64 deletions(-) diff --git a/backend/tests/github/models/mixins/issue_tests.py b/backend/tests/github/models/mixins/issue_tests.py index 16c2ee4d1..8343929e6 100644 --- a/backend/tests/github/models/mixins/issue_tests.py +++ b/backend/tests/github/models/mixins/issue_tests.py @@ -2,22 +2,30 @@ class TestIssueIndexMixin: + CREATED_AT = "2021-09-01T00:00:00Z" + UPDATED_AT = "2021-09-01T00:00:00Z" + URL = "url" + TITLE = "title" + SUMMARY = "summary" + HINT = "hint" + COMMENTS_COUNT = 5 + def test_issue_index(self): class MockModel(IssueIndexMixin): - created_at = "2021-09-01T00:00:00Z" - updated_at = "2021-09-01T00:00:00Z" - url = "url" - title = "title" - summary = "summary" - hint = "hint" - comments_count = 5 + idx_created_at = TestIssueIndexMixin.CREATED_AT + idx_updated_at = TestIssueIndexMixin.UPDATED_AT + idx_url = TestIssueIndexMixin.URL + idx_title = TestIssueIndexMixin.TITLE + idx_summary = TestIssueIndexMixin.SUMMARY + idx_hint = TestIssueIndexMixin.HINT + idx_comments_count = TestIssueIndexMixin.COMMENTS_COUNT mock_instance = MockModel() - assert mock_instance.idx_created_at == "2021-09-01T00:00:00Z" - assert mock_instance.idx_updated_at == "2021-09-01T00:00:00Z" - assert mock_instance.idx_url == "url" - assert mock_instance.idx_title == "title" - assert mock_instance.idx_summary == "summary" - assert mock_instance.idx_hint == "hint" - assert mock_instance.idx_comments_count == 5 + assert mock_instance.idx_created_at == TestIssueIndexMixin.CREATED_AT + assert mock_instance.idx_updated_at == TestIssueIndexMixin.UPDATED_AT + assert mock_instance.idx_url == TestIssueIndexMixin.URL + assert mock_instance.idx_title == TestIssueIndexMixin.TITLE + assert mock_instance.idx_summary == TestIssueIndexMixin.SUMMARY + assert mock_instance.idx_hint == TestIssueIndexMixin.HINT + assert mock_instance.idx_comments_count == TestIssueIndexMixin.COMMENTS_COUNT diff --git a/backend/tests/github/models/mixins/organization_tests.py b/backend/tests/github/models/mixins/organization_tests.py index 8a76f3c90..c105e080b 100644 --- a/backend/tests/github/models/mixins/organization_tests.py +++ b/backend/tests/github/models/mixins/organization_tests.py @@ -4,10 +4,7 @@ class TestOrganizationIndexMixin: def test_organization_index(self): organization = Organization( - name="Organization Name", - login="login", - company="Company", - location="Location" + name="Organization Name", login="login", company="Company", location="Location" ) assert organization.idx_name == "Organization Name login" diff --git a/backend/tests/github/models/mixins/repository_tests.py b/backend/tests/github/models/mixins/repository_tests.py index a75f4dee0..da7ab5df4 100644 --- a/backend/tests/github/models/mixins/repository_tests.py +++ b/backend/tests/github/models/mixins/repository_tests.py @@ -2,26 +2,36 @@ class TestRepositoryIndexMixin: + CONTRIBUTORS_COUNT = 5 + DESCRIPTION = "Description" + FORKS_COUNT = 5 + TOP_LANGUAGES = ["Python", "JavaScript"] + NAME = "Name" + OPEN_ISSUES_COUNT = 5 + PUSHED_AT = "2021-01-01" + STARS_COUNT = 5 + TOPICS = ["Topic1", "Topic2"] + def test_repository_index(self): class MockModel(RepositoryIndexMixin): - contributors_count = 5 - description = "Description" - forks_count = 5 - top_languages = ["Python", "JavaScript"] - name = "Name" - open_issues_count = 5 - pushed_at = "2021-01-01" - stars_count = 5 - topics = ["Topic1", "Topic2"] + idx_contributors_count = TestRepositoryIndexMixin.CONTRIBUTORS_COUNT + idx_description = TestRepositoryIndexMixin.DESCRIPTION + idx_forks_count = TestRepositoryIndexMixin.FORKS_COUNT + idx_languages = TestRepositoryIndexMixin.TOP_LANGUAGES + idx_name = TestRepositoryIndexMixin.NAME + idx_open_issues_count = TestRepositoryIndexMixin.OPEN_ISSUES_COUNT + idx_pushed_at = TestRepositoryIndexMixin.PUSHED_AT + idx_stars_count = TestRepositoryIndexMixin.STARS_COUNT + idx_topics = TestRepositoryIndexMixin.TOPICS mock_instance = MockModel() - assert mock_instance.idx_contributors_count == 5 - assert mock_instance.idx_description == "Description" - assert mock_instance.idx_forks_count == 5 - assert mock_instance.idx_languages == ["Python", "JavaScript"] - assert mock_instance.idx_name == "Name" - assert mock_instance.idx_open_issues_count == 5 - assert mock_instance.idx_pushed_at == "2021-01-01" - assert mock_instance.idx_stars_count == 5 - assert mock_instance.idx_topics == ["Topic1", "Topic2"] + assert mock_instance.idx_contributors_count == TestRepositoryIndexMixin.CONTRIBUTORS_COUNT + assert mock_instance.idx_description == TestRepositoryIndexMixin.DESCRIPTION + assert mock_instance.idx_forks_count == TestRepositoryIndexMixin.FORKS_COUNT + assert mock_instance.idx_languages == TestRepositoryIndexMixin.TOP_LANGUAGES + assert mock_instance.idx_name == TestRepositoryIndexMixin.NAME + assert mock_instance.idx_open_issues_count == TestRepositoryIndexMixin.OPEN_ISSUES_COUNT + assert mock_instance.idx_pushed_at == TestRepositoryIndexMixin.PUSHED_AT + assert mock_instance.idx_stars_count == TestRepositoryIndexMixin.STARS_COUNT + assert mock_instance.idx_topics == TestRepositoryIndexMixin.TOPICS diff --git a/backend/tests/github/models/mixins/user_tests.py b/backend/tests/github/models/mixins/user_tests.py index 4b1af4981..0f51e3e2a 100644 --- a/backend/tests/github/models/mixins/user_tests.py +++ b/backend/tests/github/models/mixins/user_tests.py @@ -2,36 +2,51 @@ class TestUserIndexMixin: + AVATAR_URL = "https://avatars.githubusercontent.com/u/1" + BIO = "Bio" + COMPANY = "Company" + CREATED_AT = "2021-01-01T00:00:00Z" + EMAIL = "email@example.com" + FOLLOWERS_COUNT = 5 + FOLLOWING_COUNT = 3 + LOCATION = "Earth" + LOGIN = "user_login" + NAME = "John Doe" + PUBLIC_REPOS_COUNT = 42 + TITLE = "GitHub User" + UPDATED_AT = "2021-12-31T23:59:59Z" + URL = "https://api.github.com/users/user_login" + def test_user_index(self): class MockModel(UserIndexMixin): - avatar_url = "https://avatars.githubusercontent.com/u/1" - bio = "Bio" - company = "Company" - created_at = "2021-01-01T00:00:00Z" - email = "email@example.com" - followers_count = 5 - following_count = 3 - location = "Earth" - login = "user_login" - name = "John Doe" - public_repositories_count = 42 - title = "GitHub User" - updated_at = "2021-12-31T23:59:59Z" - url = "https://api.github.com/users/user_login" + avatar_url = TestUserIndexMixin.AVATAR_URL + bio = TestUserIndexMixin.BIO + company = TestUserIndexMixin.COMPANY + created_at = TestUserIndexMixin.CREATED_AT + email = TestUserIndexMixin.EMAIL + followers_count = TestUserIndexMixin.FOLLOWERS_COUNT + following_count = TestUserIndexMixin.FOLLOWING_COUNT + location = TestUserIndexMixin.LOCATION + login = TestUserIndexMixin.LOGIN + name = TestUserIndexMixin.NAME + public_repositories_count = TestUserIndexMixin.PUBLIC_REPOS_COUNT + title = TestUserIndexMixin.TITLE + updated_at = TestUserIndexMixin.UPDATED_AT + url = TestUserIndexMixin.URL mock_instance = MockModel() - assert mock_instance.idx_avatar_url == "https://avatars.githubusercontent.com/u/1" - assert mock_instance.idx_bio == "Bio" - assert mock_instance.idx_company == "Company" - assert mock_instance.idx_created_at == "2021-01-01T00:00:00Z" - assert mock_instance.idx_email == "email@example.com" - assert mock_instance.idx_followers_count == 5 - assert mock_instance.idx_following_count == 3 - assert mock_instance.idx_location == "Earth" - assert mock_instance.idx_login == "user_login" - assert mock_instance.idx_name == "John Doe" - assert mock_instance.idx_public_repositories_count == 42 - assert mock_instance.idx_title == "GitHub User" - assert mock_instance.idx_updated_at == "2021-12-31T23:59:59Z" - assert mock_instance.idx_url == "https://api.github.com/users/user_login" + assert mock_instance.idx_avatar_url == TestUserIndexMixin.AVATAR_URL + assert mock_instance.idx_bio == TestUserIndexMixin.BIO + assert mock_instance.idx_company == TestUserIndexMixin.COMPANY + assert mock_instance.idx_created_at == TestUserIndexMixin.CREATED_AT + assert mock_instance.idx_email == TestUserIndexMixin.EMAIL + assert mock_instance.idx_followers_count == TestUserIndexMixin.FOLLOWERS_COUNT + assert mock_instance.idx_following_count == TestUserIndexMixin.FOLLOWING_COUNT + assert mock_instance.idx_location == TestUserIndexMixin.LOCATION + assert mock_instance.idx_login == TestUserIndexMixin.LOGIN + assert mock_instance.idx_name == TestUserIndexMixin.NAME + assert mock_instance.idx_public_repositories_count == TestUserIndexMixin.PUBLIC_REPOS_COUNT + assert mock_instance.idx_title == TestUserIndexMixin.TITLE + assert mock_instance.idx_updated_at == TestUserIndexMixin.UPDATED_AT + assert mock_instance.idx_url == TestUserIndexMixin.URL From fb4a7981a97d18b015ffa6331cae22de150a23ec Mon Sep 17 00:00:00 2001 From: YASH PANDEY Date: Sat, 4 Jan 2025 06:37:51 +0530 Subject: [PATCH 04/10] removed redundant comments --- backend/tests/github/models/organization_tests.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/tests/github/models/organization_tests.py b/backend/tests/github/models/organization_tests.py index 147ec65fe..751a410ca 100644 --- a/backend/tests/github/models/organization_tests.py +++ b/backend/tests/github/models/organization_tests.py @@ -16,7 +16,6 @@ def test_bulk_save(self): @patch("apps.github.models.organization.Organization.objects.get") def test_update_data(self, mock_get): - # Mock the database behavior mock_get.side_effect = Organization.DoesNotExist gh_organization_mock = Mock() @@ -27,7 +26,6 @@ def test_update_data(self, mock_get): ) as mock_from_github: Organization.update_data(gh_organization_mock) - # Assert the appropriate calls mock_save.assert_called_once() mock_from_github.assert_called_once_with(gh_organization_mock) From 054d6aafd674ee0753ddc511b6b44d10d54e9010 Mon Sep 17 00:00:00 2001 From: YASH PANDEY Date: Sun, 5 Jan 2025 03:46:32 +0530 Subject: [PATCH 05/10] Updates based on comments-2 --- backend/tests/github/models/label_tests.py | 22 ++--- .../tests/github/models/mixins/issue_tests.py | 96 ++++++++++++++----- .../github/models/mixins/repository_tests.py | 54 +++++------ .../tests/github/models/mixins/user_tests.py | 78 +++++++-------- .../tests/github/models/organization_tests.py | 8 +- backend/tests/github/models/release_tests.py | 26 ++--- .../models/repository_contributor_tests.py | 26 ++--- .../tests/github/models/repository_tests.py | 6 +- backend/tests/github/models/user_tests.py | 10 +- 9 files changed, 185 insertions(+), 141 deletions(-) diff --git a/backend/tests/github/models/label_tests.py b/backend/tests/github/models/label_tests.py index 6b381b963..f5c19723b 100644 --- a/backend/tests/github/models/label_tests.py +++ b/backend/tests/github/models/label_tests.py @@ -11,8 +11,8 @@ def test_bulk_save(self): mock_bulk_save.assert_called_once_with(Label, mock_labels) def test_update_data(self, mocker): - gh_label = mocker.Mock() - gh_label.raw_data = {"node_id": "12345"} + gh_label_mock = mocker.Mock() + gh_label_mock.raw_data = {"node_id": "12345"} mock_label = mocker.Mock(spec=Label) mock_label.node_id = "12345" @@ -21,20 +21,20 @@ def test_update_data(self, mocker): label = Label() label.from_github = mocker.Mock() - updated_label = Label.update_data(gh_label) + updated_label = Label.update_data(gh_label_mock) assert updated_label.node_id == mock_label.node_id assert updated_label.from_github.call_count == 1 def test_from_github(self): - gh_label = Mock() - gh_label.color = "000000" - gh_label.description = "Description" - gh_label.name = "Name" + gh_label_mock = Mock() + gh_label_mock.color = "000000" + gh_label_mock.description = "Description" + gh_label_mock.name = "Name" label = Label() - label.from_github(gh_label) + label.from_github(gh_label_mock) - assert label.color == gh_label.color - assert label.description == gh_label.description - assert label.name == gh_label.name + assert label.color == gh_label_mock.color + assert label.description == gh_label_mock.description + assert label.name == gh_label_mock.name diff --git a/backend/tests/github/models/mixins/issue_tests.py b/backend/tests/github/models/mixins/issue_tests.py index 8343929e6..a7919c736 100644 --- a/backend/tests/github/models/mixins/issue_tests.py +++ b/backend/tests/github/models/mixins/issue_tests.py @@ -1,31 +1,83 @@ +from unittest.mock import MagicMock + from apps.github.models.mixins.issue import IssueIndexMixin +CONTRIBUTORS_COUNT = 10 +FORKS_COUNT = 5 +STARS_COUNT = 50 +COMMENTS_COUNT = 5 -class TestIssueIndexMixin: - CREATED_AT = "2021-09-01T00:00:00Z" - UPDATED_AT = "2021-09-01T00:00:00Z" - URL = "url" - TITLE = "title" - SUMMARY = "summary" - HINT = "hint" - COMMENTS_COUNT = 5 +class TestIssueIndexMixin: def test_issue_index(self): + mock_author = MagicMock() + mock_author.login = "test_user" + mock_author.name = "Test User" + + mock_project = MagicMock() + mock_project.idx_description = "Project description" + mock_project.idx_level = "High" + mock_project.idx_tags = ["tag1", "tag2"] + mock_project.idx_topics = ["topic1", "topic2"] + mock_project.idx_name = "Project Name" + mock_project.idx_url = "https://example.com/project" + + mock_repository = MagicMock() + mock_repository.idx_contributors_count = CONTRIBUTORS_COUNT + mock_repository.idx_description = "Repository description" + mock_repository.idx_forks_count = FORKS_COUNT + mock_repository.idx_languages = ["Python", "JavaScript"] + mock_repository.idx_name = "Repository Name" + mock_repository.idx_stars_count = STARS_COUNT + mock_repository.idx_topics = ["repo_topic1", "repo_topic2"] + + mock_label_1 = MagicMock() + mock_label_1.name = "bug" + mock_label_2 = MagicMock() + mock_label_2.name = "feature" + class MockModel(IssueIndexMixin): - idx_created_at = TestIssueIndexMixin.CREATED_AT - idx_updated_at = TestIssueIndexMixin.UPDATED_AT - idx_url = TestIssueIndexMixin.URL - idx_title = TestIssueIndexMixin.TITLE - idx_summary = TestIssueIndexMixin.SUMMARY - idx_hint = TestIssueIndexMixin.HINT - idx_comments_count = TestIssueIndexMixin.COMMENTS_COUNT + def __init__(self): + self.author = mock_author + self.project = mock_project + self.repository = mock_repository + self.comments_count = 5 + self.created_at = "2021-09-01T00:00:00Z" + self.updated_at = "2021-09-02T00:00:00Z" + self.url = "https://example.com/issue" + self.title = "Issue Title" + self.summary = "Issue Summary" + self.hint = "Issue Hint" + self.labels = MagicMock(all=lambda: [mock_label_1, mock_label_2]) mock_instance = MockModel() - assert mock_instance.idx_created_at == TestIssueIndexMixin.CREATED_AT - assert mock_instance.idx_updated_at == TestIssueIndexMixin.UPDATED_AT - assert mock_instance.idx_url == TestIssueIndexMixin.URL - assert mock_instance.idx_title == TestIssueIndexMixin.TITLE - assert mock_instance.idx_summary == TestIssueIndexMixin.SUMMARY - assert mock_instance.idx_hint == TestIssueIndexMixin.HINT - assert mock_instance.idx_comments_count == TestIssueIndexMixin.COMMENTS_COUNT + assert isinstance(mock_instance, IssueIndexMixin) + + assert mock_instance.idx_author_login == "test_user" + assert mock_instance.idx_author_name == "Test User" + + assert mock_instance.idx_project_description == "Project description" + assert mock_instance.idx_project_level == "High" + assert mock_instance.idx_project_tags == ["tag1", "tag2"] + assert mock_instance.idx_project_topics == ["topic1", "topic2"] + assert mock_instance.idx_project_name == "Project Name" + assert mock_instance.idx_project_url == "https://example.com/project" + + assert mock_instance.idx_repository_contributors_count == CONTRIBUTORS_COUNT + assert mock_instance.idx_repository_description == "Repository description" + assert mock_instance.idx_repository_forks_count == FORKS_COUNT + assert mock_instance.idx_repository_languages == ["Python", "JavaScript"] + assert mock_instance.idx_repository_name == "Repository Name" + assert mock_instance.idx_repository_stars_count == STARS_COUNT + assert mock_instance.idx_repository_topics == ["repo_topic1", "repo_topic2"] + + assert mock_instance.idx_labels == ["bug", "feature"] + + assert mock_instance.idx_comments_count == COMMENTS_COUNT + assert mock_instance.idx_created_at == "2021-09-01T00:00:00Z" + assert mock_instance.idx_updated_at == "2021-09-02T00:00:00Z" + assert mock_instance.idx_url == "https://example.com/issue" + assert mock_instance.idx_title == "Issue Title" + assert mock_instance.idx_summary == "Issue Summary" + assert mock_instance.idx_hint == "Issue Hint" diff --git a/backend/tests/github/models/mixins/repository_tests.py b/backend/tests/github/models/mixins/repository_tests.py index da7ab5df4..dba69d12b 100644 --- a/backend/tests/github/models/mixins/repository_tests.py +++ b/backend/tests/github/models/mixins/repository_tests.py @@ -1,37 +1,35 @@ from apps.github.models.mixins.repository import RepositoryIndexMixin +CONTRIBUTORS_COUNT = 5 +FORKS_COUNT = 5 +OPEN_ISSUES_COUNT = 5 +STARS_COUNT = 5 -class TestRepositoryIndexMixin: - CONTRIBUTORS_COUNT = 5 - DESCRIPTION = "Description" - FORKS_COUNT = 5 - TOP_LANGUAGES = ["Python", "JavaScript"] - NAME = "Name" - OPEN_ISSUES_COUNT = 5 - PUSHED_AT = "2021-01-01" - STARS_COUNT = 5 - TOPICS = ["Topic1", "Topic2"] +class TestRepositoryIndexMixin: def test_repository_index(self): class MockModel(RepositoryIndexMixin): - idx_contributors_count = TestRepositoryIndexMixin.CONTRIBUTORS_COUNT - idx_description = TestRepositoryIndexMixin.DESCRIPTION - idx_forks_count = TestRepositoryIndexMixin.FORKS_COUNT - idx_languages = TestRepositoryIndexMixin.TOP_LANGUAGES - idx_name = TestRepositoryIndexMixin.NAME - idx_open_issues_count = TestRepositoryIndexMixin.OPEN_ISSUES_COUNT - idx_pushed_at = TestRepositoryIndexMixin.PUSHED_AT - idx_stars_count = TestRepositoryIndexMixin.STARS_COUNT - idx_topics = TestRepositoryIndexMixin.TOPICS + def __init__(self): + self.contributors_count = 5 + self.description = "Description" + self.forks_count = 5 + self.top_languages = ["Python", "JavaScript"] + self.name = "Name" + self.open_issues_count = 5 + self.pushed_at = "2021-01-01" + self.stars_count = 5 + self.topics = ["Topic1", "Topic2"] mock_instance = MockModel() - assert mock_instance.idx_contributors_count == TestRepositoryIndexMixin.CONTRIBUTORS_COUNT - assert mock_instance.idx_description == TestRepositoryIndexMixin.DESCRIPTION - assert mock_instance.idx_forks_count == TestRepositoryIndexMixin.FORKS_COUNT - assert mock_instance.idx_languages == TestRepositoryIndexMixin.TOP_LANGUAGES - assert mock_instance.idx_name == TestRepositoryIndexMixin.NAME - assert mock_instance.idx_open_issues_count == TestRepositoryIndexMixin.OPEN_ISSUES_COUNT - assert mock_instance.idx_pushed_at == TestRepositoryIndexMixin.PUSHED_AT - assert mock_instance.idx_stars_count == TestRepositoryIndexMixin.STARS_COUNT - assert mock_instance.idx_topics == TestRepositoryIndexMixin.TOPICS + assert isinstance(mock_instance, RepositoryIndexMixin) + + assert mock_instance.idx_contributors_count == CONTRIBUTORS_COUNT + assert mock_instance.idx_description == "Description" + assert mock_instance.idx_forks_count == FORKS_COUNT + assert mock_instance.idx_languages == ["Python", "JavaScript"] + assert mock_instance.idx_name == "Name" + assert mock_instance.idx_open_issues_count == OPEN_ISSUES_COUNT + assert mock_instance.idx_pushed_at == "2021-01-01" + assert mock_instance.idx_stars_count == STARS_COUNT + assert mock_instance.idx_topics == ["Topic1", "Topic2"] diff --git a/backend/tests/github/models/mixins/user_tests.py b/backend/tests/github/models/mixins/user_tests.py index 0f51e3e2a..92c432898 100644 --- a/backend/tests/github/models/mixins/user_tests.py +++ b/backend/tests/github/models/mixins/user_tests.py @@ -1,52 +1,44 @@ from apps.github.models.mixins.user import UserIndexMixin +FOLLOWERS_COUNT = 5 +FOLLOWING_COUNT = 3 +REPOSITORIES_COUNT = 42 -class TestUserIndexMixin: - AVATAR_URL = "https://avatars.githubusercontent.com/u/1" - BIO = "Bio" - COMPANY = "Company" - CREATED_AT = "2021-01-01T00:00:00Z" - EMAIL = "email@example.com" - FOLLOWERS_COUNT = 5 - FOLLOWING_COUNT = 3 - LOCATION = "Earth" - LOGIN = "user_login" - NAME = "John Doe" - PUBLIC_REPOS_COUNT = 42 - TITLE = "GitHub User" - UPDATED_AT = "2021-12-31T23:59:59Z" - URL = "https://api.github.com/users/user_login" +class TestUserIndexMixin: def test_user_index(self): class MockModel(UserIndexMixin): - avatar_url = TestUserIndexMixin.AVATAR_URL - bio = TestUserIndexMixin.BIO - company = TestUserIndexMixin.COMPANY - created_at = TestUserIndexMixin.CREATED_AT - email = TestUserIndexMixin.EMAIL - followers_count = TestUserIndexMixin.FOLLOWERS_COUNT - following_count = TestUserIndexMixin.FOLLOWING_COUNT - location = TestUserIndexMixin.LOCATION - login = TestUserIndexMixin.LOGIN - name = TestUserIndexMixin.NAME - public_repositories_count = TestUserIndexMixin.PUBLIC_REPOS_COUNT - title = TestUserIndexMixin.TITLE - updated_at = TestUserIndexMixin.UPDATED_AT - url = TestUserIndexMixin.URL + def __init__(self): + self.avatar_url = "https://avatars.githubusercontent.com/u/1" + self.bio = "Bio" + self.company = "Company" + self.created_at = "2021-01-01T00:00:00Z" + self.email = "email@example.com" + self.followers_count = 5 + self.following_count = 3 + self.location = "Earth" + self.login = "user_login" + self.name = "John Doe" + self.public_repositories_count = 42 + self.title = "GitHub User" + self.updated_at = "2021-12-31T23:59:59Z" + self.url = "https://api.github.com/users/user_login" mock_instance = MockModel() - assert mock_instance.idx_avatar_url == TestUserIndexMixin.AVATAR_URL - assert mock_instance.idx_bio == TestUserIndexMixin.BIO - assert mock_instance.idx_company == TestUserIndexMixin.COMPANY - assert mock_instance.idx_created_at == TestUserIndexMixin.CREATED_AT - assert mock_instance.idx_email == TestUserIndexMixin.EMAIL - assert mock_instance.idx_followers_count == TestUserIndexMixin.FOLLOWERS_COUNT - assert mock_instance.idx_following_count == TestUserIndexMixin.FOLLOWING_COUNT - assert mock_instance.idx_location == TestUserIndexMixin.LOCATION - assert mock_instance.idx_login == TestUserIndexMixin.LOGIN - assert mock_instance.idx_name == TestUserIndexMixin.NAME - assert mock_instance.idx_public_repositories_count == TestUserIndexMixin.PUBLIC_REPOS_COUNT - assert mock_instance.idx_title == TestUserIndexMixin.TITLE - assert mock_instance.idx_updated_at == TestUserIndexMixin.UPDATED_AT - assert mock_instance.idx_url == TestUserIndexMixin.URL + assert isinstance(mock_instance, UserIndexMixin) + + assert mock_instance.idx_avatar_url == "https://avatars.githubusercontent.com/u/1" + assert mock_instance.idx_bio == "Bio" + assert mock_instance.idx_company == "Company" + assert mock_instance.idx_created_at == "2021-01-01T00:00:00Z" + assert mock_instance.idx_email == "email@example.com" + assert mock_instance.idx_followers_count == FOLLOWERS_COUNT + assert mock_instance.idx_following_count == FOLLOWING_COUNT + assert mock_instance.idx_location == "Earth" + assert mock_instance.idx_key == "user_login" + assert mock_instance.idx_name == "John Doe" + assert mock_instance.idx_public_repositories_count == REPOSITORIES_COUNT + assert mock_instance.idx_title == "GitHub User" + assert mock_instance.idx_updated_at == "2021-12-31T23:59:59Z" + assert mock_instance.idx_url == "https://api.github.com/users/user_login" diff --git a/backend/tests/github/models/organization_tests.py b/backend/tests/github/models/organization_tests.py index 751a410ca..08e516961 100644 --- a/backend/tests/github/models/organization_tests.py +++ b/backend/tests/github/models/organization_tests.py @@ -30,10 +30,10 @@ def test_update_data(self, mock_get): mock_from_github.assert_called_once_with(gh_organization_mock) def test_from_github(self): - gh_organization = Mock() - gh_organization.description = "Description" + gh_organization_mock = Mock() + gh_organization_mock.description = "Description" organization = Organization() - organization.from_github(gh_organization) + organization.from_github(gh_organization_mock) - assert organization.description == gh_organization.description + assert organization.description == gh_organization_mock.description diff --git a/backend/tests/github/models/release_tests.py b/backend/tests/github/models/release_tests.py index 12721aaae..180be250e 100644 --- a/backend/tests/github/models/release_tests.py +++ b/backend/tests/github/models/release_tests.py @@ -11,8 +11,8 @@ def test_bulk_save(self, mocker): mock_bulk_save.assert_called_once_with(Release, mock_releases) def test_update_data(self, mocker): - gh_release = mocker.Mock() - gh_release.raw_data = {"node_id": "12345"} + gh_release_mock = mocker.Mock() + gh_release_mock.raw_data = {"node_id": "12345"} mock_release = mocker.Mock(spec=Release) mock_release.node_id = "12345" @@ -21,24 +21,24 @@ def test_update_data(self, mocker): release = Release() release.from_github = mocker.Mock() - updated_release = Release.update_data(gh_release) + updated_release = Release.update_data(gh_release_mock) assert updated_release.node_id == mock_release.node_id assert updated_release.from_github.call_count == 1 def test_from_github(self): - gh_release = Mock() - gh_release.created_at = "2021-01-01T00:00:00Z" - gh_release.body = "Description" - gh_release.title = "Name" - gh_release.tag_name = "v1.0.0" + gh_release_mock = Mock() + gh_release_mock.created_at = "2021-01-01T00:00:00Z" + gh_release_mock.body = "Description" + gh_release_mock.title = "Name" + gh_release_mock.tag_name = "v1.0.0" release = Release() - release.from_github(gh_release) + release.from_github(gh_release_mock) - assert release.created_at == gh_release.created_at - assert release.description == gh_release.body - assert release.name == gh_release.title - assert release.tag_name == gh_release.tag_name + assert release.created_at == gh_release_mock.created_at + assert release.description == gh_release_mock.body + assert release.name == gh_release_mock.title + assert release.tag_name == gh_release_mock.tag_name assert release.author is None assert release.repository is None diff --git a/backend/tests/github/models/repository_contributor_tests.py b/backend/tests/github/models/repository_contributor_tests.py index 639302f07..1c04333ea 100644 --- a/backend/tests/github/models/repository_contributor_tests.py +++ b/backend/tests/github/models/repository_contributor_tests.py @@ -7,26 +7,28 @@ class TestRepositoryContributor: def test_from_github(self): default_contribution_value = 5 repository_contributor = RepositoryContributor() - gh_label = Mock(contributions=default_contribution_value) - repository_contributor.from_github(gh_label) + gh_label_mock = Mock(contributions=default_contribution_value) + repository_contributor.from_github(gh_label_mock) assert repository_contributor.contributions_count == default_contribution_value def test_bulk_save(self): - repository_contributors = [Mock(id=None), Mock(id=1)] + mock_repository_contributors = [Mock(id=None), Mock(id=1)] with patch("apps.common.models.BulkSaveModel.bulk_save") as mock_bulk_save: - RepositoryContributor.bulk_save(repository_contributors) - mock_bulk_save.assert_called_once_with(RepositoryContributor, repository_contributors) + RepositoryContributor.bulk_save(mock_repository_contributors) + mock_bulk_save.assert_called_once_with( + RepositoryContributor, mock_repository_contributors + ) def test_update_data(self, mocker): - gh_contributor = MagicMock() - gh_contributor.raw_data = {"node_id": "12345"} - repository = MagicMock() - user = MagicMock() + gh_contributor_mock = MagicMock() + gh_contributor_mock.raw_data = {"node_id": "12345"} + repository_mock = MagicMock() + user_mock = MagicMock() mock_repository_contributor = mocker.Mock(spec=RepositoryContributor) - mock_repository_contributor.repository = repository - mock_repository_contributor.user = user + mock_repository_contributor.repository = repository_mock + mock_repository_contributor.user = user_mock mocker.patch( "apps.github.models.repository_contributor.RepositoryContributor.objects.get", return_value=mock_repository_contributor, @@ -36,7 +38,7 @@ def test_update_data(self, mocker): repository_contributor.from_github = mocker.Mock() updated_repository_contributor = RepositoryContributor.update_data( - gh_contributor, repository, user + gh_contributor_mock, repository_mock, user_mock ) assert updated_repository_contributor.repository == mock_repository_contributor.repository diff --git a/backend/tests/github/models/repository_tests.py b/backend/tests/github/models/repository_tests.py index 43f4a3eee..14c29a58e 100644 --- a/backend/tests/github/models/repository_tests.py +++ b/backend/tests/github/models/repository_tests.py @@ -9,8 +9,8 @@ class TestRepositoryModel: def test_update_data(self, mocker): - gh_repository = MagicMock() - gh_repository.raw_data = {"node_id": "12345"} + gh_repository_mock = MagicMock() + gh_repository_mock.raw_data = {"node_id": "12345"} mock_repository = mocker.Mock(spec=Repository) mock_repository.node_id = "12345" @@ -21,7 +21,7 @@ def test_update_data(self, mocker): repository = Repository() repository.from_github = mocker.Mock() - updated_repository = Repository.update_data(gh_repository) + updated_repository = Repository.update_data(gh_repository_mock) assert updated_repository.node_id == mock_repository.node_id assert updated_repository.from_github.call_count == 1 diff --git a/backend/tests/github/models/user_tests.py b/backend/tests/github/models/user_tests.py index 5cd9e3601..5778e070f 100644 --- a/backend/tests/github/models/user_tests.py +++ b/backend/tests/github/models/user_tests.py @@ -29,22 +29,22 @@ def test_is_indexable(self, login, expected_indexable): assert user.is_indexable is expected_indexable def test_from_github(self, mocker): - gh_user = mocker.Mock( + gh_user_mock = mocker.Mock( bio="Bio", hireable=True, twitter_username="twitter", ) user = User() - user.from_github(gh_user) + user.from_github(gh_user_mock) assert user.bio == "Bio" assert user.is_hireable assert user.twitter_username == "twitter" def test_update_data(self, mocker): - gh_user = mocker.Mock() - gh_user.raw_data = {"node_id": "12345"} + gh_user_mock = mocker.Mock() + gh_user_mock.raw_data = {"node_id": "12345"} mock_user = mocker.Mock(spec=User) mock_user.node_id = "12345" @@ -53,7 +53,7 @@ def test_update_data(self, mocker): user = User() user.from_github = mocker.Mock() - updated_user = User.update_data(gh_user) + updated_user = User.update_data(gh_user_mock) assert updated_user.node_id == mock_user.node_id assert updated_user.from_github.call_count == 1 From 70d0d163c5f394446250e47ca9e8c6c50153a65a Mon Sep 17 00:00:00 2001 From: YASH PANDEY Date: Mon, 13 Jan 2025 11:13:55 +0530 Subject: [PATCH 06/10] Updates in tests and making them modular --- .../github/models/repository_contributor.py | 4 +- .../tests/github/models/mixins/issue_tests.py | 68 ++++++++++--------- .../models/mixins/organization_tests.py | 15 ++-- .../github/models/mixins/repository_tests.py | 30 ++++---- .../tests/github/models/mixins/user_tests.py | 40 ++++++----- .../models/repository_contributor_tests.py | 4 +- 6 files changed, 92 insertions(+), 69 deletions(-) diff --git a/backend/apps/github/models/repository_contributor.py b/backend/apps/github/models/repository_contributor.py index f4be33f2f..a4358b7e6 100644 --- a/backend/apps/github/models/repository_contributor.py +++ b/backend/apps/github/models/repository_contributor.py @@ -37,7 +37,7 @@ def __str__(self): f"contribution{pluralize(self.contributions_count)} to {self.repository}" ) - def from_github(self, gh_label): + def from_github(self, gh_contributions): """Update instance based on GitHub contributor data.""" field_mapping = { "contributions_count": "contributions", @@ -45,7 +45,7 @@ def from_github(self, gh_label): # Direct fields. for model_field, gh_field in field_mapping.items(): - value = getattr(gh_label, gh_field) + value = getattr(gh_contributions, gh_field) if value is not None: setattr(self, model_field, value) diff --git a/backend/tests/github/models/mixins/issue_tests.py b/backend/tests/github/models/mixins/issue_tests.py index a7919c736..ac6b66dd8 100644 --- a/backend/tests/github/models/mixins/issue_tests.py +++ b/backend/tests/github/models/mixins/issue_tests.py @@ -1,5 +1,7 @@ from unittest.mock import MagicMock +import pytest + from apps.github.models.mixins.issue import IssueIndexMixin CONTRIBUTORS_COUNT = 10 @@ -9,7 +11,8 @@ class TestIssueIndexMixin: - def test_issue_index(self): + @pytest.fixture() + def mock_model(self): mock_author = MagicMock() mock_author.login = "test_user" mock_author.name = "Test User" @@ -41,7 +44,7 @@ def __init__(self): self.author = mock_author self.project = mock_project self.repository = mock_repository - self.comments_count = 5 + self.comments_count = COMMENTS_COUNT self.created_at = "2021-09-01T00:00:00Z" self.updated_at = "2021-09-02T00:00:00Z" self.url = "https://example.com/issue" @@ -50,34 +53,35 @@ def __init__(self): self.hint = "Issue Hint" self.labels = MagicMock(all=lambda: [mock_label_1, mock_label_2]) - mock_instance = MockModel() - - assert isinstance(mock_instance, IssueIndexMixin) - - assert mock_instance.idx_author_login == "test_user" - assert mock_instance.idx_author_name == "Test User" - - assert mock_instance.idx_project_description == "Project description" - assert mock_instance.idx_project_level == "High" - assert mock_instance.idx_project_tags == ["tag1", "tag2"] - assert mock_instance.idx_project_topics == ["topic1", "topic2"] - assert mock_instance.idx_project_name == "Project Name" - assert mock_instance.idx_project_url == "https://example.com/project" - - assert mock_instance.idx_repository_contributors_count == CONTRIBUTORS_COUNT - assert mock_instance.idx_repository_description == "Repository description" - assert mock_instance.idx_repository_forks_count == FORKS_COUNT - assert mock_instance.idx_repository_languages == ["Python", "JavaScript"] - assert mock_instance.idx_repository_name == "Repository Name" - assert mock_instance.idx_repository_stars_count == STARS_COUNT - assert mock_instance.idx_repository_topics == ["repo_topic1", "repo_topic2"] - - assert mock_instance.idx_labels == ["bug", "feature"] + return MockModel() - assert mock_instance.idx_comments_count == COMMENTS_COUNT - assert mock_instance.idx_created_at == "2021-09-01T00:00:00Z" - assert mock_instance.idx_updated_at == "2021-09-02T00:00:00Z" - assert mock_instance.idx_url == "https://example.com/issue" - assert mock_instance.idx_title == "Issue Title" - assert mock_instance.idx_summary == "Issue Summary" - assert mock_instance.idx_hint == "Issue Hint" + @pytest.mark.parametrize( + ("attr", "expected"), + [ + ("idx_author_login", "test_user"), + ("idx_author_name", "Test User"), + ("idx_project_description", "Project description"), + ("idx_project_level", "High"), + ("idx_project_tags", ["tag1", "tag2"]), + ("idx_project_topics", ["topic1", "topic2"]), + ("idx_project_name", "Project Name"), + ("idx_project_url", "https://example.com/project"), + ("idx_repository_contributors_count", CONTRIBUTORS_COUNT), + ("idx_repository_description", "Repository description"), + ("idx_repository_forks_count", FORKS_COUNT), + ("idx_repository_languages", ["Python", "JavaScript"]), + ("idx_repository_name", "Repository Name"), + ("idx_repository_stars_count", STARS_COUNT), + ("idx_repository_topics", ["repo_topic1", "repo_topic2"]), + ("idx_labels", ["bug", "feature"]), + ("idx_comments_count", COMMENTS_COUNT), + ("idx_created_at", "2021-09-01T00:00:00Z"), + ("idx_updated_at", "2021-09-02T00:00:00Z"), + ("idx_url", "https://example.com/issue"), + ("idx_title", "Issue Title"), + ("idx_summary", "Issue Summary"), + ("idx_hint", "Issue Hint"), + ], + ) + def test_issue_index(self, mock_model, attr, expected): + assert getattr(mock_model, attr) == expected diff --git a/backend/tests/github/models/mixins/organization_tests.py b/backend/tests/github/models/mixins/organization_tests.py index c105e080b..b65ad7f1e 100644 --- a/backend/tests/github/models/mixins/organization_tests.py +++ b/backend/tests/github/models/mixins/organization_tests.py @@ -1,11 +1,18 @@ +import pytest + from apps.github.models.organization import Organization class TestOrganizationIndexMixin: - def test_organization_index(self): + @pytest.mark.parametrize( + ("attr", "expected"), + [ + ("idx_name", "Organization Name login"), + ("idx_company", "Company Location"), + ], + ) + def test_organization_index(self, attr, expected): organization = Organization( name="Organization Name", login="login", company="Company", location="Location" ) - - assert organization.idx_name == "Organization Name login" - assert organization.idx_company == "Company Location" + assert getattr(organization, attr) == expected diff --git a/backend/tests/github/models/mixins/repository_tests.py b/backend/tests/github/models/mixins/repository_tests.py index dba69d12b..b5d8af196 100644 --- a/backend/tests/github/models/mixins/repository_tests.py +++ b/backend/tests/github/models/mixins/repository_tests.py @@ -1,3 +1,5 @@ +import pytest + from apps.github.models.mixins.repository import RepositoryIndexMixin CONTRIBUTORS_COUNT = 5 @@ -7,7 +9,21 @@ class TestRepositoryIndexMixin: - def test_repository_index(self): + @pytest.mark.parametrize( + ("attr", "expected"), + [ + ("idx_contributors_count", CONTRIBUTORS_COUNT), + ("idx_description", "Description"), + ("idx_forks_count", FORKS_COUNT), + ("idx_languages", ["Python", "JavaScript"]), + ("idx_name", "Name"), + ("idx_open_issues_count", OPEN_ISSUES_COUNT), + ("idx_pushed_at", "2021-01-01"), + ("idx_stars_count", STARS_COUNT), + ("idx_topics", ["Topic1", "Topic2"]), + ], + ) + def test_repository_index(self, attr, expected): class MockModel(RepositoryIndexMixin): def __init__(self): self.contributors_count = 5 @@ -22,14 +38,4 @@ def __init__(self): mock_instance = MockModel() - assert isinstance(mock_instance, RepositoryIndexMixin) - - assert mock_instance.idx_contributors_count == CONTRIBUTORS_COUNT - assert mock_instance.idx_description == "Description" - assert mock_instance.idx_forks_count == FORKS_COUNT - assert mock_instance.idx_languages == ["Python", "JavaScript"] - assert mock_instance.idx_name == "Name" - assert mock_instance.idx_open_issues_count == OPEN_ISSUES_COUNT - assert mock_instance.idx_pushed_at == "2021-01-01" - assert mock_instance.idx_stars_count == STARS_COUNT - assert mock_instance.idx_topics == ["Topic1", "Topic2"] + assert getattr(mock_instance, attr) == expected diff --git a/backend/tests/github/models/mixins/user_tests.py b/backend/tests/github/models/mixins/user_tests.py index 92c432898..a958e4184 100644 --- a/backend/tests/github/models/mixins/user_tests.py +++ b/backend/tests/github/models/mixins/user_tests.py @@ -1,3 +1,5 @@ +import pytest + from apps.github.models.mixins.user import UserIndexMixin FOLLOWERS_COUNT = 5 @@ -6,7 +8,26 @@ class TestUserIndexMixin: - def test_user_index(self): + @pytest.mark.parametrize( + ("attr", "expected"), + [ + ("idx_avatar_url", "https://avatars.githubusercontent.com/u/1"), + ("idx_bio", "Bio"), + ("idx_company", "Company"), + ("idx_created_at", "2021-01-01T00:00:00Z"), + ("idx_email", "email@example.com"), + ("idx_followers_count", FOLLOWERS_COUNT), + ("idx_following_count", FOLLOWING_COUNT), + ("idx_location", "Earth"), + ("idx_key", "user_login"), + ("idx_name", "John Doe"), + ("idx_public_repositories_count", REPOSITORIES_COUNT), + ("idx_title", "GitHub User"), + ("idx_updated_at", "2021-12-31T23:59:59Z"), + ("idx_url", "https://api.github.com/users/user_login"), + ], + ) + def test_user_index(self, attr, expected): class MockModel(UserIndexMixin): def __init__(self): self.avatar_url = "https://avatars.githubusercontent.com/u/1" @@ -26,19 +47,4 @@ def __init__(self): mock_instance = MockModel() - assert isinstance(mock_instance, UserIndexMixin) - - assert mock_instance.idx_avatar_url == "https://avatars.githubusercontent.com/u/1" - assert mock_instance.idx_bio == "Bio" - assert mock_instance.idx_company == "Company" - assert mock_instance.idx_created_at == "2021-01-01T00:00:00Z" - assert mock_instance.idx_email == "email@example.com" - assert mock_instance.idx_followers_count == FOLLOWERS_COUNT - assert mock_instance.idx_following_count == FOLLOWING_COUNT - assert mock_instance.idx_location == "Earth" - assert mock_instance.idx_key == "user_login" - assert mock_instance.idx_name == "John Doe" - assert mock_instance.idx_public_repositories_count == REPOSITORIES_COUNT - assert mock_instance.idx_title == "GitHub User" - assert mock_instance.idx_updated_at == "2021-12-31T23:59:59Z" - assert mock_instance.idx_url == "https://api.github.com/users/user_login" + assert getattr(mock_instance, attr) == expected diff --git a/backend/tests/github/models/repository_contributor_tests.py b/backend/tests/github/models/repository_contributor_tests.py index 1c04333ea..4eb26f40f 100644 --- a/backend/tests/github/models/repository_contributor_tests.py +++ b/backend/tests/github/models/repository_contributor_tests.py @@ -7,8 +7,8 @@ class TestRepositoryContributor: def test_from_github(self): default_contribution_value = 5 repository_contributor = RepositoryContributor() - gh_label_mock = Mock(contributions=default_contribution_value) - repository_contributor.from_github(gh_label_mock) + gh_contributions = Mock(contributions=default_contribution_value) + repository_contributor.from_github(gh_contributions) assert repository_contributor.contributions_count == default_contribution_value From 9ac2d7d2a39a7be5346072f71f8ba95f5d90705d Mon Sep 17 00:00:00 2001 From: YASH PANDEY Date: Tue, 14 Jan 2025 04:25:14 +0530 Subject: [PATCH 07/10] test-fixes --- .../tests/github/models/mixins/issue_tests.py | 88 +++++++-------- .../github/models/mixins/repository_tests.py | 39 ++++--- .../tests/github/models/mixins/user_tests.py | 105 +++++++++++------- .../models/repository_contributor_tests.py | 4 +- .../tests/github/models/repository_tests.py | 4 +- backend/tests/github/models/user_tests.py | 49 +++++--- 6 files changed, 170 insertions(+), 119 deletions(-) diff --git a/backend/tests/github/models/mixins/issue_tests.py b/backend/tests/github/models/mixins/issue_tests.py index ac6b66dd8..2ac711932 100644 --- a/backend/tests/github/models/mixins/issue_tests.py +++ b/backend/tests/github/models/mixins/issue_tests.py @@ -1,59 +1,50 @@ +from datetime import datetime, timezone from unittest.mock import MagicMock import pytest from apps.github.models.mixins.issue import IssueIndexMixin -CONTRIBUTORS_COUNT = 10 -FORKS_COUNT = 5 -STARS_COUNT = 50 COMMENTS_COUNT = 5 +FOLLOWERS_COUNT = 10 +FORKS_COUNT = 3 +STARS_COUNT = 100 -class TestIssueIndexMixin: - @pytest.fixture() - def mock_model(self): - mock_author = MagicMock() - mock_author.login = "test_user" - mock_author.name = "Test User" +class MockModel(IssueIndexMixin): + def __init__(self): + self.author = MagicMock() + self.author.login = "test_user" + self.author.name = "Test User" - mock_project = MagicMock() - mock_project.idx_description = "Project description" - mock_project.idx_level = "High" - mock_project.idx_tags = ["tag1", "tag2"] - mock_project.idx_topics = ["topic1", "topic2"] - mock_project.idx_name = "Project Name" - mock_project.idx_url = "https://example.com/project" + self.project = MagicMock() + self.project.idx_description = "Project description" + self.project.idx_level = "High" + self.project.idx_tags = ["tag1", "tag2"] + self.project.idx_topics = ["topic1", "topic2"] + self.project.idx_name = "Project Name" + self.project.idx_url = "https://example.com/project" - mock_repository = MagicMock() - mock_repository.idx_contributors_count = CONTRIBUTORS_COUNT - mock_repository.idx_description = "Repository description" - mock_repository.idx_forks_count = FORKS_COUNT - mock_repository.idx_languages = ["Python", "JavaScript"] - mock_repository.idx_name = "Repository Name" - mock_repository.idx_stars_count = STARS_COUNT - mock_repository.idx_topics = ["repo_topic1", "repo_topic2"] + self.repository = MagicMock() + self.repository.idx_contributors_count = FOLLOWERS_COUNT + self.repository.idx_description = "Repository description" + self.repository.idx_forks_count = FORKS_COUNT + self.repository.idx_name = "Repository Name" + self.repository.idx_stars_count = STARS_COUNT + self.repository.idx_topics = ["repo_topic1", "repo_topic2"] - mock_label_1 = MagicMock() - mock_label_1.name = "bug" - mock_label_2 = MagicMock() - mock_label_2.name = "feature" + self.comments_count = COMMENTS_COUNT + self.created_at = datetime(2021, 9, 1, tzinfo=timezone.utc) + self.updated_at = datetime(2021, 9, 2, tzinfo=timezone.utc) + self.url = "https://example.com/issue" + self.title = "Issue Title" + self.summary = "Issue Summary" + self.hint = "Issue Hint" + self.labels = MagicMock(all=lambda: [MagicMock(name="bug"), MagicMock(name="feature")]) - class MockModel(IssueIndexMixin): - def __init__(self): - self.author = mock_author - self.project = mock_project - self.repository = mock_repository - self.comments_count = COMMENTS_COUNT - self.created_at = "2021-09-01T00:00:00Z" - self.updated_at = "2021-09-02T00:00:00Z" - self.url = "https://example.com/issue" - self.title = "Issue Title" - self.summary = "Issue Summary" - self.hint = "Issue Hint" - self.labels = MagicMock(all=lambda: [mock_label_1, mock_label_2]) - return MockModel() +class TestIssueIndexMixin: + """Test suite for IssueIndexMixin.""" @pytest.mark.parametrize( ("attr", "expected"), @@ -66,22 +57,21 @@ def __init__(self): ("idx_project_topics", ["topic1", "topic2"]), ("idx_project_name", "Project Name"), ("idx_project_url", "https://example.com/project"), - ("idx_repository_contributors_count", CONTRIBUTORS_COUNT), + ("idx_repository_contributors_count", FOLLOWERS_COUNT), ("idx_repository_description", "Repository description"), ("idx_repository_forks_count", FORKS_COUNT), - ("idx_repository_languages", ["Python", "JavaScript"]), ("idx_repository_name", "Repository Name"), ("idx_repository_stars_count", STARS_COUNT), ("idx_repository_topics", ["repo_topic1", "repo_topic2"]), - ("idx_labels", ["bug", "feature"]), ("idx_comments_count", COMMENTS_COUNT), - ("idx_created_at", "2021-09-01T00:00:00Z"), - ("idx_updated_at", "2021-09-02T00:00:00Z"), + ("idx_created_at", datetime(2021, 9, 1, tzinfo=timezone.utc).timestamp()), + ("idx_updated_at", datetime(2021, 9, 2, tzinfo=timezone.utc).timestamp()), ("idx_url", "https://example.com/issue"), ("idx_title", "Issue Title"), ("idx_summary", "Issue Summary"), ("idx_hint", "Issue Hint"), ], ) - def test_issue_index(self, mock_model, attr, expected): - assert getattr(mock_model, attr) == expected + def test_issue_index(self, attr, expected): + mock_instance = MockModel() + assert getattr(mock_instance, attr) == expected diff --git a/backend/tests/github/models/mixins/repository_tests.py b/backend/tests/github/models/mixins/repository_tests.py index b5d8af196..0d8a54a81 100644 --- a/backend/tests/github/models/mixins/repository_tests.py +++ b/backend/tests/github/models/mixins/repository_tests.py @@ -1,3 +1,5 @@ +from datetime import datetime, timezone + import pytest from apps.github.models.mixins.repository import RepositoryIndexMixin @@ -8,7 +10,27 @@ STARS_COUNT = 5 -class TestRepositoryIndexMixin: +class MockModel(RepositoryIndexMixin): + def __init__(self): + self.contributors_count = CONTRIBUTORS_COUNT + self.description = "Description" + self.forks_count = FORKS_COUNT + self.languages = ["Python", "JavaScript"] + self.name = "Name" + self.open_issues_count = OPEN_ISSUES_COUNT + self.pushed_at = datetime(2021, 1, 1, tzinfo=timezone.utc) + self.stars_count = STARS_COUNT + self.topics = ["Topic1", "Topic2"] + self.created_at = datetime(2020, 1, 1, tzinfo=timezone.utc) + self.size = 1024 + self.has_funding_yml = True + self.license = "MIT" + self.project = None + + +class TestRepositoryIndex: + """Test suite for RepositoryIndexMixin.""" + @pytest.mark.parametrize( ("attr", "expected"), [ @@ -18,24 +40,11 @@ class TestRepositoryIndexMixin: ("idx_languages", ["Python", "JavaScript"]), ("idx_name", "Name"), ("idx_open_issues_count", OPEN_ISSUES_COUNT), - ("idx_pushed_at", "2021-01-01"), + ("idx_pushed_at", datetime(2021, 1, 1, tzinfo=timezone.utc).timestamp()), ("idx_stars_count", STARS_COUNT), ("idx_topics", ["Topic1", "Topic2"]), ], ) def test_repository_index(self, attr, expected): - class MockModel(RepositoryIndexMixin): - def __init__(self): - self.contributors_count = 5 - self.description = "Description" - self.forks_count = 5 - self.top_languages = ["Python", "JavaScript"] - self.name = "Name" - self.open_issues_count = 5 - self.pushed_at = "2021-01-01" - self.stars_count = 5 - self.topics = ["Topic1", "Topic2"] - mock_instance = MockModel() - assert getattr(mock_instance, attr) == expected diff --git a/backend/tests/github/models/mixins/user_tests.py b/backend/tests/github/models/mixins/user_tests.py index a958e4184..1dd99258f 100644 --- a/backend/tests/github/models/mixins/user_tests.py +++ b/backend/tests/github/models/mixins/user_tests.py @@ -1,50 +1,79 @@ +from datetime import datetime, timezone +from unittest.mock import MagicMock + import pytest -from apps.github.models.mixins.user import UserIndexMixin +from apps.github.models.mixins.issue import IssueIndexMixin + +COMMENTS_COUNT = 5 +FOLLOWERS_COUNT = 10 +FORKS_COUNT = 3 +STARS_COUNT = 100 + + +class MockModel(IssueIndexMixin): + def __init__(self): + self.author = MagicMock() + self.author.login = "test_user" + self.author.name = "Test User" + + self.project = MagicMock() + self.project.idx_description = "Project description" + self.project.idx_level = "High" + self.project.idx_tags = ["tag1", "tag2"] + self.project.idx_topics = ["topic1", "topic2"] + self.project.idx_name = "Project Name" + self.project.idx_url = "https://example.com/project" -FOLLOWERS_COUNT = 5 -FOLLOWING_COUNT = 3 -REPOSITORIES_COUNT = 42 + self.repository = MagicMock() + self.repository.idx_contributors_count = FOLLOWERS_COUNT + self.repository.idx_description = "Repository description" + self.repository.idx_forks_count = FORKS_COUNT + self.repository.idx_languages = ["Python", "JavaScript"] + self.repository.idx_name = "Repository Name" + self.repository.idx_stars_count = STARS_COUNT + self.repository.idx_topics = ["repo_topic1", "repo_topic2"] + self.comments_count = COMMENTS_COUNT + self.created_at = datetime(2021, 9, 1, tzinfo=timezone.utc) + self.updated_at = datetime(2021, 9, 2, tzinfo=timezone.utc) + self.url = "https://example.com/issue" + self.title = "Issue Title" + self.summary = "Issue Summary" + self.hint = "Issue Hint" + self.labels = MagicMock(all=lambda: [MagicMock(name="bug"), MagicMock(name="feature")]) + + +class TestIssueIndexMixin: + """Test suite for IssueIndexMixin.""" -class TestUserIndexMixin: @pytest.mark.parametrize( ("attr", "expected"), [ - ("idx_avatar_url", "https://avatars.githubusercontent.com/u/1"), - ("idx_bio", "Bio"), - ("idx_company", "Company"), - ("idx_created_at", "2021-01-01T00:00:00Z"), - ("idx_email", "email@example.com"), - ("idx_followers_count", FOLLOWERS_COUNT), - ("idx_following_count", FOLLOWING_COUNT), - ("idx_location", "Earth"), - ("idx_key", "user_login"), - ("idx_name", "John Doe"), - ("idx_public_repositories_count", REPOSITORIES_COUNT), - ("idx_title", "GitHub User"), - ("idx_updated_at", "2021-12-31T23:59:59Z"), - ("idx_url", "https://api.github.com/users/user_login"), + ("idx_author_login", "test_user"), + ("idx_author_name", "Test User"), + ("idx_project_description", "Project description"), + ("idx_project_level", "High"), + ("idx_project_tags", ["tag1", "tag2"]), + ("idx_project_topics", ["topic1", "topic2"]), + ("idx_project_name", "Project Name"), + ("idx_project_url", "https://example.com/project"), + ("idx_repository_contributors_count", FOLLOWERS_COUNT), + ("idx_repository_description", "Repository description"), + ("idx_repository_forks_count", FORKS_COUNT), + ("idx_repository_languages", ["Python", "JavaScript"]), + ("idx_repository_name", "Repository Name"), + ("idx_repository_stars_count", STARS_COUNT), + ("idx_repository_topics", ["repo_topic1", "repo_topic2"]), + ("idx_comments_count", COMMENTS_COUNT), + ("idx_created_at", datetime(2021, 9, 1, tzinfo=timezone.utc).timestamp()), + ("idx_updated_at", datetime(2021, 9, 2, tzinfo=timezone.utc).timestamp()), + ("idx_url", "https://example.com/issue"), + ("idx_title", "Issue Title"), + ("idx_summary", "Issue Summary"), + ("idx_hint", "Issue Hint"), ], ) - def test_user_index(self, attr, expected): - class MockModel(UserIndexMixin): - def __init__(self): - self.avatar_url = "https://avatars.githubusercontent.com/u/1" - self.bio = "Bio" - self.company = "Company" - self.created_at = "2021-01-01T00:00:00Z" - self.email = "email@example.com" - self.followers_count = 5 - self.following_count = 3 - self.location = "Earth" - self.login = "user_login" - self.name = "John Doe" - self.public_repositories_count = 42 - self.title = "GitHub User" - self.updated_at = "2021-12-31T23:59:59Z" - self.url = "https://api.github.com/users/user_login" - + def test_issue_index(self, attr, expected): mock_instance = MockModel() - assert getattr(mock_instance, attr) == expected diff --git a/backend/tests/github/models/repository_contributor_tests.py b/backend/tests/github/models/repository_contributor_tests.py index 4eb26f40f..ebbeb832d 100644 --- a/backend/tests/github/models/repository_contributor_tests.py +++ b/backend/tests/github/models/repository_contributor_tests.py @@ -7,8 +7,8 @@ class TestRepositoryContributor: def test_from_github(self): default_contribution_value = 5 repository_contributor = RepositoryContributor() - gh_contributions = Mock(contributions=default_contribution_value) - repository_contributor.from_github(gh_contributions) + gh_contributions_mock = Mock(contributions=default_contribution_value) + repository_contributor.from_github(gh_contributions_mock) assert repository_contributor.contributions_count == default_contribution_value diff --git a/backend/tests/github/models/repository_tests.py b/backend/tests/github/models/repository_tests.py index 14c29a58e..86e83b571 100644 --- a/backend/tests/github/models/repository_tests.py +++ b/backend/tests/github/models/repository_tests.py @@ -57,7 +57,7 @@ def test_is_indexable(self, mock_gh_repository): mock_gh_repository.is_indexable = False assert not mock_gh_repository.is_indexable - def test_from_github_with_missing_funding(self, mock_gh_repository, mocker): + def test_from_github_with_missing_funding(self, mock_gh_repository): mock_gh_repository.get_contents.side_effect = GithubException( data={"status": "404"}, status=404 ) @@ -68,7 +68,7 @@ def test_from_github_with_missing_funding(self, mock_gh_repository, mocker): assert not repository.has_funding_yml assert repository.is_funding_policy_compliant - def test_from_github_with_funding(self, mock_gh_repository, mocker): + def test_from_github_with_funding(self, mock_gh_repository): mock_gh_repository.get_contents.return_value = MagicMock( content=b64encode(b"test: test").decode() ) diff --git a/backend/tests/github/models/user_tests.py b/backend/tests/github/models/user_tests.py index 5778e070f..65bfca0c8 100644 --- a/backend/tests/github/models/user_tests.py +++ b/backend/tests/github/models/user_tests.py @@ -1,3 +1,5 @@ +from unittest.mock import Mock, patch + import pytest from apps.github.models.user import User @@ -24,12 +26,15 @@ def test_str_representation(self, name, login, expected_str): ("ghost", False), ], ) - def test_is_indexable(self, login, expected_indexable): + @patch( + "apps.github.models.organization.Organization.get_logins", return_value=["org1", "org2"] + ) + def test_is_indexable(self, mock_get_logins, login, expected_indexable): user = User(login=login) - assert user.is_indexable is expected_indexable + assert user.is_indexable == expected_indexable - def test_from_github(self, mocker): - gh_user_mock = mocker.Mock( + def test_from_github(self): + gh_user_mock = Mock( bio="Bio", hireable=True, twitter_username="twitter", @@ -42,18 +47,36 @@ def test_from_github(self, mocker): assert user.is_hireable assert user.twitter_username == "twitter" - def test_update_data(self, mocker): - gh_user_mock = mocker.Mock() + @patch("apps.github.models.user.User.objects.get") + @patch("apps.github.models.user.User.save") + def test_update_data(self, mock_save, mock_get): + gh_user_mock = Mock() gh_user_mock.raw_data = {"node_id": "12345"} + gh_user_mock.bio = "Bio" + gh_user_mock.hireable = True + gh_user_mock.twitter_username = "twitter" - mock_user = mocker.Mock(spec=User) + mock_user = Mock(spec=User) mock_user.node_id = "12345" - mocker.patch("apps.github.models.user.User.objects.get", return_value=mock_user) + mock_get.return_value = mock_user - user = User() - user.from_github = mocker.Mock() + updated_user = User.update_data(gh_user_mock, save=True) + + mock_get.assert_called_once_with(node_id="12345") + assert updated_user.node_id == "12345" + + @patch("apps.github.models.user.User.objects.get") + @patch("apps.github.models.user.User.save") + def test_update_data_user_does_not_exist(self, mock_save, mock_get): + gh_user_mock = Mock() + gh_user_mock.raw_data = {"node_id": "67890"} + gh_user_mock.bio = "New Bio" + gh_user_mock.hireable = False + gh_user_mock.twitter_username = "new_twitter" + + mock_get.side_effect = User.DoesNotExist - updated_user = User.update_data(gh_user_mock) + updated_user = User.update_data(gh_user_mock, save=True) - assert updated_user.node_id == mock_user.node_id - assert updated_user.from_github.call_count == 1 + mock_get.assert_called_once_with(node_id="67890") + assert updated_user.node_id == "67890" From dc4ad2cfdb590449bf2fe75ce9ccece6c6a25b6e Mon Sep 17 00:00:00 2001 From: YASH PANDEY Date: Tue, 14 Jan 2025 17:45:31 +0530 Subject: [PATCH 08/10] Added tests for release mixin --- .../github/models/mixins/release_tests.py | 53 +++++++ .../tests/github/models/mixins/user_tests.py | 148 ++++++++++-------- 2 files changed, 134 insertions(+), 67 deletions(-) create mode 100644 backend/tests/github/models/mixins/release_tests.py diff --git a/backend/tests/github/models/mixins/release_tests.py b/backend/tests/github/models/mixins/release_tests.py new file mode 100644 index 000000000..eed3ce44c --- /dev/null +++ b/backend/tests/github/models/mixins/release_tests.py @@ -0,0 +1,53 @@ +from datetime import datetime, timezone +from unittest.mock import MagicMock +import pytest + +from apps.github.models.mixins.release import ReleaseIndexMixin + + +class MockModel(ReleaseIndexMixin): + def __init__(self): + self.author = MagicMock() + + self.author.avatar_url="https://example.com/avatar.png" + self.author.login="test_user" + self.author.name="Test User" + + self.repository = MagicMock( + path="mock/repository", + project=MagicMock(nest_key="mock/project"), + ) + self.created_at = datetime(2023, 1, 1, tzinfo=timezone.utc) + self.published_at = datetime(2023, 6, 1, tzinfo=timezone.utc) + self.description = "This is a long description that should be truncated for indexing purposes." + self.is_pre_release = True + self.name = "Release v1.0.0" + self.tag_name = "v1.0.0" + + +@pytest.mark.parametrize( + ("attr", "expected"), + [ + ("idx_author", [{"avatar_url": "https://example.com/avatar.png", "login": "test_user", "name": "Test User"}]), + ("idx_created_at", datetime(2023, 1, 1, tzinfo=timezone.utc).timestamp()), + ("idx_description", "This is a long description that should be truncated for indexing purposes."), + ("idx_is_pre_release", True), + ("idx_name", "Release v1.0.0"), + ("idx_project", "mock/project"), + ("idx_published_at", datetime(2023, 6, 1, tzinfo=timezone.utc).timestamp()), + ("idx_repository", "mock/repository"), + ("idx_tag_name", "v1.0.0"), + ("idx_author", []), + ("idx_project", ""), + ("idx_published_at", None), + ], +) +def test_release_index(attr, expected): + mock_instance = MockModel() + if attr == "idx_author" and not expected: + mock_instance.author = None + elif attr == "idx_project" and expected == "": + mock_instance.repository.project = None + elif attr == "idx_published_at" and expected is None: + mock_instance.published_at = None + assert getattr(mock_instance, attr) == expected diff --git a/backend/tests/github/models/mixins/user_tests.py b/backend/tests/github/models/mixins/user_tests.py index 1dd99258f..dd0770343 100644 --- a/backend/tests/github/models/mixins/user_tests.py +++ b/backend/tests/github/models/mixins/user_tests.py @@ -3,77 +3,91 @@ import pytest -from apps.github.models.mixins.issue import IssueIndexMixin +from apps.github.models.mixins.user import UserIndexMixin -COMMENTS_COUNT = 5 -FOLLOWERS_COUNT = 10 -FORKS_COUNT = 3 -STARS_COUNT = 100 - -class MockModel(IssueIndexMixin): +class MockModel(UserIndexMixin): def __init__(self): - self.author = MagicMock() - self.author.login = "test_user" - self.author.name = "Test User" - - self.project = MagicMock() - self.project.idx_description = "Project description" - self.project.idx_level = "High" - self.project.idx_tags = ["tag1", "tag2"] - self.project.idx_topics = ["topic1", "topic2"] - self.project.idx_name = "Project Name" - self.project.idx_url = "https://example.com/project" - - self.repository = MagicMock() - self.repository.idx_contributors_count = FOLLOWERS_COUNT - self.repository.idx_description = "Repository description" - self.repository.idx_forks_count = FORKS_COUNT - self.repository.idx_languages = ["Python", "JavaScript"] - self.repository.idx_name = "Repository Name" - self.repository.idx_stars_count = STARS_COUNT - self.repository.idx_topics = ["repo_topic1", "repo_topic2"] + self.avatar_url = "https://example.com/avatar.png" + self.bio = "Developer bio" + self.company = "Test Company" + self.created_at = datetime(2021, 1, 1, tzinfo=timezone.utc) + self.email = "test@example.com" + self.login = "test_user" + self.followers_count = 100 + self.following_count = 50 + self.location = "Test Location" + self.name = "Test User" + self.public_repositories_count = 10 + self.title = "Developer" + self.url = "https://github.com/test_user" + self.updated_at = datetime(2021, 1, 2, tzinfo=timezone.utc) - self.comments_count = COMMENTS_COUNT - self.created_at = datetime(2021, 9, 1, tzinfo=timezone.utc) - self.updated_at = datetime(2021, 9, 2, tzinfo=timezone.utc) - self.url = "https://example.com/issue" - self.title = "Issue Title" - self.summary = "Issue Summary" - self.hint = "Issue Hint" - self.labels = MagicMock(all=lambda: [MagicMock(name="bug"), MagicMock(name="feature")]) + self.issues = MagicMock() + self.issues.select_related.return_value.order_by.return_value = [ + MagicMock( + created_at=datetime(2021, 1, 1, tzinfo=timezone.utc), + comments_count=5, + number=1, + repository=MagicMock( + key="repo_key", + owner=MagicMock(login="owner_login"), + ), + title="Issue Title", + ) + ] + self.issues.count.return_value = 5 + self.releases = MagicMock() + self.releases.select_related.return_value.order_by.return_value = [ + MagicMock( + is_pre_release=False, + name="Release Name", + published_at=datetime(2021, 1, 1, tzinfo=timezone.utc), + repository=MagicMock( + key="repo_key", + owner=MagicMock(login="owner_login"), + ), + tag_name="v1.0.0", + ) + ] + self.releases.count.return_value = 3 -class TestIssueIndexMixin: - """Test suite for IssueIndexMixin.""" - @pytest.mark.parametrize( - ("attr", "expected"), - [ - ("idx_author_login", "test_user"), - ("idx_author_name", "Test User"), - ("idx_project_description", "Project description"), - ("idx_project_level", "High"), - ("idx_project_tags", ["tag1", "tag2"]), - ("idx_project_topics", ["topic1", "topic2"]), - ("idx_project_name", "Project Name"), - ("idx_project_url", "https://example.com/project"), - ("idx_repository_contributors_count", FOLLOWERS_COUNT), - ("idx_repository_description", "Repository description"), - ("idx_repository_forks_count", FORKS_COUNT), - ("idx_repository_languages", ["Python", "JavaScript"]), - ("idx_repository_name", "Repository Name"), - ("idx_repository_stars_count", STARS_COUNT), - ("idx_repository_topics", ["repo_topic1", "repo_topic2"]), - ("idx_comments_count", COMMENTS_COUNT), - ("idx_created_at", datetime(2021, 9, 1, tzinfo=timezone.utc).timestamp()), - ("idx_updated_at", datetime(2021, 9, 2, tzinfo=timezone.utc).timestamp()), - ("idx_url", "https://example.com/issue"), - ("idx_title", "Issue Title"), - ("idx_summary", "Issue Summary"), - ("idx_hint", "Issue Hint"), - ], - ) - def test_issue_index(self, attr, expected): - mock_instance = MockModel() - assert getattr(mock_instance, attr) == expected +@pytest.mark.parametrize( + ("attr", "expected"), + [ + ("idx_avatar_url", "https://example.com/avatar.png"), + ("idx_bio", "Developer bio"), + ("idx_company", "Test Company"), + ("idx_created_at", datetime(2021, 1, 1, tzinfo=timezone.utc).timestamp()), + ("idx_email", "test@example.com"), + ("idx_key", "test_user"), + ("idx_followers_count", 100), + ("idx_following_count", 50), + ("idx_location", "Test Location"), + ("idx_login", "test_user"), + ("idx_name", "Test User"), + ("idx_public_repositories_count", 10), + ("idx_title", "Developer"), + ("idx_url", "https://github.com/test_user"), + ("idx_updated_at", datetime(2021, 1, 2, tzinfo=timezone.utc).timestamp()), + ( + "idx_issues", + [ + { + "created_at": datetime(2021, 1, 1, tzinfo=timezone.utc).timestamp(), + "comments_count": 5, + "number": 1, + "repository": {"key": "repo_key", "owner_key": "owner_login"}, + "title": "Issue Title", + } + ], + ), + ("idx_issues_count", 5), + ("idx_releases_count", 3), + ], +) +def test_user_index_fields(attr, expected): + mock_instance = MockModel() + assert getattr(mock_instance, attr) == expected From 4a0e69e98e41e03477d36831a89c5fe9ed222020 Mon Sep 17 00:00:00 2001 From: YASH PANDEY Date: Tue, 14 Jan 2025 19:25:17 +0530 Subject: [PATCH 09/10] pre-commit fixes --- .../github/models/mixins/release_tests.py | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/backend/tests/github/models/mixins/release_tests.py b/backend/tests/github/models/mixins/release_tests.py index eed3ce44c..06d5b611e 100644 --- a/backend/tests/github/models/mixins/release_tests.py +++ b/backend/tests/github/models/mixins/release_tests.py @@ -1,5 +1,6 @@ from datetime import datetime, timezone from unittest.mock import MagicMock + import pytest from apps.github.models.mixins.release import ReleaseIndexMixin @@ -9,17 +10,17 @@ class MockModel(ReleaseIndexMixin): def __init__(self): self.author = MagicMock() - self.author.avatar_url="https://example.com/avatar.png" - self.author.login="test_user" - self.author.name="Test User" - + self.author.avatar_url = "https://example.com/avatar.png" + self.author.login = "test_user" + self.author.name = "Test User" + self.repository = MagicMock( path="mock/repository", project=MagicMock(nest_key="mock/project"), ) self.created_at = datetime(2023, 1, 1, tzinfo=timezone.utc) self.published_at = datetime(2023, 6, 1, tzinfo=timezone.utc) - self.description = "This is a long description that should be truncated for indexing purposes." + self.description = "This is a long description" self.is_pre_release = True self.name = "Release v1.0.0" self.tag_name = "v1.0.0" @@ -28,9 +29,21 @@ def __init__(self): @pytest.mark.parametrize( ("attr", "expected"), [ - ("idx_author", [{"avatar_url": "https://example.com/avatar.png", "login": "test_user", "name": "Test User"}]), + ( + "idx_author", + [ + { + "avatar_url": "https://example.com/avatar.png", + "login": "test_user", + "name": "Test User", + } + ], + ), ("idx_created_at", datetime(2023, 1, 1, tzinfo=timezone.utc).timestamp()), - ("idx_description", "This is a long description that should be truncated for indexing purposes."), + ( + "idx_description", + "This is a long description", + ), ("idx_is_pre_release", True), ("idx_name", "Release v1.0.0"), ("idx_project", "mock/project"), From 415ce3595fe8c248e59b7f93febd76fbd38ba035 Mon Sep 17 00:00:00 2001 From: YASH PANDEY Date: Tue, 14 Jan 2025 21:31:18 +0530 Subject: [PATCH 10/10] tests for str function in issue model --- backend/tests/github/models/issue_tests.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/tests/github/models/issue_tests.py b/backend/tests/github/models/issue_tests.py index 71c2d7bfd..918741b01 100644 --- a/backend/tests/github/models/issue_tests.py +++ b/backend/tests/github/models/issue_tests.py @@ -4,9 +4,15 @@ from apps.github.models.issue import Issue from apps.github.models.repository import Repository +from apps.github.models.user import User class TestIssueModel: + def test_str(self): + author = User(name="Author", login="author") + issue = Issue(title="Test Issue", author=author) + assert str(issue) == "Test Issue by Author" + def test_open_issues_count(self): with patch("apps.github.models.issue.IndexBase.get_total_count") as mock_get_total_count: Issue.open_issues_count()