|
9 | 9 | describe Bake::Gem::GitHub::Project do |
10 | 10 | include Bake::Gem::GitHub::RepositoryContext |
11 | 11 |
|
12 | | - it "prepares, validates, and pushes a release before opening its PR" do |
13 | | - result = isolated_project(<<~'RUBY') |
14 | | - project = Bake::Gem::GitHub::ProjectClient.new(Dir.pwd) |
15 | | - url = project.prepare(Bake::Context.load(Dir.pwd), "patch") |
16 | | - {url: url, body: project.writes.first} |
17 | | - RUBY |
18 | | - expect(result[:url]).to be == "https://github.com/socketry/example/pull/42" |
19 | | - expect(result[:body]).to be(:include?, "Release example 1.0.1.") |
20 | | - expect(git("branch", "--show-current")).to be == "releases/v1.0.1" |
21 | | - expect(git("rev-parse", "HEAD")).to be == git("rev-parse", "refs/heads/releases/v1.0.1", chdir: File.join(root, "remote")) |
22 | | - expect(File.read(File.join(repository, "releases.md"))).to be(:include?, "## v1.0.1") |
23 | | - expect(git("tag", "--list")).to be == "" |
24 | | - git("checkout", "--quiet", "main") |
25 | | - git("merge", "--quiet", "--no-ff", "releases/v1.0.1", "-m", "Merge release") |
26 | | - git("push", "--quiet", "origin", "main") |
27 | | - commit = git("rev-parse", "HEAD") |
28 | | - project = Bake::Gem::GitHub::ProjectClient.new(repository) |
29 | | - project.responses["repos/socketry/example/pulls/42"] = { |
30 | | - "number" => 42, "merged" => true, "base" => {"ref" => "main", "repo" => {"full_name" => "socketry/example"}}, |
31 | | - "merge_commit_sha" => commit, "merged_by" => {"login" => "maintainer"}, "html_url" => result[:url] |
32 | | - } |
33 | | - evidence = project.inspect_release(42) |
34 | | - expect(evidence).to have_keys(name: be == "example", version: be == "1.0.1", commit: be == commit, merged_by: be == "maintainer") |
35 | | - end |
36 | | - |
37 | | - it "reports an existing release PR without creating a branch" do |
38 | | - url = isolated_project(<<~'RUBY') |
39 | | - project = Bake::Gem::GitHub::ProjectClient.new(Dir.pwd) |
40 | | - project.pulls = [{"headRefName" => "releases/v1.0.1", "url" => "existing"}] |
41 | | - project.prepare(Bake::Context.load(Dir.pwd), "patch") |
42 | | - RUBY |
43 | | - expect(url).to be == "existing" |
44 | | - expect(git("branch", "--show-current")).to be == "main" |
45 | | - end |
46 | | - |
47 | | - it "refuses preparation from another branch" do |
48 | | - git("checkout", "--quiet", "-b", "feature") |
49 | | - expect do |
50 | | - isolated_project('Bake::Gem::GitHub::ProjectClient.new(Dir.pwd).prepare(Bake::Context.load(Dir.pwd), "patch")') |
51 | | - end.to raise_exception(RuntimeError, message: be =~ /Prepare releases from main/) |
52 | | - end |
53 | | - |
54 | | - it "refuses preparation when the local default branch differs from origin" do |
55 | | - git("commit", "--quiet", "--allow-empty", "-m", "Local change") |
56 | | - expect do |
57 | | - isolated_project('Bake::Gem::GitHub::ProjectClient.new(Dir.pwd).prepare(Bake::Context.load(Dir.pwd), "patch")') |
58 | | - end.to raise_exception(RuntimeError, message: be =~ /differs from origin/) |
| 12 | + with "#prepare" do |
| 13 | + it "prepares, validates, and pushes a release before opening its PR" do |
| 14 | + result = isolated_project(<<~'RUBY') |
| 15 | + project = Bake::Gem::GitHub::ProjectClient.new(Dir.pwd) |
| 16 | + url = project.prepare(Bake::Context.load(Dir.pwd), "patch") |
| 17 | + {url: url, body: project.writes.first} |
| 18 | + RUBY |
| 19 | + expect(result[:url]).to be == "https://github.com/socketry/example/pull/42" |
| 20 | + expect(result[:body]).to be(:include?, "Release example 1.0.1.") |
| 21 | + expect(git("branch", "--show-current")).to be == "releases/v1.0.1" |
| 22 | + expect(git("rev-parse", "HEAD")).to be == git("rev-parse", "refs/heads/releases/v1.0.1", chdir: File.join(root, "remote")) |
| 23 | + expect(File.read(File.join(repository, "releases.md"))).to be(:include?, "## v1.0.1") |
| 24 | + expect(git("tag", "--list")).to be == "" |
| 25 | + git("checkout", "--quiet", "main") |
| 26 | + git("merge", "--quiet", "--no-ff", "releases/v1.0.1", "-m", "Merge release") |
| 27 | + git("push", "--quiet", "origin", "main") |
| 28 | + commit = git("rev-parse", "HEAD") |
| 29 | + project = Bake::Gem::GitHub::ProjectClient.new(repository) |
| 30 | + project.responses["repos/socketry/example/pulls/42"] = { |
| 31 | + "number" => 42, "merged" => true, "base" => {"ref" => "main", "repo" => {"full_name" => "socketry/example"}}, |
| 32 | + "merge_commit_sha" => commit, "merged_by" => {"login" => "maintainer"}, "html_url" => result[:url] |
| 33 | + } |
| 34 | + evidence = project.inspect_release(42) |
| 35 | + expect(evidence).to have_keys(name: be == "example", version: be == "1.0.1", commit: be == commit, merged_by: be == "maintainer") |
| 36 | + end |
| 37 | + |
| 38 | + it "reports an existing release PR without creating a branch" do |
| 39 | + url = isolated_project(<<~'RUBY') |
| 40 | + project = Bake::Gem::GitHub::ProjectClient.new(Dir.pwd) |
| 41 | + project.pulls = [{"headRefName" => "releases/v1.0.1", "url" => "existing"}] |
| 42 | + project.prepare(Bake::Context.load(Dir.pwd), "patch") |
| 43 | + RUBY |
| 44 | + expect(url).to be == "existing" |
| 45 | + expect(git("branch", "--show-current")).to be == "main" |
| 46 | + end |
| 47 | + |
| 48 | + it "refuses preparation from another branch" do |
| 49 | + git("checkout", "--quiet", "-b", "feature") |
| 50 | + expect do |
| 51 | + isolated_project('Bake::Gem::GitHub::ProjectClient.new(Dir.pwd).prepare(Bake::Context.load(Dir.pwd), "patch")') |
| 52 | + end.to raise_exception(RuntimeError, message: be =~ /Prepare releases from main/) |
| 53 | + end |
| 54 | + |
| 55 | + it "refuses preparation when the local default branch differs from origin" do |
| 56 | + git("commit", "--quiet", "--allow-empty", "-m", "Local change") |
| 57 | + expect do |
| 58 | + isolated_project('Bake::Gem::GitHub::ProjectClient.new(Dir.pwd).prepare(Bake::Context.load(Dir.pwd), "patch")') |
| 59 | + end.to raise_exception(RuntimeError, message: be =~ /differs from origin/) |
| 60 | + end |
59 | 61 | end |
60 | 62 |
|
61 | | - with "merged source verification" do |
| 63 | + with "#merged and #inspect_release" do |
62 | 64 | let(:project) {Bake::Gem::GitHub::ProjectClient.new(repository)} |
63 | 65 | let(:pull) {{"merged" => true, "base" => {"ref" => "main", "repo" => {"full_name" => "socketry/example"}}, "merge_commit_sha" => git("rev-parse", "HEAD")}} |
64 | 66 |
|
|
94 | 96 | end |
95 | 97 | end |
96 | 98 |
|
97 | | - with "repository policy" do |
| 99 | + with "#doctor and #apply" do |
98 | 100 | let(:project) {Bake::Gem::GitHub::ProjectClient.new(repository)} |
99 | 101 | let(:rules) {[]} |
100 | 102 |
|
|
104 | 106 | end |
105 | 107 |
|
106 | 108 | it "reports desired and observed settings without writing" do |
107 | | - result = project.doctor |
| 109 | + expect(Bake::Gem::GitHub::Project).to receive(:new).with(repository).and_return(project) |
| 110 | + result = Bake::Context.load(repository).call("gem:github:setup:plan") |
108 | 111 | expect(result[:desired_rules].keys).to be == %w[reviews checks history tags] |
109 | 112 | expect(result[:existing_rules]).to be == [] |
110 | 113 | expect(result[:trusted_publisher][:workflow_filename]).to be == "release-publish.yaml" |
|
113 | 116 |
|
114 | 117 | it "creates missing managed rulesets while preserving unrelated rulesets" do |
115 | 118 | rules << {"id" => 123, "name" => "Unrelated policy"} |
116 | | - project.apply |
| 119 | + expect(Bake::Gem::GitHub::Project).to receive(:new).with(repository).and_return(project) |
| 120 | + Bake::Context.load(repository).call("gem:github:setup:apply") |
117 | 121 | expect(project.writes.map{|rule| rule.fetch("name")}).to be == ["Gem release reviews", "Gem release checks", "Gem release history", "Gem release tags"] |
118 | 122 | expect(project.requests.drop(1).all?{|request| request.include?("POST")}).to be == true |
119 | 123 | end |
|
0 commit comments