- update, files and the 6 /api catalog controllers now live in the engine on a new WarpEngine::ApiController base (same rescue/mime behavior as host) - engine routes serve /update, /file/*path, /api/software*, /api/builds*, /api/image/:id, /api/download at unchanged public paths via the root mount; host routes keep only TTG endpoints (events, members, wiki, rss, swagger) - /update secret comes from WarpEngine.config.update_secret and an unconfigured secret now rejects every request (previously an empty UPDATE_SECRET env accepted empty secrets) - apipie-rails is an engine dependency (DSL in engine controllers); dummy app configures apipie with validation off, mirroring the host - engine request specs: catalog controller specs moved from host plus new /update auth contract spec Verified: engine suite 53 green, host suite 6 green, /api/software and /api/builds byte-identical to baselines, /update 401/400 behavior intact, admin and TTG endpoints OK. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
47 lines
1.6 KiB
Ruby
47 lines
1.6 KiB
Ruby
require "rails_helper"
|
|
|
|
RSpec.describe "GET /update", type: :request do
|
|
before do
|
|
allow(WarpEngine.config).to receive(:update_secret).and_return("s3cret")
|
|
end
|
|
|
|
it "rejects requests without a secret" do
|
|
get "/update", params: { platform: "tic80", name: "game", version: "1.0" }
|
|
|
|
expect(response).to have_http_status(:unauthorized)
|
|
end
|
|
|
|
it "rejects requests with a wrong secret" do
|
|
get "/update", params: { secret: "wrong", platform: "tic80", name: "game", version: "1.0" }
|
|
|
|
expect(response).to have_http_status(:unauthorized)
|
|
end
|
|
|
|
it "rejects every request when no secret is configured" do
|
|
allow(WarpEngine.config).to receive(:update_secret).and_return(nil)
|
|
|
|
get "/update", params: { secret: "", platform: "tic80", name: "game", version: "1.0" }
|
|
|
|
expect(response).to have_http_status(:unauthorized)
|
|
end
|
|
|
|
it "requires a version" do
|
|
get "/update", headers: { "X-Update-Secret" => "s3cret" }, params: { platform: "tic80", name: "game" }
|
|
|
|
expect(response).to have_http_status(:bad_request)
|
|
expect(response.body).to eq("Version not provided")
|
|
end
|
|
|
|
it "runs the updater with a valid secret" do
|
|
updater = instance_double(WarpEngine::SoftwareUpdater::Tic80Service)
|
|
allow(WarpEngine::SoftwareUpdater::Tic80Service).to receive(:new).and_return(updater)
|
|
expect(updater).to receive(:update).with("game", "1.0")
|
|
|
|
get "/update", headers: { "X-Update-Secret" => "s3cret" },
|
|
params: { platform: "tic80", name: "game", version: "1.0" }
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(response.body).to eq("Updated")
|
|
end
|
|
end
|