@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,183 +0,0 @@
|
|
|
1
|
-
// Unit tests for the Azure Blob driver submodule (task 29.3). Azure Blob does
|
|
2
|
-
// not speak the S3 wire shape, so this driver maps the StorageDriver contract
|
|
3
|
-
// directly onto a structural AzureBlobClientLike (not the S3-style base). These
|
|
4
|
-
// tests exercise the injected-client path with an in-memory AzureBlobClientLike
|
|
5
|
-
// double (no `@azure/storage-blob` SDK, no external service), the
|
|
6
|
-
// StorageConfigError guard when no client is injected, the lazy-SDK connect
|
|
7
|
-
// path when the SDK is absent, and the shared driver contract-conformance suite.
|
|
8
|
-
//
|
|
9
|
-
// Requirements: 2.1, 2.3, 3.3
|
|
10
|
-
import test from "node:test";
|
|
11
|
-
import assert from "node:assert/strict";
|
|
12
|
-
import { createAzureBlobDriver, connectAzureBlobDriver } from "../drivers/azure.js";
|
|
13
|
-
import { StorageConfigError } from "../errors.js";
|
|
14
|
-
import { registerStorageDriverContractTests } from "./contract.js";
|
|
15
|
-
const FIXED_NOW = 1_700_000_000_000;
|
|
16
|
-
const fixedClock = () => FIXED_NOW;
|
|
17
|
-
function bytes(str) {
|
|
18
|
-
return new TextEncoder().encode(str);
|
|
19
|
-
}
|
|
20
|
-
/** A minimal in-memory AzureBlobClientLike double. */
|
|
21
|
-
function makeFakeClient() {
|
|
22
|
-
const blobs = new Map(); // blobName -> { body, contentType, metadata }
|
|
23
|
-
return {
|
|
24
|
-
async upload({ blobName, body, contentType, metadata }) {
|
|
25
|
-
blobs.set(blobName, {
|
|
26
|
-
body: body.slice(),
|
|
27
|
-
contentType,
|
|
28
|
-
metadata: metadata ? { ...metadata } : undefined,
|
|
29
|
-
});
|
|
30
|
-
return { etag: `"${blobName}-etag"` };
|
|
31
|
-
},
|
|
32
|
-
async download({ blobName }) {
|
|
33
|
-
const blob = blobs.get(blobName);
|
|
34
|
-
if (blob === undefined)
|
|
35
|
-
return null;
|
|
36
|
-
return {
|
|
37
|
-
body: blob.body.slice(),
|
|
38
|
-
contentType: blob.contentType,
|
|
39
|
-
etag: `"${blobName}-etag"`,
|
|
40
|
-
contentLength: blob.body.byteLength,
|
|
41
|
-
lastModified: FIXED_NOW,
|
|
42
|
-
metadata: blob.metadata,
|
|
43
|
-
};
|
|
44
|
-
},
|
|
45
|
-
async getProperties({ blobName }) {
|
|
46
|
-
const blob = blobs.get(blobName);
|
|
47
|
-
if (blob === undefined)
|
|
48
|
-
return null;
|
|
49
|
-
return {
|
|
50
|
-
contentType: blob.contentType,
|
|
51
|
-
etag: `"${blobName}-etag"`,
|
|
52
|
-
contentLength: blob.body.byteLength,
|
|
53
|
-
lastModified: FIXED_NOW,
|
|
54
|
-
metadata: blob.metadata,
|
|
55
|
-
};
|
|
56
|
-
},
|
|
57
|
-
async deleteBlob({ blobName }) {
|
|
58
|
-
blobs.delete(blobName);
|
|
59
|
-
},
|
|
60
|
-
async exists({ blobName }) {
|
|
61
|
-
return blobs.has(blobName);
|
|
62
|
-
},
|
|
63
|
-
async listBlobs({ prefix }) {
|
|
64
|
-
return [...blobs.entries()]
|
|
65
|
-
.filter(([name]) => name.startsWith(prefix))
|
|
66
|
-
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
67
|
-
.map(([name, blob]) => ({
|
|
68
|
-
name,
|
|
69
|
-
contentLength: blob.body.byteLength,
|
|
70
|
-
lastModified: FIXED_NOW,
|
|
71
|
-
}));
|
|
72
|
-
},
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
function makeDriver() {
|
|
76
|
-
return createAzureBlobDriver(makeFakeClient(), { clock: fixedClock });
|
|
77
|
-
}
|
|
78
|
-
// ── name ──────────────────────────────────────────────────────────────────────
|
|
79
|
-
test("driver name is azure", () => {
|
|
80
|
-
assert.equal(makeDriver().name, "azure");
|
|
81
|
-
});
|
|
82
|
-
// ── injected-client primitives round-trip ─────────────────────────────────────
|
|
83
|
-
test("put/get round-trips bytes and typed metadata over the injected client", async () => {
|
|
84
|
-
const driver = makeDriver();
|
|
85
|
-
const content = bytes("azure blob payload");
|
|
86
|
-
await driver.put("container/key.txt", content, {
|
|
87
|
-
contentType: "text/plain",
|
|
88
|
-
owner: "user-7",
|
|
89
|
-
tenant: "tenant-q",
|
|
90
|
-
accessLevel: "public",
|
|
91
|
-
custom: { label: "report" },
|
|
92
|
-
});
|
|
93
|
-
const result = await driver.get("container/key.txt");
|
|
94
|
-
assert.equal(result.found, true);
|
|
95
|
-
assert.deepEqual(result.bytes, content);
|
|
96
|
-
assert.equal(result.metadata.contentType, "text/plain");
|
|
97
|
-
assert.equal(result.metadata.owner, "user-7");
|
|
98
|
-
assert.equal(result.metadata.tenant, "tenant-q");
|
|
99
|
-
assert.equal(result.metadata.accessLevel, "public");
|
|
100
|
-
assert.deepEqual(result.metadata.custom, { label: "report" });
|
|
101
|
-
assert.equal(result.metadata.size, content.byteLength);
|
|
102
|
-
});
|
|
103
|
-
test("exists/delete/stat/list behave consistently", async () => {
|
|
104
|
-
const driver = makeDriver();
|
|
105
|
-
await driver.put("d/a.txt", bytes("a"), {});
|
|
106
|
-
await driver.put("d/b.txt", bytes("bb"), {});
|
|
107
|
-
assert.equal(await driver.exists("d/a.txt"), true);
|
|
108
|
-
assert.equal(await driver.exists("d/missing.txt"), false);
|
|
109
|
-
const stat = await driver.stat("d/b.txt");
|
|
110
|
-
assert.ok(stat);
|
|
111
|
-
assert.equal(stat.size, 2);
|
|
112
|
-
assert.equal(await driver.stat("d/missing.txt"), null);
|
|
113
|
-
const items = await driver.list("d/");
|
|
114
|
-
assert.deepEqual(items.map((i) => i.key), ["d/a.txt", "d/b.txt"]);
|
|
115
|
-
await driver.delete("d/a.txt");
|
|
116
|
-
assert.equal(await driver.exists("d/a.txt"), false);
|
|
117
|
-
});
|
|
118
|
-
test("list honors the limit option", async () => {
|
|
119
|
-
const driver = makeDriver();
|
|
120
|
-
await driver.put("p/1.txt", bytes("1"), {});
|
|
121
|
-
await driver.put("p/2.txt", bytes("2"), {});
|
|
122
|
-
await driver.put("p/3.txt", bytes("3"), {});
|
|
123
|
-
const items = await driver.list("p/", { limit: 2 });
|
|
124
|
-
assert.deepEqual(items.map((i) => i.key), ["p/1.txt", "p/2.txt"]);
|
|
125
|
-
});
|
|
126
|
-
test("get on a missing key reports found:false", async () => {
|
|
127
|
-
const driver = makeDriver();
|
|
128
|
-
const result = await driver.get("nope");
|
|
129
|
-
assert.equal(result.found, false);
|
|
130
|
-
});
|
|
131
|
-
test("overwrite preserves createdAt and advances updatedAt semantics", async () => {
|
|
132
|
-
const driver = makeDriver();
|
|
133
|
-
const first = await driver.put("k.txt", bytes("one"), {});
|
|
134
|
-
const second = await driver.put("k.txt", bytes("two-longer"), {});
|
|
135
|
-
assert.equal(second.createdAt, first.createdAt);
|
|
136
|
-
assert.equal(second.size, bytes("two-longer").byteLength);
|
|
137
|
-
});
|
|
138
|
-
// ── streaming ───────────────────────────────────────────────────────────────
|
|
139
|
-
test("putStream/getStream round-trips content", async () => {
|
|
140
|
-
const { Readable } = await import("node:stream");
|
|
141
|
-
const driver = makeDriver();
|
|
142
|
-
const content = bytes("streamed azure content");
|
|
143
|
-
await driver.putStream("s/obj.bin", Readable.from([Buffer.from(content)]), {});
|
|
144
|
-
const stream = await driver.getStream("s/obj.bin");
|
|
145
|
-
const chunks = [];
|
|
146
|
-
for await (const chunk of stream)
|
|
147
|
-
chunks.push(chunk);
|
|
148
|
-
assert.deepEqual(new Uint8Array(Buffer.concat(chunks)), content);
|
|
149
|
-
});
|
|
150
|
-
test("getStream throws on a missing key", async () => {
|
|
151
|
-
const driver = makeDriver();
|
|
152
|
-
await assert.rejects(() => driver.getStream("absent"));
|
|
153
|
-
});
|
|
154
|
-
// ── advanced capabilities left undefined for facade simulation ────────────────
|
|
155
|
-
test("advanced capabilities are left undefined for facade simulation", () => {
|
|
156
|
-
const driver = makeDriver();
|
|
157
|
-
assert.equal(driver.multipart, undefined);
|
|
158
|
-
assert.equal(driver.resumable, undefined);
|
|
159
|
-
assert.equal(driver.versioning, undefined);
|
|
160
|
-
assert.equal(driver.signedUrl, undefined);
|
|
161
|
-
assert.equal(driver.lifecycle, undefined);
|
|
162
|
-
});
|
|
163
|
-
// ── configuration guards ──────────────────────────────────────────────────────
|
|
164
|
-
test("createAzureBlobDriver throws StorageConfigError when no client is injected", () => {
|
|
165
|
-
assert.throws(() => createAzureBlobDriver(undefined), (err) => {
|
|
166
|
-
assert.ok(err instanceof StorageConfigError);
|
|
167
|
-
assert.equal(err.provider, "azure");
|
|
168
|
-
return true;
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
test("connectAzureBlobDriver throws StorageConfigError when the Azure SDK is absent", async () => {
|
|
172
|
-
await assert.rejects(() => connectAzureBlobDriver({
|
|
173
|
-
container: "c",
|
|
174
|
-
connectionString: "UseDevelopmentStorage=true",
|
|
175
|
-
}), (err) => {
|
|
176
|
-
assert.ok(err instanceof StorageConfigError);
|
|
177
|
-
assert.equal(err.provider, "azure");
|
|
178
|
-
return true;
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
// ── shared contract-conformance suite ─────────────────────────────────────────
|
|
182
|
-
registerStorageDriverContractTests("azure", () => createAzureBlobDriver(makeFakeClient(), { clock: fixedClock }), test);
|
|
183
|
-
//# sourceMappingURL=azure-driver.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"azure-driver.test.js","sourceRoot":"","sources":["../../src/tests/azure-driver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backblaze-driver.test.d.ts","sourceRoot":"","sources":["../../src/tests/backblaze-driver.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
// Unit tests for the Backblaze B2 driver submodule (task 28.5).
|
|
2
|
-
//
|
|
3
|
-
// Backblaze B2 exposes a fully S3-compatible API, so the driver is a thin
|
|
4
|
-
// specialization of the shared S3-style base: it fixes the driver name to
|
|
5
|
-
// "backblaze" and either accepts an injected S3ClientLike or builds its own
|
|
6
|
-
// client from connection config via a lazy dynamic import() of the optional
|
|
7
|
-
// peer SDK. These tests exercise the injected-client path with an in-memory
|
|
8
|
-
// fake (no external service, no SDK), assert the name/contract behavior, and
|
|
9
|
-
// confirm the self-built path throws StorageConfigError when the SDK is absent.
|
|
10
|
-
//
|
|
11
|
-
// Requirements: 2.1, 2.3, 3.3
|
|
12
|
-
import test from "node:test";
|
|
13
|
-
import assert from "node:assert/strict";
|
|
14
|
-
import { BackblazeB2Driver, createBackblazeB2Driver, BACKBLAZE_DRIVER_NAME, } from "../drivers/backblaze.js";
|
|
15
|
-
import { StorageConfigError } from "../errors.js";
|
|
16
|
-
import { NotFoundError } from "../errors.js";
|
|
17
|
-
import { registerStorageDriverContractTests } from "./contract.js";
|
|
18
|
-
const FIXED_NOW = 1_700_000_000_000;
|
|
19
|
-
const fixedClock = () => FIXED_NOW;
|
|
20
|
-
function bytes(str) {
|
|
21
|
-
return new TextEncoder().encode(str);
|
|
22
|
-
}
|
|
23
|
-
/** A minimal in-memory S3ClientLike standing in for the B2 S3 endpoint. */
|
|
24
|
-
function makeFakeClient({ withMultipart = true } = {}) {
|
|
25
|
-
const objects = new Map();
|
|
26
|
-
const uploads = new Map();
|
|
27
|
-
let seed = 0;
|
|
28
|
-
const client = {
|
|
29
|
-
async putObject({ key, body, contentType, metadata }) {
|
|
30
|
-
objects.set(key, {
|
|
31
|
-
body: body.slice(),
|
|
32
|
-
contentType,
|
|
33
|
-
metadata: metadata ? { ...metadata } : undefined,
|
|
34
|
-
});
|
|
35
|
-
return { etag: `${key}-etag` };
|
|
36
|
-
},
|
|
37
|
-
async getObject({ key }) {
|
|
38
|
-
const obj = objects.get(key);
|
|
39
|
-
if (obj === undefined)
|
|
40
|
-
return null;
|
|
41
|
-
return {
|
|
42
|
-
body: obj.body.slice(),
|
|
43
|
-
contentType: obj.contentType,
|
|
44
|
-
etag: `${key}-etag`,
|
|
45
|
-
size: obj.body.byteLength,
|
|
46
|
-
lastModified: FIXED_NOW,
|
|
47
|
-
metadata: obj.metadata,
|
|
48
|
-
};
|
|
49
|
-
},
|
|
50
|
-
async headObject({ key }) {
|
|
51
|
-
const obj = objects.get(key);
|
|
52
|
-
if (obj === undefined)
|
|
53
|
-
return null;
|
|
54
|
-
return {
|
|
55
|
-
contentType: obj.contentType,
|
|
56
|
-
etag: `${key}-etag`,
|
|
57
|
-
size: obj.body.byteLength,
|
|
58
|
-
lastModified: FIXED_NOW,
|
|
59
|
-
metadata: obj.metadata,
|
|
60
|
-
};
|
|
61
|
-
},
|
|
62
|
-
async deleteObject({ key }) {
|
|
63
|
-
objects.delete(key);
|
|
64
|
-
},
|
|
65
|
-
async listObjects({ prefix }) {
|
|
66
|
-
return [...objects.entries()]
|
|
67
|
-
.filter(([key]) => key.startsWith(prefix))
|
|
68
|
-
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
69
|
-
.map(([key, obj]) => ({ key, size: obj.body.byteLength, updatedAt: FIXED_NOW }));
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
if (withMultipart) {
|
|
73
|
-
client.createMultipartUpload = async ({ key, contentType, metadata }) => {
|
|
74
|
-
const uploadId = `upload-${(seed += 1)}`;
|
|
75
|
-
uploads.set(uploadId, { key, contentType, metadata, parts: new Map() });
|
|
76
|
-
return { uploadId };
|
|
77
|
-
};
|
|
78
|
-
client.uploadPart = async ({ uploadId, partNumber, body }) => {
|
|
79
|
-
uploads.get(uploadId).parts.set(partNumber, body.slice());
|
|
80
|
-
return { etag: `${uploadId}-${partNumber}` };
|
|
81
|
-
};
|
|
82
|
-
client.completeMultipartUpload = async ({ uploadId, parts }) => {
|
|
83
|
-
const session = uploads.get(uploadId);
|
|
84
|
-
const ordered = [...parts].sort((a, b) => a.partNumber - b.partNumber);
|
|
85
|
-
const buffers = ordered.map((p) => Buffer.from(session.parts.get(p.partNumber)));
|
|
86
|
-
objects.set(session.key, {
|
|
87
|
-
body: new Uint8Array(Buffer.concat(buffers)),
|
|
88
|
-
contentType: session.contentType,
|
|
89
|
-
metadata: session.metadata,
|
|
90
|
-
});
|
|
91
|
-
uploads.delete(uploadId);
|
|
92
|
-
return { etag: `${session.key}-etag` };
|
|
93
|
-
};
|
|
94
|
-
client.abortMultipartUpload = async ({ uploadId }) => {
|
|
95
|
-
uploads.delete(uploadId);
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
return { client, objects, uploads };
|
|
99
|
-
}
|
|
100
|
-
// ── name ────────────────────────────────────────────────────────────────────
|
|
101
|
-
test("driver name is fixed to 'backblaze'", () => {
|
|
102
|
-
const { client } = makeFakeClient();
|
|
103
|
-
const driver = createBackblazeB2Driver(client, { clock: fixedClock });
|
|
104
|
-
assert.equal(driver.name, BACKBLAZE_DRIVER_NAME);
|
|
105
|
-
assert.equal(driver.name, "backblaze");
|
|
106
|
-
});
|
|
107
|
-
test("BackblazeB2Driver class constructs with name 'backblaze'", () => {
|
|
108
|
-
const { client } = makeFakeClient();
|
|
109
|
-
const driver = new BackblazeB2Driver(client, { clock: fixedClock });
|
|
110
|
-
assert.equal(driver.name, "backblaze");
|
|
111
|
-
});
|
|
112
|
-
test("injected-client factory is synchronous (returns a driver, not a promise)", () => {
|
|
113
|
-
const { client } = makeFakeClient();
|
|
114
|
-
const driver = createBackblazeB2Driver(client);
|
|
115
|
-
assert.equal(typeof driver.put, "function");
|
|
116
|
-
assert.notEqual(typeof driver.then, "function");
|
|
117
|
-
});
|
|
118
|
-
// ── primitives round-trip through the injected client ──────────────────────────
|
|
119
|
-
test("put/get round-trips bytes and typed metadata", async () => {
|
|
120
|
-
const { client } = makeFakeClient();
|
|
121
|
-
const driver = createBackblazeB2Driver(client, { clock: fixedClock });
|
|
122
|
-
const content = bytes("backblaze payload");
|
|
123
|
-
await driver.put("docs/file.txt", content, {
|
|
124
|
-
contentType: "text/plain",
|
|
125
|
-
owner: "user-1",
|
|
126
|
-
accessLevel: "public",
|
|
127
|
-
custom: { label: "invoice" },
|
|
128
|
-
});
|
|
129
|
-
const result = await driver.get("docs/file.txt");
|
|
130
|
-
assert.equal(result.found, true);
|
|
131
|
-
assert.deepEqual(result.bytes, content);
|
|
132
|
-
assert.equal(result.metadata.contentType, "text/plain");
|
|
133
|
-
assert.equal(result.metadata.owner, "user-1");
|
|
134
|
-
assert.equal(result.metadata.accessLevel, "public");
|
|
135
|
-
assert.deepEqual(result.metadata.custom, { label: "invoice" });
|
|
136
|
-
});
|
|
137
|
-
test("get/stat report a missing key consistently", async () => {
|
|
138
|
-
const { client } = makeFakeClient();
|
|
139
|
-
const driver = createBackblazeB2Driver(client, { clock: fixedClock });
|
|
140
|
-
assert.deepEqual(await driver.get("missing"), { found: false });
|
|
141
|
-
assert.equal(await driver.stat("missing"), null);
|
|
142
|
-
await assert.rejects(() => driver.getStream("missing"), NotFoundError);
|
|
143
|
-
});
|
|
144
|
-
test("native multipart delegates through the client when available", async () => {
|
|
145
|
-
const { client } = makeFakeClient({ withMultipart: true });
|
|
146
|
-
const driver = createBackblazeB2Driver(client, { clock: fixedClock });
|
|
147
|
-
assert.notEqual(driver.multipart, undefined);
|
|
148
|
-
const mp = driver.multipart;
|
|
149
|
-
const uploadId = await mp.create("big/file.bin", {});
|
|
150
|
-
const p1 = await mp.uploadPart(uploadId, 1, bytes("part-one-"));
|
|
151
|
-
const p2 = await mp.uploadPart(uploadId, 2, bytes("part-two"));
|
|
152
|
-
await mp.complete(uploadId, [p1, p2]);
|
|
153
|
-
const result = await driver.get("big/file.bin");
|
|
154
|
-
assert.equal(result.found, true);
|
|
155
|
-
assert.deepEqual(result.bytes, bytes("part-one-part-two"));
|
|
156
|
-
});
|
|
157
|
-
test("native capabilities are delegated when injected via options", () => {
|
|
158
|
-
const { client } = makeFakeClient();
|
|
159
|
-
const versioning = { snapshot: async () => null, list: async () => [], restore: async () => ({}), deleteVersion: async () => { } };
|
|
160
|
-
const lifecycle = { apply: async () => [] };
|
|
161
|
-
const signedUrl = { sign: async () => "url", verify: () => ({ valid: true }) };
|
|
162
|
-
const driver = createBackblazeB2Driver(client, {
|
|
163
|
-
clock: fixedClock,
|
|
164
|
-
capabilities: { versioning, lifecycle, signedUrl },
|
|
165
|
-
});
|
|
166
|
-
assert.equal(driver.versioning, versioning);
|
|
167
|
-
assert.equal(driver.lifecycle, lifecycle);
|
|
168
|
-
assert.equal(driver.signedUrl, signedUrl);
|
|
169
|
-
});
|
|
170
|
-
// ── self-built client path (lazy dynamic import of an absent optional SDK) ──────
|
|
171
|
-
test("building own client without the SDK installed throws StorageConfigError", async () => {
|
|
172
|
-
await assert.rejects(() => createBackblazeB2Driver({
|
|
173
|
-
bucket: "my-bucket",
|
|
174
|
-
endpoint: "https://s3.us-west-002.backblazeb2.com",
|
|
175
|
-
region: "us-west-002",
|
|
176
|
-
credentials: { accessKeyId: "keyId", secretAccessKey: "appKey" },
|
|
177
|
-
}), (error) => {
|
|
178
|
-
assert.ok(error instanceof StorageConfigError);
|
|
179
|
-
assert.equal(error.provider, "backblaze");
|
|
180
|
-
return true;
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
// ── shared contract-conformance suite ───────────────────────────────────────────
|
|
184
|
-
registerStorageDriverContractTests("backblaze", () => createBackblazeB2Driver(makeFakeClient().client, { clock: fixedClock }), test);
|
|
185
|
-
//# sourceMappingURL=backblaze-driver.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backblaze-driver.test.js","sourceRoot":"","sources":["../../src/tests/backblaze-driver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-degradation.test.d.ts","sourceRoot":"","sources":["../../src/tests/bridge-degradation.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
// Cross-bridge graceful-degradation unit tests for the storage facade
|
|
2
|
-
// (task 21.4).
|
|
3
|
-
//
|
|
4
|
-
// Tasks 21.1/21.2/21.3 each proved a single bridge degrades gracefully in
|
|
5
|
-
// isolation (events-bridge.test.js, queue-bridge.test.js,
|
|
6
|
-
// realtime-bridge.test.js). This file adds the focused CROSS-bridge coverage
|
|
7
|
-
// that specifically satisfies task 21.4's intent: with the Events, Queue AND
|
|
8
|
-
// Realtime bridges wired simultaneously, object and upload operations must
|
|
9
|
-
// still succeed whether every bridge is ABSENT or every bridge THROWS, and the
|
|
10
|
-
// events published must carry the affected key + metadata.
|
|
11
|
-
//
|
|
12
|
-
// Covered:
|
|
13
|
-
// - all three bridges absent → put/get/delete/putStream/resumeUpload succeed
|
|
14
|
-
// (17.3, 19.3).
|
|
15
|
-
// - all three bridges throwing simultaneously → the same operations still
|
|
16
|
-
// succeed and return correct results (17.4, 19.3).
|
|
17
|
-
// - with a live (recording) events bridge alongside a throwing queue + throwing
|
|
18
|
-
// realtime bridge, the published events still carry key + metadata; asserted
|
|
19
|
-
// for storage.uploaded (key + full metadata) and storage.deleted (key)
|
|
20
|
-
// (18.2).
|
|
21
|
-
//
|
|
22
|
-
// Uses the Node.js built-in test runner (node:test); executed via
|
|
23
|
-
// `node --test dist/tests/*.test.js`.
|
|
24
|
-
//
|
|
25
|
-
// Requirements: 17.3, 17.4, 18.2, 19.3
|
|
26
|
-
import test from "node:test";
|
|
27
|
-
import assert from "node:assert/strict";
|
|
28
|
-
import { Readable } from "node:stream";
|
|
29
|
-
import { createStorage } from "../index.js";
|
|
30
|
-
/** A bridge trio whose every method throws synchronously on use. */
|
|
31
|
-
function throwingBridges() {
|
|
32
|
-
return {
|
|
33
|
-
events: {
|
|
34
|
-
publish() {
|
|
35
|
-
throw new Error("events bus down");
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
queue: {
|
|
39
|
-
dispatch() {
|
|
40
|
-
throw new Error("queue down");
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
realtime: {
|
|
44
|
-
broadcast() {
|
|
45
|
-
throw new Error("realtime down");
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
/** A recording EventsLike double capturing every published (event, payload). */
|
|
51
|
-
function recordingEvents() {
|
|
52
|
-
const published = [];
|
|
53
|
-
return {
|
|
54
|
-
published,
|
|
55
|
-
publish(event, payload) {
|
|
56
|
-
published.push({ event, payload: payload });
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
test("with NO bridges configured, object + upload operations all succeed (Req 17.3, 19.3)", async () => {
|
|
61
|
-
const storage = createStorage({ provider: "memory" });
|
|
62
|
-
// Object operations.
|
|
63
|
-
const meta = await storage.put("k", "v");
|
|
64
|
-
assert.equal(meta.key, "k");
|
|
65
|
-
const got = await storage.get("k");
|
|
66
|
-
assert.equal(got.found, true);
|
|
67
|
-
await storage.delete("k");
|
|
68
|
-
assert.equal(await storage.exists("k"), false);
|
|
69
|
-
// Streaming upload.
|
|
70
|
-
const streamed = await storage.putStream("s", Readable.from([Buffer.from("stream-bytes")]));
|
|
71
|
-
assert.equal(streamed.key, "s");
|
|
72
|
-
assert.equal(await storage.exists("s"), true);
|
|
73
|
-
// Resumable upload.
|
|
74
|
-
const sessionId = await storage.startUpload("r");
|
|
75
|
-
const resumed = await storage.resumeUpload(sessionId, Readable.from([Buffer.from("resumed")]));
|
|
76
|
-
assert.equal(resumed.key, "r");
|
|
77
|
-
assert.equal(await storage.exists("r"), true);
|
|
78
|
-
});
|
|
79
|
-
test("with ALL THREE bridges throwing simultaneously, object operations still succeed (Req 17.4, 19.3)", async () => {
|
|
80
|
-
const storage = createStorage({ provider: "memory", bridges: throwingBridges() });
|
|
81
|
-
// put on a new key succeeds and returns metadata despite every bridge throwing.
|
|
82
|
-
const meta = await storage.put("k", "v", { contentType: "text/plain" });
|
|
83
|
-
assert.equal(meta.key, "k");
|
|
84
|
-
// get returns the stored bytes.
|
|
85
|
-
const got = await storage.get("k");
|
|
86
|
-
assert.equal(got.found, true);
|
|
87
|
-
// put overwriting (storage.updated path) still succeeds.
|
|
88
|
-
const updated = await storage.put("k", "v2");
|
|
89
|
-
assert.equal(updated.key, "k");
|
|
90
|
-
// delete succeeds and removes the object.
|
|
91
|
-
await storage.delete("k");
|
|
92
|
-
assert.equal(await storage.exists("k"), false);
|
|
93
|
-
});
|
|
94
|
-
test("with ALL THREE bridges throwing simultaneously, streaming + resumable uploads still succeed (Req 17.4, 19.3)", async () => {
|
|
95
|
-
const storage = createStorage({ provider: "memory", bridges: throwingBridges() });
|
|
96
|
-
// putStream broadcasts started/completed through a throwing realtime bridge —
|
|
97
|
-
// the upload must still complete.
|
|
98
|
-
const streamed = await storage.putStream("s", Readable.from([Buffer.from("stream-bytes")]));
|
|
99
|
-
assert.equal(streamed.key, "s");
|
|
100
|
-
assert.equal(await storage.exists("s"), true);
|
|
101
|
-
// resumeUpload likewise broadcasts through the throwing realtime bridge.
|
|
102
|
-
const sessionId = await storage.startUpload("r");
|
|
103
|
-
const resumed = await storage.resumeUpload(sessionId, Readable.from([Buffer.from("resumed")]));
|
|
104
|
-
assert.equal(resumed.key, "r");
|
|
105
|
-
assert.equal(await storage.exists("r"), true);
|
|
106
|
-
});
|
|
107
|
-
test("published events carry key + metadata even while queue + realtime bridges throw (Req 18.2)", async () => {
|
|
108
|
-
const events = recordingEvents();
|
|
109
|
-
const storage = createStorage({
|
|
110
|
-
provider: "memory",
|
|
111
|
-
bridges: {
|
|
112
|
-
events,
|
|
113
|
-
queue: {
|
|
114
|
-
dispatch() {
|
|
115
|
-
throw new Error("queue down");
|
|
116
|
-
},
|
|
117
|
-
},
|
|
118
|
-
realtime: {
|
|
119
|
-
broadcast() {
|
|
120
|
-
throw new Error("realtime down");
|
|
121
|
-
},
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
|
-
});
|
|
125
|
-
await storage.put("photo.png", "bytes", { contentType: "image/png" });
|
|
126
|
-
await storage.delete("photo.png");
|
|
127
|
-
assert.deepEqual(events.published.map((e) => e.event), ["storage.uploaded", "storage.deleted"]);
|
|
128
|
-
// storage.uploaded carries the affected key AND the full object metadata.
|
|
129
|
-
const uploaded = events.published[0].payload;
|
|
130
|
-
assert.equal(uploaded.key, "photo.png");
|
|
131
|
-
assert.ok(uploaded.metadata, "uploaded event must carry metadata");
|
|
132
|
-
assert.equal(uploaded.metadata.key, "photo.png");
|
|
133
|
-
assert.equal(uploaded.metadata.contentType, "image/png");
|
|
134
|
-
// storage.deleted carries the affected key.
|
|
135
|
-
const deleted = events.published[1].payload;
|
|
136
|
-
assert.equal(deleted.key, "photo.png");
|
|
137
|
-
});
|
|
138
|
-
//# sourceMappingURL=bridge-degradation.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-degradation.test.js","sourceRoot":"","sources":["../../src/tests/bridge-degradation.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tests/cli.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../../src/tests/cli.test.ts"],"names":[],"mappings":""}
|