chore(github): add Branch class (#7838)

This commit is contained in:
Sergio Garcia
2025-05-26 14:34:44 +02:00
committed by GitHub
parent 15e4d1acce
commit 3658e85cfc
30 changed files with 820 additions and 233 deletions
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -30,19 +30,37 @@ class Test_repository_branch_delete_on_merge_enabled_test:
def test_branch_deletion_disabled(self):
repository_client = mock.MagicMock
repo_name = "repo1"
repo_name = "repo2"
default_branch = "main"
repository_client.repositories = {
1: Repo(
id=1,
2: Repo(
id=2,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
full_name="account-name/repo2",
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=False,
delete_branch_on_merge=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -63,29 +81,47 @@ class Test_repository_branch_delete_on_merge_enabled_test:
check = repository_branch_delete_on_merge_enabled()
result = check.execute()
assert len(result) == 1
assert result[0].resource_id == 1
assert result[0].resource_name == "repo1"
assert result[0].resource_id == 2
assert result[0].resource_name == repo_name
assert result[0].status == "FAIL"
assert (
result[0].status_extended
== f"Repository {repo_name} does not delete branches on merge."
== f"Repository {repo_name} does not delete branches on merge in default branch ({default_branch})."
)
def test_branch_deletion_enabled(self):
repository_client = mock.MagicMock
repo_name = "repo1"
default_branch = "main"
repository_client.repositories = {
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
default_branch=Branch(
name=default_branch,
protected=True,
default_branch=True,
require_pull_request=True,
approval_count=1,
required_linear_history=True,
allow_force_pushes=False,
branch_deletion=False,
status_checks=True,
enforce_admins=True,
require_code_owner_reviews=True,
require_signed_commits=True,
conversation_resolution=True,
),
private=False,
securitymd=True,
delete_branch_on_merge=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
codeowners_exists=True,
secret_scanning_enabled=True,
dependabot_alerts_enabled=True,
delete_branch_on_merge=True,
),
}
@@ -107,9 +143,9 @@ class Test_repository_branch_delete_on_merge_enabled_test:
result = check.execute()
assert len(result) == 1
assert result[0].resource_id == 1
assert result[0].resource_name == "repo1"
assert result[0].resource_name == repo_name
assert result[0].status == "PASS"
assert (
result[0].status_extended
== f"Repository {repo_name} does delete branches on merge."
== f"Repository {repo_name} does delete branches on merge in default branch ({default_branch})."
)
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -31,7 +31,21 @@ class Test_repository_default_branch_deletion_disabled_test:
def test_allow_branch_deletion_enabled(self):
repository_client = mock.MagicMock
repo_name = "repo1"
default_branch = "main"
default_branch = Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
)
now = datetime.now(timezone.utc)
repository_client.repositories = {
@@ -45,6 +59,11 @@ class Test_repository_default_branch_deletion_disabled_test:
archived=False,
pushed_at=now,
default_branch_deletion=True,
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -76,7 +95,21 @@ class Test_repository_default_branch_deletion_disabled_test:
def test_allow_branch_deletion_disabled(self):
repository_client = mock.MagicMock
repo_name = "repo1"
default_branch = "main"
default_branch = Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=False,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
)
now = datetime.now(timezone.utc)
repository_client.repositories = {
@@ -90,6 +123,11 @@ class Test_repository_default_branch_deletion_disabled_test:
archived=False,
pushed_at=now,
default_branch_deletion=False,
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -28,7 +28,7 @@ class Test_repository_default_branch_disallows_force_push_test:
result = check.execute()
assert len(result) == 0
def test_allow_force_push_enabled(self):
def test_force_push_allowed(self):
repository_client = mock.MagicMock
repo_name = "repo1"
default_branch = "main"
@@ -38,12 +38,29 @@ class Test_repository_default_branch_disallows_force_push_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
allow_force_pushes=True,
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -69,10 +86,10 @@ class Test_repository_default_branch_disallows_force_push_test:
assert result[0].status == "FAIL"
assert (
result[0].status_extended
== f"Repository {repo_name} does allow force push."
== f"Repository {repo_name} does allow force pushes on default branch ({default_branch})."
)
def test_allow_force_push_disabled(self):
def test_force_push_disallowed(self):
repository_client = mock.MagicMock
repo_name = "repo1"
default_branch = "main"
@@ -82,12 +99,29 @@ class Test_repository_default_branch_disallows_force_push_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=Branch(
name=default_branch,
protected=True,
default_branch=True,
require_pull_request=True,
approval_count=1,
required_linear_history=True,
allow_force_pushes=False,
branch_deletion=False,
status_checks=True,
enforce_admins=True,
require_code_owner_reviews=True,
require_signed_commits=True,
conversation_resolution=True,
),
private=False,
default_branch=default_branch,
allow_force_pushes=False,
securitymd=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
codeowners_exists=True,
secret_scanning_enabled=True,
dependabot_alerts_enabled=True,
delete_branch_on_merge=True,
),
}
@@ -113,5 +147,5 @@ class Test_repository_default_branch_disallows_force_push_test:
assert result[0].status == "PASS"
assert (
result[0].status_extended
== f"Repository {repo_name} does deny force push."
== f"Repository {repo_name} does deny force pushes on default branch ({default_branch})."
)
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -38,12 +38,29 @@ class Test_repository_default_branch_protection_applies_to_admins_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=False,
enforce_admins=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -82,12 +99,29 @@ class Test_repository_default_branch_protection_applies_to_admins_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=Branch(
name=default_branch,
protected=True,
default_branch=True,
require_pull_request=True,
approval_count=1,
required_linear_history=True,
allow_force_pushes=False,
branch_deletion=False,
status_checks=True,
enforce_admins=True,
require_code_owner_reviews=True,
require_signed_commits=True,
conversation_resolution=True,
),
private=False,
default_branch=default_branch,
enforce_admins=True,
securitymd=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
codeowners_exists=True,
secret_scanning_enabled=True,
dependabot_alerts_enabled=True,
delete_branch_on_merge=True,
),
}
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -38,12 +38,29 @@ class Test_repository_default_branch_protection_enabled_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
default_branch_protection=False,
securitymd=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -82,12 +99,29 @@ class Test_repository_default_branch_protection_enabled_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=Branch(
name=default_branch,
protected=True,
default_branch=True,
require_pull_request=True,
approval_count=1,
required_linear_history=True,
allow_force_pushes=False,
branch_deletion=False,
status_checks=True,
enforce_admins=True,
require_code_owner_reviews=True,
require_signed_commits=True,
conversation_resolution=True,
),
private=False,
default_branch=default_branch,
default_branch_protection=True,
securitymd=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
codeowners_exists=True,
secret_scanning_enabled=True,
dependabot_alerts_enabled=True,
delete_branch_on_merge=True,
),
}
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -37,14 +37,29 @@ class Test_repository_default_branch_requires_codeowners_review:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
default_branch=Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=True,
require_pull_request=False,
approval_count=0,
require_code_owner_reviews=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -82,14 +97,29 @@ class Test_repository_default_branch_requires_codeowners_review:
name=repo_name,
owner="account-name",
full_name="account-name/repo2",
default_branch="main",
default_branch=Branch(
name="main",
protected=True,
default_branch=True,
require_pull_request=True,
approval_count=1,
required_linear_history=True,
allow_force_pushes=False,
branch_deletion=False,
status_checks=True,
enforce_admins=True,
require_code_owner_reviews=True,
require_signed_commits=True,
conversation_resolution=True,
),
private=False,
securitymd=True,
require_pull_request=False,
approval_count=0,
require_code_owner_reviews=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
codeowners_exists=True,
secret_scanning_enabled=True,
dependabot_alerts_enabled=True,
delete_branch_on_merge=True,
),
}
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -38,12 +38,29 @@ class Test_repository_default_branch_requires_conversation_resolution_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
conversation_resolution=False,
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
private=False,
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -69,7 +86,7 @@ class Test_repository_default_branch_requires_conversation_resolution_test:
assert result[0].status == "FAIL"
assert (
result[0].status_extended
== f"Repository {repo_name} does not require conversation resolution."
== f"Repository {repo_name} does not require conversation resolution on default branch ({default_branch})."
)
def test_conversation_resolution_enabled(self):
@@ -82,12 +99,29 @@ class Test_repository_default_branch_requires_conversation_resolution_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=Branch(
name=default_branch,
protected=True,
default_branch=True,
require_pull_request=True,
approval_count=1,
required_linear_history=True,
allow_force_pushes=False,
branch_deletion=False,
status_checks=True,
enforce_admins=True,
require_code_owner_reviews=True,
require_signed_commits=True,
conversation_resolution=True,
),
private=False,
default_branch=default_branch,
conversation_resolution=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
codeowners_exists=True,
secret_scanning_enabled=True,
dependabot_alerts_enabled=True,
delete_branch_on_merge=True,
),
}
@@ -113,5 +147,5 @@ class Test_repository_default_branch_requires_conversation_resolution_test:
assert result[0].status == "PASS"
assert (
result[0].status_extended
== f"Repository {repo_name} does require conversation resolution."
== f"Repository {repo_name} does require conversation resolution on default branch ({default_branch})."
)
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -38,12 +38,29 @@ class Test_repository_default_branch_requires_linear_history_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
required_linear_history=False,
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -82,12 +99,29 @@ class Test_repository_default_branch_requires_linear_history_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=Branch(
name=default_branch,
protected=True,
default_branch=True,
require_pull_request=True,
approval_count=1,
required_linear_history=True,
allow_force_pushes=False,
branch_deletion=False,
status_checks=True,
enforce_admins=True,
require_code_owner_reviews=True,
require_signed_commits=True,
conversation_resolution=True,
),
private=False,
default_branch=default_branch,
required_linear_history=True,
securitymd=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
codeowners_exists=True,
secret_scanning_enabled=True,
dependabot_alerts_enabled=True,
delete_branch_on_merge=True,
),
}
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -37,14 +37,29 @@ class Test_repository_default_branch_requires_multiple_approvals:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch_protection=False,
default_branch="main",
default_branch=Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=False,
require_pull_request=False,
approval_count=0,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -82,14 +97,29 @@ class Test_repository_default_branch_requires_multiple_approvals:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch_protection=False,
default_branch="master",
default_branch=Branch(
name="master",
protected=False,
default_branch=True,
require_pull_request=True,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=False,
require_pull_request=True,
approval_count=0,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -127,14 +157,29 @@ class Test_repository_default_branch_requires_multiple_approvals:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch_protection=True,
default_branch="master",
default_branch=Branch(
name="master",
protected=True,
default_branch=True,
require_pull_request=True,
approval_count=2,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=True,
require_pull_request=True,
approval_count=2,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -38,12 +38,29 @@ class Test_repository_default_branch_requires_signed_commits:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
default_branch=default_branch,
require_signed_commits=False,
securitymd=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -65,7 +82,7 @@ class Test_repository_default_branch_requires_signed_commits:
result = check.execute()
assert len(result) == 1
assert result[0].resource_id == 1
assert result[0].resource_name == repo_name
assert result[0].resource_name == "repo1"
assert result[0].status == "FAIL"
assert (
result[0].status_extended
@@ -74,20 +91,37 @@ class Test_repository_default_branch_requires_signed_commits:
def test_signed_commits_required(self):
repository_client = mock.MagicMock
repo_name = "repo2"
repo_name = "repo1"
default_branch = "main"
repository_client.repositories = {
2: Repo(
id=2,
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo2",
full_name="account-name/repo1",
default_branch=Branch(
name=default_branch,
protected=True,
default_branch=True,
require_pull_request=True,
approval_count=1,
required_linear_history=True,
allow_force_pushes=False,
branch_deletion=False,
status_checks=True,
enforce_admins=True,
require_code_owner_reviews=True,
require_signed_commits=True,
conversation_resolution=True,
),
private=False,
default_branch=default_branch,
require_signed_commits=True,
securitymd=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
codeowners_exists=True,
secret_scanning_enabled=True,
dependabot_alerts_enabled=True,
delete_branch_on_merge=True,
),
}
@@ -108,8 +142,8 @@ class Test_repository_default_branch_requires_signed_commits:
check = repository_default_branch_requires_signed_commits()
result = check.execute()
assert len(result) == 1
assert result[0].resource_id == 2
assert result[0].resource_name == repo_name
assert result[0].resource_id == 1
assert result[0].resource_name == "repo1"
assert result[0].status == "PASS"
assert (
result[0].status_extended
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -38,12 +38,30 @@ class Test_repository_default_branch_status_checks_required_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
status_checks=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
private=False,
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -83,11 +101,29 @@ class Test_repository_default_branch_status_checks_required_test:
owner="account-name",
full_name="account-name/repo1",
private=False,
default_branch=default_branch,
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=True,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
status_checks=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -37,15 +37,29 @@ class Test_repository_dependency_scanning_enabled:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
default_branch=Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
require_pull_request=False,
approval_count=0,
codeowners_exists=False,
secret_scanning_enabled=True,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
@@ -83,15 +97,29 @@ class Test_repository_dependency_scanning_enabled:
name=repo_name,
owner="account-name",
full_name="account-name/repo2",
default_branch="main",
default_branch=Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
securitymd=True,
require_pull_request=False,
approval_count=0,
codeowners_exists=False,
secret_scanning_enabled=True,
dependabot_alerts_enabled=True,
delete_branch_on_merge=False,
),
}
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -37,14 +37,28 @@ class Test_repository_has_codeowners_file:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
default_branch=Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=True,
require_pull_request=False,
approval_count=0,
codeowners_exists=False,
secret_scanning_enabled=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
delete_branch_on_merge=False,
),
}
@@ -82,14 +96,28 @@ class Test_repository_has_codeowners_file:
name=repo_name,
owner="account-name",
full_name="account-name/repo2",
default_branch="main",
default_branch=Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=True,
require_pull_request=False,
approval_count=0,
codeowners_exists=True,
secret_scanning_enabled=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
delete_branch_on_merge=False,
),
}
@@ -1,7 +1,7 @@
from datetime import datetime, timedelta, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -40,11 +40,31 @@ class Test_repository_inactive_not_archived:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/test-repo",
private=False,
default_branch=default_branch,
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
archived=False,
pushed_at=recent_activity,
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
repository_client.audit_config = {}
@@ -85,11 +105,31 @@ class Test_repository_inactive_not_archived:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/test-repo",
private=False,
default_branch=default_branch,
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
archived=False,
pushed_at=old_activity,
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
repository_client.audit_config = {}
@@ -128,11 +168,31 @@ class Test_repository_inactive_not_archived:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/test-repo",
default_branch=default_branch,
private=False,
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
archived=True,
pushed_at=old_activity,
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
repository_client.audit_config = {}
@@ -173,11 +233,31 @@ class Test_repository_inactive_not_archived:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/test-repo",
private=False,
default_branch=default_branch,
default_branch=Branch(
name=default_branch,
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
archived=False,
pushed_at=old_activity,
securitymd=False,
codeowners_exists=False,
secret_scanning_enabled=False,
dependabot_alerts_enabled=False,
delete_branch_on_merge=False,
),
}
repository_client.audit_config = {"inactive_not_archived_days_threshold": 40}
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -37,13 +37,28 @@ class Test_repository_public_has_securitymd_file_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
default_branch=Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=False,
require_pull_request=False,
approval_count=0,
codeowners_exists=False,
secret_scanning_enabled=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
delete_branch_on_merge=False,
),
}
@@ -81,13 +96,28 @@ class Test_repository_public_has_securitymd_file_test:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
default_branch=Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=True,
require_pull_request=False,
approval_count=0,
codeowners_exists=False,
secret_scanning_enabled=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
delete_branch_on_merge=False,
),
}
@@ -1,7 +1,7 @@
from datetime import datetime, timezone
from unittest import mock
from prowler.providers.github.services.repository.repository_service import Repo
from prowler.providers.github.services.repository.repository_service import Branch, Repo
from tests.providers.github.github_fixtures import set_mocked_github_provider
@@ -37,14 +37,28 @@ class Test_repository_secret_scanning_enabled:
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
default_branch=Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=True,
require_pull_request=False,
approval_count=0,
codeowners_exists=False,
secret_scanning_enabled=False,
archived=False,
pushed_at=datetime.now(timezone.utc),
delete_branch_on_merge=False,
),
}
@@ -82,14 +96,28 @@ class Test_repository_secret_scanning_enabled:
name=repo_name,
owner="account-name",
full_name="account-name/repo2",
default_branch="main",
default_branch=Branch(
name="main",
protected=False,
default_branch=True,
require_pull_request=False,
approval_count=0,
required_linear_history=False,
allow_force_pushes=True,
branch_deletion=True,
status_checks=False,
enforce_admins=False,
require_code_owner_reviews=False,
require_signed_commits=False,
conversation_resolution=False,
),
private=False,
securitymd=True,
require_pull_request=False,
approval_count=0,
codeowners_exists=False,
secret_scanning_enabled=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
delete_branch_on_merge=False,
),
}
@@ -2,6 +2,7 @@ from datetime import datetime, timezone
from unittest.mock import MagicMock, patch
from prowler.providers.github.services.repository.repository_service import (
Branch,
Repo,
Repository,
)
@@ -15,25 +16,28 @@ def mock_list_repositories(_):
name="repo1",
owner="account-name",
full_name="account-name/repo1",
default_branch_protection=True,
default_branch="main",
default_branch=Branch(
name="main",
protected=True,
default_branch=True,
require_pull_request=True,
approval_count=2,
required_linear_history=True,
allow_force_pushes=True,
branch_deletion=True,
status_checks=True,
enforce_admins=True,
require_code_owner_reviews=True,
require_signed_commits=True,
conversation_resolution=True,
),
private=False,
securitymd=True,
require_pull_request=True,
required_linear_history=True,
allow_force_pushes=True,
default_branch_deletion=True,
status_checks=True,
approval_count=2,
codeowners_exists=True,
require_code_owner_reviews=True,
secret_scanning_enabled=True,
require_signed_commits=True,
archived=False,
pushed_at=datetime.now(timezone.utc),
enforce_admins=True,
delete_branch_on_merge=True,
conversation_resolution=True,
),
}
@@ -57,21 +61,27 @@ class Test_Repository_Service:
assert repository_service.repositories[1].name == "repo1"
assert repository_service.repositories[1].full_name == "account-name/repo1"
assert repository_service.repositories[1].private is False
assert repository_service.repositories[1].default_branch == "main"
assert repository_service.repositories[1].default_branch.name == "main"
assert repository_service.repositories[1].securitymd
assert repository_service.repositories[1].required_linear_history
assert repository_service.repositories[1].require_pull_request
assert repository_service.repositories[1].allow_force_pushes
assert repository_service.repositories[1].default_branch_deletion
assert repository_service.repositories[1].status_checks
assert repository_service.repositories[1].enforce_admins
assert repository_service.repositories[1].default_branch.required_linear_history
assert repository_service.repositories[1].default_branch.require_pull_request
assert repository_service.repositories[1].default_branch.allow_force_pushes
assert repository_service.repositories[1].default_branch.branch_deletion
assert repository_service.repositories[1].default_branch.status_checks
assert repository_service.repositories[1].default_branch.enforce_admins
assert repository_service.repositories[1].delete_branch_on_merge
assert repository_service.repositories[1].conversation_resolution
assert repository_service.repositories[1].approval_count == 2
assert repository_service.repositories[1].default_branch.conversation_resolution
assert repository_service.repositories[1].default_branch.approval_count == 2
assert repository_service.repositories[1].codeowners_exists is True
assert repository_service.repositories[1].require_code_owner_reviews is True
assert (
repository_service.repositories[1].default_branch.require_code_owner_reviews
is True
)
assert repository_service.repositories[1].secret_scanning_enabled is True
assert repository_service.repositories[1].require_signed_commits is True
assert (
repository_service.repositories[1].default_branch.require_signed_commits
is True
)
assert repository_service.repositories[1].archived is False
assert repository_service.repositories[1].pushed_at is not None