@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
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
// Unit tests for the in-process testing utilities (task 25.1).
|
|
2
|
-
//
|
|
3
|
-
// Verifies the zero-network test doubles exported from the ./testing submodule:
|
|
4
|
-
// MemoryStorage, FakeStorage, StorageHarness (advanceable clock + assertions),
|
|
5
|
-
// FakeUpload, and FakeDownload. All run entirely in-process with no external
|
|
6
|
-
// service (Requirement 22.2) and sit on the same Storage/StorageDriver contract
|
|
7
|
-
// as production code (Requirements 22.1, 22.3).
|
|
8
|
-
//
|
|
9
|
-
// Imported from the built submodule entry point (`../testing/index.js`) which
|
|
10
|
-
// backs the package's `@streetjs/storage/testing` subpath export.
|
|
11
|
-
//
|
|
12
|
-
// Requirements: 22.1, 22.2, 22.3
|
|
13
|
-
import test from "node:test";
|
|
14
|
-
import assert from "node:assert/strict";
|
|
15
|
-
import { MemoryStorage, FakeStorage, StorageHarness, FakeUpload, FakeDownload, MemoryStorageDriver, createAdvanceableClock, } from "../testing/index.js";
|
|
16
|
-
function bytes(str) {
|
|
17
|
-
return new TextEncoder().encode(str);
|
|
18
|
-
}
|
|
19
|
-
test("MemoryStorage returns a working in-memory Storage facade", async () => {
|
|
20
|
-
const storage = MemoryStorage();
|
|
21
|
-
const meta = await storage.put("a.txt", "hello");
|
|
22
|
-
assert.equal(meta.key, "a.txt");
|
|
23
|
-
assert.equal(await storage.exists("a.txt"), true);
|
|
24
|
-
const got = await storage.get("a.txt");
|
|
25
|
-
assert.equal(got.found, true);
|
|
26
|
-
assert.deepEqual(Buffer.from(got.bytes), Buffer.from(bytes("hello")));
|
|
27
|
-
});
|
|
28
|
-
test("MemoryStorageDriver is re-exported for driver-level substitution", async () => {
|
|
29
|
-
const driver = new MemoryStorageDriver();
|
|
30
|
-
const meta = await driver.put("k", bytes("x"), {});
|
|
31
|
-
assert.equal(meta.size, 1);
|
|
32
|
-
assert.equal(await driver.exists("k"), true);
|
|
33
|
-
});
|
|
34
|
-
test("createAdvanceableClock advances and sets deterministically", () => {
|
|
35
|
-
const clock = createAdvanceableClock(1000);
|
|
36
|
-
assert.equal(clock(), 1000);
|
|
37
|
-
clock.advance(500);
|
|
38
|
-
assert.equal(clock(), 1500);
|
|
39
|
-
assert.equal(clock.now(), 1500);
|
|
40
|
-
clock.set(42);
|
|
41
|
-
assert.equal(clock(), 42);
|
|
42
|
-
});
|
|
43
|
-
test("FakeStorage is substitutable for the facade and controls time", async () => {
|
|
44
|
-
const storage = new FakeStorage();
|
|
45
|
-
const meta = await storage.put("doc", "content");
|
|
46
|
-
// Timestamps come from the advanceable clock, not wall time.
|
|
47
|
-
assert.equal(meta.createdAt, storage.clock.now());
|
|
48
|
-
storage.advanceTime(10_000);
|
|
49
|
-
const meta2 = await storage.put("doc", "content-v2");
|
|
50
|
-
assert.equal(meta2.updatedAt, storage.clock.now());
|
|
51
|
-
assert.ok(meta2.updatedAt > meta.createdAt);
|
|
52
|
-
// Full facade surface is present (stats + probe delegate to the real facade).
|
|
53
|
-
const stats = storage.stats();
|
|
54
|
-
assert.equal(typeof stats.uploads, "number");
|
|
55
|
-
const probe = await storage.probe();
|
|
56
|
-
assert.equal(typeof probe.connectivity, "boolean");
|
|
57
|
-
await storage.close();
|
|
58
|
-
});
|
|
59
|
-
test("StorageHarness assertions pass for matching state", async () => {
|
|
60
|
-
const harness = new StorageHarness();
|
|
61
|
-
await harness.storage.put("k1", "one");
|
|
62
|
-
await harness.storage.put("k2", "two");
|
|
63
|
-
await harness.assertExists("k1");
|
|
64
|
-
await harness.assertMissing("nope");
|
|
65
|
-
await harness.assertContent("k1", "one");
|
|
66
|
-
await harness.assertSize("k2", 3);
|
|
67
|
-
await harness.assertKeys("", ["k1", "k2"]);
|
|
68
|
-
await harness.close();
|
|
69
|
-
});
|
|
70
|
-
test("StorageHarness assertions fail loudly on mismatch", async () => {
|
|
71
|
-
const harness = new StorageHarness();
|
|
72
|
-
await harness.storage.put("k", "abc");
|
|
73
|
-
await assert.rejects(() => harness.assertContent("k", "xyz"));
|
|
74
|
-
await assert.rejects(() => harness.assertMissing("k"));
|
|
75
|
-
});
|
|
76
|
-
test("StorageHarness advanceable clock drives object timestamps", async () => {
|
|
77
|
-
const harness = new StorageHarness();
|
|
78
|
-
harness.setTime(5000);
|
|
79
|
-
const meta = await harness.storage.put("t", "v");
|
|
80
|
-
assert.equal(meta.createdAt, 5000);
|
|
81
|
-
harness.advance(2000);
|
|
82
|
-
const meta2 = await harness.storage.put("t", "v2");
|
|
83
|
-
assert.equal(meta2.updatedAt, 7000);
|
|
84
|
-
});
|
|
85
|
-
test("FakeUpload buffers chunks and persists on complete", async () => {
|
|
86
|
-
const storage = MemoryStorage();
|
|
87
|
-
const upload = new FakeUpload(storage, "big.bin");
|
|
88
|
-
upload.write("part-1;");
|
|
89
|
-
upload.write(bytes("part-2"));
|
|
90
|
-
assert.equal(upload.bytesWritten, "part-1;".length + "part-2".length);
|
|
91
|
-
assert.equal(upload.isCompleted, false);
|
|
92
|
-
const meta = await upload.complete();
|
|
93
|
-
assert.equal(upload.isCompleted, true);
|
|
94
|
-
assert.equal(meta.key, "big.bin");
|
|
95
|
-
const got = await storage.get("big.bin");
|
|
96
|
-
assert.deepEqual(Buffer.from(got.bytes), Buffer.from(bytes("part-1;part-2")));
|
|
97
|
-
assert.throws(() => upload.write("more"));
|
|
98
|
-
await assert.rejects(() => upload.complete());
|
|
99
|
-
});
|
|
100
|
-
test("FakeUpload abort discards buffered content", async () => {
|
|
101
|
-
const storage = MemoryStorage();
|
|
102
|
-
const upload = new FakeUpload(storage, "gone.bin");
|
|
103
|
-
upload.write("data");
|
|
104
|
-
upload.abort();
|
|
105
|
-
assert.equal(upload.isAborted, true);
|
|
106
|
-
assert.equal(upload.bytesWritten, 0);
|
|
107
|
-
assert.equal(await storage.exists("gone.bin"), false);
|
|
108
|
-
assert.throws(() => upload.write("x"));
|
|
109
|
-
await assert.rejects(() => upload.complete());
|
|
110
|
-
});
|
|
111
|
-
test("FakeDownload reads bytes, text, and chunks; reports absence", async () => {
|
|
112
|
-
const storage = MemoryStorage();
|
|
113
|
-
await storage.put("read.txt", "hello world");
|
|
114
|
-
const download = new FakeDownload(storage, "read.txt");
|
|
115
|
-
assert.equal(await download.found(), true);
|
|
116
|
-
assert.deepEqual(Buffer.from(await download.bytes()), Buffer.from(bytes("hello world")));
|
|
117
|
-
assert.equal(await download.text(), "hello world");
|
|
118
|
-
const collected = [];
|
|
119
|
-
for await (const chunk of download.chunks(4)) {
|
|
120
|
-
collected.push(Buffer.from(chunk));
|
|
121
|
-
}
|
|
122
|
-
assert.deepEqual(Buffer.concat(collected), Buffer.from(bytes("hello world")));
|
|
123
|
-
// Every non-final chunk respects the requested size bound.
|
|
124
|
-
for (const chunk of collected.slice(0, -1)) {
|
|
125
|
-
assert.equal(chunk.byteLength, 4);
|
|
126
|
-
}
|
|
127
|
-
const missing = new FakeDownload(storage, "absent.txt");
|
|
128
|
-
assert.equal(await missing.found(), false);
|
|
129
|
-
await assert.rejects(() => missing.bytes());
|
|
130
|
-
});
|
|
131
|
-
test("signed URLs work out of the box on the doubles (no external service)", async () => {
|
|
132
|
-
const storage = new FakeStorage();
|
|
133
|
-
await storage.put("secret", "s");
|
|
134
|
-
const url = await storage.signedUrl("secret", "GET");
|
|
135
|
-
assert.equal(typeof url, "string");
|
|
136
|
-
assert.ok(url.length > 0);
|
|
137
|
-
});
|
|
138
|
-
//# sourceMappingURL=testing-utilities.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"testing-utilities.test.js","sourceRoot":"","sources":["../../src/tests/testing-utilities.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../../src/tests/validation.test.ts"],"names":[],"mappings":""}
|
|
@@ -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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"}
|