@streetjs/storage 1.0.0 → 1.0.1
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/package.json +12 -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.d.ts +0 -131
- package/dist/tests/contract.d.ts.map +0 -1
- package/dist/tests/contract.js +0 -222
- package/dist/tests/contract.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
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
// Unit tests for the pre-persistence validation pipeline of @streetjs/storage.
|
|
2
|
-
//
|
|
3
|
-
// Covers the built-in validators (MIME type, extension, size, filename,
|
|
4
|
-
// checksum, custom), their ordering/short-circuit behavior, and the facade
|
|
5
|
-
// wiring: when `config.validation` is set, a rejected upload aborts with a
|
|
6
|
-
// ValidationError and leaves NO object stored (Requirements 9.1, 9.2, 9.3, 9.4).
|
|
7
|
-
//
|
|
8
|
-
// Uses the Node.js built-in test runner (node:test), executed via
|
|
9
|
-
// `node --test dist/tests/*.test.js`.
|
|
10
|
-
//
|
|
11
|
-
// Requirements: 9.1, 9.2, 9.3, 9.4
|
|
12
|
-
import test from "node:test";
|
|
13
|
-
import assert from "node:assert/strict";
|
|
14
|
-
import { Readable } from "node:stream";
|
|
15
|
-
import { ValidationPipeline } from "../validation.js";
|
|
16
|
-
import { createStorage } from "../facade.js";
|
|
17
|
-
import { ValidationError } from "../errors.js";
|
|
18
|
-
// ── Pipeline-level tests ──────────────────────────────────────────────────────
|
|
19
|
-
test("MIME type validator accepts allowed exact and wildcard types", async () => {
|
|
20
|
-
const pipeline = new ValidationPipeline({ allowedMimeTypes: ["image/png", "text/*"] });
|
|
21
|
-
assert.equal((await pipeline.validate({ key: "a.png", size: 1, contentType: "image/png" })).ok, true);
|
|
22
|
-
assert.equal((await pipeline.validate({ key: "a.txt", size: 1, contentType: "text/plain" })).ok, true);
|
|
23
|
-
});
|
|
24
|
-
test("MIME type validator rejects disallowed or missing content type", async () => {
|
|
25
|
-
const pipeline = new ValidationPipeline({ allowedMimeTypes: ["image/png"] });
|
|
26
|
-
const disallowed = await pipeline.validate({ key: "a.gif", size: 1, contentType: "image/gif" });
|
|
27
|
-
assert.equal(disallowed.ok, false);
|
|
28
|
-
assert.ok(disallowed.error.includes("image/gif"));
|
|
29
|
-
const missing = await pipeline.validate({ key: "a", size: 1 });
|
|
30
|
-
assert.equal(missing.ok, false);
|
|
31
|
-
});
|
|
32
|
-
test("extension validator normalizes dots and case", async () => {
|
|
33
|
-
const pipeline = new ValidationPipeline({ allowedExtensions: [".PNG", "jpg"] });
|
|
34
|
-
assert.equal((await pipeline.validate({ key: "photos/a.png", size: 1 })).ok, true);
|
|
35
|
-
assert.equal((await pipeline.validate({ key: "photos/a.JPG", size: 1 })).ok, true);
|
|
36
|
-
const bad = await pipeline.validate({ key: "photos/a.gif", size: 1 });
|
|
37
|
-
assert.equal(bad.ok, false);
|
|
38
|
-
const none = await pipeline.validate({ key: "photos/noext", size: 1 });
|
|
39
|
-
assert.equal(none.ok, false);
|
|
40
|
-
});
|
|
41
|
-
test("size validator rejects content larger than maxSize", async () => {
|
|
42
|
-
const pipeline = new ValidationPipeline({ maxSize: 10 });
|
|
43
|
-
assert.equal((await pipeline.validate({ key: "a", size: 10 })).ok, true);
|
|
44
|
-
const tooBig = await pipeline.validate({ key: "a", size: 11 });
|
|
45
|
-
assert.equal(tooBig.ok, false);
|
|
46
|
-
assert.ok(tooBig.error.includes("11"));
|
|
47
|
-
});
|
|
48
|
-
test("filename validator matches against the final path segment", async () => {
|
|
49
|
-
const pipeline = new ValidationPipeline({ filenamePattern: /^[a-z0-9_-]+\.txt$/ });
|
|
50
|
-
assert.equal((await pipeline.validate({ key: "dir/valid_name.txt", size: 1 })).ok, true);
|
|
51
|
-
const bad = await pipeline.validate({ key: "dir/Bad Name.txt", size: 1 });
|
|
52
|
-
assert.equal(bad.ok, false);
|
|
53
|
-
});
|
|
54
|
-
test("filename validator with a global pattern is not stateful across calls", async () => {
|
|
55
|
-
const pipeline = new ValidationPipeline({ filenamePattern: /\.txt$/g });
|
|
56
|
-
assert.equal((await pipeline.validate({ key: "a.txt", size: 1 })).ok, true);
|
|
57
|
-
assert.equal((await pipeline.validate({ key: "b.txt", size: 1 })).ok, true);
|
|
58
|
-
});
|
|
59
|
-
test("checksum validator requires a non-empty checksum when configured", async () => {
|
|
60
|
-
const pipeline = new ValidationPipeline({ requireChecksum: true });
|
|
61
|
-
assert.equal((await pipeline.validate({ key: "a", size: 1, checksum: "abc" })).ok, true);
|
|
62
|
-
assert.equal((await pipeline.validate({ key: "a", size: 1 })).ok, false);
|
|
63
|
-
assert.equal((await pipeline.validate({ key: "a", size: 1, checksum: "" })).ok, false);
|
|
64
|
-
});
|
|
65
|
-
test("custom validator result is returned verbatim and runs last", async () => {
|
|
66
|
-
const pipeline = new ValidationPipeline({
|
|
67
|
-
custom: (input) => ({ ok: false, error: `custom rejected ${input.key}` }),
|
|
68
|
-
});
|
|
69
|
-
const result = await pipeline.validate({ key: "x", size: 1 });
|
|
70
|
-
assert.equal(result.ok, false);
|
|
71
|
-
assert.equal(result.error, "custom rejected x");
|
|
72
|
-
});
|
|
73
|
-
test("pipeline short-circuits on the first rejection in order", async () => {
|
|
74
|
-
// Size (validator 3) rejects; the custom validator (validator 6) must not run.
|
|
75
|
-
let customRan = false;
|
|
76
|
-
const pipeline = new ValidationPipeline({
|
|
77
|
-
maxSize: 5,
|
|
78
|
-
custom: () => {
|
|
79
|
-
customRan = true;
|
|
80
|
-
return { ok: true };
|
|
81
|
-
},
|
|
82
|
-
});
|
|
83
|
-
const result = await pipeline.validate({ key: "a", size: 100 });
|
|
84
|
-
assert.equal(result.ok, false);
|
|
85
|
-
assert.equal(customRan, false);
|
|
86
|
-
});
|
|
87
|
-
test("empty config accepts everything", async () => {
|
|
88
|
-
const pipeline = new ValidationPipeline({});
|
|
89
|
-
assert.equal((await pipeline.validate({ key: "anything", size: 12345 })).ok, true);
|
|
90
|
-
});
|
|
91
|
-
// ── Facade wiring tests ────────────────────────────────────────────────────────
|
|
92
|
-
test("facade put rejects invalid uploads and stores no object", async () => {
|
|
93
|
-
const storage = createStorage({
|
|
94
|
-
provider: "memory",
|
|
95
|
-
validation: { maxSize: 4 },
|
|
96
|
-
});
|
|
97
|
-
await assert.rejects(() => storage.put("big.bin", new Uint8Array([1, 2, 3, 4, 5])), (err) => err instanceof ValidationError);
|
|
98
|
-
assert.equal(await storage.exists("big.bin"), false);
|
|
99
|
-
});
|
|
100
|
-
test("facade put persists valid uploads when validation passes", async () => {
|
|
101
|
-
const storage = createStorage({
|
|
102
|
-
provider: "memory",
|
|
103
|
-
validation: { maxSize: 16, allowedExtensions: ["txt"] },
|
|
104
|
-
});
|
|
105
|
-
const meta = await storage.put("notes/a.txt", "hello");
|
|
106
|
-
assert.equal(meta.key, "notes/a.txt");
|
|
107
|
-
assert.equal(await storage.exists("notes/a.txt"), true);
|
|
108
|
-
});
|
|
109
|
-
test("facade putStream rejects invalid uploads and stores no object", async () => {
|
|
110
|
-
const storage = createStorage({
|
|
111
|
-
provider: "memory",
|
|
112
|
-
validation: { maxSize: 3 },
|
|
113
|
-
});
|
|
114
|
-
const stream = Readable.from([Buffer.from([1, 2, 3, 4, 5, 6])]);
|
|
115
|
-
await assert.rejects(() => storage.putStream("stream.bin", stream), (err) => err instanceof ValidationError);
|
|
116
|
-
assert.equal(await storage.exists("stream.bin"), false);
|
|
117
|
-
});
|
|
118
|
-
test("facade putStream persists valid uploads and preserves bytes", async () => {
|
|
119
|
-
const storage = createStorage({
|
|
120
|
-
provider: "memory",
|
|
121
|
-
validation: { maxSize: 1024 },
|
|
122
|
-
});
|
|
123
|
-
const content = Buffer.from("streamed payload");
|
|
124
|
-
const stream = Readable.from([content]);
|
|
125
|
-
await storage.putStream("ok.bin", stream);
|
|
126
|
-
const result = await storage.get("ok.bin");
|
|
127
|
-
assert.equal(result.found, true);
|
|
128
|
-
assert.deepEqual(result.bytes, new Uint8Array(content));
|
|
129
|
-
});
|
|
130
|
-
test("facade without validation config performs no validation", async () => {
|
|
131
|
-
const storage = createStorage({ provider: "memory" });
|
|
132
|
-
await storage.put("huge.bin", new Uint8Array(1000));
|
|
133
|
-
assert.equal(await storage.exists("huge.bin"), true);
|
|
134
|
-
});
|
|
135
|
-
//# sourceMappingURL=validation.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../src/tests/validation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"versioning.test.d.ts","sourceRoot":"","sources":["../../src/tests/versioning.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
// Unit tests for the versioning manager wired into the storage facade
|
|
2
|
-
// (task 14.1).
|
|
3
|
-
//
|
|
4
|
-
// Verifies the Requirement 12 semantics over the zero-dependency `memory`
|
|
5
|
-
// provider (which has no native `versioning` capability, so the manager
|
|
6
|
-
// simulates version snapshots over the driver primitives under reserved
|
|
7
|
-
// `.versions/<key>/<versionId>` keys):
|
|
8
|
-
//
|
|
9
|
-
// - overwriting a versioned key snapshots the prior content; unlimited
|
|
10
|
-
// Versions are retained (12.1).
|
|
11
|
-
// - listVersions returns the retained Version identifiers for a key (12.2).
|
|
12
|
-
// - restoreVersion makes a listed Version's content the current content (12.3).
|
|
13
|
-
// - deleteVersion removes only that Version and retains the rest (12.4).
|
|
14
|
-
// - a versioning-mechanism failure allows the overwrite to proceed WITHOUT
|
|
15
|
-
// creating a Version (12.5).
|
|
16
|
-
// - with versioning disabled no Versions are recorded.
|
|
17
|
-
//
|
|
18
|
-
// Uses the Node.js built-in test runner (node:test); executed via
|
|
19
|
-
// `node --test dist/tests/*.test.js`.
|
|
20
|
-
//
|
|
21
|
-
// Requirements: 12.1, 12.2, 12.3, 12.4, 12.5
|
|
22
|
-
import test from "node:test";
|
|
23
|
-
import assert from "node:assert/strict";
|
|
24
|
-
import { createStorage } from "../facade.js";
|
|
25
|
-
import { VersioningManager } from "../versioning.js";
|
|
26
|
-
import { MemoryStorageDriver } from "../drivers/memory.js";
|
|
27
|
-
import { NotFoundError } from "../errors.js";
|
|
28
|
-
const fixedClock = () => 1_700_000_000_000;
|
|
29
|
-
test("overwrite snapshots prior content and retains unlimited Versions (Req 12.1)", async () => {
|
|
30
|
-
const storage = createStorage({ provider: "memory", versioning: true, clock: fixedClock });
|
|
31
|
-
await storage.put("doc", "v1", { contentType: "text/plain" });
|
|
32
|
-
await storage.put("doc", "v2", { contentType: "text/plain" });
|
|
33
|
-
await storage.put("doc", "v3", { contentType: "text/plain" });
|
|
34
|
-
// Three writes → the two overwrites each snapshot the prior content.
|
|
35
|
-
const versions = await storage.listVersions("doc");
|
|
36
|
-
assert.equal(versions.length, 2);
|
|
37
|
-
// Current content is the latest write.
|
|
38
|
-
const got = await storage.get("doc");
|
|
39
|
-
assert.equal(Buffer.from(got.bytes).toString(), "v3");
|
|
40
|
-
});
|
|
41
|
-
test("first write to a key creates no Version (Req 12.1)", async () => {
|
|
42
|
-
const storage = createStorage({ provider: "memory", versioning: true, clock: fixedClock });
|
|
43
|
-
await storage.put("fresh", "only");
|
|
44
|
-
assert.deepEqual(await storage.listVersions("fresh"), []);
|
|
45
|
-
});
|
|
46
|
-
test("listVersions returns retained Version identifiers (Req 12.2)", async () => {
|
|
47
|
-
const storage = createStorage({ provider: "memory", versioning: true, clock: fixedClock });
|
|
48
|
-
await storage.put("k", "a");
|
|
49
|
-
await storage.put("k", "b");
|
|
50
|
-
const versions = await storage.listVersions("k");
|
|
51
|
-
assert.equal(versions.length, 1);
|
|
52
|
-
assert.equal(typeof versions[0].versionId, "string");
|
|
53
|
-
assert.ok(versions[0].versionId.length > 0);
|
|
54
|
-
assert.equal(versions[0].size, Buffer.byteLength("a"));
|
|
55
|
-
});
|
|
56
|
-
test("restoreVersion makes a Version's content current (Req 12.3)", async () => {
|
|
57
|
-
const storage = createStorage({ provider: "memory", versioning: true, clock: fixedClock });
|
|
58
|
-
await storage.put("k", "original", { contentType: "text/plain" });
|
|
59
|
-
await storage.put("k", "changed", { contentType: "text/plain" });
|
|
60
|
-
const [v1] = await storage.listVersions("k");
|
|
61
|
-
const meta = await storage.restoreVersion("k", v1.versionId);
|
|
62
|
-
assert.equal(meta.key, "k");
|
|
63
|
-
const got = await storage.get("k");
|
|
64
|
-
assert.equal(Buffer.from(got.bytes).toString(), "original");
|
|
65
|
-
});
|
|
66
|
-
test("restoreVersion of an unknown Version throws NotFoundError", async () => {
|
|
67
|
-
const storage = createStorage({ provider: "memory", versioning: true, clock: fixedClock });
|
|
68
|
-
await storage.put("k", "x");
|
|
69
|
-
await assert.rejects(() => storage.restoreVersion("k", "nope"), NotFoundError);
|
|
70
|
-
});
|
|
71
|
-
test("deleteVersion removes only that Version and retains the rest (Req 12.4)", async () => {
|
|
72
|
-
const storage = createStorage({ provider: "memory", versioning: true, clock: fixedClock });
|
|
73
|
-
await storage.put("k", "a");
|
|
74
|
-
await storage.put("k", "b");
|
|
75
|
-
await storage.put("k", "c");
|
|
76
|
-
const versions = await storage.listVersions("k");
|
|
77
|
-
assert.equal(versions.length, 2);
|
|
78
|
-
await storage.deleteVersion("k", versions[0].versionId);
|
|
79
|
-
const remaining = await storage.listVersions("k");
|
|
80
|
-
assert.equal(remaining.length, 1);
|
|
81
|
-
assert.equal(remaining[0].versionId, versions[1].versionId);
|
|
82
|
-
});
|
|
83
|
-
test("versioning failure allows the overwrite to proceed without a Version (Req 12.5)", async () => {
|
|
84
|
-
// A driver whose get() throws simulates a versioning-mechanism failure while
|
|
85
|
-
// snapshotting. The overwrite must still succeed and record no Version.
|
|
86
|
-
const base = new MemoryStorageDriver({ clock: fixedClock });
|
|
87
|
-
let failNextGet = false;
|
|
88
|
-
const flaky = {
|
|
89
|
-
...base,
|
|
90
|
-
name: "flaky",
|
|
91
|
-
put: (key, bytes, meta) => base.put(key, bytes, meta),
|
|
92
|
-
get: (key) => {
|
|
93
|
-
if (failNextGet) {
|
|
94
|
-
return Promise.reject(new Error("snapshot storage constraint"));
|
|
95
|
-
}
|
|
96
|
-
return base.get(key);
|
|
97
|
-
},
|
|
98
|
-
exists: (key) => base.exists(key),
|
|
99
|
-
delete: (key) => base.delete(key),
|
|
100
|
-
stat: (key) => base.stat(key),
|
|
101
|
-
list: (prefix, options) => base.list(prefix, options),
|
|
102
|
-
putStream: (key, stream, meta) => base.putStream(key, stream, meta),
|
|
103
|
-
getStream: (key) => base.getStream(key),
|
|
104
|
-
};
|
|
105
|
-
const storage = createStorage({ provider: "custom", driver: flaky, versioning: true });
|
|
106
|
-
await storage.put("k", "v1");
|
|
107
|
-
// Force the snapshot read to fail on the overwrite.
|
|
108
|
-
failNextGet = true;
|
|
109
|
-
const meta = await storage.put("k", "v2");
|
|
110
|
-
failNextGet = false;
|
|
111
|
-
assert.equal(meta.key, "k");
|
|
112
|
-
const got = await storage.get("k");
|
|
113
|
-
assert.equal(Buffer.from(got.bytes).toString(), "v2");
|
|
114
|
-
// No Version was created because the snapshot failed (listVersions reads
|
|
115
|
-
// succeed again once the flag is cleared).
|
|
116
|
-
assert.deepEqual(await storage.listVersions("k"), []);
|
|
117
|
-
});
|
|
118
|
-
test("with versioning disabled no Versions are recorded", async () => {
|
|
119
|
-
const storage = createStorage({ provider: "memory", clock: fixedClock });
|
|
120
|
-
await storage.put("k", "a");
|
|
121
|
-
await storage.put("k", "b");
|
|
122
|
-
assert.deepEqual(await storage.listVersions("k"), []);
|
|
123
|
-
});
|
|
124
|
-
test("VersioningManager is exported and constructible", () => {
|
|
125
|
-
const manager = new VersioningManager(new MemoryStorageDriver({ clock: fixedClock }));
|
|
126
|
-
assert.ok(manager instanceof VersioningManager);
|
|
127
|
-
});
|
|
128
|
-
//# sourceMappingURL=versioning.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"versioning.test.js","sourceRoot":"","sources":["../../src/tests/versioning.test.ts"],"names":[],"mappings":"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"}
|