|
9 | 9 | fab!(:user, :admin) |
10 | 10 |
|
11 | 11 | let(:repo_path) { Rails.root.to_s } |
12 | | - let(:from_version) { "abc123" } |
| 12 | + let(:from_version) { "2025.12" } |
13 | 13 | let(:repo) do |
14 | 14 | instance_double( |
15 | 15 | DockerManager::GitRepo, |
16 | 16 | path: repo_path, |
17 | 17 | name: "discourse", |
18 | 18 | start_upgrading: true, |
19 | 19 | stop_upgrading: true, |
20 | | - latest_local_commit: "abc123", |
| 20 | + latest_local_commit: "2025.12", |
21 | 21 | tracking_ref: "origin/main", |
22 | 22 | upstream_branch: "origin/main", |
23 | 23 | has_local_main?: true, |
24 | 24 | detached_head?: false, |
25 | 25 | ) |
26 | 26 | end |
27 | | - let(:web_server_adapter) do |
28 | | - instance_double( |
29 | | - DockerManager::PitchforkAdapter, |
30 | | - min_workers: 1, |
31 | | - server_name: "Pitchfork", |
32 | | - launcher_pid: 1000, |
33 | | - master_pid: 1001, |
34 | | - workers: [2001, 2002, 2003], |
35 | | - reload: true, |
36 | | - scale_down_workers: true, |
37 | | - scale_up_workers: true, |
38 | | - clear_restart_flag: true, |
39 | | - ) |
| 27 | + |
| 28 | + describe "#web_server" do |
| 29 | + context "when unicorn is running" do |
| 30 | + before do |
| 31 | + allow_any_instance_of(Kernel).to receive(:`).with("pgrep -f '^unicorn[^_]'").and_return( |
| 32 | + "1234", |
| 33 | + ) |
| 34 | + end |
| 35 | + |
| 36 | + it "uses UnicornAdapter" do |
| 37 | + expect(upgrader.web_server).to be_a_kind_of(DockerManager::UnicornAdapter) |
| 38 | + end |
| 39 | + end |
| 40 | + |
| 41 | + context "when pitchfork is running" do |
| 42 | + before do |
| 43 | + allow_any_instance_of(Kernel).to receive(:`).with("pgrep -f '^unicorn[^_]'").and_return("") |
| 44 | + end |
| 45 | + |
| 46 | + it "uses PitchforkAdapter" do |
| 47 | + expect(upgrader.web_server).to be_a_kind_of(DockerManager::PitchforkAdapter) |
| 48 | + end |
| 49 | + end |
40 | 50 | end |
41 | 51 |
|
42 | 52 | describe "#upgrade" do |
| 53 | + let(:launcher_pid) { 1000 } |
| 54 | + let(:master_pid) { 1001 } |
| 55 | + let(:workers) { [2001, 2002, 2003] } |
| 56 | + |
43 | 57 | before do |
44 | | - allow(DockerManager::PitchforkAdapter).to receive(:new).and_return(web_server_adapter) |
45 | | - allow_any_instance_of(described_class).to receive(:`).with(/pgrep/).and_return("") |
| 58 | + allow_any_instance_of(Kernel).to receive(:`).with(/pgrep/).and_return("") |
46 | 59 | allow(Open3).to receive(:popen2e).and_yield([], [], OpenStruct.new(value: 0)) |
| 60 | + allow(upgrader.web_server).to receive_messages( |
| 61 | + launcher_pid:, |
| 62 | + master_pid:, |
| 63 | + workers:, |
| 64 | + scale_down_workers: nil, |
| 65 | + reload: nil, |
| 66 | + clear_restart_flag: nil, |
| 67 | + scale_up_workers: nil, |
| 68 | + ) |
47 | 69 | end |
48 | 70 |
|
49 | 71 | context "when a repo fails to start upgrading" do |
|
55 | 77 | end |
56 | 78 |
|
57 | 79 | context "when not enough workers are running" do |
58 | | - let(:web_server_adapter) do |
59 | | - instance_double( |
60 | | - DockerManager::PitchforkAdapter, |
61 | | - min_workers: 1, |
62 | | - server_name: "Pitchfork", |
63 | | - launcher_pid: 1000, |
64 | | - master_pid: 1001, |
65 | | - workers: [2001], |
66 | | - clear_restart_flag: true, |
67 | | - ) |
68 | | - end |
| 80 | + let(:workers) { [2001] } |
69 | 81 |
|
70 | 82 | it "raises an error" do |
71 | 83 | expect { upgrader.upgrade }.to raise_error("Not enough workers") |
72 | 84 | end |
73 | 85 | end |
74 | 86 |
|
75 | 87 | context "when launcher process is missing" do |
76 | | - let(:web_server_adapter) do |
77 | | - instance_double( |
78 | | - DockerManager::PitchforkAdapter, |
79 | | - min_workers: 1, |
80 | | - server_name: "Pitchfork", |
81 | | - launcher_pid: 0, |
82 | | - master_pid: 1001, |
83 | | - workers: [2001, 2002], |
84 | | - clear_restart_flag: true, |
85 | | - ) |
86 | | - end |
| 88 | + let(:launcher_pid) { 0 } |
87 | 89 |
|
88 | 90 | it "raises an error" do |
89 | 91 | expect { upgrader.upgrade }.to raise_error("No Pitchfork master or launcher") |
90 | 92 | end |
91 | 93 | end |
92 | 94 |
|
93 | 95 | context "when master process is missing" do |
94 | | - let(:web_server_adapter) do |
95 | | - instance_double( |
96 | | - DockerManager::PitchforkAdapter, |
97 | | - min_workers: 1, |
98 | | - server_name: "Pitchfork", |
99 | | - launcher_pid: 1000, |
100 | | - master_pid: 0, |
101 | | - workers: [2001, 2002], |
102 | | - clear_restart_flag: true, |
103 | | - ) |
104 | | - end |
| 96 | + let(:master_pid) { 0 } |
105 | 97 |
|
106 | 98 | it "raises an error" do |
107 | 99 | expect { upgrader.upgrade }.to raise_error("No Pitchfork master or launcher") |
|
111 | 103 | context "with valid configuration" do |
112 | 104 | it "scales down workers" do |
113 | 105 | upgrader.upgrade |
114 | | - expect(web_server_adapter).to have_received(:scale_down_workers).with(2) |
| 106 | + expect(upgrader.web_server).to have_received(:scale_down_workers).with(2) |
115 | 107 | end |
116 | 108 |
|
117 | 109 | it "reloads the web server to free memory" do |
118 | 110 | upgrader.upgrade |
119 | | - expect(web_server_adapter).to have_received(:reload).twice |
| 111 | + expect(upgrader.web_server).to have_received(:reload).twice |
120 | 112 | end |
121 | 113 |
|
122 | 114 | it "runs git fetch and reset commands" do |
|
165 | 157 |
|
166 | 158 | it "clears the restart flag" do |
167 | 159 | upgrader.upgrade |
168 | | - expect(web_server_adapter).to have_received(:clear_restart_flag) |
| 160 | + expect(upgrader.web_server).to have_received(:clear_restart_flag) |
169 | 161 | end |
170 | 162 | end |
171 | 163 |
|
|
257 | 249 |
|
258 | 250 | it "scales workers back up" do |
259 | 251 | expect { upgrader.upgrade }.to raise_error(RuntimeError) |
260 | | - expect(web_server_adapter).to have_received(:scale_up_workers).with(2) |
261 | | - end |
262 | | - end |
263 | | - end |
264 | | - |
265 | | - describe "web_server_adapter selection" do |
266 | | - context "when unicorn is running" do |
267 | | - before do |
268 | | - allow_any_instance_of(described_class).to receive(:`).with( |
269 | | - "pgrep -f '^unicorn[^_]'", |
270 | | - ).and_return("1234") |
271 | | - end |
272 | | - |
273 | | - it "uses UnicornAdapter" do |
274 | | - expect(upgrader.web_server).to be_a_kind_of(DockerManager::UnicornAdapter) |
275 | | - end |
276 | | - end |
277 | | - |
278 | | - context "when pitchfork is running" do |
279 | | - before do |
280 | | - allow_any_instance_of(described_class).to receive(:`).with( |
281 | | - "pgrep -f '^unicorn[^_]'", |
282 | | - ).and_return("") |
283 | | - end |
284 | | - |
285 | | - it "uses PitchforkAdapter" do |
286 | | - expect(upgrader.web_server).to be_a_kind_of(DockerManager::PitchforkAdapter) |
| 252 | + expect(upgrader.web_server).to have_received(:scale_up_workers).with(2) |
287 | 253 | end |
288 | 254 | end |
289 | 255 | end |
|
0 commit comments