From 38d39e7c93c9e51a2db494aa49052eadf345dd37 Mon Sep 17 00:00:00 2001 From: Kohei Watanabe Date: Wed, 2 Oct 2024 17:55:31 +0900 Subject: [PATCH] add match --- src/index.ts | 6 ++ test/integrity-metadata-set/match.js | 100 +++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 test/integrity-metadata-set/match.js diff --git a/src/index.ts b/src/index.ts index 3f41630..4413704 100644 --- a/src/index.ts +++ b/src/index.ts @@ -191,6 +191,12 @@ export class IntegrityMetadataSet { return [...new Set(strongestHashAlgorithms)]; } + match(integrity: IntegrityMetadataLike | string | null | undefined): boolean { + return this.#set.some((integrityMetadata) => + integrityMetadata.match(integrity), + ); + } + join(separator = " "): string { return this.#set.map(String).join(separator); } diff --git a/test/integrity-metadata-set/match.js b/test/integrity-metadata-set/match.js new file mode 100644 index 0000000..8f48c30 --- /dev/null +++ b/test/integrity-metadata-set/match.js @@ -0,0 +1,100 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { IntegrityMetadataSet } from "../../dist/index.js"; + +test("if the hash values match, return true", function () { + const integrityMetadata = new IntegrityMetadataSet( + "sha256-MV9b23bQeMQ7isAGTkoBZGErH853yGk0W/yUx1iU7dM=", + ); + + assert.strictEqual( + integrityMetadata.match({ + alg: "sha256", + val: "MV9b23bQeMQ7isAGTkoBZGErH853yGk0W/yUx1iU7dM=", + }), + true, + ); +}); + +test("if the hash of one of the selected algorithms matches, return true", function () { + const integrityMetadata = new IntegrityMetadataSet([ + "sha256-MV9b23bQeMQ7isAGTkoBZGErH853yGk0W/yUx1iU7dM=", + "sha256-uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=", + ]); + + assert.strictEqual( + integrityMetadata.match({ + alg: "sha256", + val: "MV9b23bQeMQ7isAGTkoBZGErH853yGk0W/yUx1iU7dM=", + }), + true, + ); +}); + +test("if the hash algorithms are different, return false", function () { + const integrityMetadata = new IntegrityMetadataSet( + "sha256-MV9b23bQeMQ7isAGTkoBZGErH853yGk0W/yUx1iU7dM=", + ); + + assert.strictEqual( + integrityMetadata.match({ + alg: "sha512", + val: "MJ7MSJwS1utMxA9QyQLytNDtd+5RGnx6m808qG1M2G+YndNbxf9JlnDaNCVbRbDP2DDoH2Bdz33FVC6TrpzXbw==", + }), + false, + ); +}); + +test("if the hash values are different, return false", function () { + const integrityMetadata = new IntegrityMetadataSet( + "sha256-MV9b23bQeMQ7isAGTkoBZGErH853yGk0W/yUx1iU7dM=", + ); + + assert.strictEqual( + integrityMetadata.match({ + alg: "sha256", + val: "uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=", + }), + false, + ); +}); + +test("if the hash algorithm is unsupported, return false", function () { + const integrityMetadata = new IntegrityMetadataSet( + "sha1-lDpwLQbzRZmu4fjajvn3KWAx1pk=", + ); + + assert.strictEqual( + integrityMetadata.match( + new IntegrityMetadataSet("sha1-lDpwLQbzRZmu4fjajvn3KWAx1pk="), + ), + false, + ); +}); + +test("if null, return false", function () { + const integrityMetadata = new IntegrityMetadataSet(null); + + assert.strictEqual( + integrityMetadata.match(new IntegrityMetadataSet(null)), + false, + ); +}); + +test("if empty, return false", function () { + const integrityMetadata = new IntegrityMetadataSet([]); + + assert.strictEqual( + integrityMetadata.match(new IntegrityMetadataSet([])), + false, + ); +}); + +test("if invalid value, return false", function () { + const integrityMetadata = new IntegrityMetadataSet("md5\0/..invalid-value"); + + assert.strictEqual( + integrityMetadata.match(new IntegrityMetadataSet("md5\0/..invalid-value")), + false, + ); +});