@streetjs/storage 1.0.0
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/LICENSE +21 -0
- package/README.md +719 -0
- package/dist/access.d.ts +95 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +114 -0
- package/dist/access.js.map +1 -0
- package/dist/cli/commands.d.ts +88 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +369 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/generators.d.ts +41 -0
- package/dist/cli/generators.d.ts.map +1 -0
- package/dist/cli/generators.js +119 -0
- package/dist/cli/generators.js.map +1 -0
- package/dist/directory.d.ts +88 -0
- package/dist/directory.d.ts.map +1 -0
- package/dist/directory.js +148 -0
- package/dist/directory.js.map +1 -0
- package/dist/driver.d.ts +83 -0
- package/dist/driver.d.ts.map +1 -0
- package/dist/driver.js +16 -0
- package/dist/driver.js.map +1 -0
- package/dist/drivers/azure.d.ts +239 -0
- package/dist/drivers/azure.d.ts.map +1 -0
- package/dist/drivers/azure.js +476 -0
- package/dist/drivers/azure.js.map +1 -0
- package/dist/drivers/backblaze.d.ts +105 -0
- package/dist/drivers/backblaze.d.ts.map +1 -0
- package/dist/drivers/backblaze.js +279 -0
- package/dist/drivers/backblaze.js.map +1 -0
- package/dist/drivers/gcs.d.ts +239 -0
- package/dist/drivers/gcs.d.ts.map +1 -0
- package/dist/drivers/gcs.js +454 -0
- package/dist/drivers/gcs.js.map +1 -0
- package/dist/drivers/local.d.ts +126 -0
- package/dist/drivers/local.d.ts.map +1 -0
- package/dist/drivers/local.js +321 -0
- package/dist/drivers/local.js.map +1 -0
- package/dist/drivers/memory.d.ts +104 -0
- package/dist/drivers/memory.d.ts.map +1 -0
- package/dist/drivers/memory.js +197 -0
- package/dist/drivers/memory.js.map +1 -0
- package/dist/drivers/minio.d.ts +90 -0
- package/dist/drivers/minio.d.ts.map +1 -0
- package/dist/drivers/minio.js +276 -0
- package/dist/drivers/minio.js.map +1 -0
- package/dist/drivers/r2.d.ts +100 -0
- package/dist/drivers/r2.d.ts.map +1 -0
- package/dist/drivers/r2.js +240 -0
- package/dist/drivers/r2.js.map +1 -0
- package/dist/drivers/s3-base.d.ts +270 -0
- package/dist/drivers/s3-base.d.ts.map +1 -0
- package/dist/drivers/s3-base.js +436 -0
- package/dist/drivers/s3-base.js.map +1 -0
- package/dist/drivers/s3.d.ts +111 -0
- package/dist/drivers/s3.d.ts.map +1 -0
- package/dist/drivers/s3.js +311 -0
- package/dist/drivers/s3.js.map +1 -0
- package/dist/drivers/supabase.d.ts +246 -0
- package/dist/drivers/supabase.d.ts.map +1 -0
- package/dist/drivers/supabase.js +502 -0
- package/dist/drivers/supabase.js.map +1 -0
- package/dist/errors.d.ts +115 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +131 -0
- package/dist/errors.js.map +1 -0
- package/dist/examples/storage-demo.d.ts +53 -0
- package/dist/examples/storage-demo.d.ts.map +1 -0
- package/dist/examples/storage-demo.js +242 -0
- package/dist/examples/storage-demo.js.map +1 -0
- package/dist/facade.d.ts +192 -0
- package/dist/facade.d.ts.map +1 -0
- package/dist/facade.js +898 -0
- package/dist/facade.js.map +1 -0
- package/dist/image.d.ts +94 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +224 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/events.d.ts +108 -0
- package/dist/integrations/events.d.ts.map +1 -0
- package/dist/integrations/events.js +111 -0
- package/dist/integrations/events.js.map +1 -0
- package/dist/integrations/queue.d.ts +89 -0
- package/dist/integrations/queue.d.ts.map +1 -0
- package/dist/integrations/queue.js +91 -0
- package/dist/integrations/queue.js.map +1 -0
- package/dist/integrations/realtime.d.ts +95 -0
- package/dist/integrations/realtime.d.ts.map +1 -0
- package/dist/integrations/realtime.js +90 -0
- package/dist/integrations/realtime.js.map +1 -0
- package/dist/lifecycle.d.ts +137 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +240 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/metadata.d.ts +109 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +139 -0
- package/dist/metadata.js.map +1 -0
- package/dist/multipart.d.ts +108 -0
- package/dist/multipart.d.ts.map +1 -0
- package/dist/multipart.js +200 -0
- package/dist/multipart.js.map +1 -0
- package/dist/observability.d.ts +82 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +175 -0
- package/dist/observability.js.map +1 -0
- package/dist/plugin.d.ts +82 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +100 -0
- package/dist/plugin.js.map +1 -0
- package/dist/resumable.d.ts +118 -0
- package/dist/resumable.d.ts.map +1 -0
- package/dist/resumable.js +223 -0
- package/dist/resumable.js.map +1 -0
- package/dist/search.d.ts +57 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +172 -0
- package/dist/search.js.map +1 -0
- package/dist/signed-url.d.ts +110 -0
- package/dist/signed-url.d.ts.map +1 -0
- package/dist/signed-url.js +237 -0
- package/dist/signed-url.js.map +1 -0
- package/dist/testing/index.d.ts +219 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +393 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tests/access.test.d.ts +2 -0
- package/dist/tests/access.test.d.ts.map +1 -0
- package/dist/tests/access.test.js +270 -0
- package/dist/tests/access.test.js.map +1 -0
- package/dist/tests/azure-driver.test.d.ts +2 -0
- package/dist/tests/azure-driver.test.d.ts.map +1 -0
- package/dist/tests/azure-driver.test.js +183 -0
- package/dist/tests/azure-driver.test.js.map +1 -0
- package/dist/tests/backblaze-driver.test.d.ts +2 -0
- package/dist/tests/backblaze-driver.test.d.ts.map +1 -0
- package/dist/tests/backblaze-driver.test.js +185 -0
- package/dist/tests/backblaze-driver.test.js.map +1 -0
- package/dist/tests/bridge-degradation.test.d.ts +2 -0
- package/dist/tests/bridge-degradation.test.d.ts.map +1 -0
- package/dist/tests/bridge-degradation.test.js +138 -0
- package/dist/tests/bridge-degradation.test.js.map +1 -0
- package/dist/tests/cli.test.d.ts +2 -0
- package/dist/tests/cli.test.d.ts.map +1 -0
- package/dist/tests/cli.test.js +127 -0
- package/dist/tests/cli.test.js.map +1 -0
- package/dist/tests/contract.d.ts +131 -0
- package/dist/tests/contract.d.ts.map +1 -0
- package/dist/tests/contract.js +222 -0
- package/dist/tests/contract.js.map +1 -0
- package/dist/tests/contract.test.d.ts +2 -0
- package/dist/tests/contract.test.d.ts.map +1 -0
- package/dist/tests/contract.test.js +110 -0
- package/dist/tests/contract.test.js.map +1 -0
- package/dist/tests/directory.test.d.ts +2 -0
- package/dist/tests/directory.test.d.ts.map +1 -0
- package/dist/tests/directory.test.js +125 -0
- package/dist/tests/directory.test.js.map +1 -0
- package/dist/tests/errors.test.d.ts +2 -0
- package/dist/tests/errors.test.d.ts.map +1 -0
- package/dist/tests/errors.test.js +93 -0
- package/dist/tests/errors.test.js.map +1 -0
- package/dist/tests/events-bridge.test.d.ts +2 -0
- package/dist/tests/events-bridge.test.d.ts.map +1 -0
- package/dist/tests/events-bridge.test.js +228 -0
- package/dist/tests/events-bridge.test.js.map +1 -0
- package/dist/tests/example-smoke.test.d.ts +2 -0
- package/dist/tests/example-smoke.test.d.ts.map +1 -0
- package/dist/tests/example-smoke.test.js +34 -0
- package/dist/tests/example-smoke.test.js.map +1 -0
- package/dist/tests/gcs-driver.test.d.ts +2 -0
- package/dist/tests/gcs-driver.test.d.ts.map +1 -0
- package/dist/tests/gcs-driver.test.js +197 -0
- package/dist/tests/gcs-driver.test.js.map +1 -0
- package/dist/tests/image.test.d.ts +2 -0
- package/dist/tests/image.test.d.ts.map +1 -0
- package/dist/tests/image.test.js +102 -0
- package/dist/tests/image.test.js.map +1 -0
- package/dist/tests/lifecycle.test.d.ts +2 -0
- package/dist/tests/lifecycle.test.d.ts.map +1 -0
- package/dist/tests/lifecycle.test.js +171 -0
- package/dist/tests/lifecycle.test.js.map +1 -0
- package/dist/tests/local-driver.test.d.ts +2 -0
- package/dist/tests/local-driver.test.d.ts.map +1 -0
- package/dist/tests/local-driver.test.js +153 -0
- package/dist/tests/local-driver.test.js.map +1 -0
- package/dist/tests/local-streaming.test.d.ts +2 -0
- package/dist/tests/local-streaming.test.d.ts.map +1 -0
- package/dist/tests/local-streaming.test.js +121 -0
- package/dist/tests/local-streaming.test.js.map +1 -0
- package/dist/tests/memory-driver.test.d.ts +2 -0
- package/dist/tests/memory-driver.test.d.ts.map +1 -0
- package/dist/tests/memory-driver.test.js +180 -0
- package/dist/tests/memory-driver.test.js.map +1 -0
- package/dist/tests/memory-streaming.test.d.ts +2 -0
- package/dist/tests/memory-streaming.test.d.ts.map +1 -0
- package/dist/tests/memory-streaming.test.js +92 -0
- package/dist/tests/memory-streaming.test.js.map +1 -0
- package/dist/tests/minio-driver.test.d.ts +2 -0
- package/dist/tests/minio-driver.test.d.ts.map +1 -0
- package/dist/tests/minio-driver.test.js +146 -0
- package/dist/tests/minio-driver.test.js.map +1 -0
- package/dist/tests/non-s3-integration.test.d.ts +2 -0
- package/dist/tests/non-s3-integration.test.d.ts.map +1 -0
- package/dist/tests/non-s3-integration.test.js +201 -0
- package/dist/tests/non-s3-integration.test.js.map +1 -0
- package/dist/tests/observability.registration.test.d.ts +2 -0
- package/dist/tests/observability.registration.test.d.ts.map +1 -0
- package/dist/tests/observability.registration.test.js +103 -0
- package/dist/tests/observability.registration.test.js.map +1 -0
- package/dist/tests/observability.test.d.ts +2 -0
- package/dist/tests/observability.test.d.ts.map +1 -0
- package/dist/tests/observability.test.js +240 -0
- package/dist/tests/observability.test.js.map +1 -0
- package/dist/tests/plugin.test.d.ts +2 -0
- package/dist/tests/plugin.test.d.ts.map +1 -0
- package/dist/tests/plugin.test.js +112 -0
- package/dist/tests/plugin.test.js.map +1 -0
- package/dist/tests/prop-concurrent.test.d.ts +2 -0
- package/dist/tests/prop-concurrent.test.d.ts.map +1 -0
- package/dist/tests/prop-concurrent.test.js +59 -0
- package/dist/tests/prop-concurrent.test.js.map +1 -0
- package/dist/tests/prop-copy.test.d.ts +2 -0
- package/dist/tests/prop-copy.test.d.ts.map +1 -0
- package/dist/tests/prop-copy.test.js +63 -0
- package/dist/tests/prop-copy.test.js.map +1 -0
- package/dist/tests/prop-delete.test.d.ts +2 -0
- package/dist/tests/prop-delete.test.d.ts.map +1 -0
- package/dist/tests/prop-delete.test.js +35 -0
- package/dist/tests/prop-delete.test.js.map +1 -0
- package/dist/tests/prop-directory.test.d.ts +2 -0
- package/dist/tests/prop-directory.test.d.ts.map +1 -0
- package/dist/tests/prop-directory.test.js +118 -0
- package/dist/tests/prop-directory.test.js.map +1 -0
- package/dist/tests/prop-driver-conformance.test.d.ts +2 -0
- package/dist/tests/prop-driver-conformance.test.d.ts.map +1 -0
- package/dist/tests/prop-driver-conformance.test.js +110 -0
- package/dist/tests/prop-driver-conformance.test.js.map +1 -0
- package/dist/tests/prop-driver-equivalence.test.d.ts +2 -0
- package/dist/tests/prop-driver-equivalence.test.d.ts.map +1 -0
- package/dist/tests/prop-driver-equivalence.test.js +163 -0
- package/dist/tests/prop-driver-equivalence.test.js.map +1 -0
- package/dist/tests/prop-lifecycle.test.d.ts +2 -0
- package/dist/tests/prop-lifecycle.test.d.ts.map +1 -0
- package/dist/tests/prop-lifecycle.test.js +83 -0
- package/dist/tests/prop-lifecycle.test.js.map +1 -0
- package/dist/tests/prop-list.test.d.ts +2 -0
- package/dist/tests/prop-list.test.d.ts.map +1 -0
- package/dist/tests/prop-list.test.js +53 -0
- package/dist/tests/prop-list.test.js.map +1 -0
- package/dist/tests/prop-metadata.test.d.ts +2 -0
- package/dist/tests/prop-metadata.test.d.ts.map +1 -0
- package/dist/tests/prop-metadata.test.js +87 -0
- package/dist/tests/prop-metadata.test.js.map +1 -0
- package/dist/tests/prop-move.test.d.ts +2 -0
- package/dist/tests/prop-move.test.d.ts.map +1 -0
- package/dist/tests/prop-move.test.js +67 -0
- package/dist/tests/prop-move.test.js.map +1 -0
- package/dist/tests/prop-multipart-abort.test.d.ts +2 -0
- package/dist/tests/prop-multipart-abort.test.d.ts.map +1 -0
- package/dist/tests/prop-multipart-abort.test.js +48 -0
- package/dist/tests/prop-multipart-abort.test.js.map +1 -0
- package/dist/tests/prop-multipart.test.d.ts +2 -0
- package/dist/tests/prop-multipart.test.d.ts.map +1 -0
- package/dist/tests/prop-multipart.test.js +65 -0
- package/dist/tests/prop-multipart.test.js.map +1 -0
- package/dist/tests/prop-resumable.test.d.ts +2 -0
- package/dist/tests/prop-resumable.test.d.ts.map +1 -0
- package/dist/tests/prop-resumable.test.js +78 -0
- package/dist/tests/prop-resumable.test.js.map +1 -0
- package/dist/tests/prop-search.test.d.ts +2 -0
- package/dist/tests/prop-search.test.d.ts.map +1 -0
- package/dist/tests/prop-search.test.js +120 -0
- package/dist/tests/prop-search.test.js.map +1 -0
- package/dist/tests/prop-signed-url.test.d.ts +2 -0
- package/dist/tests/prop-signed-url.test.d.ts.map +1 -0
- package/dist/tests/prop-signed-url.test.js +74 -0
- package/dist/tests/prop-signed-url.test.js.map +1 -0
- package/dist/tests/prop-streaming.test.d.ts +2 -0
- package/dist/tests/prop-streaming.test.d.ts.map +1 -0
- package/dist/tests/prop-streaming.test.js +34 -0
- package/dist/tests/prop-streaming.test.js.map +1 -0
- package/dist/tests/prop-upload-download.test.d.ts +2 -0
- package/dist/tests/prop-upload-download.test.d.ts.map +1 -0
- package/dist/tests/prop-upload-download.test.js +30 -0
- package/dist/tests/prop-upload-download.test.js.map +1 -0
- package/dist/tests/prop-validation.test.d.ts +2 -0
- package/dist/tests/prop-validation.test.d.ts.map +1 -0
- package/dist/tests/prop-validation.test.js +50 -0
- package/dist/tests/prop-validation.test.js.map +1 -0
- package/dist/tests/prop-versioning.test.d.ts +2 -0
- package/dist/tests/prop-versioning.test.d.ts.map +1 -0
- package/dist/tests/prop-versioning.test.js +74 -0
- package/dist/tests/prop-versioning.test.js.map +1 -0
- package/dist/tests/queue-bridge.test.d.ts +2 -0
- package/dist/tests/queue-bridge.test.d.ts.map +1 -0
- package/dist/tests/queue-bridge.test.js +111 -0
- package/dist/tests/queue-bridge.test.js.map +1 -0
- package/dist/tests/r2-driver.test.d.ts +2 -0
- package/dist/tests/r2-driver.test.d.ts.map +1 -0
- package/dist/tests/r2-driver.test.js +143 -0
- package/dist/tests/r2-driver.test.js.map +1 -0
- package/dist/tests/realtime-bridge.test.d.ts +2 -0
- package/dist/tests/realtime-bridge.test.d.ts.map +1 -0
- package/dist/tests/realtime-bridge.test.js +106 -0
- package/dist/tests/realtime-bridge.test.js.map +1 -0
- package/dist/tests/resumable.test.d.ts +2 -0
- package/dist/tests/resumable.test.d.ts.map +1 -0
- package/dist/tests/resumable.test.js +104 -0
- package/dist/tests/resumable.test.js.map +1 -0
- package/dist/tests/s3-base.test.d.ts +2 -0
- package/dist/tests/s3-base.test.d.ts.map +1 -0
- package/dist/tests/s3-base.test.js +289 -0
- package/dist/tests/s3-base.test.js.map +1 -0
- package/dist/tests/s3-integration.test.d.ts +2 -0
- package/dist/tests/s3-integration.test.d.ts.map +1 -0
- package/dist/tests/s3-integration.test.js +270 -0
- package/dist/tests/s3-integration.test.js.map +1 -0
- package/dist/tests/s3.test.d.ts +2 -0
- package/dist/tests/s3.test.d.ts.map +1 -0
- package/dist/tests/s3.test.js +203 -0
- package/dist/tests/s3.test.js.map +1 -0
- package/dist/tests/scaffold.test.d.ts +2 -0
- package/dist/tests/scaffold.test.d.ts.map +1 -0
- package/dist/tests/scaffold.test.js +13 -0
- package/dist/tests/scaffold.test.js.map +1 -0
- package/dist/tests/search.test.d.ts +2 -0
- package/dist/tests/search.test.d.ts.map +1 -0
- package/dist/tests/search.test.js +106 -0
- package/dist/tests/search.test.js.map +1 -0
- package/dist/tests/supabase-driver.test.d.ts +2 -0
- package/dist/tests/supabase-driver.test.d.ts.map +1 -0
- package/dist/tests/supabase-driver.test.js +196 -0
- package/dist/tests/supabase-driver.test.js.map +1 -0
- package/dist/tests/testing-utilities.test.d.ts +2 -0
- package/dist/tests/testing-utilities.test.d.ts.map +1 -0
- package/dist/tests/testing-utilities.test.js +138 -0
- package/dist/tests/testing-utilities.test.js.map +1 -0
- package/dist/tests/validation.test.d.ts +2 -0
- package/dist/tests/validation.test.d.ts.map +1 -0
- package/dist/tests/validation.test.js +135 -0
- package/dist/tests/validation.test.js.map +1 -0
- package/dist/tests/versioning.test.d.ts +2 -0
- package/dist/tests/versioning.test.d.ts.map +1 -0
- package/dist/tests/versioning.test.js +128 -0
- package/dist/tests/versioning.test.js.map +1 -0
- package/dist/types.d.ts +232 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +105 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +225 -0
- package/dist/validation.js.map +1 -0
- package/dist/versioning.d.ts +100 -0
- package/dist/versioning.d.ts.map +1 -0
- package/dist/versioning.js +179 -0
- package/dist/versioning.js.map +1 -0
- package/package.json +137 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage/testing — in-process test doubles (task 25.1).
|
|
3
|
+
*
|
|
4
|
+
* This submodule provides zero-network, in-process test doubles that let
|
|
5
|
+
* application code exercise the storage surface without any external service:
|
|
6
|
+
*
|
|
7
|
+
* - {@link MemoryStorage} — a convenience factory that returns a real
|
|
8
|
+
* {@link Storage} facade backed by the zero-dependency in-memory driver (via
|
|
9
|
+
* `createStorage({ provider: "memory", ... })`). Because it is a genuine
|
|
10
|
+
* facade over {@link MemoryStorageDriver}, it exercises the exact same code
|
|
11
|
+
* paths as production and is fully substitutable for a production facade
|
|
12
|
+
* (Requirements 22.2, 22.3).
|
|
13
|
+
* - {@link FakeStorage} — an in-process {@link Storage} double wrapping the
|
|
14
|
+
* memory-backed facade and adding an advanceable {@link AdvanceableClock} so
|
|
15
|
+
* tests can deterministically control time-sensitive behavior (signed-URL
|
|
16
|
+
* expiry, lifecycle age) while remaining drop-in substitutable for the facade
|
|
17
|
+
* (Requirement 22.3).
|
|
18
|
+
* - {@link StorageHarness} — bundles an advanceable clock, a {@link Storage}
|
|
19
|
+
* built on that clock, and a set of async assertion helpers for concise
|
|
20
|
+
* storage tests.
|
|
21
|
+
* - {@link FakeUpload} / {@link FakeDownload} — simple in-process upload and
|
|
22
|
+
* download doubles for chunked/progress-style flows, backed by any
|
|
23
|
+
* {@link Storage}.
|
|
24
|
+
* - {@link MemoryStorageDriver} is re-exported so tests that need to substitute
|
|
25
|
+
* at the {@link StorageDriver} level (rather than the facade level) can do so.
|
|
26
|
+
*
|
|
27
|
+
* None of these require network or external services (Requirement 22.2) and all
|
|
28
|
+
* sit on the same {@link StorageDriver}/{@link Storage} contract as production
|
|
29
|
+
* code (Requirements 22.1, 22.3).
|
|
30
|
+
*
|
|
31
|
+
* The package's `./testing` subpath export maps to this module's built output
|
|
32
|
+
* (`dist/testing/index.js`).
|
|
33
|
+
*
|
|
34
|
+
* _Requirements: 22.1, 22.2, 22.3_
|
|
35
|
+
*/
|
|
36
|
+
import type { Clock } from "streetjs";
|
|
37
|
+
import type { PutOptions, Storage } from "../facade.js";
|
|
38
|
+
import type { StorageConfig, StorageMetadataMap, StorageObjectMetadata } from "../types.js";
|
|
39
|
+
export { MemoryStorageDriver } from "../drivers/memory.js";
|
|
40
|
+
/** Config accepted by the in-process doubles: everything except the fixed provider. */
|
|
41
|
+
export type TestingStorageConfig = Omit<StorageConfig, "provider" | "driver">;
|
|
42
|
+
/**
|
|
43
|
+
* A {@link Clock} (`() => number`) whose value tests can advance or set
|
|
44
|
+
* explicitly. Passed as `config.clock` so every timestamp the storage layer
|
|
45
|
+
* derives (object `createdAt`/`updatedAt`, signed-URL expiry, lifecycle age) is
|
|
46
|
+
* deterministic and controllable from a test.
|
|
47
|
+
*/
|
|
48
|
+
export interface AdvanceableClock extends Clock {
|
|
49
|
+
/** Return the current epoch-ms reading (same as calling the clock). */
|
|
50
|
+
now(): number;
|
|
51
|
+
/** Set the clock to an absolute epoch-ms value. */
|
|
52
|
+
set(epochMs: number): void;
|
|
53
|
+
/** Advance the clock forward by `deltaMs` milliseconds. */
|
|
54
|
+
advance(deltaMs: number): void;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create an {@link AdvanceableClock} starting at `start` (defaults to a fixed,
|
|
58
|
+
* deterministic epoch so tests are reproducible unless they opt into wall
|
|
59
|
+
* time).
|
|
60
|
+
*/
|
|
61
|
+
export declare function createAdvanceableClock(start?: number): AdvanceableClock;
|
|
62
|
+
/**
|
|
63
|
+
* Convenience factory returning a real {@link Storage} facade backed by the
|
|
64
|
+
* zero-dependency {@link MemoryStorageDriver} (via `createStorage`). This is the
|
|
65
|
+
* simplest substitute for a production facade in tests: it needs no network and
|
|
66
|
+
* runs entirely in-process (Requirements 22.2, 22.3).
|
|
67
|
+
*
|
|
68
|
+
* A default `signingSecret` is supplied when none is given so signed-URL helpers
|
|
69
|
+
* work out of the box; any provided config field overrides the defaults.
|
|
70
|
+
*/
|
|
71
|
+
export declare function MemoryStorage<T extends StorageMetadataMap = StorageMetadataMap>(config?: TestingStorageConfig): Storage<T>;
|
|
72
|
+
/**
|
|
73
|
+
* An in-process {@link Storage} double that wraps a memory-backed facade and
|
|
74
|
+
* exposes an advanceable {@link AdvanceableClock}. It implements the full
|
|
75
|
+
* {@link Storage} contract by delegating to the wrapped facade, so it is a
|
|
76
|
+
* drop-in substitute for a production facade (Requirement 22.3) while giving
|
|
77
|
+
* tests deterministic control over time.
|
|
78
|
+
*
|
|
79
|
+
* @typeParam T - Optional per-application custom metadata map.
|
|
80
|
+
*/
|
|
81
|
+
export declare class FakeStorage<T extends StorageMetadataMap = StorageMetadataMap> implements Storage<T> {
|
|
82
|
+
/** The advanceable clock backing every timestamp/expiry the double derives. */
|
|
83
|
+
readonly clock: AdvanceableClock;
|
|
84
|
+
/** The wrapped, memory-backed facade every method delegates to. */
|
|
85
|
+
private readonly inner;
|
|
86
|
+
constructor(config?: TestingStorageConfig);
|
|
87
|
+
put(key: string, content: Uint8Array | string, options?: PutOptions): Promise<StorageObjectMetadata>;
|
|
88
|
+
get(key: string): ReturnType<Storage<T>["get"]>;
|
|
89
|
+
exists(key: string): Promise<boolean>;
|
|
90
|
+
delete(key: string): Promise<void>;
|
|
91
|
+
copy(source: string, destination: string): ReturnType<Storage<T>["copy"]>;
|
|
92
|
+
move(source: string, destination: string): ReturnType<Storage<T>["move"]>;
|
|
93
|
+
rename(key: string, newKey: string): ReturnType<Storage<T>["rename"]>;
|
|
94
|
+
list(prefix: string, options?: Parameters<Storage<T>["list"]>[1]): ReturnType<Storage<T>["list"]>;
|
|
95
|
+
stat(key: string): Promise<StorageObjectMetadata | null>;
|
|
96
|
+
putStream(key: string, stream: Parameters<Storage<T>["putStream"]>[1], options?: PutOptions): Promise<StorageObjectMetadata>;
|
|
97
|
+
getStream(key: string): ReturnType<Storage<T>["getStream"]>;
|
|
98
|
+
createMultipartUpload(key: string, options?: PutOptions): Promise<string>;
|
|
99
|
+
uploadPart(uploadId: string, partNumber: number, content: Uint8Array): ReturnType<Storage<T>["uploadPart"]>;
|
|
100
|
+
completeMultipartUpload(uploadId: string, parts: Parameters<Storage<T>["completeMultipartUpload"]>[1]): Promise<StorageObjectMetadata>;
|
|
101
|
+
abortMultipartUpload(uploadId: string): Promise<void>;
|
|
102
|
+
startUpload(key: string, options?: PutOptions): Promise<string>;
|
|
103
|
+
resumeUpload(sessionId: string, stream: Parameters<Storage<T>["resumeUpload"]>[1]): Promise<StorageObjectMetadata>;
|
|
104
|
+
cancelUpload(sessionId: string): Promise<void>;
|
|
105
|
+
signedUrl(key: string, op: Parameters<Storage<T>["signedUrl"]>[1], options?: Parameters<Storage<T>["signedUrl"]>[2]): Promise<string>;
|
|
106
|
+
listVersions(key: string): ReturnType<Storage<T>["listVersions"]>;
|
|
107
|
+
restoreVersion(key: string, versionId: string): Promise<StorageObjectMetadata>;
|
|
108
|
+
deleteVersion(key: string, versionId: string): Promise<void>;
|
|
109
|
+
applyLifecycle(rule: Parameters<Storage<T>["applyLifecycle"]>[0]): ReturnType<Storage<T>["applyLifecycle"]>;
|
|
110
|
+
get images(): Storage<T>["images"];
|
|
111
|
+
get directory(): Storage<T>["directory"];
|
|
112
|
+
search(filters: Parameters<Storage<T>["search"]>[0]): ReturnType<Storage<T>["search"]>;
|
|
113
|
+
stats(): ReturnType<Storage<T>["stats"]>;
|
|
114
|
+
probe(): ReturnType<Storage<T>["probe"]>;
|
|
115
|
+
close(): Promise<void>;
|
|
116
|
+
/** Advance the double's clock forward by `deltaMs` milliseconds. */
|
|
117
|
+
advanceTime(deltaMs: number): void;
|
|
118
|
+
/** Set the double's clock to an absolute epoch-ms value. */
|
|
119
|
+
setTime(epochMs: number): void;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* A test harness bundling an advanceable {@link AdvanceableClock}, a
|
|
123
|
+
* {@link Storage} built on that clock, and a set of async assertion helpers for
|
|
124
|
+
* concise, readable storage tests. Everything runs in-process with no network
|
|
125
|
+
* (Requirement 22.2).
|
|
126
|
+
*
|
|
127
|
+
* @typeParam T - Optional per-application custom metadata map.
|
|
128
|
+
*/
|
|
129
|
+
export declare class StorageHarness<T extends StorageMetadataMap = StorageMetadataMap> {
|
|
130
|
+
/** The advanceable clock the harness's storage derives all timestamps from. */
|
|
131
|
+
readonly clock: AdvanceableClock;
|
|
132
|
+
/** The memory-backed {@link Storage} under test, wired to {@link clock}. */
|
|
133
|
+
readonly storage: Storage<T>;
|
|
134
|
+
constructor(config?: TestingStorageConfig);
|
|
135
|
+
/** Advance the harness clock forward by `deltaMs` milliseconds. */
|
|
136
|
+
advance(deltaMs: number): void;
|
|
137
|
+
/** Set the harness clock to an absolute epoch-ms value. */
|
|
138
|
+
setTime(epochMs: number): void;
|
|
139
|
+
/** Assert an object exists at `key`. */
|
|
140
|
+
assertExists(key: string): Promise<void>;
|
|
141
|
+
/** Assert no object exists at `key`. */
|
|
142
|
+
assertMissing(key: string): Promise<void>;
|
|
143
|
+
/**
|
|
144
|
+
* Assert the object at `key` holds exactly `expected` bytes (a string is
|
|
145
|
+
* compared as its UTF-8 encoding).
|
|
146
|
+
*/
|
|
147
|
+
assertContent(key: string, expected: Uint8Array | string): Promise<void>;
|
|
148
|
+
/** Assert the stored object at `key` reports exactly `size` bytes. */
|
|
149
|
+
assertSize(key: string, size: number): Promise<void>;
|
|
150
|
+
/** Assert the set of keys under `prefix` equals `expected` (order-insensitive). */
|
|
151
|
+
assertKeys(prefix: string, expected: readonly string[]): Promise<void>;
|
|
152
|
+
/** Release any resources held by the harness's storage. */
|
|
153
|
+
close(): Promise<void>;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* A simple in-process upload double for chunked / progress-style flows. Bytes
|
|
157
|
+
* written via {@link FakeUpload.write} are buffered in memory; {@link
|
|
158
|
+
* FakeUpload.complete} persists the assembled bytes to the backing
|
|
159
|
+
* {@link Storage} and returns the resulting metadata. Requires no network
|
|
160
|
+
* (Requirement 22.2).
|
|
161
|
+
*/
|
|
162
|
+
export declare class FakeUpload {
|
|
163
|
+
private readonly storage;
|
|
164
|
+
/** The destination key the completed upload is written to. */
|
|
165
|
+
readonly key: string;
|
|
166
|
+
private readonly options?;
|
|
167
|
+
private readonly chunks;
|
|
168
|
+
private completed;
|
|
169
|
+
private aborted;
|
|
170
|
+
constructor(storage: Storage,
|
|
171
|
+
/** The destination key the completed upload is written to. */
|
|
172
|
+
key: string, options?: PutOptions | undefined);
|
|
173
|
+
/** Total number of bytes buffered so far. */
|
|
174
|
+
get bytesWritten(): number;
|
|
175
|
+
/** Whether {@link complete} has already run. */
|
|
176
|
+
get isCompleted(): boolean;
|
|
177
|
+
/** Whether the upload was aborted. */
|
|
178
|
+
get isAborted(): boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Buffer another chunk of upload content. A `string` chunk is encoded as
|
|
181
|
+
* UTF-8. Throws if the upload has already completed or been aborted.
|
|
182
|
+
*/
|
|
183
|
+
write(chunk: Uint8Array | string): void;
|
|
184
|
+
/**
|
|
185
|
+
* Persist all buffered chunks to the backing storage under {@link key} and
|
|
186
|
+
* return the stored object's metadata. Throws if already completed or aborted.
|
|
187
|
+
*/
|
|
188
|
+
complete(): Promise<StorageObjectMetadata>;
|
|
189
|
+
/** Discard buffered content; nothing is persisted. */
|
|
190
|
+
abort(): void;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* A simple in-process download double. Reads the object at `key` from the
|
|
194
|
+
* backing {@link Storage} and exposes its content as bytes, text, or an async
|
|
195
|
+
* chunk iterator. Requires no network (Requirement 22.2).
|
|
196
|
+
*/
|
|
197
|
+
export declare class FakeDownload {
|
|
198
|
+
private readonly storage;
|
|
199
|
+
/** The source key this download reads from. */
|
|
200
|
+
readonly key: string;
|
|
201
|
+
constructor(storage: Storage,
|
|
202
|
+
/** The source key this download reads from. */
|
|
203
|
+
key: string);
|
|
204
|
+
/** Whether an object currently exists at {@link key}. */
|
|
205
|
+
found(): Promise<boolean>;
|
|
206
|
+
/**
|
|
207
|
+
* Read and return the full object bytes. Throws {@link NotFoundError} when no
|
|
208
|
+
* object exists at {@link key}.
|
|
209
|
+
*/
|
|
210
|
+
bytes(): Promise<Uint8Array>;
|
|
211
|
+
/** Read the full object content decoded as a UTF-8 string. */
|
|
212
|
+
text(): Promise<string>;
|
|
213
|
+
/**
|
|
214
|
+
* Yield the object content in fixed-size chunks of at most `chunkSize` bytes,
|
|
215
|
+
* simulating a streamed download. Throws {@link NotFoundError} when absent.
|
|
216
|
+
*/
|
|
217
|
+
chunks(chunkSize?: number): AsyncGenerator<Uint8Array>;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage/testing — in-process test doubles (task 25.1).
|
|
3
|
+
*
|
|
4
|
+
* This submodule provides zero-network, in-process test doubles that let
|
|
5
|
+
* application code exercise the storage surface without any external service:
|
|
6
|
+
*
|
|
7
|
+
* - {@link MemoryStorage} — a convenience factory that returns a real
|
|
8
|
+
* {@link Storage} facade backed by the zero-dependency in-memory driver (via
|
|
9
|
+
* `createStorage({ provider: "memory", ... })`). Because it is a genuine
|
|
10
|
+
* facade over {@link MemoryStorageDriver}, it exercises the exact same code
|
|
11
|
+
* paths as production and is fully substitutable for a production facade
|
|
12
|
+
* (Requirements 22.2, 22.3).
|
|
13
|
+
* - {@link FakeStorage} — an in-process {@link Storage} double wrapping the
|
|
14
|
+
* memory-backed facade and adding an advanceable {@link AdvanceableClock} so
|
|
15
|
+
* tests can deterministically control time-sensitive behavior (signed-URL
|
|
16
|
+
* expiry, lifecycle age) while remaining drop-in substitutable for the facade
|
|
17
|
+
* (Requirement 22.3).
|
|
18
|
+
* - {@link StorageHarness} — bundles an advanceable clock, a {@link Storage}
|
|
19
|
+
* built on that clock, and a set of async assertion helpers for concise
|
|
20
|
+
* storage tests.
|
|
21
|
+
* - {@link FakeUpload} / {@link FakeDownload} — simple in-process upload and
|
|
22
|
+
* download doubles for chunked/progress-style flows, backed by any
|
|
23
|
+
* {@link Storage}.
|
|
24
|
+
* - {@link MemoryStorageDriver} is re-exported so tests that need to substitute
|
|
25
|
+
* at the {@link StorageDriver} level (rather than the facade level) can do so.
|
|
26
|
+
*
|
|
27
|
+
* None of these require network or external services (Requirement 22.2) and all
|
|
28
|
+
* sit on the same {@link StorageDriver}/{@link Storage} contract as production
|
|
29
|
+
* code (Requirements 22.1, 22.3).
|
|
30
|
+
*
|
|
31
|
+
* The package's `./testing` subpath export maps to this module's built output
|
|
32
|
+
* (`dist/testing/index.js`).
|
|
33
|
+
*
|
|
34
|
+
* _Requirements: 22.1, 22.2, 22.3_
|
|
35
|
+
*/
|
|
36
|
+
import assert from "node:assert/strict";
|
|
37
|
+
import { Buffer } from "node:buffer";
|
|
38
|
+
import { createStorage } from "../facade.js";
|
|
39
|
+
import { NotFoundError } from "../errors.js";
|
|
40
|
+
// Re-export the zero-dependency driver so tests can substitute at the driver
|
|
41
|
+
// level (Requirement 22.3) in addition to the facade-level doubles below.
|
|
42
|
+
export { MemoryStorageDriver } from "../drivers/memory.js";
|
|
43
|
+
/** Default signing secret so {@link FakeStorage}/{@link StorageHarness} can mint signed URLs out of the box. */
|
|
44
|
+
const DEFAULT_SIGNING_SECRET = "streetjs-storage-testing-secret";
|
|
45
|
+
/**
|
|
46
|
+
* Create an {@link AdvanceableClock} starting at `start` (defaults to a fixed,
|
|
47
|
+
* deterministic epoch so tests are reproducible unless they opt into wall
|
|
48
|
+
* time).
|
|
49
|
+
*/
|
|
50
|
+
export function createAdvanceableClock(start = 1_700_000_000_000) {
|
|
51
|
+
let current = start;
|
|
52
|
+
const clock = (() => current);
|
|
53
|
+
clock.now = () => current;
|
|
54
|
+
clock.set = (epochMs) => {
|
|
55
|
+
current = epochMs;
|
|
56
|
+
};
|
|
57
|
+
clock.advance = (deltaMs) => {
|
|
58
|
+
current += deltaMs;
|
|
59
|
+
};
|
|
60
|
+
return clock;
|
|
61
|
+
}
|
|
62
|
+
// ── MemoryStorage ──────────────────────────────────────────────────────────
|
|
63
|
+
/**
|
|
64
|
+
* Convenience factory returning a real {@link Storage} facade backed by the
|
|
65
|
+
* zero-dependency {@link MemoryStorageDriver} (via `createStorage`). This is the
|
|
66
|
+
* simplest substitute for a production facade in tests: it needs no network and
|
|
67
|
+
* runs entirely in-process (Requirements 22.2, 22.3).
|
|
68
|
+
*
|
|
69
|
+
* A default `signingSecret` is supplied when none is given so signed-URL helpers
|
|
70
|
+
* work out of the box; any provided config field overrides the defaults.
|
|
71
|
+
*/
|
|
72
|
+
export function MemoryStorage(config = {}) {
|
|
73
|
+
return createStorage({
|
|
74
|
+
signingSecret: DEFAULT_SIGNING_SECRET,
|
|
75
|
+
...config,
|
|
76
|
+
provider: "memory",
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// ── FakeStorage ──────────────────────────────────────────────────────────────
|
|
80
|
+
/**
|
|
81
|
+
* An in-process {@link Storage} double that wraps a memory-backed facade and
|
|
82
|
+
* exposes an advanceable {@link AdvanceableClock}. It implements the full
|
|
83
|
+
* {@link Storage} contract by delegating to the wrapped facade, so it is a
|
|
84
|
+
* drop-in substitute for a production facade (Requirement 22.3) while giving
|
|
85
|
+
* tests deterministic control over time.
|
|
86
|
+
*
|
|
87
|
+
* @typeParam T - Optional per-application custom metadata map.
|
|
88
|
+
*/
|
|
89
|
+
export class FakeStorage {
|
|
90
|
+
/** The advanceable clock backing every timestamp/expiry the double derives. */
|
|
91
|
+
clock;
|
|
92
|
+
/** The wrapped, memory-backed facade every method delegates to. */
|
|
93
|
+
inner;
|
|
94
|
+
constructor(config = {}) {
|
|
95
|
+
this.clock = createAdvanceableClock();
|
|
96
|
+
this.inner = createStorage({
|
|
97
|
+
signingSecret: DEFAULT_SIGNING_SECRET,
|
|
98
|
+
...config,
|
|
99
|
+
clock: this.clock,
|
|
100
|
+
provider: "memory",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// ── Object operations ──────────────────────────────────────────────────────
|
|
104
|
+
put(key, content, options) {
|
|
105
|
+
return this.inner.put(key, content, options);
|
|
106
|
+
}
|
|
107
|
+
get(key) {
|
|
108
|
+
return this.inner.get(key);
|
|
109
|
+
}
|
|
110
|
+
exists(key) {
|
|
111
|
+
return this.inner.exists(key);
|
|
112
|
+
}
|
|
113
|
+
delete(key) {
|
|
114
|
+
return this.inner.delete(key);
|
|
115
|
+
}
|
|
116
|
+
copy(source, destination) {
|
|
117
|
+
return this.inner.copy(source, destination);
|
|
118
|
+
}
|
|
119
|
+
move(source, destination) {
|
|
120
|
+
return this.inner.move(source, destination);
|
|
121
|
+
}
|
|
122
|
+
rename(key, newKey) {
|
|
123
|
+
return this.inner.rename(key, newKey);
|
|
124
|
+
}
|
|
125
|
+
list(prefix, options) {
|
|
126
|
+
return this.inner.list(prefix, options);
|
|
127
|
+
}
|
|
128
|
+
stat(key) {
|
|
129
|
+
return this.inner.stat(key);
|
|
130
|
+
}
|
|
131
|
+
// ── Streaming ────────────────────────────────────────────────────────────────
|
|
132
|
+
putStream(key, stream, options) {
|
|
133
|
+
return this.inner.putStream(key, stream, options);
|
|
134
|
+
}
|
|
135
|
+
getStream(key) {
|
|
136
|
+
return this.inner.getStream(key);
|
|
137
|
+
}
|
|
138
|
+
// ── Multipart ────────────────────────────────────────────────────────────────
|
|
139
|
+
createMultipartUpload(key, options) {
|
|
140
|
+
return this.inner.createMultipartUpload(key, options);
|
|
141
|
+
}
|
|
142
|
+
uploadPart(uploadId, partNumber, content) {
|
|
143
|
+
return this.inner.uploadPart(uploadId, partNumber, content);
|
|
144
|
+
}
|
|
145
|
+
completeMultipartUpload(uploadId, parts) {
|
|
146
|
+
return this.inner.completeMultipartUpload(uploadId, parts);
|
|
147
|
+
}
|
|
148
|
+
abortMultipartUpload(uploadId) {
|
|
149
|
+
return this.inner.abortMultipartUpload(uploadId);
|
|
150
|
+
}
|
|
151
|
+
// ── Resumable ────────────────────────────────────────────────────────────────
|
|
152
|
+
startUpload(key, options) {
|
|
153
|
+
return this.inner.startUpload(key, options);
|
|
154
|
+
}
|
|
155
|
+
resumeUpload(sessionId, stream) {
|
|
156
|
+
return this.inner.resumeUpload(sessionId, stream);
|
|
157
|
+
}
|
|
158
|
+
cancelUpload(sessionId) {
|
|
159
|
+
return this.inner.cancelUpload(sessionId);
|
|
160
|
+
}
|
|
161
|
+
// ── Signed URLs ──────────────────────────────────────────────────────────────
|
|
162
|
+
signedUrl(key, op, options) {
|
|
163
|
+
return this.inner.signedUrl(key, op, options);
|
|
164
|
+
}
|
|
165
|
+
// ── Versioning ───────────────────────────────────────────────────────────────
|
|
166
|
+
listVersions(key) {
|
|
167
|
+
return this.inner.listVersions(key);
|
|
168
|
+
}
|
|
169
|
+
restoreVersion(key, versionId) {
|
|
170
|
+
return this.inner.restoreVersion(key, versionId);
|
|
171
|
+
}
|
|
172
|
+
deleteVersion(key, versionId) {
|
|
173
|
+
return this.inner.deleteVersion(key, versionId);
|
|
174
|
+
}
|
|
175
|
+
// ── Lifecycle ────────────────────────────────────────────────────────────────
|
|
176
|
+
applyLifecycle(rule) {
|
|
177
|
+
return this.inner.applyLifecycle(rule);
|
|
178
|
+
}
|
|
179
|
+
// ── Image processing ─────────────────────────────────────────────────────────
|
|
180
|
+
get images() {
|
|
181
|
+
return this.inner.images;
|
|
182
|
+
}
|
|
183
|
+
// ── Directory API ────────────────────────────────────────────────────────────
|
|
184
|
+
get directory() {
|
|
185
|
+
return this.inner.directory;
|
|
186
|
+
}
|
|
187
|
+
// ── Search ───────────────────────────────────────────────────────────────────
|
|
188
|
+
search(filters) {
|
|
189
|
+
return this.inner.search(filters);
|
|
190
|
+
}
|
|
191
|
+
// ── Observability ────────────────────────────────────────────────────────────
|
|
192
|
+
stats() {
|
|
193
|
+
return this.inner.stats();
|
|
194
|
+
}
|
|
195
|
+
probe() {
|
|
196
|
+
return this.inner.probe();
|
|
197
|
+
}
|
|
198
|
+
close() {
|
|
199
|
+
return this.inner.close();
|
|
200
|
+
}
|
|
201
|
+
// ── Time control convenience ─────────────────────────────────────────────────
|
|
202
|
+
/** Advance the double's clock forward by `deltaMs` milliseconds. */
|
|
203
|
+
advanceTime(deltaMs) {
|
|
204
|
+
this.clock.advance(deltaMs);
|
|
205
|
+
}
|
|
206
|
+
/** Set the double's clock to an absolute epoch-ms value. */
|
|
207
|
+
setTime(epochMs) {
|
|
208
|
+
this.clock.set(epochMs);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// ── StorageHarness ─────────────────────────────────────────────────────────
|
|
212
|
+
/**
|
|
213
|
+
* A test harness bundling an advanceable {@link AdvanceableClock}, a
|
|
214
|
+
* {@link Storage} built on that clock, and a set of async assertion helpers for
|
|
215
|
+
* concise, readable storage tests. Everything runs in-process with no network
|
|
216
|
+
* (Requirement 22.2).
|
|
217
|
+
*
|
|
218
|
+
* @typeParam T - Optional per-application custom metadata map.
|
|
219
|
+
*/
|
|
220
|
+
export class StorageHarness {
|
|
221
|
+
/** The advanceable clock the harness's storage derives all timestamps from. */
|
|
222
|
+
clock;
|
|
223
|
+
/** The memory-backed {@link Storage} under test, wired to {@link clock}. */
|
|
224
|
+
storage;
|
|
225
|
+
constructor(config = {}) {
|
|
226
|
+
this.clock = createAdvanceableClock();
|
|
227
|
+
this.storage = createStorage({
|
|
228
|
+
signingSecret: DEFAULT_SIGNING_SECRET,
|
|
229
|
+
...config,
|
|
230
|
+
clock: this.clock,
|
|
231
|
+
provider: "memory",
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
/** Advance the harness clock forward by `deltaMs` milliseconds. */
|
|
235
|
+
advance(deltaMs) {
|
|
236
|
+
this.clock.advance(deltaMs);
|
|
237
|
+
}
|
|
238
|
+
/** Set the harness clock to an absolute epoch-ms value. */
|
|
239
|
+
setTime(epochMs) {
|
|
240
|
+
this.clock.set(epochMs);
|
|
241
|
+
}
|
|
242
|
+
/** Assert an object exists at `key`. */
|
|
243
|
+
async assertExists(key) {
|
|
244
|
+
assert.equal(await this.storage.exists(key), true, `expected object to exist at "${key}"`);
|
|
245
|
+
}
|
|
246
|
+
/** Assert no object exists at `key`. */
|
|
247
|
+
async assertMissing(key) {
|
|
248
|
+
assert.equal(await this.storage.exists(key), false, `expected no object at "${key}"`);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Assert the object at `key` holds exactly `expected` bytes (a string is
|
|
252
|
+
* compared as its UTF-8 encoding).
|
|
253
|
+
*/
|
|
254
|
+
async assertContent(key, expected) {
|
|
255
|
+
const result = await this.storage.get(key);
|
|
256
|
+
assert.equal(result.found, true, `expected object to exist at "${key}"`);
|
|
257
|
+
const expectedBytes = typeof expected === "string" ? new TextEncoder().encode(expected) : expected;
|
|
258
|
+
assert.deepEqual(Buffer.from(result.bytes ?? new Uint8Array()), Buffer.from(expectedBytes), `content mismatch at "${key}"`);
|
|
259
|
+
}
|
|
260
|
+
/** Assert the stored object at `key` reports exactly `size` bytes. */
|
|
261
|
+
async assertSize(key, size) {
|
|
262
|
+
const metadata = await this.storage.stat(key);
|
|
263
|
+
assert.notEqual(metadata, null, `expected object to exist at "${key}"`);
|
|
264
|
+
assert.equal(metadata?.size, size, `size mismatch at "${key}"`);
|
|
265
|
+
}
|
|
266
|
+
/** Assert the set of keys under `prefix` equals `expected` (order-insensitive). */
|
|
267
|
+
async assertKeys(prefix, expected) {
|
|
268
|
+
const items = await this.storage.list(prefix);
|
|
269
|
+
const actual = items.map((item) => item.key).sort();
|
|
270
|
+
assert.deepEqual(actual, [...expected].sort(), `key set mismatch under "${prefix}"`);
|
|
271
|
+
}
|
|
272
|
+
/** Release any resources held by the harness's storage. */
|
|
273
|
+
async close() {
|
|
274
|
+
await this.storage.close();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// ── FakeUpload ─────────────────────────────────────────────────────────────
|
|
278
|
+
/**
|
|
279
|
+
* A simple in-process upload double for chunked / progress-style flows. Bytes
|
|
280
|
+
* written via {@link FakeUpload.write} are buffered in memory; {@link
|
|
281
|
+
* FakeUpload.complete} persists the assembled bytes to the backing
|
|
282
|
+
* {@link Storage} and returns the resulting metadata. Requires no network
|
|
283
|
+
* (Requirement 22.2).
|
|
284
|
+
*/
|
|
285
|
+
export class FakeUpload {
|
|
286
|
+
storage;
|
|
287
|
+
key;
|
|
288
|
+
options;
|
|
289
|
+
chunks = [];
|
|
290
|
+
completed = false;
|
|
291
|
+
aborted = false;
|
|
292
|
+
constructor(storage,
|
|
293
|
+
/** The destination key the completed upload is written to. */
|
|
294
|
+
key, options) {
|
|
295
|
+
this.storage = storage;
|
|
296
|
+
this.key = key;
|
|
297
|
+
this.options = options;
|
|
298
|
+
}
|
|
299
|
+
/** Total number of bytes buffered so far. */
|
|
300
|
+
get bytesWritten() {
|
|
301
|
+
return this.chunks.reduce((total, chunk) => total + chunk.byteLength, 0);
|
|
302
|
+
}
|
|
303
|
+
/** Whether {@link complete} has already run. */
|
|
304
|
+
get isCompleted() {
|
|
305
|
+
return this.completed;
|
|
306
|
+
}
|
|
307
|
+
/** Whether the upload was aborted. */
|
|
308
|
+
get isAborted() {
|
|
309
|
+
return this.aborted;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Buffer another chunk of upload content. A `string` chunk is encoded as
|
|
313
|
+
* UTF-8. Throws if the upload has already completed or been aborted.
|
|
314
|
+
*/
|
|
315
|
+
write(chunk) {
|
|
316
|
+
if (this.completed) {
|
|
317
|
+
throw new Error("FakeUpload: cannot write after complete()");
|
|
318
|
+
}
|
|
319
|
+
if (this.aborted) {
|
|
320
|
+
throw new Error("FakeUpload: cannot write after abort()");
|
|
321
|
+
}
|
|
322
|
+
this.chunks.push(typeof chunk === "string" ? Buffer.from(chunk, "utf8") : Buffer.from(chunk));
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Persist all buffered chunks to the backing storage under {@link key} and
|
|
326
|
+
* return the stored object's metadata. Throws if already completed or aborted.
|
|
327
|
+
*/
|
|
328
|
+
async complete() {
|
|
329
|
+
if (this.completed) {
|
|
330
|
+
throw new Error("FakeUpload: already completed");
|
|
331
|
+
}
|
|
332
|
+
if (this.aborted) {
|
|
333
|
+
throw new Error("FakeUpload: cannot complete an aborted upload");
|
|
334
|
+
}
|
|
335
|
+
this.completed = true;
|
|
336
|
+
const bytes = new Uint8Array(Buffer.concat(this.chunks));
|
|
337
|
+
return this.storage.put(this.key, bytes, this.options);
|
|
338
|
+
}
|
|
339
|
+
/** Discard buffered content; nothing is persisted. */
|
|
340
|
+
abort() {
|
|
341
|
+
this.aborted = true;
|
|
342
|
+
this.chunks.length = 0;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// ── FakeDownload ───────────────────────────────────────────────────────────
|
|
346
|
+
/**
|
|
347
|
+
* A simple in-process download double. Reads the object at `key` from the
|
|
348
|
+
* backing {@link Storage} and exposes its content as bytes, text, or an async
|
|
349
|
+
* chunk iterator. Requires no network (Requirement 22.2).
|
|
350
|
+
*/
|
|
351
|
+
export class FakeDownload {
|
|
352
|
+
storage;
|
|
353
|
+
key;
|
|
354
|
+
constructor(storage,
|
|
355
|
+
/** The source key this download reads from. */
|
|
356
|
+
key) {
|
|
357
|
+
this.storage = storage;
|
|
358
|
+
this.key = key;
|
|
359
|
+
}
|
|
360
|
+
/** Whether an object currently exists at {@link key}. */
|
|
361
|
+
found() {
|
|
362
|
+
return this.storage.exists(this.key);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Read and return the full object bytes. Throws {@link NotFoundError} when no
|
|
366
|
+
* object exists at {@link key}.
|
|
367
|
+
*/
|
|
368
|
+
async bytes() {
|
|
369
|
+
const result = await this.storage.get(this.key);
|
|
370
|
+
if (!result.found || result.bytes === undefined) {
|
|
371
|
+
throw new NotFoundError(this.key);
|
|
372
|
+
}
|
|
373
|
+
return result.bytes;
|
|
374
|
+
}
|
|
375
|
+
/** Read the full object content decoded as a UTF-8 string. */
|
|
376
|
+
async text() {
|
|
377
|
+
return Buffer.from(await this.bytes()).toString("utf8");
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Yield the object content in fixed-size chunks of at most `chunkSize` bytes,
|
|
381
|
+
* simulating a streamed download. Throws {@link NotFoundError} when absent.
|
|
382
|
+
*/
|
|
383
|
+
async *chunks(chunkSize = 64 * 1024) {
|
|
384
|
+
if (chunkSize <= 0) {
|
|
385
|
+
throw new Error("FakeDownload: chunkSize must be a positive integer");
|
|
386
|
+
}
|
|
387
|
+
const bytes = await this.bytes();
|
|
388
|
+
for (let offset = 0; offset < bytes.byteLength; offset += chunkSize) {
|
|
389
|
+
yield bytes.subarray(offset, Math.min(offset + chunkSize, bytes.byteLength));
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.test.d.ts","sourceRoot":"","sources":["../../src/tests/access.test.ts"],"names":[],"mappings":""}
|