@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,289 +0,0 @@
|
|
|
1
|
-
// Unit tests for the shared S3-style driver base and the S3ClientLike contract
|
|
2
|
-
// (task 28.1). A fake in-memory S3ClientLike stands in for a provider SDK so the
|
|
3
|
-
// base can be exercised with no external service and no SDK dependency.
|
|
4
|
-
//
|
|
5
|
-
// Coverage:
|
|
6
|
-
// - mandatory primitives put/get/exists/delete/stat/list mapped onto the client
|
|
7
|
-
// - typed metadata round-trips (owner/tenant/accessLevel/custom/contentType),
|
|
8
|
-
// createdAt preserved on overwrite, computed size/checksum
|
|
9
|
-
// - consistent not-found reporting (get -> found:false, stat -> null,
|
|
10
|
-
// getStream -> NotFoundError)
|
|
11
|
-
// - streaming round-trip via putStream/getStream
|
|
12
|
-
// - native multipart delegation when the client exposes the method set; absent
|
|
13
|
-
// otherwise (facade would simulate)
|
|
14
|
-
// - versioning/lifecycle/signedUrl delegated only when injected via options
|
|
15
|
-
// - the shared driver contract-conformance suite passes against the base
|
|
16
|
-
//
|
|
17
|
-
// Requirements: 2.3, 3.1, 3.3
|
|
18
|
-
import test from "node:test";
|
|
19
|
-
import assert from "node:assert/strict";
|
|
20
|
-
import { S3StyleDriver, createS3StyleDriver, } from "../drivers/s3-base.js";
|
|
21
|
-
import { NotFoundError } from "../errors.js";
|
|
22
|
-
import { registerStorageDriverContractTests } from "./contract.js";
|
|
23
|
-
const FIXED_NOW = 1_700_000_000_000;
|
|
24
|
-
const fixedClock = () => FIXED_NOW;
|
|
25
|
-
function bytes(str) {
|
|
26
|
-
return new TextEncoder().encode(str);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* A minimal in-memory S3ClientLike. `withMultipart` toggles whether the native
|
|
30
|
-
* multipart method set is present so we can assert conditional capability
|
|
31
|
-
* wiring.
|
|
32
|
-
*/
|
|
33
|
-
function makeFakeClient({ withMultipart = false } = {}) {
|
|
34
|
-
const objects = new Map(); // key -> { body, contentType, metadata }
|
|
35
|
-
const uploads = new Map(); // uploadId -> { key, metadata, parts: Map<number, body> }
|
|
36
|
-
let uploadCounterSeed = 0;
|
|
37
|
-
const client = {
|
|
38
|
-
async putObject({ key, body, contentType, metadata }) {
|
|
39
|
-
objects.set(key, {
|
|
40
|
-
body: body.slice(),
|
|
41
|
-
contentType,
|
|
42
|
-
metadata: metadata ? { ...metadata } : undefined,
|
|
43
|
-
});
|
|
44
|
-
return { etag: `"${key}-etag"` };
|
|
45
|
-
},
|
|
46
|
-
async getObject({ key }) {
|
|
47
|
-
const obj = objects.get(key);
|
|
48
|
-
if (obj === undefined) {
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
return {
|
|
52
|
-
body: obj.body.slice(),
|
|
53
|
-
contentType: obj.contentType,
|
|
54
|
-
etag: `"${key}-etag"`,
|
|
55
|
-
size: obj.body.byteLength,
|
|
56
|
-
lastModified: FIXED_NOW,
|
|
57
|
-
metadata: obj.metadata,
|
|
58
|
-
};
|
|
59
|
-
},
|
|
60
|
-
async headObject({ key }) {
|
|
61
|
-
const obj = objects.get(key);
|
|
62
|
-
if (obj === undefined) {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
return {
|
|
66
|
-
contentType: obj.contentType,
|
|
67
|
-
etag: `"${key}-etag"`,
|
|
68
|
-
size: obj.body.byteLength,
|
|
69
|
-
lastModified: FIXED_NOW,
|
|
70
|
-
metadata: obj.metadata,
|
|
71
|
-
};
|
|
72
|
-
},
|
|
73
|
-
async deleteObject({ key }) {
|
|
74
|
-
objects.delete(key);
|
|
75
|
-
},
|
|
76
|
-
async listObjects({ prefix }) {
|
|
77
|
-
return [...objects.entries()]
|
|
78
|
-
.filter(([key]) => key.startsWith(prefix))
|
|
79
|
-
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
80
|
-
.map(([key, obj]) => ({ key, size: obj.body.byteLength, updatedAt: FIXED_NOW }));
|
|
81
|
-
},
|
|
82
|
-
};
|
|
83
|
-
if (withMultipart) {
|
|
84
|
-
client.createMultipartUpload = async ({ key, contentType, metadata }) => {
|
|
85
|
-
const uploadId = `upload-${(uploadCounterSeed += 1)}`;
|
|
86
|
-
uploads.set(uploadId, { key, contentType, metadata, parts: new Map() });
|
|
87
|
-
return { uploadId };
|
|
88
|
-
};
|
|
89
|
-
client.uploadPart = async ({ uploadId, partNumber, body }) => {
|
|
90
|
-
uploads.get(uploadId).parts.set(partNumber, body.slice());
|
|
91
|
-
return { etag: `"${uploadId}-${partNumber}"` };
|
|
92
|
-
};
|
|
93
|
-
client.completeMultipartUpload = async ({ uploadId, parts }) => {
|
|
94
|
-
const session = uploads.get(uploadId);
|
|
95
|
-
const ordered = [...parts].sort((a, b) => a.partNumber - b.partNumber);
|
|
96
|
-
const buffers = ordered.map((p) => Buffer.from(session.parts.get(p.partNumber)));
|
|
97
|
-
const body = new Uint8Array(Buffer.concat(buffers));
|
|
98
|
-
objects.set(session.key, {
|
|
99
|
-
body,
|
|
100
|
-
contentType: session.contentType,
|
|
101
|
-
metadata: session.metadata,
|
|
102
|
-
});
|
|
103
|
-
uploads.delete(uploadId);
|
|
104
|
-
return { etag: `"${session.key}-etag"` };
|
|
105
|
-
};
|
|
106
|
-
client.abortMultipartUpload = async ({ uploadId }) => {
|
|
107
|
-
uploads.delete(uploadId);
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
return { client, objects, uploads };
|
|
111
|
-
}
|
|
112
|
-
function makeDriver(opts = {}) {
|
|
113
|
-
const { client } = makeFakeClient(opts);
|
|
114
|
-
return createS3StyleDriver(client, { clock: fixedClock, name: "s3", ...opts.driverOptions });
|
|
115
|
-
}
|
|
116
|
-
// ── primitives ────────────────────────────────────────────────────────────────
|
|
117
|
-
test("put returns typed metadata with computed size/checksum and defaults", async () => {
|
|
118
|
-
const driver = makeDriver();
|
|
119
|
-
const content = bytes("hello world");
|
|
120
|
-
const meta = await driver.put("greetings/hello.txt", content, {});
|
|
121
|
-
assert.equal(meta.key, "greetings/hello.txt");
|
|
122
|
-
assert.equal(meta.size, content.byteLength);
|
|
123
|
-
assert.match(meta.checksum, /^[0-9a-f]{64}$/);
|
|
124
|
-
assert.equal(meta.contentType, "application/octet-stream");
|
|
125
|
-
assert.equal(meta.accessLevel, "private");
|
|
126
|
-
assert.deepEqual(meta.custom, {});
|
|
127
|
-
assert.equal(meta.createdAt, FIXED_NOW);
|
|
128
|
-
assert.equal(meta.updatedAt, FIXED_NOW);
|
|
129
|
-
});
|
|
130
|
-
test("get round-trips bytes and typed metadata across the client boundary", async () => {
|
|
131
|
-
const driver = makeDriver();
|
|
132
|
-
const content = bytes("the quick brown fox");
|
|
133
|
-
await driver.put("docs/fox.txt", content, {
|
|
134
|
-
contentType: "text/plain",
|
|
135
|
-
owner: "user-1",
|
|
136
|
-
tenant: "tenant-a",
|
|
137
|
-
accessLevel: "public",
|
|
138
|
-
custom: { label: "invoice" },
|
|
139
|
-
});
|
|
140
|
-
const result = await driver.get("docs/fox.txt");
|
|
141
|
-
assert.equal(result.found, true);
|
|
142
|
-
assert.deepEqual(result.bytes, content);
|
|
143
|
-
assert.equal(result.metadata.contentType, "text/plain");
|
|
144
|
-
assert.equal(result.metadata.owner, "user-1");
|
|
145
|
-
assert.equal(result.metadata.tenant, "tenant-a");
|
|
146
|
-
assert.equal(result.metadata.accessLevel, "public");
|
|
147
|
-
assert.deepEqual(result.metadata.custom, { label: "invoice" });
|
|
148
|
-
});
|
|
149
|
-
test("get preserves arbitrary binary bytes without mutation", async () => {
|
|
150
|
-
const driver = makeDriver();
|
|
151
|
-
const content = new Uint8Array([0, 255, 1, 254, 127, 128]);
|
|
152
|
-
await driver.put("bin/data", content, {});
|
|
153
|
-
const result = await driver.get("bin/data");
|
|
154
|
-
assert.equal(result.found, true);
|
|
155
|
-
assert.deepEqual(result.bytes, content);
|
|
156
|
-
});
|
|
157
|
-
test("exists reflects presence via the client", async () => {
|
|
158
|
-
const driver = makeDriver();
|
|
159
|
-
await driver.put("present.txt", bytes("here"), {});
|
|
160
|
-
assert.equal(await driver.exists("present.txt"), true);
|
|
161
|
-
assert.equal(await driver.exists("absent.txt"), false);
|
|
162
|
-
});
|
|
163
|
-
test("delete removes visibility", async () => {
|
|
164
|
-
const driver = makeDriver();
|
|
165
|
-
await driver.put("temp/file.txt", bytes("bye"), {});
|
|
166
|
-
await driver.delete("temp/file.txt");
|
|
167
|
-
assert.equal(await driver.exists("temp/file.txt"), false);
|
|
168
|
-
const result = await driver.get("temp/file.txt");
|
|
169
|
-
assert.equal(result.found, false);
|
|
170
|
-
});
|
|
171
|
-
test("stat returns metadata without content and null for a missing key", async () => {
|
|
172
|
-
const driver = makeDriver();
|
|
173
|
-
await driver.put("stat/key.txt", bytes("stat me"), { contentType: "text/plain" });
|
|
174
|
-
const meta = await driver.stat("stat/key.txt");
|
|
175
|
-
assert.notEqual(meta, null);
|
|
176
|
-
assert.ok(meta);
|
|
177
|
-
assert.equal(meta.key, "stat/key.txt");
|
|
178
|
-
assert.equal(meta.contentType, "text/plain");
|
|
179
|
-
assert.equal(meta.bytes, undefined);
|
|
180
|
-
assert.equal(await driver.stat("no/such/key"), null);
|
|
181
|
-
});
|
|
182
|
-
test("list returns prefix-matching items with size and updatedAt", async () => {
|
|
183
|
-
const driver = makeDriver();
|
|
184
|
-
await driver.put("photos/b.png", bytes("bb"), {});
|
|
185
|
-
await driver.put("photos/a.png", bytes("a"), {});
|
|
186
|
-
await driver.put("docs/readme.md", bytes("doc"), {});
|
|
187
|
-
const items = await driver.list("photos/");
|
|
188
|
-
assert.deepEqual(items.map((item) => item.key), ["photos/a.png", "photos/b.png"]);
|
|
189
|
-
assert.equal(items[0].size, 1);
|
|
190
|
-
assert.equal(items[0].updatedAt, FIXED_NOW);
|
|
191
|
-
});
|
|
192
|
-
// ── createdAt preservation on overwrite ────────────────────────────────────────
|
|
193
|
-
test("overwrite preserves createdAt and advances updatedAt", async () => {
|
|
194
|
-
let now = 1000;
|
|
195
|
-
const { client } = makeFakeClient();
|
|
196
|
-
const driver = createS3StyleDriver(client, { clock: () => now });
|
|
197
|
-
const first = await driver.put("k", bytes("v1"), {});
|
|
198
|
-
assert.equal(first.createdAt, 1000);
|
|
199
|
-
now = 2000;
|
|
200
|
-
const second = await driver.put("k", bytes("v2-longer"), {});
|
|
201
|
-
assert.equal(second.createdAt, 1000, "createdAt must be preserved on overwrite");
|
|
202
|
-
assert.equal(second.updatedAt, 2000, "updatedAt must advance");
|
|
203
|
-
});
|
|
204
|
-
// ── not-found semantics ────────────────────────────────────────────────────────
|
|
205
|
-
test("get on a missing key reports found:false (not an error)", async () => {
|
|
206
|
-
const driver = makeDriver();
|
|
207
|
-
const result = await driver.get("missing");
|
|
208
|
-
assert.equal(result.found, false);
|
|
209
|
-
});
|
|
210
|
-
test("getStream on a missing key throws NotFoundError", async () => {
|
|
211
|
-
const driver = makeDriver();
|
|
212
|
-
await assert.rejects(() => driver.getStream("missing"), NotFoundError);
|
|
213
|
-
});
|
|
214
|
-
// ── streaming ──────────────────────────────────────────────────────────────────
|
|
215
|
-
test("putStream + getStream round-trips content", async () => {
|
|
216
|
-
const { Readable } = await import("node:stream");
|
|
217
|
-
const driver = makeDriver();
|
|
218
|
-
const content = bytes("streamed content across chunks");
|
|
219
|
-
await driver.putStream("stream/file.txt", Readable.from([Buffer.from(content.slice(0, 10)), Buffer.from(content.slice(10))]), { contentType: "text/plain" });
|
|
220
|
-
const stream = await driver.getStream("stream/file.txt");
|
|
221
|
-
const chunks = [];
|
|
222
|
-
for await (const chunk of stream) {
|
|
223
|
-
chunks.push(Buffer.from(chunk));
|
|
224
|
-
}
|
|
225
|
-
assert.deepEqual(new Uint8Array(Buffer.concat(chunks)), content);
|
|
226
|
-
});
|
|
227
|
-
// ── capability delegation ───────────────────────────────────────────────────────
|
|
228
|
-
test("multipart capability is undefined when the client lacks multipart methods", () => {
|
|
229
|
-
const { client } = makeFakeClient({ withMultipart: false });
|
|
230
|
-
const driver = createS3StyleDriver(client);
|
|
231
|
-
assert.equal(driver.multipart, undefined);
|
|
232
|
-
});
|
|
233
|
-
test("multipart capability is wired and assembles parts when the client supports it", async () => {
|
|
234
|
-
const { client } = makeFakeClient({ withMultipart: true });
|
|
235
|
-
const driver = createS3StyleDriver(client, { clock: fixedClock });
|
|
236
|
-
assert.notEqual(driver.multipart, undefined);
|
|
237
|
-
const mp = driver.multipart;
|
|
238
|
-
const uploadId = await mp.create("big/file.bin", { contentType: "text/plain" });
|
|
239
|
-
const p1 = await mp.uploadPart(uploadId, 1, bytes("part-one-"));
|
|
240
|
-
const p2 = await mp.uploadPart(uploadId, 2, bytes("part-two"));
|
|
241
|
-
const meta = await mp.complete(uploadId, [p1, p2]);
|
|
242
|
-
assert.equal(meta.key, "big/file.bin");
|
|
243
|
-
const result = await driver.get("big/file.bin");
|
|
244
|
-
assert.equal(result.found, true);
|
|
245
|
-
assert.deepEqual(result.bytes, bytes("part-one-part-two"));
|
|
246
|
-
});
|
|
247
|
-
test("multipart abort discards the upload without creating an object", async () => {
|
|
248
|
-
const { client } = makeFakeClient({ withMultipart: true });
|
|
249
|
-
const driver = createS3StyleDriver(client, { clock: fixedClock });
|
|
250
|
-
const mp = driver.multipart;
|
|
251
|
-
const uploadId = await mp.create("aborted/file.bin", {});
|
|
252
|
-
await mp.uploadPart(uploadId, 1, bytes("data"));
|
|
253
|
-
await mp.abort(uploadId);
|
|
254
|
-
assert.equal(await driver.exists("aborted/file.bin"), false);
|
|
255
|
-
});
|
|
256
|
-
test("versioning/lifecycle/signedUrl are undefined unless injected", () => {
|
|
257
|
-
const { client } = makeFakeClient();
|
|
258
|
-
const bare = createS3StyleDriver(client);
|
|
259
|
-
assert.equal(bare.versioning, undefined);
|
|
260
|
-
assert.equal(bare.lifecycle, undefined);
|
|
261
|
-
assert.equal(bare.signedUrl, undefined);
|
|
262
|
-
});
|
|
263
|
-
test("native versioning/lifecycle/signedUrl capabilities are delegated when injected", () => {
|
|
264
|
-
const { client } = makeFakeClient();
|
|
265
|
-
const versioning = { snapshot: async () => null, list: async () => [], restore: async () => ({}), deleteVersion: async () => { } };
|
|
266
|
-
const lifecycle = { apply: async () => [] };
|
|
267
|
-
const signedUrl = { sign: async () => "url", verify: () => ({ valid: true }) };
|
|
268
|
-
const driver = createS3StyleDriver(client, {
|
|
269
|
-
capabilities: { versioning, lifecycle, signedUrl },
|
|
270
|
-
});
|
|
271
|
-
assert.equal(driver.versioning, versioning);
|
|
272
|
-
assert.equal(driver.lifecycle, lifecycle);
|
|
273
|
-
assert.equal(driver.signedUrl, signedUrl);
|
|
274
|
-
});
|
|
275
|
-
test("driver name defaults to s3 and is configurable", () => {
|
|
276
|
-
const { client } = makeFakeClient();
|
|
277
|
-
assert.equal(createS3StyleDriver(client).name, "s3");
|
|
278
|
-
assert.equal(createS3StyleDriver(client, { name: "r2" }).name, "r2");
|
|
279
|
-
});
|
|
280
|
-
test("S3StyleDriver class is exported and constructible", async () => {
|
|
281
|
-
const { client } = makeFakeClient();
|
|
282
|
-
const driver = new S3StyleDriver(client, { clock: fixedClock, name: "minio" });
|
|
283
|
-
assert.equal(driver.name, "minio");
|
|
284
|
-
const meta = await driver.put("x", bytes("y"), {});
|
|
285
|
-
assert.equal(meta.key, "x");
|
|
286
|
-
});
|
|
287
|
-
// ── shared contract-conformance suite ───────────────────────────────────────────
|
|
288
|
-
registerStorageDriverContractTests("s3-base", () => createS3StyleDriver(makeFakeClient().client, { clock: fixedClock }), test);
|
|
289
|
-
//# sourceMappingURL=s3-base.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"s3-base.test.js","sourceRoot":"","sources":["../../src/tests/s3-base.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"s3-integration.test.d.ts","sourceRoot":"","sources":["../../src/tests/s3-integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
// Integration tests for the S3-compatible cloud drivers (task 28.6): Amazon S3,
|
|
2
|
-
// Cloudflare R2, MinIO, and Backblaze B2. These are *live* provider tests that
|
|
3
|
-
// talk to a real bucket, so they follow the "honest external skipping" policy
|
|
4
|
-
// from Requirement 27 — they never fabricate provider success and never report a
|
|
5
|
-
// skipped provider as passed.
|
|
6
|
-
//
|
|
7
|
-
// Behavior matrix (Requirements 27.2–27.5):
|
|
8
|
-
//
|
|
9
|
-
// • Credentials ABSENT → the test is declared with node:test's
|
|
10
|
-
// test(name, { skip: reason }, ...) so the runner marks it SKIPPED (not
|
|
11
|
-
// passed) and never executes any provider code. This is the normal CI case
|
|
12
|
-
// here: with no credentials the file loads and every provider test skips
|
|
13
|
-
// cleanly, so `node --test dist/tests/*.test.js` stays green. (27.3)
|
|
14
|
-
//
|
|
15
|
-
// • Credentials PRESENT → the test runs against the provider: it constructs the
|
|
16
|
-
// driver from configuration and performs an upload/download/delete
|
|
17
|
-
// round-trip, asserting the downloaded bytes equal the uploaded bytes. (27.2)
|
|
18
|
-
//
|
|
19
|
-
// • Credentials PRESENT but the run cannot proceed for another reason (for
|
|
20
|
-
// example the optional provider SDK is not installed, or the client cannot
|
|
21
|
-
// be constructed) → the running test calls t.skip(reason), which reports it
|
|
22
|
-
// as skipped with a clear message rather than a failure: "passed with a
|
|
23
|
-
// clear skip message". (27.4)
|
|
24
|
-
//
|
|
25
|
-
// • Runner MISCONFIGURED → when a provider's credentials are only *partially*
|
|
26
|
-
// supplied (some required environment variables set, others missing) the
|
|
27
|
-
// configuration is inconsistent. That is a misconfigured runner, so the
|
|
28
|
-
// test FAILS and fails the build rather than silently skipping. (27.5)
|
|
29
|
-
//
|
|
30
|
-
// SDK isolation: this file imports no provider SDK and no driver module at import
|
|
31
|
-
// time. The driver factories (which themselves resolve any optional SDK lazily)
|
|
32
|
-
// are pulled in with a dynamic import() only when credentials are present, so the
|
|
33
|
-
// module always loads even though none of the @aws-sdk / minio peers are
|
|
34
|
-
// installed in this workspace.
|
|
35
|
-
//
|
|
36
|
-
// Requirements: 27.2, 27.3, 27.4, 27.5
|
|
37
|
-
import test from "node:test";
|
|
38
|
-
import assert from "node:assert/strict";
|
|
39
|
-
/**
|
|
40
|
-
* Read the first non-empty value among a list of candidate environment variable
|
|
41
|
-
* names. Returns `undefined` when none are set to a non-empty string.
|
|
42
|
-
*/
|
|
43
|
-
function readEnv(names) {
|
|
44
|
-
for (const name of names) {
|
|
45
|
-
const value = process.env[name];
|
|
46
|
-
if (typeof value === "string" && value.trim() !== "") {
|
|
47
|
-
return value;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return undefined;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Descriptors for every S3-compatible provider under test. Each declares the
|
|
54
|
-
* required credential fields (with their accepted environment-variable names),
|
|
55
|
-
* any optional fields, and an async `connect(values)` that builds a driver from
|
|
56
|
-
* the resolved configuration by lazily importing its submodule.
|
|
57
|
-
*/
|
|
58
|
-
const PROVIDERS = [
|
|
59
|
-
{
|
|
60
|
-
label: "S3",
|
|
61
|
-
required: {
|
|
62
|
-
bucket: ["STREETJS_S3_BUCKET"],
|
|
63
|
-
region: ["STREETJS_S3_REGION", "AWS_REGION", "AWS_DEFAULT_REGION"],
|
|
64
|
-
accessKeyId: ["STREETJS_S3_ACCESS_KEY_ID", "AWS_ACCESS_KEY_ID"],
|
|
65
|
-
secretAccessKey: ["STREETJS_S3_SECRET_ACCESS_KEY", "AWS_SECRET_ACCESS_KEY"],
|
|
66
|
-
},
|
|
67
|
-
optional: {
|
|
68
|
-
endpoint: ["STREETJS_S3_ENDPOINT"],
|
|
69
|
-
forcePathStyle: ["STREETJS_S3_FORCE_PATH_STYLE"],
|
|
70
|
-
},
|
|
71
|
-
async connect(v) {
|
|
72
|
-
const { createS3StorageDriverFromConfig } = await import("../drivers/s3.js");
|
|
73
|
-
return createS3StorageDriverFromConfig({
|
|
74
|
-
bucket: v.bucket,
|
|
75
|
-
region: v.region,
|
|
76
|
-
endpoint: v.endpoint,
|
|
77
|
-
// Path-style addressing is required by S3-compatible gateways such as
|
|
78
|
-
// MinIO (which do not support virtual-hosted-style bucket subdomains).
|
|
79
|
-
// Opt-in via STREETJS_S3_FORCE_PATH_STYLE; unset preserves SDK defaults
|
|
80
|
-
// (virtual-hosted-style) for real AWS S3.
|
|
81
|
-
forcePathStyle: v.forcePathStyle !== undefined ? v.forcePathStyle !== "false" : undefined,
|
|
82
|
-
credentials: {
|
|
83
|
-
accessKeyId: v.accessKeyId,
|
|
84
|
-
secretAccessKey: v.secretAccessKey,
|
|
85
|
-
},
|
|
86
|
-
});
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
label: "R2",
|
|
91
|
-
required: {
|
|
92
|
-
accountId: ["STREETJS_R2_ACCOUNT_ID", "R2_ACCOUNT_ID"],
|
|
93
|
-
bucket: ["STREETJS_R2_BUCKET", "R2_BUCKET"],
|
|
94
|
-
accessKeyId: ["STREETJS_R2_ACCESS_KEY_ID", "R2_ACCESS_KEY_ID"],
|
|
95
|
-
secretAccessKey: ["STREETJS_R2_SECRET_ACCESS_KEY", "R2_SECRET_ACCESS_KEY"],
|
|
96
|
-
},
|
|
97
|
-
optional: {
|
|
98
|
-
endpoint: ["STREETJS_R2_ENDPOINT", "R2_ENDPOINT"],
|
|
99
|
-
},
|
|
100
|
-
async connect(v) {
|
|
101
|
-
const { connectCloudflareR2Driver } = await import("../drivers/r2.js");
|
|
102
|
-
return connectCloudflareR2Driver({
|
|
103
|
-
accountId: v.accountId,
|
|
104
|
-
bucket: v.bucket,
|
|
105
|
-
accessKeyId: v.accessKeyId,
|
|
106
|
-
secretAccessKey: v.secretAccessKey,
|
|
107
|
-
endpoint: v.endpoint,
|
|
108
|
-
});
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
label: "MinIO",
|
|
113
|
-
required: {
|
|
114
|
-
endPoint: ["STREETJS_MINIO_ENDPOINT", "MINIO_ENDPOINT"],
|
|
115
|
-
bucket: ["STREETJS_MINIO_BUCKET", "MINIO_BUCKET"],
|
|
116
|
-
accessKey: ["STREETJS_MINIO_ACCESS_KEY", "MINIO_ACCESS_KEY", "MINIO_ROOT_USER"],
|
|
117
|
-
secretKey: ["STREETJS_MINIO_SECRET_KEY", "MINIO_SECRET_KEY", "MINIO_ROOT_PASSWORD"],
|
|
118
|
-
},
|
|
119
|
-
optional: {
|
|
120
|
-
port: ["STREETJS_MINIO_PORT", "MINIO_PORT"],
|
|
121
|
-
useSSL: ["STREETJS_MINIO_USE_SSL", "MINIO_USE_SSL"],
|
|
122
|
-
region: ["STREETJS_MINIO_REGION", "MINIO_REGION"],
|
|
123
|
-
},
|
|
124
|
-
async connect(v) {
|
|
125
|
-
const { connectMinIODriver } = await import("../drivers/minio.js");
|
|
126
|
-
return connectMinIODriver({
|
|
127
|
-
endPoint: v.endPoint,
|
|
128
|
-
bucket: v.bucket,
|
|
129
|
-
accessKey: v.accessKey,
|
|
130
|
-
secretKey: v.secretKey,
|
|
131
|
-
port: v.port !== undefined ? Number(v.port) : undefined,
|
|
132
|
-
useSSL: v.useSSL !== undefined ? v.useSSL !== "false" : undefined,
|
|
133
|
-
region: v.region,
|
|
134
|
-
});
|
|
135
|
-
},
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
label: "Backblaze",
|
|
139
|
-
required: {
|
|
140
|
-
endpoint: ["STREETJS_B2_ENDPOINT", "B2_ENDPOINT"],
|
|
141
|
-
bucket: ["STREETJS_B2_BUCKET", "B2_BUCKET"],
|
|
142
|
-
accessKeyId: ["STREETJS_B2_KEY_ID", "B2_KEY_ID", "B2_APPLICATION_KEY_ID"],
|
|
143
|
-
secretAccessKey: ["STREETJS_B2_APPLICATION_KEY", "B2_APPLICATION_KEY"],
|
|
144
|
-
},
|
|
145
|
-
optional: {
|
|
146
|
-
region: ["STREETJS_B2_REGION", "B2_REGION"],
|
|
147
|
-
},
|
|
148
|
-
async connect(v) {
|
|
149
|
-
const { createBackblazeB2Driver } = await import("../drivers/backblaze.js");
|
|
150
|
-
return createBackblazeB2Driver({
|
|
151
|
-
endpoint: v.endpoint,
|
|
152
|
-
bucket: v.bucket,
|
|
153
|
-
region: v.region,
|
|
154
|
-
credentials: {
|
|
155
|
-
accessKeyId: v.accessKeyId,
|
|
156
|
-
secretAccessKey: v.secretAccessKey,
|
|
157
|
-
},
|
|
158
|
-
});
|
|
159
|
-
},
|
|
160
|
-
},
|
|
161
|
-
];
|
|
162
|
-
/**
|
|
163
|
-
* Resolve a provider's configuration from the environment and classify the
|
|
164
|
-
* result as one of:
|
|
165
|
-
* - "absent" → none of the required fields are set
|
|
166
|
-
* - "present" → every required field is set
|
|
167
|
-
* - "misconfigured" → some (but not all) required fields are set
|
|
168
|
-
*
|
|
169
|
-
* Returns the classification, the resolved values (including optional fields),
|
|
170
|
-
* and the human-readable list of accepted env-var names used in skip/fail
|
|
171
|
-
* messages.
|
|
172
|
-
*/
|
|
173
|
-
function classifyProvider(provider) {
|
|
174
|
-
const values = {};
|
|
175
|
-
const requiredNames = [];
|
|
176
|
-
let resolvedCount = 0;
|
|
177
|
-
const total = Object.keys(provider.required).length;
|
|
178
|
-
for (const [field, names] of Object.entries(provider.required)) {
|
|
179
|
-
requiredNames.push(names[0]);
|
|
180
|
-
const value = readEnv(names);
|
|
181
|
-
if (value !== undefined) {
|
|
182
|
-
values[field] = value;
|
|
183
|
-
resolvedCount += 1;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
for (const [field, names] of Object.entries(provider.optional ?? {})) {
|
|
187
|
-
const value = readEnv(names);
|
|
188
|
-
if (value !== undefined) {
|
|
189
|
-
values[field] = value;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
let classification;
|
|
193
|
-
if (resolvedCount === 0) {
|
|
194
|
-
classification = "absent";
|
|
195
|
-
}
|
|
196
|
-
else if (resolvedCount === total) {
|
|
197
|
-
classification = "present";
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
classification = "misconfigured";
|
|
201
|
-
}
|
|
202
|
-
return { classification, values, requiredNames, resolvedCount, total };
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Upload/download/delete round-trip asserting byte fidelity. Cleans up the test
|
|
206
|
-
* object on a best-effort basis so live buckets are not left with test data.
|
|
207
|
-
*/
|
|
208
|
-
async function runRoundTrip(driver) {
|
|
209
|
-
const key = `streetjs-integration/${Date.now()}-${Math.random().toString(16).slice(2)}.bin`;
|
|
210
|
-
const content = new TextEncoder().encode(`streetjs storage integration round-trip ${new Date().toISOString()}`);
|
|
211
|
-
try {
|
|
212
|
-
await driver.put(key, content, { contentType: "application/octet-stream" });
|
|
213
|
-
const exists = await driver.exists(key);
|
|
214
|
-
assert.equal(exists, true, "object must exist after put");
|
|
215
|
-
const got = await driver.get(key);
|
|
216
|
-
assert.equal(got.found, true, "object must be found after put");
|
|
217
|
-
assert.deepEqual(got.bytes, content, "downloaded bytes must equal uploaded bytes");
|
|
218
|
-
}
|
|
219
|
-
finally {
|
|
220
|
-
try {
|
|
221
|
-
await driver.delete(key);
|
|
222
|
-
}
|
|
223
|
-
catch {
|
|
224
|
-
// Best-effort cleanup; a delete failure must not mask the assertion result.
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
// ── Register one integration test per provider, honestly classified ────────────
|
|
229
|
-
for (const provider of PROVIDERS) {
|
|
230
|
-
const { classification, values, requiredNames } = classifyProvider(provider);
|
|
231
|
-
const testName = `[integration] ${provider.label}: upload/download preserves bytes`;
|
|
232
|
-
if (classification === "absent") {
|
|
233
|
-
// Requirement 27.3 — no credentials: skip with a clear message. Declared via
|
|
234
|
-
// the { skip } option so node:test marks it SKIPPED (never passed) and no
|
|
235
|
-
// provider code runs.
|
|
236
|
-
test(testName, {
|
|
237
|
-
skip: `No ${provider.label} credentials present in the environment ` +
|
|
238
|
-
`(set ${requiredNames.join(", ")} to run this integration test).`,
|
|
239
|
-
}, () => { });
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
if (classification === "misconfigured") {
|
|
243
|
-
// Requirement 27.5 — partial credentials are a misconfigured runner: FAIL so
|
|
244
|
-
// the build fails rather than silently skipping an inconsistent setup.
|
|
245
|
-
test(testName, () => {
|
|
246
|
-
assert.fail(`${provider.label} integration is misconfigured: some but not all required ` +
|
|
247
|
-
`credentials are set. Provide all of [${requiredNames.join(", ")}] to run, ` +
|
|
248
|
-
`or none to skip.`);
|
|
249
|
-
});
|
|
250
|
-
continue;
|
|
251
|
-
}
|
|
252
|
-
// Requirement 27.2 — credentials present: run against the provider.
|
|
253
|
-
test(testName, async (t) => {
|
|
254
|
-
let driver;
|
|
255
|
-
try {
|
|
256
|
-
driver = await provider.connect(values);
|
|
257
|
-
}
|
|
258
|
-
catch (error) {
|
|
259
|
-
// Requirement 27.4 — present but cannot run for another reason (e.g. the
|
|
260
|
-
// optional SDK is not installed, or the client cannot be constructed):
|
|
261
|
-
// report passed-with-skip via t.skip rather than failing the build.
|
|
262
|
-
const reason = error instanceof Error ? error.message : String(error);
|
|
263
|
-
t.skip(`${provider.label} credentials are present but the driver could not be ` +
|
|
264
|
-
`constructed, so the integration test cannot run: ${reason}`);
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
await runRoundTrip(driver);
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
//# sourceMappingURL=s3-integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"s3-integration.test.js","sourceRoot":"","sources":["../../src/tests/s3-integration.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tests/s3.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"s3.test.d.ts","sourceRoot":"","sources":["../../src/tests/s3.test.ts"],"names":[],"mappings":""}
|