@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,106 +0,0 @@
|
|
|
1
|
-
// Unit tests for search filtering wired into the storage facade (task 18.1).
|
|
2
|
-
//
|
|
3
|
-
// Verifies the Requirement 16 semantics over the zero-dependency `memory`
|
|
4
|
-
// provider, exercised through `storage.search`:
|
|
5
|
-
//
|
|
6
|
-
// - Filtering supports prefix, contentType, owner, tenant, size range,
|
|
7
|
-
// updated-time range, and custom metadata (16.1).
|
|
8
|
-
// - Multiple filters combine with AND semantics: only objects satisfying
|
|
9
|
-
// EVERY supplied filter are returned (16.2).
|
|
10
|
-
// - When no object satisfies the filters, an empty result set is returned
|
|
11
|
-
// (16.3).
|
|
12
|
-
// - Reserved internal keys (.versions/ etc.) are excluded from broad searches.
|
|
13
|
-
//
|
|
14
|
-
// Uses the Node.js built-in test runner (node:test); executed via
|
|
15
|
-
// `node --test dist/tests/*.test.js`.
|
|
16
|
-
//
|
|
17
|
-
// Requirements: 16.1, 16.2, 16.3
|
|
18
|
-
import test from "node:test";
|
|
19
|
-
import assert from "node:assert/strict";
|
|
20
|
-
import { createStorage } from "../facade.js";
|
|
21
|
-
import { searchObjects } from "../search.js";
|
|
22
|
-
import { MemoryStorageDriver } from "../drivers/memory.js";
|
|
23
|
-
/** A fixed clock so updatedAt values are deterministic for time-range filters. */
|
|
24
|
-
function fixedClock(now) {
|
|
25
|
-
return () => now;
|
|
26
|
-
}
|
|
27
|
-
/** Build a facade backed by a fresh in-memory driver with a fixed clock. */
|
|
28
|
-
function makeStorage(now = 1000) {
|
|
29
|
-
const driver = new MemoryStorageDriver({ clock: fixedClock(now) });
|
|
30
|
-
return { storage: createStorage({ provider: "memory", driver }), driver };
|
|
31
|
-
}
|
|
32
|
-
/** Collect the sorted keys from a list of StorageListItem results. */
|
|
33
|
-
function keysOf(items) {
|
|
34
|
-
return items.map((item) => item.key).sort();
|
|
35
|
-
}
|
|
36
|
-
test("search returns exactly the objects satisfying EVERY supplied filter (16.2)", async () => {
|
|
37
|
-
const { storage } = makeStorage();
|
|
38
|
-
// Two objects share owner "alice"; one also matches the content type and size.
|
|
39
|
-
await storage.put("photos/a.jpg", "aa", { contentType: "image/jpeg", owner: "alice" }); // size 2
|
|
40
|
-
await storage.put("photos/b.png", "bbbbb", { contentType: "image/png", owner: "alice" }); // size 5
|
|
41
|
-
await storage.put("photos/c.jpg", "cccc", { contentType: "image/jpeg", owner: "bob" }); // size 4
|
|
42
|
-
await storage.put("docs/readme.txt", "hello", { contentType: "text/plain", owner: "alice" });
|
|
43
|
-
// Conjunctive filter: prefix AND contentType AND owner AND size range.
|
|
44
|
-
const result = await storage.search({
|
|
45
|
-
prefix: "photos/",
|
|
46
|
-
contentType: "image/jpeg",
|
|
47
|
-
owner: "alice",
|
|
48
|
-
minSize: 1,
|
|
49
|
-
maxSize: 3,
|
|
50
|
-
});
|
|
51
|
-
// Only photos/a.jpg satisfies all four constraints at once.
|
|
52
|
-
assert.deepEqual(keysOf(result), ["photos/a.jpg"]);
|
|
53
|
-
});
|
|
54
|
-
test("each filter dimension narrows results independently (16.1)", async () => {
|
|
55
|
-
const { storage } = makeStorage(5000);
|
|
56
|
-
await storage.put("t1/x", "a", { owner: "alice", tenant: "acme", contentType: "text/plain" });
|
|
57
|
-
await storage.put("t1/y", "bb", { owner: "bob", tenant: "acme", contentType: "text/plain" });
|
|
58
|
-
await storage.put("t2/z", "ccc", { owner: "alice", tenant: "globex", contentType: "image/png" });
|
|
59
|
-
assert.deepEqual(keysOf(await storage.search({ owner: "alice" })), ["t1/x", "t2/z"]);
|
|
60
|
-
assert.deepEqual(keysOf(await storage.search({ tenant: "acme" })), ["t1/x", "t1/y"]);
|
|
61
|
-
assert.deepEqual(keysOf(await storage.search({ contentType: "image/png" })), ["t2/z"]);
|
|
62
|
-
assert.deepEqual(keysOf(await storage.search({ prefix: "t1/" })), ["t1/x", "t1/y"]);
|
|
63
|
-
// Size range: only the 2-byte and 3-byte objects.
|
|
64
|
-
assert.deepEqual(keysOf(await storage.search({ minSize: 2 })), ["t1/y", "t2/z"]);
|
|
65
|
-
});
|
|
66
|
-
test("search matches on updated-time range and custom metadata (16.1)", async () => {
|
|
67
|
-
const { storage } = makeStorage(2000);
|
|
68
|
-
await storage.put("k1", "one", { custom: { category: "invoice", region: "eu" } });
|
|
69
|
-
await storage.put("k2", "two", { custom: { category: "receipt", region: "eu" } });
|
|
70
|
-
// Custom metadata filter (AND across supplied custom fields).
|
|
71
|
-
const invoices = await storage.search({ metadata: { category: "invoice" } });
|
|
72
|
-
assert.deepEqual(keysOf(invoices), ["k1"]);
|
|
73
|
-
const euReceipts = await storage.search({ metadata: { category: "receipt", region: "eu" } });
|
|
74
|
-
assert.deepEqual(keysOf(euReceipts), ["k2"]);
|
|
75
|
-
// Time range covering the fixed clock value returns all; a window before it none.
|
|
76
|
-
assert.deepEqual(keysOf(await storage.search({ updatedAfter: 1000, updatedBefore: 3000 })), [
|
|
77
|
-
"k1",
|
|
78
|
-
"k2",
|
|
79
|
-
]);
|
|
80
|
-
assert.deepEqual(await storage.search({ updatedBefore: 1000 }), []);
|
|
81
|
-
});
|
|
82
|
-
test("search returns an empty set when no object matches (16.3)", async () => {
|
|
83
|
-
const { storage } = makeStorage();
|
|
84
|
-
await storage.put("photos/a.jpg", "aa", { contentType: "image/jpeg", owner: "alice" });
|
|
85
|
-
// A filter combination no object satisfies.
|
|
86
|
-
assert.deepEqual(await storage.search({ owner: "nobody" }), []);
|
|
87
|
-
assert.deepEqual(await storage.search({ contentType: "image/jpeg", owner: "bob" }), []);
|
|
88
|
-
assert.deepEqual(await storage.search({ minSize: 100 }), []);
|
|
89
|
-
// Searching an empty store also yields an empty set.
|
|
90
|
-
const { storage: empty } = makeStorage();
|
|
91
|
-
assert.deepEqual(await empty.search({}), []);
|
|
92
|
-
});
|
|
93
|
-
test("search excludes reserved internal keys from broad searches", async () => {
|
|
94
|
-
const { storage, driver } = makeStorage();
|
|
95
|
-
await storage.put("photos/a.jpg", "aa", { owner: "alice" });
|
|
96
|
-
// Simulate framework bookkeeping written directly to the driver.
|
|
97
|
-
await driver.put(".versions/photos/a.jpg/v1", new Uint8Array([1]), {});
|
|
98
|
-
await driver.put(".multipart/upload-1/1", new Uint8Array([2]), {});
|
|
99
|
-
// A broad, unfiltered search surfaces only the user-visible object.
|
|
100
|
-
const all = await storage.search({});
|
|
101
|
-
assert.deepEqual(keysOf(all), ["photos/a.jpg"]);
|
|
102
|
-
// But an explicit search into the reserved space still finds those keys.
|
|
103
|
-
const versions = await searchObjects(driver, { prefix: ".versions/" });
|
|
104
|
-
assert.deepEqual(keysOf(versions), [".versions/photos/a.jpg/v1"]);
|
|
105
|
-
});
|
|
106
|
-
//# sourceMappingURL=search.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.test.js","sourceRoot":"","sources":["../../src/tests/search.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-driver.test.d.ts","sourceRoot":"","sources":["../../src/tests/supabase-driver.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
// Unit tests for the Supabase Storage driver submodule (task 29.1). Unlike the
|
|
2
|
-
// S3-compatible providers, Supabase Storage uses a bucket-scoped file API, so
|
|
3
|
-
// the driver maps the StorageDriver contract directly onto a purpose-built
|
|
4
|
-
// structural SupabaseStorageClientLike (not the shared S3 base). These tests
|
|
5
|
-
// exercise the injected-client path with an in-memory SupabaseStorageClientLike
|
|
6
|
-
// double (no `@supabase/supabase-js` SDK, no external service), the
|
|
7
|
-
// StorageConfigError guard when no client is injected, the connect() guard when
|
|
8
|
-
// the SDK is absent, and the shared driver contract-conformance suite.
|
|
9
|
-
//
|
|
10
|
-
// Requirements: 2.1, 2.3, 3.3
|
|
11
|
-
import test from "node:test";
|
|
12
|
-
import assert from "node:assert/strict";
|
|
13
|
-
import { createSupabaseStorageDriver, connectSupabaseStorageDriver, } from "../drivers/supabase.js";
|
|
14
|
-
import { StorageConfigError } from "../errors.js";
|
|
15
|
-
import { registerStorageDriverContractTests } from "./contract.js";
|
|
16
|
-
const FIXED_NOW = 1_700_000_000_000;
|
|
17
|
-
const fixedClock = () => FIXED_NOW;
|
|
18
|
-
function bytes(str) {
|
|
19
|
-
return new TextEncoder().encode(str);
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* A minimal in-memory SupabaseStorageClientLike double. It stores the raw bytes
|
|
23
|
-
* plus the content type and custom-metadata map exactly as the real Supabase
|
|
24
|
-
* object model would, and returns `null` (never throws) for a missing object so
|
|
25
|
-
* the driver's not-found mapping is exercised.
|
|
26
|
-
*/
|
|
27
|
-
function makeFakeClient() {
|
|
28
|
-
const objects = new Map(); // path -> { bytes, contentType, metadata }
|
|
29
|
-
return {
|
|
30
|
-
async upload({ path, body, contentType, metadata }) {
|
|
31
|
-
objects.set(path, {
|
|
32
|
-
bytes: body.slice(),
|
|
33
|
-
contentType,
|
|
34
|
-
metadata: metadata ? { ...metadata } : undefined,
|
|
35
|
-
});
|
|
36
|
-
return {};
|
|
37
|
-
},
|
|
38
|
-
async download(path) {
|
|
39
|
-
const obj = objects.get(path);
|
|
40
|
-
return obj === undefined ? null : obj.bytes.slice();
|
|
41
|
-
},
|
|
42
|
-
async remove(path) {
|
|
43
|
-
objects.delete(path);
|
|
44
|
-
},
|
|
45
|
-
async exists(path) {
|
|
46
|
-
return objects.has(path);
|
|
47
|
-
},
|
|
48
|
-
async info(path) {
|
|
49
|
-
const obj = objects.get(path);
|
|
50
|
-
if (obj === undefined)
|
|
51
|
-
return null;
|
|
52
|
-
return {
|
|
53
|
-
size: obj.bytes.byteLength,
|
|
54
|
-
contentType: obj.contentType,
|
|
55
|
-
etag: `${path}-etag`,
|
|
56
|
-
createdAt: new Date(FIXED_NOW).toISOString(),
|
|
57
|
-
updatedAt: new Date(FIXED_NOW).toISOString(),
|
|
58
|
-
userMetadata: obj.metadata,
|
|
59
|
-
};
|
|
60
|
-
},
|
|
61
|
-
async list({ prefix }) {
|
|
62
|
-
return [...objects.entries()]
|
|
63
|
-
.filter(([name]) => name.startsWith(prefix))
|
|
64
|
-
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
65
|
-
.map(([name, obj]) => ({
|
|
66
|
-
name,
|
|
67
|
-
size: obj.bytes.byteLength,
|
|
68
|
-
updatedAt: new Date(FIXED_NOW).toISOString(),
|
|
69
|
-
}));
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
function makeDriver() {
|
|
74
|
-
return createSupabaseStorageDriver(makeFakeClient(), { clock: fixedClock });
|
|
75
|
-
}
|
|
76
|
-
// ── name ──────────────────────────────────────────────────────────────────────
|
|
77
|
-
test("driver name is fixed to supabase", () => {
|
|
78
|
-
assert.equal(makeDriver().name, "supabase");
|
|
79
|
-
});
|
|
80
|
-
// ── injected-client primitives round-trip ─────────────────────────────────────
|
|
81
|
-
test("put/get round-trips bytes and typed metadata over the injected client", async () => {
|
|
82
|
-
const driver = makeDriver();
|
|
83
|
-
const content = bytes("supabase object payload");
|
|
84
|
-
await driver.put("bucketed/key.txt", content, {
|
|
85
|
-
contentType: "text/plain",
|
|
86
|
-
owner: "user-7",
|
|
87
|
-
tenant: "tenant-q",
|
|
88
|
-
accessLevel: "public",
|
|
89
|
-
custom: { label: "report" },
|
|
90
|
-
});
|
|
91
|
-
const result = await driver.get("bucketed/key.txt");
|
|
92
|
-
assert.equal(result.found, true);
|
|
93
|
-
assert.deepEqual(result.bytes, content);
|
|
94
|
-
assert.equal(result.metadata.contentType, "text/plain");
|
|
95
|
-
assert.equal(result.metadata.owner, "user-7");
|
|
96
|
-
assert.equal(result.metadata.tenant, "tenant-q");
|
|
97
|
-
assert.equal(result.metadata.accessLevel, "public");
|
|
98
|
-
assert.deepEqual(result.metadata.custom, { label: "report" });
|
|
99
|
-
assert.equal(result.metadata.size, content.byteLength);
|
|
100
|
-
});
|
|
101
|
-
test("createdAt is preserved across overwrite while updatedAt advances", async () => {
|
|
102
|
-
let now = 1000;
|
|
103
|
-
const driver = createSupabaseStorageDriver(makeFakeClient(), { clock: () => now });
|
|
104
|
-
const first = await driver.put("k.txt", bytes("v1"), {});
|
|
105
|
-
now = 5000;
|
|
106
|
-
const second = await driver.put("k.txt", bytes("v2-longer"), {});
|
|
107
|
-
assert.equal(second.createdAt, first.createdAt);
|
|
108
|
-
assert.equal(second.updatedAt, 5000);
|
|
109
|
-
assert.equal(second.size, bytes("v2-longer").byteLength);
|
|
110
|
-
});
|
|
111
|
-
test("exists/delete/stat/list behave consistently", async () => {
|
|
112
|
-
const driver = makeDriver();
|
|
113
|
-
await driver.put("d/a.txt", bytes("a"), {});
|
|
114
|
-
await driver.put("d/b.txt", bytes("bb"), {});
|
|
115
|
-
assert.equal(await driver.exists("d/a.txt"), true);
|
|
116
|
-
assert.equal(await driver.exists("d/missing.txt"), false);
|
|
117
|
-
const stat = await driver.stat("d/b.txt");
|
|
118
|
-
assert.ok(stat);
|
|
119
|
-
assert.equal(stat.size, 2);
|
|
120
|
-
assert.equal(await driver.stat("d/missing.txt"), null);
|
|
121
|
-
const items = await driver.list("d/");
|
|
122
|
-
assert.deepEqual(items.map((i) => i.key), ["d/a.txt", "d/b.txt"]);
|
|
123
|
-
await driver.delete("d/a.txt");
|
|
124
|
-
assert.equal(await driver.exists("d/a.txt"), false);
|
|
125
|
-
});
|
|
126
|
-
test("list honors cursor and limit", async () => {
|
|
127
|
-
const driver = makeDriver();
|
|
128
|
-
await driver.put("p/1", bytes("1"), {});
|
|
129
|
-
await driver.put("p/2", bytes("2"), {});
|
|
130
|
-
await driver.put("p/3", bytes("3"), {});
|
|
131
|
-
const limited = await driver.list("p/", { limit: 2 });
|
|
132
|
-
assert.deepEqual(limited.map((i) => i.key), ["p/1", "p/2"]);
|
|
133
|
-
const afterCursor = await driver.list("p/", { cursor: "p/1" });
|
|
134
|
-
assert.deepEqual(afterCursor.map((i) => i.key), ["p/2", "p/3"]);
|
|
135
|
-
});
|
|
136
|
-
test("get on a missing key reports found:false", async () => {
|
|
137
|
-
const driver = makeDriver();
|
|
138
|
-
const result = await driver.get("nope");
|
|
139
|
-
assert.equal(result.found, false);
|
|
140
|
-
});
|
|
141
|
-
// ── streaming ──────────────────────────────────────────────────────────────────
|
|
142
|
-
test("putStream/getStream round-trip through the injected client", async () => {
|
|
143
|
-
const { Readable } = await import("node:stream");
|
|
144
|
-
const driver = makeDriver();
|
|
145
|
-
const payload = bytes("streamed supabase payload");
|
|
146
|
-
await driver.putStream("s/obj.bin", Readable.from([Buffer.from(payload)]), {
|
|
147
|
-
contentType: "application/octet-stream",
|
|
148
|
-
});
|
|
149
|
-
const stream = await driver.getStream("s/obj.bin");
|
|
150
|
-
const chunks = [];
|
|
151
|
-
for await (const chunk of stream)
|
|
152
|
-
chunks.push(Buffer.from(chunk));
|
|
153
|
-
assert.deepEqual(new Uint8Array(Buffer.concat(chunks)), payload);
|
|
154
|
-
});
|
|
155
|
-
test("getStream throws NotFoundError for a missing key", async () => {
|
|
156
|
-
const driver = makeDriver();
|
|
157
|
-
await assert.rejects(() => driver.getStream("absent"), (err) => {
|
|
158
|
-
assert.ok(err instanceof Error);
|
|
159
|
-
assert.equal(err.name, "NotFoundError");
|
|
160
|
-
return true;
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
// ── advanced capabilities are left undefined for facade simulation ─────────────
|
|
164
|
-
test("advanced capabilities are undefined (simulated by the facade)", () => {
|
|
165
|
-
const driver = makeDriver();
|
|
166
|
-
assert.equal(driver.multipart, undefined);
|
|
167
|
-
assert.equal(driver.resumable, undefined);
|
|
168
|
-
assert.equal(driver.versioning, undefined);
|
|
169
|
-
assert.equal(driver.signedUrl, undefined);
|
|
170
|
-
assert.equal(driver.lifecycle, undefined);
|
|
171
|
-
});
|
|
172
|
-
// ── configuration guards ──────────────────────────────────────────────────────
|
|
173
|
-
test("createSupabaseStorageDriver throws StorageConfigError when no client is injected", () => {
|
|
174
|
-
assert.throws(() => createSupabaseStorageDriver(undefined), (err) => {
|
|
175
|
-
assert.ok(err instanceof StorageConfigError);
|
|
176
|
-
assert.equal(err.provider, "supabase");
|
|
177
|
-
return true;
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
test("connectSupabaseStorageDriver throws StorageConfigError when the Supabase SDK is absent", async () => {
|
|
181
|
-
await assert.rejects(() => connectSupabaseStorageDriver({ url: "https://x.supabase.co", key: "k", bucket: "b" }), (err) => {
|
|
182
|
-
assert.ok(err instanceof StorageConfigError);
|
|
183
|
-
assert.equal(err.provider, "supabase");
|
|
184
|
-
return true;
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
test("connectSupabaseStorageDriver throws StorageConfigError when config is incomplete", async () => {
|
|
188
|
-
await assert.rejects(() => connectSupabaseStorageDriver({ url: "", key: "", bucket: "" }), (err) => {
|
|
189
|
-
assert.ok(err instanceof StorageConfigError);
|
|
190
|
-
assert.equal(err.provider, "supabase");
|
|
191
|
-
return true;
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
// ── shared contract-conformance suite ─────────────────────────────────────────
|
|
195
|
-
registerStorageDriverContractTests("supabase", () => createSupabaseStorageDriver(makeFakeClient(), { clock: fixedClock }), test);
|
|
196
|
-
//# sourceMappingURL=supabase-driver.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-driver.test.js","sourceRoot":"","sources":["../../src/tests/supabase-driver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"testing-utilities.test.d.ts","sourceRoot":"","sources":["../../src/tests/testing-utilities.test.ts"],"names":[],"mappings":""}
|
|
@@ -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":""}
|