|
| 1 | +require 'test/unit' |
| 2 | +require_relative '../src/script' |
| 3 | + |
| 4 | +class ScriptTest < Test::Unit::TestCase |
| 5 | + |
| 6 | + def setup |
| 7 | + url = ENV['URL'].nil? ? '' : ENV["URL"] |
| 8 | + token = ENV['TOKEN'].nil? ? '' : ENV["TOKEN"] |
| 9 | + @secrets_token = ENV['SECRETS_TOKEN'] |
| 10 | + @obj = GithubApi.new(url, token) |
| 11 | + end |
| 12 | + |
| 13 | + def test_health_check |
| 14 | + assert_not_nil(@obj.instance_variable_get('@repo_uri'), 'Url alive') |
| 15 | + assert_not_nil(@obj.instance_variable_get('@token'), 'Token alive') |
| 16 | + end |
| 17 | + |
| 18 | + def test_token_present |
| 19 | + actual = @secrets_token =~ /^ghp_\w{36}$/ |
| 20 | + assert_not_nil(actual, "Secret with name 'PAT' with valid personal access token doesn't exist") |
| 21 | + end |
| 22 | + |
| 23 | + def test_deploy_key_present |
| 24 | + response = @obj.deploy_keys |
| 25 | + assert_not_nil(response, "Access denied") |
| 26 | + deploy_key = response.find {|element| element['title'] == 'DEPLOY_KEY'} |
| 27 | + assert_not_nil(deploy_key, "The deploy key with name 'DEPLOY_KEY' doesn't exist") |
| 28 | + end |
| 29 | + |
| 30 | + def test_main_present |
| 31 | + actual = @obj.branch_exist?('main') |
| 32 | + assert(actual, 'Branch main is not present') |
| 33 | + end |
| 34 | + |
| 35 | + def test_main_protected |
| 36 | + actual = @obj.branch_protected?('main') |
| 37 | + assert(actual, 'Branch main is not protected') |
| 38 | + end |
| 39 | + |
| 40 | + def test_develop_present |
| 41 | + actual = @obj.branch_exist?('develop') |
| 42 | + assert(actual, 'Branch develop is not present') |
| 43 | + end |
| 44 | + |
| 45 | + def test_develop_protected |
| 46 | + actual = @obj.branch_protected?('develop') |
| 47 | + assert(actual, 'Branch develop is not protected') |
| 48 | + end |
| 49 | + |
| 50 | + def test_develop_default |
| 51 | + actual = @obj.default_branch |
| 52 | + expected = 'develop' |
| 53 | + assert_equal(expected, actual, 'Default branch isn\'t develop') |
| 54 | + end |
| 55 | + |
| 56 | + def test_codeowners_contains_user |
| 57 | + user_name = 'softservedata' |
| 58 | + content = @obj.file_branch('CODEOWNERS', 'main') || @obj.file_branch('.github/CODEOWNERS', 'main') || @obj.file_branch('docs/CODEOWNERS', 'main') |
| 59 | + assert_not_nil(content, 'File CODEOWNERS doesn\'t exist on main branch') |
| 60 | + assert(content.include?(user_name), "User #{user_name} doesn't present in CODEOWNERS") |
| 61 | + end |
| 62 | + |
| 63 | + def test_codeowners_not_present_develop |
| 64 | + content = @obj.file_branch('CODEOWNERS', 'develop') |
| 65 | + assert_nil(content, 'File CODEOWNERS exist on develop branch') |
| 66 | + end |
| 67 | + |
| 68 | + def test_deny_merge_main |
| 69 | + classic_rules = @obj.rules_required_pull_request_reviews('main') |
| 70 | + rulesets = @obj.get_branch_ruleset('main') |
| 71 | + rulesets_rules = rulesets&.find { |rule| rule['type'] == 'pull_request' } |
| 72 | + assert_not_nil(classic_rules || rulesets_rules, 'We should not allow merge to main branch without PR') |
| 73 | + end |
| 74 | + |
| 75 | + def test_deny_merge_develop |
| 76 | + classic_rules = @obj.rules_required_pull_request_reviews('develop') |
| 77 | + rulesets = @obj.get_branch_ruleset('develop') |
| 78 | + rulesets_rules = rulesets&.find { |rule| rule['type'] == 'pull_request' } |
| 79 | + assert_not_nil(classic_rules || rulesets_rules, 'We should not allow merge to develop branch without PR ') |
| 80 | + end |
| 81 | + |
| 82 | + def test_2_approvals_develop |
| 83 | + classic_required_approving_review_count = @obj.rules_required_pull_request_reviews('develop').nil? || @obj.rules_required_pull_request_reviews('develop')["required_approving_review_count"] |
| 84 | + pull_request_rulesets_rules = @obj.get_branch_ruleset('develop') |
| 85 | + rulesets_required_approving_review_count = pull_request_rulesets_rules&.find { |rule| rule['type'] == 'pull_request' }&.[]('parameters')&.[]('required_approving_review_count') |
| 86 | + expected = 2 |
| 87 | + required_approving_review_count = classic_required_approving_review_count == expected || rulesets_required_approving_review_count == expected |
| 88 | + assert_true(required_approving_review_count, 'We should have 2 approvals before merge to develop branch') |
| 89 | + end |
| 90 | + |
| 91 | + def test_without_approval_main |
| 92 | + classic_required_approving_review_count = @obj.rules_required_pull_request_reviews('main').nil? || @obj.rules_required_pull_request_reviews('main')["required_approving_review_count"] |
| 93 | + pull_request_rulesets_rules = @obj.get_branch_ruleset('main') |
| 94 | + rulesets_required_approving_review_count = pull_request_rulesets_rules&.find { |rule| rule['type'] == 'pull_request' }&.[]('parameters')&.[]('required_approving_review_count') |
| 95 | + expected = 0 |
| 96 | + required_approving_review_count = classic_required_approving_review_count == expected || rulesets_required_approving_review_count == expected |
| 97 | + assert_true(required_approving_review_count, 'We shouldn\'t have any approvals before merge to main branch') |
| 98 | + end |
| 99 | + |
| 100 | + def test_approve_from_user |
| 101 | + user_name = 'softservedata' |
| 102 | + classic_require_code_owner_review = @obj.rules_required_pull_request_reviews('main')["require_code_owner_reviews"] |
| 103 | + pull_request_rulesets_rules = @obj.get_branch_ruleset('main') |
| 104 | + rulesets_require_code_owner_review = pull_request_rulesets_rules&.find { |rule| rule['type'] == 'pull_request' }&.[]('parameters')&.[]('require_code_owner_review') |
| 105 | + assert(classic_require_code_owner_review || rulesets_require_code_owner_review, "We should not allow merge to main branch without approve from #{user_name}") |
| 106 | + end |
| 107 | + |
| 108 | + def test_PR_template_present |
| 109 | + actual = @obj.file_branch('.github/pull_request_template.md', 'main') |
| 110 | + assert_not_nil(actual, 'Pull request template is absent') |
| 111 | + end |
| 112 | + |
| 113 | +end |
0 commit comments