Skip to content

Commit

Permalink
Delete old integrity urls in PATCH and DELETE endpoints (#175)
Browse files Browse the repository at this point in the history
* Delete old integrity urls in PATCH and DELETE endpoints

* Self review

* Self review
  • Loading branch information
joeldenning authored Oct 15, 2024
1 parent 2b7e276 commit fae320e
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/modify.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,11 @@ exports.modifyService = function (
) {
return modifyLock(env, (json) => {
const map = getMapFromManifest(json);
const oldUrl = map[serviceName];
if (oldUrl && json.integrity) {
delete json.integrity[oldUrl];
}

if (remove) {
delete map[serviceName];
delete map[serviceName + "/"];
Expand Down
116 changes: 116 additions & 0 deletions test/integrity.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
const request = require("supertest");
const { app, setConfig } = require("../src/web-server");
const {
resetManifest: resetMemoryManifest,
} = require("../src/io-methods/memory");

describe(`integrity`, () => {
beforeAll(() => {
setConfig({
manifestFormat: "importmap",
packagesViaTrailingSlashes: true,
locations: {
prod: "memory://prod",
},
});
});

beforeEach(() => {
resetMemoryManifest();
});

it(`sets integrity field in import map`, async () => {
const url = "/a.js";
const integrity = "sha256-example";

const response = await request(app)
.patch("/services")
.query({
skip_url_check: true,
})
.set("accept", "json")
.send({
service: "a",
url,
integrity,
})
.expect(200)
.expect("Content-Type", /json/);

expect(response.body.integrity).toMatchObject({
[url]: integrity,
});
});

it(`removes old integrity when patching a service`, async () => {
const url = "/a.js";
const integrity = "sha256-a";

const response = await request(app)
.patch("/services")
.query({
skip_url_check: true,
})
.set("accept", "json")
.send({
service: "a",
url,
integrity,
})
.expect(200)
.expect("Content-Type", /json/);

expect(response.body.integrity[url]).not.toBeUndefined();

const url2 = "/a2.js";
const integrity2 = "sha256-a2";

const response2 = await request(app)
.patch("/services")
.query({
skip_url_check: true,
})
.set("accept", "json")
.send({
service: "a",
url: url2,
integrity: integrity2,
})
.expect(200)
.expect("Content-Type", /json/);

expect(response2.body.integrity[url]).toBeUndefined();
expect(response2.body.integrity[url2]).not.toBeUndefined();
});

it(`deletes old integrity when deleting a service`, async () => {
const url = "/a.js";
const integrity = "sha256-example";

const response = await request(app)
.patch("/services")
.query({
skip_url_check: true,
})
.set("accept", "json")
.send({
service: "a",
url,
integrity,
})
.expect(200)
.expect("Content-Type", /json/);

expect(response.body.integrity).toMatchObject({
[url]: integrity,
});

const response2 = await request(app)
.delete("/services/a")
.set("accept", "json")
.send()
.expect(200)
.expect("Content-Type", /json/);
expect(response2.body.integrity[url]).toBeUndefined();
});
});

0 comments on commit fae320e

Please sign in to comment.