40 lines
1.3 KiB
Ruby
40 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "minitest/autorun"
|
|
require "yaml"
|
|
|
|
class WorkflowContractTest < Minitest::Test
|
|
ROOT = File.expand_path("..", __dir__)
|
|
WORKFLOW_DIRECTORY = File.join(ROOT, ".github", "workflows")
|
|
TEST_WORKFLOW_PATH = File.join(WORKFLOW_DIRECTORY, "test.yml")
|
|
ACTION_PINS = {
|
|
"actions/checkout" => "93cb6efe18208431cddfb8368fd83d5badbf9bfd",
|
|
"ruby/setup-ruby" => "003a5c4d8d6321bd302e38f6f0ec593f77f06600",
|
|
"rubygems/release-gem" => "052cc82692552de3ef2b81fd670e41d13cba8092"
|
|
}.freeze
|
|
|
|
def test_matrix_covers_every_supported_ruby
|
|
workflow = YAML.safe_load(File.read(TEST_WORKFLOW_PATH), aliases: false)
|
|
versions = workflow.dig("jobs", "test", "strategy", "matrix", "ruby")
|
|
|
|
assert_equal %w[3.2 3.3 3.4 4.0], versions
|
|
end
|
|
|
|
def test_every_third_party_action_uses_its_reviewed_commit
|
|
action_uses = Dir[File.join(WORKFLOW_DIRECTORY, "*.{yml,yaml}")].sort.flat_map do |path|
|
|
File.readlines(path).filter_map do |line|
|
|
line[/^\s*-?\s*uses:\s*([^\s#]+)/, 1]
|
|
end
|
|
end
|
|
|
|
assert_equal 5, action_uses.length
|
|
action_uses.each do |action_use|
|
|
action, separator, revision = action_use.rpartition("@")
|
|
|
|
assert_equal "@", separator
|
|
assert_equal ACTION_PINS.fetch(action), revision
|
|
assert_match(/\A[0-9a-f]{40}\z/, revision)
|
|
end
|
|
end
|
|
end
|