|
6 | 6 | require "json" |
7 | 7 | require "stringio" |
8 | 8 | require "webmock/minitest" |
| 9 | +require "base64" |
9 | 10 | require_relative "../lib/ruby_version_pr_creator" |
10 | 11 |
|
11 | 12 | # Test suite for the RubyVersionPRCreator module |
@@ -79,6 +80,34 @@ def test_closes_existing_automation_prs |
79 | 80 | assert_match(/closing existing pr/i, @output.string) |
80 | 81 | end |
81 | 82 |
|
| 83 | + def test_reuses_existing_matching_automation_pr |
| 84 | + stub_github_api_with_matching_existing_pr |
| 85 | + creator = create_creator(["3.4.0"], [".github/ruby-versions.json"]) |
| 86 | + stub_git_operations(creator) |
| 87 | + |
| 88 | + result = creator.call |
| 89 | + |
| 90 | + assert result[:success] |
| 91 | + assert_equal 100, result[:pr_number] |
| 92 | + assert_equal "https://github.com/rails/devcontainer/pull/100", result[:pr_url] |
| 93 | + assert_match(/reusing existing automation pr/i, @output.string) |
| 94 | + assert_not_requested(:post, "https://api.github.com/repos/rails/devcontainer/pulls") |
| 95 | + assert_not_requested(:patch, "https://api.github.com/repos/rails/devcontainer/pulls/100") |
| 96 | + end |
| 97 | + |
| 98 | + def test_handles_empty_versions_file_content_as_non_matching |
| 99 | + stub_github_api_with_empty_versions_file_pr |
| 100 | + creator = create_creator(["3.4.0"], [".github/ruby-versions.json"]) |
| 101 | + stub_git_operations(creator) |
| 102 | + |
| 103 | + result = creator.call |
| 104 | + |
| 105 | + assert result[:success] |
| 106 | + assert_equal 123, result[:pr_number] |
| 107 | + assert_requested(:patch, "https://api.github.com/repos/rails/devcontainer/pulls/100") |
| 108 | + assert_requested(:post, "https://api.github.com/repos/rails/devcontainer/pulls") |
| 109 | + end |
| 110 | + |
82 | 111 | def test_generates_correct_pr_title_single_version |
83 | 112 | stub_github_api_success |
84 | 113 | creator = create_creator(["3.4.0"], [".github/ruby-versions.json"]) |
@@ -190,7 +219,91 @@ def stub_github_api_with_existing_pr |
190 | 219 | stub_request(:get, "https://api.github.com/repos/rails/devcontainer/pulls?state=open") |
191 | 220 | .to_return( |
192 | 221 | status: 200, |
193 | | - body: JSON.generate([{ number: 100, labels: [{ name: "automation" }, { name: "ruby-versions" }] }]), |
| 222 | + body: JSON.generate([ |
| 223 | + { |
| 224 | + number: 100, |
| 225 | + title: "Add Ruby version: 3.3.9", |
| 226 | + head: { ref: "automated/ruby-versions-old" }, |
| 227 | + labels: [{ name: "automation" }, { name: "ruby-versions" }] |
| 228 | + } |
| 229 | + ]), |
| 230 | + headers: json_headers |
| 231 | + ) |
| 232 | + |
| 233 | + stub_request(:get, "https://api.github.com/repos/rails/devcontainer/contents/.github/ruby-versions.json?ref=automated/ruby-versions-old") |
| 234 | + .to_return( |
| 235 | + status: 200, |
| 236 | + body: JSON.generate({ content: Base64.strict_encode64(JSON.generate(["3.3.9", "3.3.8"])) }), |
| 237 | + headers: json_headers |
| 238 | + ) |
| 239 | + |
| 240 | + stub_request(:post, "https://api.github.com/repos/rails/devcontainer/issues/100/comments") |
| 241 | + .to_return(status: 201, body: JSON.generate({ id: 1 }), headers: json_headers) |
| 242 | + |
| 243 | + stub_request(:patch, "https://api.github.com/repos/rails/devcontainer/pulls/100") |
| 244 | + .to_return(status: 200, body: JSON.generate({ number: 100, state: "closed" }), headers: json_headers) |
| 245 | + |
| 246 | + stub_request(:post, "https://api.github.com/repos/rails/devcontainer/pulls") |
| 247 | + .to_return( |
| 248 | + status: 201, |
| 249 | + body: JSON.generate({ number: 123, html_url: "https://github.com/rails/devcontainer/pull/123" }), |
| 250 | + headers: json_headers |
| 251 | + ) |
| 252 | + |
| 253 | + stub_request(:post, "https://api.github.com/repos/rails/devcontainer/issues/123/labels") |
| 254 | + .to_return(status: 200, body: JSON.generate([]), headers: json_headers) |
| 255 | + end |
| 256 | + |
| 257 | + def stub_github_api_with_matching_existing_pr |
| 258 | + stub_request(:get, "https://api.github.com/repos/rails/devcontainer") |
| 259 | + .to_return(status: 200, body: JSON.generate({ full_name: "rails/devcontainer" }), headers: json_headers) |
| 260 | + |
| 261 | + stub_request(:get, "https://api.github.com/repos/rails/devcontainer/pulls?state=open") |
| 262 | + .to_return( |
| 263 | + status: 200, |
| 264 | + body: JSON.generate([ |
| 265 | + { |
| 266 | + number: 100, |
| 267 | + title: "Add Ruby version: 3.4.0", |
| 268 | + body: "Automated Ruby Version Update for 3.4.0", |
| 269 | + html_url: "https://github.com/rails/devcontainer/pull/100", |
| 270 | + head: { ref: "automated/ruby-versions-100" }, |
| 271 | + labels: [{ name: "automation" }, { name: "ruby-versions" }] |
| 272 | + } |
| 273 | + ]), |
| 274 | + headers: json_headers |
| 275 | + ) |
| 276 | + |
| 277 | + stub_request(:get, "https://api.github.com/repos/rails/devcontainer/contents/.github/ruby-versions.json?ref=automated/ruby-versions-100") |
| 278 | + .to_return( |
| 279 | + status: 200, |
| 280 | + body: JSON.generate({ content: Base64.strict_encode64(JSON.generate(["3.4.0", "3.3.10"])) }), |
| 281 | + headers: json_headers |
| 282 | + ) |
| 283 | + end |
| 284 | + |
| 285 | + def stub_github_api_with_empty_versions_file_pr |
| 286 | + stub_request(:get, "https://api.github.com/repos/rails/devcontainer") |
| 287 | + .to_return(status: 200, body: JSON.generate({ full_name: "rails/devcontainer" }), headers: json_headers) |
| 288 | + |
| 289 | + stub_request(:get, "https://api.github.com/repos/rails/devcontainer/pulls?state=open") |
| 290 | + .to_return( |
| 291 | + status: 200, |
| 292 | + body: JSON.generate([ |
| 293 | + { |
| 294 | + number: 100, |
| 295 | + title: "Add Ruby version: 3.4.0", |
| 296 | + head: { ref: "automated/ruby-versions-empty" }, |
| 297 | + labels: [{ name: "automation" }, { name: "ruby-versions" }] |
| 298 | + } |
| 299 | + ]), |
| 300 | + headers: json_headers |
| 301 | + ) |
| 302 | + |
| 303 | + stub_request(:get, "https://api.github.com/repos/rails/devcontainer/contents/.github/ruby-versions.json?ref=automated/ruby-versions-empty") |
| 304 | + .to_return( |
| 305 | + status: 200, |
| 306 | + body: JSON.generate({ content: "" }), |
194 | 307 | headers: json_headers |
195 | 308 | ) |
196 | 309 |
|
|
0 commit comments