@streetjs/storage 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/drivers/local.d.ts +8 -0
- package/dist/drivers/local.d.ts.map +1 -1
- package/dist/drivers/local.js +18 -3
- package/dist/drivers/local.js.map +1 -1
- package/dist/tests/contract.d.ts +19 -0
- package/dist/tests/contract.d.ts.map +1 -1
- package/dist/tests/contract.js +28 -0
- package/dist/tests/contract.js.map +1 -1
- package/package.json +10 -6
- package/dist/tests/access.test.d.ts +0 -2
- package/dist/tests/access.test.d.ts.map +0 -1
- package/dist/tests/access.test.js +0 -270
- package/dist/tests/access.test.js.map +0 -1
- package/dist/tests/azure-driver.test.d.ts +0 -2
- package/dist/tests/azure-driver.test.d.ts.map +0 -1
- package/dist/tests/azure-driver.test.js +0 -183
- package/dist/tests/azure-driver.test.js.map +0 -1
- package/dist/tests/backblaze-driver.test.d.ts +0 -2
- package/dist/tests/backblaze-driver.test.d.ts.map +0 -1
- package/dist/tests/backblaze-driver.test.js +0 -185
- package/dist/tests/backblaze-driver.test.js.map +0 -1
- package/dist/tests/bridge-degradation.test.d.ts +0 -2
- package/dist/tests/bridge-degradation.test.d.ts.map +0 -1
- package/dist/tests/bridge-degradation.test.js +0 -138
- package/dist/tests/bridge-degradation.test.js.map +0 -1
- package/dist/tests/cli.test.d.ts +0 -2
- package/dist/tests/cli.test.d.ts.map +0 -1
- package/dist/tests/cli.test.js +0 -127
- package/dist/tests/cli.test.js.map +0 -1
- package/dist/tests/contract.test.d.ts +0 -2
- package/dist/tests/contract.test.d.ts.map +0 -1
- package/dist/tests/contract.test.js +0 -110
- package/dist/tests/contract.test.js.map +0 -1
- package/dist/tests/directory.test.d.ts +0 -2
- package/dist/tests/directory.test.d.ts.map +0 -1
- package/dist/tests/directory.test.js +0 -125
- package/dist/tests/directory.test.js.map +0 -1
- package/dist/tests/errors.test.d.ts +0 -2
- package/dist/tests/errors.test.d.ts.map +0 -1
- package/dist/tests/errors.test.js +0 -93
- package/dist/tests/errors.test.js.map +0 -1
- package/dist/tests/events-bridge.test.d.ts +0 -2
- package/dist/tests/events-bridge.test.d.ts.map +0 -1
- package/dist/tests/events-bridge.test.js +0 -228
- package/dist/tests/events-bridge.test.js.map +0 -1
- package/dist/tests/example-smoke.test.d.ts +0 -2
- package/dist/tests/example-smoke.test.d.ts.map +0 -1
- package/dist/tests/example-smoke.test.js +0 -34
- package/dist/tests/example-smoke.test.js.map +0 -1
- package/dist/tests/gcs-driver.test.d.ts +0 -2
- package/dist/tests/gcs-driver.test.d.ts.map +0 -1
- package/dist/tests/gcs-driver.test.js +0 -197
- package/dist/tests/gcs-driver.test.js.map +0 -1
- package/dist/tests/image.test.d.ts +0 -2
- package/dist/tests/image.test.d.ts.map +0 -1
- package/dist/tests/image.test.js +0 -102
- package/dist/tests/image.test.js.map +0 -1
- package/dist/tests/lifecycle.test.d.ts +0 -2
- package/dist/tests/lifecycle.test.d.ts.map +0 -1
- package/dist/tests/lifecycle.test.js +0 -171
- package/dist/tests/lifecycle.test.js.map +0 -1
- package/dist/tests/local-driver.test.d.ts +0 -2
- package/dist/tests/local-driver.test.d.ts.map +0 -1
- package/dist/tests/local-driver.test.js +0 -153
- package/dist/tests/local-driver.test.js.map +0 -1
- package/dist/tests/local-streaming.test.d.ts +0 -2
- package/dist/tests/local-streaming.test.d.ts.map +0 -1
- package/dist/tests/local-streaming.test.js +0 -121
- package/dist/tests/local-streaming.test.js.map +0 -1
- package/dist/tests/memory-driver.test.d.ts +0 -2
- package/dist/tests/memory-driver.test.d.ts.map +0 -1
- package/dist/tests/memory-driver.test.js +0 -180
- package/dist/tests/memory-driver.test.js.map +0 -1
- package/dist/tests/memory-streaming.test.d.ts +0 -2
- package/dist/tests/memory-streaming.test.d.ts.map +0 -1
- package/dist/tests/memory-streaming.test.js +0 -92
- package/dist/tests/memory-streaming.test.js.map +0 -1
- package/dist/tests/minio-driver.test.d.ts +0 -2
- package/dist/tests/minio-driver.test.d.ts.map +0 -1
- package/dist/tests/minio-driver.test.js +0 -146
- package/dist/tests/minio-driver.test.js.map +0 -1
- package/dist/tests/non-s3-integration.test.d.ts +0 -2
- package/dist/tests/non-s3-integration.test.d.ts.map +0 -1
- package/dist/tests/non-s3-integration.test.js +0 -201
- package/dist/tests/non-s3-integration.test.js.map +0 -1
- package/dist/tests/observability.registration.test.d.ts +0 -2
- package/dist/tests/observability.registration.test.d.ts.map +0 -1
- package/dist/tests/observability.registration.test.js +0 -103
- package/dist/tests/observability.registration.test.js.map +0 -1
- package/dist/tests/observability.test.d.ts +0 -2
- package/dist/tests/observability.test.d.ts.map +0 -1
- package/dist/tests/observability.test.js +0 -240
- package/dist/tests/observability.test.js.map +0 -1
- package/dist/tests/plugin.test.d.ts +0 -2
- package/dist/tests/plugin.test.d.ts.map +0 -1
- package/dist/tests/plugin.test.js +0 -112
- package/dist/tests/plugin.test.js.map +0 -1
- package/dist/tests/prop-concurrent.test.d.ts +0 -2
- package/dist/tests/prop-concurrent.test.d.ts.map +0 -1
- package/dist/tests/prop-concurrent.test.js +0 -59
- package/dist/tests/prop-concurrent.test.js.map +0 -1
- package/dist/tests/prop-copy.test.d.ts +0 -2
- package/dist/tests/prop-copy.test.d.ts.map +0 -1
- package/dist/tests/prop-copy.test.js +0 -63
- package/dist/tests/prop-copy.test.js.map +0 -1
- package/dist/tests/prop-delete.test.d.ts +0 -2
- package/dist/tests/prop-delete.test.d.ts.map +0 -1
- package/dist/tests/prop-delete.test.js +0 -35
- package/dist/tests/prop-delete.test.js.map +0 -1
- package/dist/tests/prop-directory.test.d.ts +0 -2
- package/dist/tests/prop-directory.test.d.ts.map +0 -1
- package/dist/tests/prop-directory.test.js +0 -118
- package/dist/tests/prop-directory.test.js.map +0 -1
- package/dist/tests/prop-driver-conformance.test.d.ts +0 -2
- package/dist/tests/prop-driver-conformance.test.d.ts.map +0 -1
- package/dist/tests/prop-driver-conformance.test.js +0 -110
- package/dist/tests/prop-driver-conformance.test.js.map +0 -1
- package/dist/tests/prop-driver-equivalence.test.d.ts +0 -2
- package/dist/tests/prop-driver-equivalence.test.d.ts.map +0 -1
- package/dist/tests/prop-driver-equivalence.test.js +0 -163
- package/dist/tests/prop-driver-equivalence.test.js.map +0 -1
- package/dist/tests/prop-lifecycle.test.d.ts +0 -2
- package/dist/tests/prop-lifecycle.test.d.ts.map +0 -1
- package/dist/tests/prop-lifecycle.test.js +0 -83
- package/dist/tests/prop-lifecycle.test.js.map +0 -1
- package/dist/tests/prop-list.test.d.ts +0 -2
- package/dist/tests/prop-list.test.d.ts.map +0 -1
- package/dist/tests/prop-list.test.js +0 -53
- package/dist/tests/prop-list.test.js.map +0 -1
- package/dist/tests/prop-metadata.test.d.ts +0 -2
- package/dist/tests/prop-metadata.test.d.ts.map +0 -1
- package/dist/tests/prop-metadata.test.js +0 -87
- package/dist/tests/prop-metadata.test.js.map +0 -1
- package/dist/tests/prop-move.test.d.ts +0 -2
- package/dist/tests/prop-move.test.d.ts.map +0 -1
- package/dist/tests/prop-move.test.js +0 -67
- package/dist/tests/prop-move.test.js.map +0 -1
- package/dist/tests/prop-multipart-abort.test.d.ts +0 -2
- package/dist/tests/prop-multipart-abort.test.d.ts.map +0 -1
- package/dist/tests/prop-multipart-abort.test.js +0 -48
- package/dist/tests/prop-multipart-abort.test.js.map +0 -1
- package/dist/tests/prop-multipart.test.d.ts +0 -2
- package/dist/tests/prop-multipart.test.d.ts.map +0 -1
- package/dist/tests/prop-multipart.test.js +0 -65
- package/dist/tests/prop-multipart.test.js.map +0 -1
- package/dist/tests/prop-resumable.test.d.ts +0 -2
- package/dist/tests/prop-resumable.test.d.ts.map +0 -1
- package/dist/tests/prop-resumable.test.js +0 -78
- package/dist/tests/prop-resumable.test.js.map +0 -1
- package/dist/tests/prop-search.test.d.ts +0 -2
- package/dist/tests/prop-search.test.d.ts.map +0 -1
- package/dist/tests/prop-search.test.js +0 -120
- package/dist/tests/prop-search.test.js.map +0 -1
- package/dist/tests/prop-signed-url.test.d.ts +0 -2
- package/dist/tests/prop-signed-url.test.d.ts.map +0 -1
- package/dist/tests/prop-signed-url.test.js +0 -74
- package/dist/tests/prop-signed-url.test.js.map +0 -1
- package/dist/tests/prop-streaming.test.d.ts +0 -2
- package/dist/tests/prop-streaming.test.d.ts.map +0 -1
- package/dist/tests/prop-streaming.test.js +0 -34
- package/dist/tests/prop-streaming.test.js.map +0 -1
- package/dist/tests/prop-upload-download.test.d.ts +0 -2
- package/dist/tests/prop-upload-download.test.d.ts.map +0 -1
- package/dist/tests/prop-upload-download.test.js +0 -30
- package/dist/tests/prop-upload-download.test.js.map +0 -1
- package/dist/tests/prop-validation.test.d.ts +0 -2
- package/dist/tests/prop-validation.test.d.ts.map +0 -1
- package/dist/tests/prop-validation.test.js +0 -50
- package/dist/tests/prop-validation.test.js.map +0 -1
- package/dist/tests/prop-versioning.test.d.ts +0 -2
- package/dist/tests/prop-versioning.test.d.ts.map +0 -1
- package/dist/tests/prop-versioning.test.js +0 -74
- package/dist/tests/prop-versioning.test.js.map +0 -1
- package/dist/tests/queue-bridge.test.d.ts +0 -2
- package/dist/tests/queue-bridge.test.d.ts.map +0 -1
- package/dist/tests/queue-bridge.test.js +0 -111
- package/dist/tests/queue-bridge.test.js.map +0 -1
- package/dist/tests/r2-driver.test.d.ts +0 -2
- package/dist/tests/r2-driver.test.d.ts.map +0 -1
- package/dist/tests/r2-driver.test.js +0 -143
- package/dist/tests/r2-driver.test.js.map +0 -1
- package/dist/tests/realtime-bridge.test.d.ts +0 -2
- package/dist/tests/realtime-bridge.test.d.ts.map +0 -1
- package/dist/tests/realtime-bridge.test.js +0 -106
- package/dist/tests/realtime-bridge.test.js.map +0 -1
- package/dist/tests/resumable.test.d.ts +0 -2
- package/dist/tests/resumable.test.d.ts.map +0 -1
- package/dist/tests/resumable.test.js +0 -104
- package/dist/tests/resumable.test.js.map +0 -1
- package/dist/tests/s3-base.test.d.ts +0 -2
- package/dist/tests/s3-base.test.d.ts.map +0 -1
- package/dist/tests/s3-base.test.js +0 -289
- package/dist/tests/s3-base.test.js.map +0 -1
- package/dist/tests/s3-integration.test.d.ts +0 -2
- package/dist/tests/s3-integration.test.d.ts.map +0 -1
- package/dist/tests/s3-integration.test.js +0 -270
- package/dist/tests/s3-integration.test.js.map +0 -1
- package/dist/tests/s3.test.d.ts +0 -2
- package/dist/tests/s3.test.d.ts.map +0 -1
- package/dist/tests/s3.test.js +0 -203
- package/dist/tests/s3.test.js.map +0 -1
- package/dist/tests/scaffold.test.d.ts +0 -2
- package/dist/tests/scaffold.test.d.ts.map +0 -1
- package/dist/tests/scaffold.test.js +0 -13
- package/dist/tests/scaffold.test.js.map +0 -1
- package/dist/tests/search.test.d.ts +0 -2
- package/dist/tests/search.test.d.ts.map +0 -1
- package/dist/tests/search.test.js +0 -106
- package/dist/tests/search.test.js.map +0 -1
- package/dist/tests/supabase-driver.test.d.ts +0 -2
- package/dist/tests/supabase-driver.test.d.ts.map +0 -1
- package/dist/tests/supabase-driver.test.js +0 -196
- package/dist/tests/supabase-driver.test.js.map +0 -1
- package/dist/tests/testing-utilities.test.d.ts +0 -2
- package/dist/tests/testing-utilities.test.d.ts.map +0 -1
- package/dist/tests/testing-utilities.test.js +0 -138
- package/dist/tests/testing-utilities.test.js.map +0 -1
- package/dist/tests/validation.test.d.ts +0 -2
- package/dist/tests/validation.test.d.ts.map +0 -1
- package/dist/tests/validation.test.js +0 -135
- package/dist/tests/validation.test.js.map +0 -1
- package/dist/tests/versioning.test.d.ts +0 -2
- package/dist/tests/versioning.test.d.ts.map +0 -1
- package/dist/tests/versioning.test.js +0 -128
- package/dist/tests/versioning.test.js.map +0 -1
package/dist/tests/cli.test.js
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
// cli.test.js — unit tests for the @streetjs/storage CLI generators and the
|
|
2
|
-
// storage:verify command (Requirements 21.2, 21.4).
|
|
3
|
-
//
|
|
4
|
-
// Covers three concerns:
|
|
5
|
-
// (1) Generator name validation — isValidGeneratorName / generateStorage
|
|
6
|
-
// reject invalid names and accept valid PascalCase identifiers.
|
|
7
|
-
// (2) Compile-clean scaffold output — the generated `contents` imports only
|
|
8
|
-
// public @streetjs/storage symbols (createStorage + StorageConfig) and
|
|
9
|
-
// wires them into a typed factory.
|
|
10
|
-
// (3) storage:verify pass/fail reporting — StorageCommands.storageVerify
|
|
11
|
-
// reports a pass for the built-in memory provider (process.exitCode is
|
|
12
|
-
// not set to 1) and a failure for an unknown/misconfigured provider
|
|
13
|
-
// (process.exitCode === 1).
|
|
14
|
-
//
|
|
15
|
-
// Uses the Node.js built-in test runner (node:test); executed via
|
|
16
|
-
// `node --test dist/tests/*.test.js`.
|
|
17
|
-
import test from "node:test";
|
|
18
|
-
import assert from "node:assert/strict";
|
|
19
|
-
import { generateStorage, isValidGeneratorName, isValidProvider, DEFAULT_STORAGE_DIR, } from "../cli/generators.js";
|
|
20
|
-
import { StorageCommands } from "../cli/commands.js";
|
|
21
|
-
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
22
|
-
/** Build a ParsedArgs object matching the shape streetjs' parseArgv produces. */
|
|
23
|
-
function parsedArgs(options = {}) {
|
|
24
|
-
const { command = null, positional = [], flags = {} } = options;
|
|
25
|
-
return { command, positional, flags };
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Run `fn` while capturing everything written to console.log/console.error and
|
|
29
|
-
* with process.exitCode reset, restoring both afterwards. Returns the captured
|
|
30
|
-
* output plus the exitCode observed after `fn` completes.
|
|
31
|
-
*/
|
|
32
|
-
async function captureRun(fn) {
|
|
33
|
-
const originalLog = console.log;
|
|
34
|
-
const originalError = console.error;
|
|
35
|
-
const originalExitCode = process.exitCode;
|
|
36
|
-
const logs = [];
|
|
37
|
-
const errors = [];
|
|
38
|
-
console.log = (...args) => logs.push(args.join(" "));
|
|
39
|
-
console.error = (...args) => errors.push(args.join(" "));
|
|
40
|
-
process.exitCode = undefined;
|
|
41
|
-
try {
|
|
42
|
-
await fn();
|
|
43
|
-
return { logs, errors, exitCode: process.exitCode };
|
|
44
|
-
}
|
|
45
|
-
finally {
|
|
46
|
-
console.log = originalLog;
|
|
47
|
-
console.error = originalError;
|
|
48
|
-
process.exitCode = originalExitCode;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
// ── (1) Generator name validation ──────────────────────────────────────────────
|
|
52
|
-
test("isValidGeneratorName rejects invalid names and accepts PascalCase", () => {
|
|
53
|
-
// Invalid: empty, non-identifier, leading digit, hyphen/space/dot.
|
|
54
|
-
assert.equal(isValidGeneratorName(""), false);
|
|
55
|
-
assert.equal(isValidGeneratorName("1Uploads"), false);
|
|
56
|
-
assert.equal(isValidGeneratorName("my-storage"), false);
|
|
57
|
-
assert.equal(isValidGeneratorName("my storage"), false);
|
|
58
|
-
assert.equal(isValidGeneratorName("Up.loads"), false);
|
|
59
|
-
assert.equal(isValidGeneratorName("$Uploads"), false);
|
|
60
|
-
// Valid: identifier-safe tokens including PascalCase.
|
|
61
|
-
assert.equal(isValidGeneratorName("Uploads"), true);
|
|
62
|
-
assert.equal(isValidGeneratorName("UserAvatars"), true);
|
|
63
|
-
assert.equal(isValidGeneratorName("A1"), true);
|
|
64
|
-
assert.equal(isValidGeneratorName("uploads"), true);
|
|
65
|
-
});
|
|
66
|
-
test("generateStorage throws for invalid names before producing output", () => {
|
|
67
|
-
assert.throws(() => generateStorage(""), /Invalid generator name/);
|
|
68
|
-
assert.throws(() => generateStorage("bad-name"), /Invalid generator name/);
|
|
69
|
-
assert.throws(() => generateStorage("9lives"), /Invalid generator name/);
|
|
70
|
-
});
|
|
71
|
-
test("generateStorage throws for a non-built-in provider", () => {
|
|
72
|
-
assert.throws(() => generateStorage("Uploads", DEFAULT_STORAGE_DIR, "s3"), /Invalid storage provider/);
|
|
73
|
-
assert.equal(isValidProvider("memory"), true);
|
|
74
|
-
assert.equal(isValidProvider("local"), true);
|
|
75
|
-
assert.equal(isValidProvider("s3"), false);
|
|
76
|
-
});
|
|
77
|
-
// ── (2) Compile-clean scaffold output ──────────────────────────────────────────
|
|
78
|
-
test("generateStorage emits a scaffold importing only public @streetjs/storage symbols", () => {
|
|
79
|
-
const result = generateStorage("Uploads");
|
|
80
|
-
// Path is derived from the PascalCase class name under the default dir.
|
|
81
|
-
assert.ok(result.path.endsWith("UploadsStorage.ts"), `unexpected path: ${result.path}`);
|
|
82
|
-
const contents = result.contents;
|
|
83
|
-
// Imports only the public package entry point (no deep/internal imports).
|
|
84
|
-
assert.match(contents, /import \{ createStorage \} from "@streetjs\/storage";/);
|
|
85
|
-
assert.match(contents, /import type \{ Storage, StorageConfig \} from "@streetjs\/storage";/);
|
|
86
|
-
assert.ok(!/from "\.\//.test(contents) && !/from "\.\.\//.test(contents), "scaffold must not import from relative/internal paths");
|
|
87
|
-
// Wires a typed StorageConfig and a factory that calls createStorage.
|
|
88
|
-
assert.match(contents, /: StorageConfig = \{/);
|
|
89
|
-
assert.match(contents, /provider: "memory"/);
|
|
90
|
-
assert.match(contents, /export function createUploadsStorage\(\): Storage \{/);
|
|
91
|
-
assert.match(contents, /return createStorage\(/);
|
|
92
|
-
});
|
|
93
|
-
test("generateStorage local provider scaffold supplies a root and stays on the public surface", () => {
|
|
94
|
-
const result = generateStorage("Assets", DEFAULT_STORAGE_DIR, "local");
|
|
95
|
-
const contents = result.contents;
|
|
96
|
-
assert.match(contents, /provider: "local"/);
|
|
97
|
-
assert.match(contents, /root: "\.\/var\/assets"/);
|
|
98
|
-
assert.match(contents, /import \{ createStorage \} from "@streetjs\/storage";/);
|
|
99
|
-
});
|
|
100
|
-
// ── (3) storage:verify pass/fail reporting ──────────────────────────────────────
|
|
101
|
-
test("storageVerify reports a pass for the built-in memory provider", async () => {
|
|
102
|
-
const commands = new StorageCommands();
|
|
103
|
-
const args = parsedArgs({ command: "storage:verify", flags: { provider: "memory" } });
|
|
104
|
-
const { logs, exitCode } = await captureRun(() => commands.storageVerify(args));
|
|
105
|
-
// A passing run must NOT set a failure exit code.
|
|
106
|
-
assert.notEqual(exitCode, 1);
|
|
107
|
-
const output = logs.join("\n");
|
|
108
|
-
assert.match(output, /Contract conformance for driver "memory"/);
|
|
109
|
-
assert.match(output, /— PASS\./);
|
|
110
|
-
// No FAIL check lines expected.
|
|
111
|
-
assert.ok(!/\[FAIL\]/.test(output), "memory provider should have no failing checks");
|
|
112
|
-
});
|
|
113
|
-
test("storageVerify reports failure for an unknown provider (exitCode 1)", async () => {
|
|
114
|
-
const commands = new StorageCommands();
|
|
115
|
-
const args = parsedArgs({ command: "storage:verify", flags: { provider: "does-not-exist" } });
|
|
116
|
-
const { errors, exitCode } = await captureRun(() => commands.storageVerify(args));
|
|
117
|
-
assert.equal(exitCode, 1);
|
|
118
|
-
assert.match(errors.join("\n"), /Unknown storage provider "does-not-exist"/);
|
|
119
|
-
});
|
|
120
|
-
test("storageVerify reports failure for a misconfigured local provider (missing root)", async () => {
|
|
121
|
-
const commands = new StorageCommands();
|
|
122
|
-
const args = parsedArgs({ command: "storage:verify", flags: { provider: "local" } });
|
|
123
|
-
const { errors, exitCode } = await captureRun(() => commands.storageVerify(args));
|
|
124
|
-
assert.equal(exitCode, 1);
|
|
125
|
-
assert.match(errors.join("\n"), /"local" storage provider requires a "root" directory/);
|
|
126
|
-
});
|
|
127
|
-
//# sourceMappingURL=cli.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/tests/cli.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contract.test.d.ts","sourceRoot":"","sources":["../../src/tests/contract.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
// Contract-conformance suite run against the two zero-dependency drivers.
|
|
2
|
-
//
|
|
3
|
-
// Exercises the shared, parameterized suite from `./contract.js` (task 27.1)
|
|
4
|
-
// against MemoryStorageDriver and LocalStorageDriver, verifying both directions
|
|
5
|
-
// it is consumed in production:
|
|
6
|
-
//
|
|
7
|
-
// - as node:test cases via registerStorageDriverContractTests (what a driver's
|
|
8
|
-
// own test file would do), and
|
|
9
|
-
// - programmatically via runStorageDriverContract (what `storage:verify` and
|
|
10
|
-
// Property 19 use), asserting the returned report passes for every check.
|
|
11
|
-
//
|
|
12
|
-
// Each check receives a freshly constructed driver from the supplied factory;
|
|
13
|
-
// the Local driver gets a fresh temp directory per instance so checks stay
|
|
14
|
-
// isolated. Executed via `node --test dist/tests/*.test.js`.
|
|
15
|
-
//
|
|
16
|
-
// Requirements: 2.1, 2.3, 2.4
|
|
17
|
-
import test from "node:test";
|
|
18
|
-
import assert from "node:assert/strict";
|
|
19
|
-
import { mkdtempSync, rmSync } from "node:fs";
|
|
20
|
-
import { tmpdir } from "node:os";
|
|
21
|
-
import { join } from "node:path";
|
|
22
|
-
import { runStorageDriverContract, registerStorageDriverContractTests, storageDriverContractChecks, } from "./contract.js";
|
|
23
|
-
import { MemoryStorageDriver } from "../drivers/memory.js";
|
|
24
|
-
import { LocalStorageDriver } from "../drivers/local.js";
|
|
25
|
-
/** A fixed clock for deterministic timestamps. */
|
|
26
|
-
const fixedClock = () => 1_700_000_000_000;
|
|
27
|
-
/** Factory: a fresh in-memory driver per call. */
|
|
28
|
-
function makeMemoryDriver() {
|
|
29
|
-
return new MemoryStorageDriver({ clock: fixedClock });
|
|
30
|
-
}
|
|
31
|
-
/** Temp roots allocated for Local drivers, cleaned up after the run. */
|
|
32
|
-
const tempRoots = [];
|
|
33
|
-
/** Factory: a fresh filesystem driver rooted at a unique temp dir per call. */
|
|
34
|
-
function makeLocalDriver() {
|
|
35
|
-
const root = mkdtempSync(join(tmpdir(), "streetjs-storage-contract-"));
|
|
36
|
-
tempRoots.push(root);
|
|
37
|
-
return new LocalStorageDriver({ root, clock: fixedClock });
|
|
38
|
-
}
|
|
39
|
-
test.after(() => {
|
|
40
|
-
for (const root of tempRoots) {
|
|
41
|
-
rmSync(root, { recursive: true, force: true });
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
// ── As node:test cases (per-driver, per-check) ────────────────────────────────
|
|
45
|
-
registerStorageDriverContractTests("memory driver contract", makeMemoryDriver, test);
|
|
46
|
-
registerStorageDriverContractTests("local driver contract", makeLocalDriver, test);
|
|
47
|
-
// ── Programmatically (the storage:verify / Property 19 consumption path) ──────
|
|
48
|
-
test("runStorageDriverContract reports a full pass for the memory driver", async () => {
|
|
49
|
-
const report = await runStorageDriverContract(makeMemoryDriver);
|
|
50
|
-
assert.equal(report.driver, "memory");
|
|
51
|
-
assert.equal(report.passed, true);
|
|
52
|
-
assert.equal(report.results.length, storageDriverContractChecks.length);
|
|
53
|
-
assert.ok(report.results.every((result) => result.passed), `all checks must pass, got: ${JSON.stringify(report.results)}`);
|
|
54
|
-
});
|
|
55
|
-
test("runStorageDriverContract reports a full pass for the local driver", async () => {
|
|
56
|
-
const report = await runStorageDriverContract(makeLocalDriver);
|
|
57
|
-
assert.equal(report.driver, "local");
|
|
58
|
-
assert.equal(report.passed, true);
|
|
59
|
-
assert.equal(report.results.length, storageDriverContractChecks.length);
|
|
60
|
-
assert.ok(report.results.every((result) => result.passed), `all checks must pass, got: ${JSON.stringify(report.results)}`);
|
|
61
|
-
});
|
|
62
|
-
test("a non-conforming driver is reported as failed, not thrown", async () => {
|
|
63
|
-
// A driver that always reports a missing object exists violates the
|
|
64
|
-
// not-found and round-trip checks; the runner must capture this as failures
|
|
65
|
-
// rather than throwing.
|
|
66
|
-
const brokenDriver = {
|
|
67
|
-
name: "broken",
|
|
68
|
-
async put(key, bytes) {
|
|
69
|
-
return {
|
|
70
|
-
key,
|
|
71
|
-
size: bytes.byteLength,
|
|
72
|
-
contentType: "application/octet-stream",
|
|
73
|
-
etag: "x",
|
|
74
|
-
checksum: "x",
|
|
75
|
-
accessLevel: "private",
|
|
76
|
-
createdAt: 0,
|
|
77
|
-
updatedAt: 0,
|
|
78
|
-
custom: {},
|
|
79
|
-
};
|
|
80
|
-
},
|
|
81
|
-
async get() {
|
|
82
|
-
return { found: false };
|
|
83
|
-
},
|
|
84
|
-
async exists() {
|
|
85
|
-
return false;
|
|
86
|
-
},
|
|
87
|
-
async delete() { },
|
|
88
|
-
async stat() {
|
|
89
|
-
return null;
|
|
90
|
-
},
|
|
91
|
-
async list() {
|
|
92
|
-
return [];
|
|
93
|
-
},
|
|
94
|
-
async putStream(key, _stream, _metadata) {
|
|
95
|
-
return this.put(key, new Uint8Array(), {});
|
|
96
|
-
},
|
|
97
|
-
async getStream() {
|
|
98
|
-
throw new Error("unsupported");
|
|
99
|
-
},
|
|
100
|
-
};
|
|
101
|
-
const report = await runStorageDriverContract(() => brokenDriver);
|
|
102
|
-
assert.equal(report.driver, "broken");
|
|
103
|
-
assert.equal(report.passed, false);
|
|
104
|
-
// existence and byte round-trip must fail (get always reports not-found);
|
|
105
|
-
// the two not-found checks and metadata shape still pass.
|
|
106
|
-
const failed = report.results.filter((result) => !result.passed).map((r) => r.name);
|
|
107
|
-
assert.ok(failed.some((name) => name.startsWith("existence")), "existence check should fail for the broken driver");
|
|
108
|
-
assert.ok(failed.some((name) => name.startsWith("byte round-trip")), "byte round-trip check should fail for the broken driver");
|
|
109
|
-
});
|
|
110
|
-
//# sourceMappingURL=contract.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contract.test.js","sourceRoot":"","sources":["../../src/tests/contract.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"directory.test.d.ts","sourceRoot":"","sources":["../../src/tests/directory.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
// Unit tests for the Directory API wired into the storage facade (task 17.1).
|
|
2
|
-
//
|
|
3
|
-
// Verifies the Requirement 15 semantics over the zero-dependency `memory`
|
|
4
|
-
// provider, exercised through `storage.directory`:
|
|
5
|
-
//
|
|
6
|
-
// - mkdir(path) makes the path available as a directory prefix (15.1).
|
|
7
|
-
// - listDirectory(path) returns only the IMMEDIATE children, collapsing
|
|
8
|
-
// deeper keys into a single sub-directory entry (15.2).
|
|
9
|
-
// - removeDirectory(path) removes every object under the prefix (15.3), and is
|
|
10
|
-
// a success no-op returning { removed: false } for an empty/missing prefix
|
|
11
|
-
// (15.6).
|
|
12
|
-
// - walk(path) returns every object key beneath the prefix (15.4).
|
|
13
|
-
//
|
|
14
|
-
// Uses the Node.js built-in test runner (node:test); executed via
|
|
15
|
-
// `node --test dist/tests/*.test.js`.
|
|
16
|
-
//
|
|
17
|
-
// Requirements: 15.1, 15.2, 15.3, 15.4, 15.5, 15.6
|
|
18
|
-
import test from "node:test";
|
|
19
|
-
import assert from "node:assert/strict";
|
|
20
|
-
import { createStorage } from "../facade.js";
|
|
21
|
-
import { MemoryStorageDriver } from "../drivers/memory.js";
|
|
22
|
-
/** Build a facade backed by a fresh in-memory driver. */
|
|
23
|
-
function makeStorage() {
|
|
24
|
-
const driver = new MemoryStorageDriver({});
|
|
25
|
-
return createStorage({ provider: "memory", driver });
|
|
26
|
-
}
|
|
27
|
-
/** Seed the store with a small hierarchy of objects. */
|
|
28
|
-
async function seed(storage) {
|
|
29
|
-
await storage.put("photos/a.jpg", "a");
|
|
30
|
-
await storage.put("photos/b.jpg", "bb");
|
|
31
|
-
await storage.put("photos/2024/c.jpg", "ccc");
|
|
32
|
-
await storage.put("photos/2024/holidays/d.jpg", "dddd");
|
|
33
|
-
await storage.put("docs/readme.txt", "hello");
|
|
34
|
-
}
|
|
35
|
-
test("directory getter returns a working, cached DirectoryApi", () => {
|
|
36
|
-
const storage = makeStorage();
|
|
37
|
-
const dir = storage.directory;
|
|
38
|
-
assert.equal(typeof dir.mkdir, "function");
|
|
39
|
-
assert.equal(typeof dir.listDirectory, "function");
|
|
40
|
-
assert.equal(typeof dir.removeDirectory, "function");
|
|
41
|
-
assert.equal(typeof dir.walk, "function");
|
|
42
|
-
// Same instance is reused across accesses (lazily constructed once).
|
|
43
|
-
assert.equal(storage.directory, dir);
|
|
44
|
-
});
|
|
45
|
-
test("mkdir makes the path available as a directory prefix (15.1)", async () => {
|
|
46
|
-
const storage = makeStorage();
|
|
47
|
-
await storage.directory.mkdir("uploads");
|
|
48
|
-
// The marker key exists so the empty directory is discoverable.
|
|
49
|
-
assert.equal(await storage.exists("uploads/"), true);
|
|
50
|
-
// A freshly-made directory has no child entries yet.
|
|
51
|
-
const listing = await storage.directory.listDirectory("uploads");
|
|
52
|
-
assert.deepEqual(listing, []);
|
|
53
|
-
});
|
|
54
|
-
test("mkdir on the root/empty path is a no-op (15.1)", async () => {
|
|
55
|
-
const storage = makeStorage();
|
|
56
|
-
await storage.directory.mkdir("");
|
|
57
|
-
await storage.directory.mkdir("/");
|
|
58
|
-
// No marker keys were written for the root.
|
|
59
|
-
const keys = await storage.directory.walk("");
|
|
60
|
-
assert.deepEqual(keys, []);
|
|
61
|
-
});
|
|
62
|
-
test("listDirectory returns only immediate children (15.2)", async () => {
|
|
63
|
-
const storage = makeStorage();
|
|
64
|
-
await seed(storage);
|
|
65
|
-
const listing = await storage.directory.listDirectory("photos");
|
|
66
|
-
const keys = listing.map((item) => item.key).sort();
|
|
67
|
-
// Immediate children of photos/: two files and one sub-directory entry;
|
|
68
|
-
// deeper keys (photos/2024/holidays/...) collapse into photos/2024/.
|
|
69
|
-
assert.deepEqual(keys, ["photos/2024/", "photos/a.jpg", "photos/b.jpg"]);
|
|
70
|
-
// The sub-directory entry is synthesized with size 0.
|
|
71
|
-
const subdir = listing.find((item) => item.key === "photos/2024/");
|
|
72
|
-
assert.equal(subdir.size, 0);
|
|
73
|
-
// File entries carry their real byte sizes.
|
|
74
|
-
const fileA = listing.find((item) => item.key === "photos/a.jpg");
|
|
75
|
-
assert.equal(fileA.size, 1);
|
|
76
|
-
const fileB = listing.find((item) => item.key === "photos/b.jpg");
|
|
77
|
-
assert.equal(fileB.size, 2);
|
|
78
|
-
});
|
|
79
|
-
test("listDirectory accepts leading/trailing delimiters equivalently (15.2)", async () => {
|
|
80
|
-
const storage = makeStorage();
|
|
81
|
-
await seed(storage);
|
|
82
|
-
const a = (await storage.directory.listDirectory("photos")).map((i) => i.key).sort();
|
|
83
|
-
const b = (await storage.directory.listDirectory("/photos/")).map((i) => i.key).sort();
|
|
84
|
-
assert.deepEqual(a, b);
|
|
85
|
-
});
|
|
86
|
-
test("walk returns every object key beneath the prefix (15.4)", async () => {
|
|
87
|
-
const storage = makeStorage();
|
|
88
|
-
await seed(storage);
|
|
89
|
-
const keys = (await storage.directory.walk("photos")).sort();
|
|
90
|
-
assert.deepEqual(keys, [
|
|
91
|
-
"photos/2024/c.jpg",
|
|
92
|
-
"photos/2024/holidays/d.jpg",
|
|
93
|
-
"photos/a.jpg",
|
|
94
|
-
"photos/b.jpg",
|
|
95
|
-
]);
|
|
96
|
-
// walk excludes the directory's own marker key.
|
|
97
|
-
await storage.directory.mkdir("photos");
|
|
98
|
-
const withMarker = (await storage.directory.walk("photos")).sort();
|
|
99
|
-
assert.equal(withMarker.includes("photos/"), false);
|
|
100
|
-
});
|
|
101
|
-
test("removeDirectory removes every object under the prefix (15.3)", async () => {
|
|
102
|
-
const storage = makeStorage();
|
|
103
|
-
await seed(storage);
|
|
104
|
-
const result = await storage.directory.removeDirectory("photos");
|
|
105
|
-
assert.deepEqual(result, { removed: true });
|
|
106
|
-
// Nothing remains beneath photos/.
|
|
107
|
-
assert.deepEqual(await storage.directory.walk("photos"), []);
|
|
108
|
-
assert.equal(await storage.exists("photos/a.jpg"), false);
|
|
109
|
-
assert.equal(await storage.exists("photos/2024/holidays/d.jpg"), false);
|
|
110
|
-
// Sibling directories are untouched.
|
|
111
|
-
assert.equal(await storage.exists("docs/readme.txt"), true);
|
|
112
|
-
});
|
|
113
|
-
test("removeDirectory of an empty/missing prefix is a success no-op (15.6)", async () => {
|
|
114
|
-
const storage = makeStorage();
|
|
115
|
-
await seed(storage);
|
|
116
|
-
// Missing prefix: no objects removed, success result, siblings intact.
|
|
117
|
-
const missing = await storage.directory.removeDirectory("does-not-exist");
|
|
118
|
-
assert.deepEqual(missing, { removed: false });
|
|
119
|
-
assert.equal(await storage.exists("docs/readme.txt"), true);
|
|
120
|
-
// Removing twice: second call finds nothing and reports removed: false.
|
|
121
|
-
await storage.directory.removeDirectory("docs");
|
|
122
|
-
const second = await storage.directory.removeDirectory("docs");
|
|
123
|
-
assert.deepEqual(second, { removed: false });
|
|
124
|
-
});
|
|
125
|
-
//# sourceMappingURL=directory.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"directory.test.js","sourceRoot":"","sources":["../../src/tests/directory.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/tests/errors.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
// Unit tests for the typed error hierarchy of @streetjs/storage.
|
|
2
|
-
//
|
|
3
|
-
// Verifies that every concrete error subclass derives from both StorageError
|
|
4
|
-
// and the native Error (so consumers can catch the whole family or discriminate
|
|
5
|
-
// on a subclass), that each carries its descriptive typed fields, and that each
|
|
6
|
-
// sets `name` correctly. Uses the Node.js built-in test runner (node:test) and
|
|
7
|
-
// is executed via `node --test dist/tests/*.test.js`.
|
|
8
|
-
//
|
|
9
|
-
// Requirements: 1.5, 9.4, 11.3
|
|
10
|
-
import test from "node:test";
|
|
11
|
-
import assert from "node:assert/strict";
|
|
12
|
-
import { StorageError, StorageConfigError, NotFoundError, ValidationError, AuthorizationError, UnsupportedImageError, } from "../index.js";
|
|
13
|
-
test("StorageError is a native Error and sets its name", () => {
|
|
14
|
-
const err = new StorageError("boom");
|
|
15
|
-
assert.ok(err instanceof Error);
|
|
16
|
-
assert.ok(err instanceof StorageError);
|
|
17
|
-
assert.equal(err.name, "StorageError");
|
|
18
|
-
assert.equal(err.message, "boom");
|
|
19
|
-
});
|
|
20
|
-
test("StorageError carries an optional cause", () => {
|
|
21
|
-
const underlying = new Error("root cause");
|
|
22
|
-
const err = new StorageError("wrapped", { cause: underlying });
|
|
23
|
-
assert.equal(err.cause, underlying);
|
|
24
|
-
});
|
|
25
|
-
test("StorageConfigError is instanceof StorageError and Error", () => {
|
|
26
|
-
const err = new StorageConfigError("bad config", { provider: "s3" });
|
|
27
|
-
assert.ok(err instanceof Error);
|
|
28
|
-
assert.ok(err instanceof StorageError);
|
|
29
|
-
assert.ok(err instanceof StorageConfigError);
|
|
30
|
-
});
|
|
31
|
-
test("StorageConfigError carries provider and name", () => {
|
|
32
|
-
const err = new StorageConfigError("unknown provider", { provider: "nope" });
|
|
33
|
-
assert.equal(err.name, "StorageConfigError");
|
|
34
|
-
assert.equal(err.provider, "nope");
|
|
35
|
-
});
|
|
36
|
-
test("NotFoundError is instanceof StorageError and Error", () => {
|
|
37
|
-
const err = new NotFoundError("photos/1.png");
|
|
38
|
-
assert.ok(err instanceof Error);
|
|
39
|
-
assert.ok(err instanceof StorageError);
|
|
40
|
-
assert.ok(err instanceof NotFoundError);
|
|
41
|
-
});
|
|
42
|
-
test("NotFoundError carries key, name, and default message", () => {
|
|
43
|
-
const err = new NotFoundError("photos/1.png");
|
|
44
|
-
assert.equal(err.name, "NotFoundError");
|
|
45
|
-
assert.equal(err.key, "photos/1.png");
|
|
46
|
-
assert.equal(err.message, 'Object not found for key "photos/1.png"');
|
|
47
|
-
});
|
|
48
|
-
test("ValidationError is instanceof StorageError and Error", () => {
|
|
49
|
-
const err = new ValidationError("file too large");
|
|
50
|
-
assert.ok(err instanceof Error);
|
|
51
|
-
assert.ok(err instanceof StorageError);
|
|
52
|
-
assert.ok(err instanceof ValidationError);
|
|
53
|
-
});
|
|
54
|
-
test("ValidationError carries validationError, optional key, and name", () => {
|
|
55
|
-
const err = new ValidationError("file too large", { key: "uploads/big.zip" });
|
|
56
|
-
assert.equal(err.name, "ValidationError");
|
|
57
|
-
assert.equal(err.validationError, "file too large");
|
|
58
|
-
assert.equal(err.key, "uploads/big.zip");
|
|
59
|
-
assert.equal(err.message, "Upload validation failed: file too large");
|
|
60
|
-
});
|
|
61
|
-
test("AuthorizationError is instanceof StorageError and Error", () => {
|
|
62
|
-
const err = new AuthorizationError("denied");
|
|
63
|
-
assert.ok(err instanceof Error);
|
|
64
|
-
assert.ok(err instanceof StorageError);
|
|
65
|
-
assert.ok(err instanceof AuthorizationError);
|
|
66
|
-
});
|
|
67
|
-
test("AuthorizationError carries key, operation, accessLevel, and name", () => {
|
|
68
|
-
const err = new AuthorizationError("access denied", {
|
|
69
|
-
key: "private/secret.txt",
|
|
70
|
-
operation: "read",
|
|
71
|
-
accessLevel: "private",
|
|
72
|
-
});
|
|
73
|
-
assert.equal(err.name, "AuthorizationError");
|
|
74
|
-
assert.equal(err.key, "private/secret.txt");
|
|
75
|
-
assert.equal(err.operation, "read");
|
|
76
|
-
assert.equal(err.accessLevel, "private");
|
|
77
|
-
});
|
|
78
|
-
test("UnsupportedImageError is instanceof StorageError and Error", () => {
|
|
79
|
-
const err = new UnsupportedImageError("cannot process");
|
|
80
|
-
assert.ok(err instanceof Error);
|
|
81
|
-
assert.ok(err instanceof StorageError);
|
|
82
|
-
assert.ok(err instanceof UnsupportedImageError);
|
|
83
|
-
});
|
|
84
|
-
test("UnsupportedImageError carries format, key, and name", () => {
|
|
85
|
-
const err = new UnsupportedImageError("unsupported format", {
|
|
86
|
-
format: "image/tiff",
|
|
87
|
-
key: "images/scan.tiff",
|
|
88
|
-
});
|
|
89
|
-
assert.equal(err.name, "UnsupportedImageError");
|
|
90
|
-
assert.equal(err.format, "image/tiff");
|
|
91
|
-
assert.equal(err.key, "images/scan.tiff");
|
|
92
|
-
});
|
|
93
|
-
//# sourceMappingURL=errors.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/tests/errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events-bridge.test.d.ts","sourceRoot":"","sources":["../../src/tests/events-bridge.test.ts"],"names":[],"mappings":""}
|