@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.
Files changed (225) hide show
  1. package/dist/drivers/local.d.ts +8 -0
  2. package/dist/drivers/local.d.ts.map +1 -1
  3. package/dist/drivers/local.js +18 -3
  4. package/dist/drivers/local.js.map +1 -1
  5. package/package.json +12 -6
  6. package/dist/tests/access.test.d.ts +0 -2
  7. package/dist/tests/access.test.d.ts.map +0 -1
  8. package/dist/tests/access.test.js +0 -270
  9. package/dist/tests/access.test.js.map +0 -1
  10. package/dist/tests/azure-driver.test.d.ts +0 -2
  11. package/dist/tests/azure-driver.test.d.ts.map +0 -1
  12. package/dist/tests/azure-driver.test.js +0 -183
  13. package/dist/tests/azure-driver.test.js.map +0 -1
  14. package/dist/tests/backblaze-driver.test.d.ts +0 -2
  15. package/dist/tests/backblaze-driver.test.d.ts.map +0 -1
  16. package/dist/tests/backblaze-driver.test.js +0 -185
  17. package/dist/tests/backblaze-driver.test.js.map +0 -1
  18. package/dist/tests/bridge-degradation.test.d.ts +0 -2
  19. package/dist/tests/bridge-degradation.test.d.ts.map +0 -1
  20. package/dist/tests/bridge-degradation.test.js +0 -138
  21. package/dist/tests/bridge-degradation.test.js.map +0 -1
  22. package/dist/tests/cli.test.d.ts +0 -2
  23. package/dist/tests/cli.test.d.ts.map +0 -1
  24. package/dist/tests/cli.test.js +0 -127
  25. package/dist/tests/cli.test.js.map +0 -1
  26. package/dist/tests/contract.d.ts +0 -131
  27. package/dist/tests/contract.d.ts.map +0 -1
  28. package/dist/tests/contract.js +0 -222
  29. package/dist/tests/contract.js.map +0 -1
  30. package/dist/tests/contract.test.d.ts +0 -2
  31. package/dist/tests/contract.test.d.ts.map +0 -1
  32. package/dist/tests/contract.test.js +0 -110
  33. package/dist/tests/contract.test.js.map +0 -1
  34. package/dist/tests/directory.test.d.ts +0 -2
  35. package/dist/tests/directory.test.d.ts.map +0 -1
  36. package/dist/tests/directory.test.js +0 -125
  37. package/dist/tests/directory.test.js.map +0 -1
  38. package/dist/tests/errors.test.d.ts +0 -2
  39. package/dist/tests/errors.test.d.ts.map +0 -1
  40. package/dist/tests/errors.test.js +0 -93
  41. package/dist/tests/errors.test.js.map +0 -1
  42. package/dist/tests/events-bridge.test.d.ts +0 -2
  43. package/dist/tests/events-bridge.test.d.ts.map +0 -1
  44. package/dist/tests/events-bridge.test.js +0 -228
  45. package/dist/tests/events-bridge.test.js.map +0 -1
  46. package/dist/tests/example-smoke.test.d.ts +0 -2
  47. package/dist/tests/example-smoke.test.d.ts.map +0 -1
  48. package/dist/tests/example-smoke.test.js +0 -34
  49. package/dist/tests/example-smoke.test.js.map +0 -1
  50. package/dist/tests/gcs-driver.test.d.ts +0 -2
  51. package/dist/tests/gcs-driver.test.d.ts.map +0 -1
  52. package/dist/tests/gcs-driver.test.js +0 -197
  53. package/dist/tests/gcs-driver.test.js.map +0 -1
  54. package/dist/tests/image.test.d.ts +0 -2
  55. package/dist/tests/image.test.d.ts.map +0 -1
  56. package/dist/tests/image.test.js +0 -102
  57. package/dist/tests/image.test.js.map +0 -1
  58. package/dist/tests/lifecycle.test.d.ts +0 -2
  59. package/dist/tests/lifecycle.test.d.ts.map +0 -1
  60. package/dist/tests/lifecycle.test.js +0 -171
  61. package/dist/tests/lifecycle.test.js.map +0 -1
  62. package/dist/tests/local-driver.test.d.ts +0 -2
  63. package/dist/tests/local-driver.test.d.ts.map +0 -1
  64. package/dist/tests/local-driver.test.js +0 -153
  65. package/dist/tests/local-driver.test.js.map +0 -1
  66. package/dist/tests/local-streaming.test.d.ts +0 -2
  67. package/dist/tests/local-streaming.test.d.ts.map +0 -1
  68. package/dist/tests/local-streaming.test.js +0 -121
  69. package/dist/tests/local-streaming.test.js.map +0 -1
  70. package/dist/tests/memory-driver.test.d.ts +0 -2
  71. package/dist/tests/memory-driver.test.d.ts.map +0 -1
  72. package/dist/tests/memory-driver.test.js +0 -180
  73. package/dist/tests/memory-driver.test.js.map +0 -1
  74. package/dist/tests/memory-streaming.test.d.ts +0 -2
  75. package/dist/tests/memory-streaming.test.d.ts.map +0 -1
  76. package/dist/tests/memory-streaming.test.js +0 -92
  77. package/dist/tests/memory-streaming.test.js.map +0 -1
  78. package/dist/tests/minio-driver.test.d.ts +0 -2
  79. package/dist/tests/minio-driver.test.d.ts.map +0 -1
  80. package/dist/tests/minio-driver.test.js +0 -146
  81. package/dist/tests/minio-driver.test.js.map +0 -1
  82. package/dist/tests/non-s3-integration.test.d.ts +0 -2
  83. package/dist/tests/non-s3-integration.test.d.ts.map +0 -1
  84. package/dist/tests/non-s3-integration.test.js +0 -201
  85. package/dist/tests/non-s3-integration.test.js.map +0 -1
  86. package/dist/tests/observability.registration.test.d.ts +0 -2
  87. package/dist/tests/observability.registration.test.d.ts.map +0 -1
  88. package/dist/tests/observability.registration.test.js +0 -103
  89. package/dist/tests/observability.registration.test.js.map +0 -1
  90. package/dist/tests/observability.test.d.ts +0 -2
  91. package/dist/tests/observability.test.d.ts.map +0 -1
  92. package/dist/tests/observability.test.js +0 -240
  93. package/dist/tests/observability.test.js.map +0 -1
  94. package/dist/tests/plugin.test.d.ts +0 -2
  95. package/dist/tests/plugin.test.d.ts.map +0 -1
  96. package/dist/tests/plugin.test.js +0 -112
  97. package/dist/tests/plugin.test.js.map +0 -1
  98. package/dist/tests/prop-concurrent.test.d.ts +0 -2
  99. package/dist/tests/prop-concurrent.test.d.ts.map +0 -1
  100. package/dist/tests/prop-concurrent.test.js +0 -59
  101. package/dist/tests/prop-concurrent.test.js.map +0 -1
  102. package/dist/tests/prop-copy.test.d.ts +0 -2
  103. package/dist/tests/prop-copy.test.d.ts.map +0 -1
  104. package/dist/tests/prop-copy.test.js +0 -63
  105. package/dist/tests/prop-copy.test.js.map +0 -1
  106. package/dist/tests/prop-delete.test.d.ts +0 -2
  107. package/dist/tests/prop-delete.test.d.ts.map +0 -1
  108. package/dist/tests/prop-delete.test.js +0 -35
  109. package/dist/tests/prop-delete.test.js.map +0 -1
  110. package/dist/tests/prop-directory.test.d.ts +0 -2
  111. package/dist/tests/prop-directory.test.d.ts.map +0 -1
  112. package/dist/tests/prop-directory.test.js +0 -118
  113. package/dist/tests/prop-directory.test.js.map +0 -1
  114. package/dist/tests/prop-driver-conformance.test.d.ts +0 -2
  115. package/dist/tests/prop-driver-conformance.test.d.ts.map +0 -1
  116. package/dist/tests/prop-driver-conformance.test.js +0 -110
  117. package/dist/tests/prop-driver-conformance.test.js.map +0 -1
  118. package/dist/tests/prop-driver-equivalence.test.d.ts +0 -2
  119. package/dist/tests/prop-driver-equivalence.test.d.ts.map +0 -1
  120. package/dist/tests/prop-driver-equivalence.test.js +0 -163
  121. package/dist/tests/prop-driver-equivalence.test.js.map +0 -1
  122. package/dist/tests/prop-lifecycle.test.d.ts +0 -2
  123. package/dist/tests/prop-lifecycle.test.d.ts.map +0 -1
  124. package/dist/tests/prop-lifecycle.test.js +0 -83
  125. package/dist/tests/prop-lifecycle.test.js.map +0 -1
  126. package/dist/tests/prop-list.test.d.ts +0 -2
  127. package/dist/tests/prop-list.test.d.ts.map +0 -1
  128. package/dist/tests/prop-list.test.js +0 -53
  129. package/dist/tests/prop-list.test.js.map +0 -1
  130. package/dist/tests/prop-metadata.test.d.ts +0 -2
  131. package/dist/tests/prop-metadata.test.d.ts.map +0 -1
  132. package/dist/tests/prop-metadata.test.js +0 -87
  133. package/dist/tests/prop-metadata.test.js.map +0 -1
  134. package/dist/tests/prop-move.test.d.ts +0 -2
  135. package/dist/tests/prop-move.test.d.ts.map +0 -1
  136. package/dist/tests/prop-move.test.js +0 -67
  137. package/dist/tests/prop-move.test.js.map +0 -1
  138. package/dist/tests/prop-multipart-abort.test.d.ts +0 -2
  139. package/dist/tests/prop-multipart-abort.test.d.ts.map +0 -1
  140. package/dist/tests/prop-multipart-abort.test.js +0 -48
  141. package/dist/tests/prop-multipart-abort.test.js.map +0 -1
  142. package/dist/tests/prop-multipart.test.d.ts +0 -2
  143. package/dist/tests/prop-multipart.test.d.ts.map +0 -1
  144. package/dist/tests/prop-multipart.test.js +0 -65
  145. package/dist/tests/prop-multipart.test.js.map +0 -1
  146. package/dist/tests/prop-resumable.test.d.ts +0 -2
  147. package/dist/tests/prop-resumable.test.d.ts.map +0 -1
  148. package/dist/tests/prop-resumable.test.js +0 -78
  149. package/dist/tests/prop-resumable.test.js.map +0 -1
  150. package/dist/tests/prop-search.test.d.ts +0 -2
  151. package/dist/tests/prop-search.test.d.ts.map +0 -1
  152. package/dist/tests/prop-search.test.js +0 -120
  153. package/dist/tests/prop-search.test.js.map +0 -1
  154. package/dist/tests/prop-signed-url.test.d.ts +0 -2
  155. package/dist/tests/prop-signed-url.test.d.ts.map +0 -1
  156. package/dist/tests/prop-signed-url.test.js +0 -74
  157. package/dist/tests/prop-signed-url.test.js.map +0 -1
  158. package/dist/tests/prop-streaming.test.d.ts +0 -2
  159. package/dist/tests/prop-streaming.test.d.ts.map +0 -1
  160. package/dist/tests/prop-streaming.test.js +0 -34
  161. package/dist/tests/prop-streaming.test.js.map +0 -1
  162. package/dist/tests/prop-upload-download.test.d.ts +0 -2
  163. package/dist/tests/prop-upload-download.test.d.ts.map +0 -1
  164. package/dist/tests/prop-upload-download.test.js +0 -30
  165. package/dist/tests/prop-upload-download.test.js.map +0 -1
  166. package/dist/tests/prop-validation.test.d.ts +0 -2
  167. package/dist/tests/prop-validation.test.d.ts.map +0 -1
  168. package/dist/tests/prop-validation.test.js +0 -50
  169. package/dist/tests/prop-validation.test.js.map +0 -1
  170. package/dist/tests/prop-versioning.test.d.ts +0 -2
  171. package/dist/tests/prop-versioning.test.d.ts.map +0 -1
  172. package/dist/tests/prop-versioning.test.js +0 -74
  173. package/dist/tests/prop-versioning.test.js.map +0 -1
  174. package/dist/tests/queue-bridge.test.d.ts +0 -2
  175. package/dist/tests/queue-bridge.test.d.ts.map +0 -1
  176. package/dist/tests/queue-bridge.test.js +0 -111
  177. package/dist/tests/queue-bridge.test.js.map +0 -1
  178. package/dist/tests/r2-driver.test.d.ts +0 -2
  179. package/dist/tests/r2-driver.test.d.ts.map +0 -1
  180. package/dist/tests/r2-driver.test.js +0 -143
  181. package/dist/tests/r2-driver.test.js.map +0 -1
  182. package/dist/tests/realtime-bridge.test.d.ts +0 -2
  183. package/dist/tests/realtime-bridge.test.d.ts.map +0 -1
  184. package/dist/tests/realtime-bridge.test.js +0 -106
  185. package/dist/tests/realtime-bridge.test.js.map +0 -1
  186. package/dist/tests/resumable.test.d.ts +0 -2
  187. package/dist/tests/resumable.test.d.ts.map +0 -1
  188. package/dist/tests/resumable.test.js +0 -104
  189. package/dist/tests/resumable.test.js.map +0 -1
  190. package/dist/tests/s3-base.test.d.ts +0 -2
  191. package/dist/tests/s3-base.test.d.ts.map +0 -1
  192. package/dist/tests/s3-base.test.js +0 -289
  193. package/dist/tests/s3-base.test.js.map +0 -1
  194. package/dist/tests/s3-integration.test.d.ts +0 -2
  195. package/dist/tests/s3-integration.test.d.ts.map +0 -1
  196. package/dist/tests/s3-integration.test.js +0 -270
  197. package/dist/tests/s3-integration.test.js.map +0 -1
  198. package/dist/tests/s3.test.d.ts +0 -2
  199. package/dist/tests/s3.test.d.ts.map +0 -1
  200. package/dist/tests/s3.test.js +0 -203
  201. package/dist/tests/s3.test.js.map +0 -1
  202. package/dist/tests/scaffold.test.d.ts +0 -2
  203. package/dist/tests/scaffold.test.d.ts.map +0 -1
  204. package/dist/tests/scaffold.test.js +0 -13
  205. package/dist/tests/scaffold.test.js.map +0 -1
  206. package/dist/tests/search.test.d.ts +0 -2
  207. package/dist/tests/search.test.d.ts.map +0 -1
  208. package/dist/tests/search.test.js +0 -106
  209. package/dist/tests/search.test.js.map +0 -1
  210. package/dist/tests/supabase-driver.test.d.ts +0 -2
  211. package/dist/tests/supabase-driver.test.d.ts.map +0 -1
  212. package/dist/tests/supabase-driver.test.js +0 -196
  213. package/dist/tests/supabase-driver.test.js.map +0 -1
  214. package/dist/tests/testing-utilities.test.d.ts +0 -2
  215. package/dist/tests/testing-utilities.test.d.ts.map +0 -1
  216. package/dist/tests/testing-utilities.test.js +0 -138
  217. package/dist/tests/testing-utilities.test.js.map +0 -1
  218. package/dist/tests/validation.test.d.ts +0 -2
  219. package/dist/tests/validation.test.d.ts.map +0 -1
  220. package/dist/tests/validation.test.js +0 -135
  221. package/dist/tests/validation.test.js.map +0 -1
  222. package/dist/tests/versioning.test.d.ts +0 -2
  223. package/dist/tests/versioning.test.d.ts.map +0 -1
  224. package/dist/tests/versioning.test.js +0 -128
  225. package/dist/tests/versioning.test.js.map +0 -1
@@ -1,197 +0,0 @@
1
- // Unit tests for the Google Cloud Storage driver submodule (task 29.2). Unlike
2
- // the S3-compatible providers, GCS uses a bucket/file object model, so the
3
- // driver maps the StorageDriver contract directly onto a purpose-built
4
- // structural GcsClientLike (not the shared S3 base). These tests exercise the
5
- // injected-client path with an in-memory GcsClientLike double (no
6
- // `@google-cloud/storage` SDK, no external service), the StorageConfigError
7
- // guard when no client is injected, the connect() guard when the SDK is absent,
8
- // and the shared driver contract-conformance suite.
9
- //
10
- // Requirements: 2.1, 2.3, 3.3
11
- import test from "node:test";
12
- import assert from "node:assert/strict";
13
- import { createGoogleCloudStorageDriver, connectGoogleCloudStorageDriver, } from "../drivers/gcs.js";
14
- import { StorageConfigError } from "../errors.js";
15
- import { registerStorageDriverContractTests } from "./contract.js";
16
- const FIXED_NOW = 1_700_000_000_000;
17
- const fixedClock = () => FIXED_NOW;
18
- function bytes(str) {
19
- return new TextEncoder().encode(str);
20
- }
21
- /**
22
- * A minimal in-memory GcsClientLike double. It stores the raw bytes plus the
23
- * content type and custom-metadata map exactly as the real GCS object model
24
- * would, and returns `null` (never throws) for a missing object so the driver's
25
- * not-found mapping is exercised.
26
- */
27
- function makeFakeClient() {
28
- const objects = new Map(); // name -> { bytes, contentType, metadata }
29
- return {
30
- async save(name, data, options) {
31
- objects.set(name, {
32
- bytes: data.slice(),
33
- contentType: options?.contentType,
34
- metadata: options?.metadata ? { ...options.metadata } : undefined,
35
- });
36
- },
37
- async download(name) {
38
- const obj = objects.get(name);
39
- return obj === undefined ? null : obj.bytes.slice();
40
- },
41
- async delete(name) {
42
- objects.delete(name);
43
- },
44
- async exists(name) {
45
- return objects.has(name);
46
- },
47
- async getMetadata(name) {
48
- const obj = objects.get(name);
49
- if (obj === undefined)
50
- return null;
51
- return {
52
- size: String(obj.bytes.byteLength),
53
- contentType: obj.contentType,
54
- etag: `${name}-etag`,
55
- updated: new Date(FIXED_NOW).toISOString(),
56
- timeCreated: new Date(FIXED_NOW).toISOString(),
57
- metadata: obj.metadata,
58
- };
59
- },
60
- async getFiles({ prefix }) {
61
- return [...objects.entries()]
62
- .filter(([name]) => name.startsWith(prefix))
63
- .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
64
- .map(([name, obj]) => ({
65
- name,
66
- attributes: {
67
- size: String(obj.bytes.byteLength),
68
- updated: new Date(FIXED_NOW).toISOString(),
69
- },
70
- }));
71
- },
72
- };
73
- }
74
- function makeDriver() {
75
- return createGoogleCloudStorageDriver(makeFakeClient(), { clock: fixedClock });
76
- }
77
- // ── name ──────────────────────────────────────────────────────────────────────
78
- test("driver name is fixed to gcs", () => {
79
- assert.equal(makeDriver().name, "gcs");
80
- });
81
- // ── injected-client primitives round-trip ─────────────────────────────────────
82
- test("put/get round-trips bytes and typed metadata over the injected client", async () => {
83
- const driver = makeDriver();
84
- const content = bytes("gcs object payload");
85
- await driver.put("bucketed/key.txt", content, {
86
- contentType: "text/plain",
87
- owner: "user-7",
88
- tenant: "tenant-q",
89
- accessLevel: "public",
90
- custom: { label: "report" },
91
- });
92
- const result = await driver.get("bucketed/key.txt");
93
- assert.equal(result.found, true);
94
- assert.deepEqual(result.bytes, content);
95
- assert.equal(result.metadata.contentType, "text/plain");
96
- assert.equal(result.metadata.owner, "user-7");
97
- assert.equal(result.metadata.tenant, "tenant-q");
98
- assert.equal(result.metadata.accessLevel, "public");
99
- assert.deepEqual(result.metadata.custom, { label: "report" });
100
- assert.equal(result.metadata.size, content.byteLength);
101
- });
102
- test("createdAt is preserved across overwrite while updatedAt advances", async () => {
103
- let now = 1000;
104
- const driver = createGoogleCloudStorageDriver(makeFakeClient(), { clock: () => now });
105
- const first = await driver.put("k.txt", bytes("v1"), {});
106
- now = 5000;
107
- const second = await driver.put("k.txt", bytes("v2-longer"), {});
108
- assert.equal(second.createdAt, first.createdAt);
109
- assert.equal(second.updatedAt, 5000);
110
- assert.equal(second.size, bytes("v2-longer").byteLength);
111
- });
112
- test("exists/delete/stat/list behave consistently", async () => {
113
- const driver = makeDriver();
114
- await driver.put("d/a.txt", bytes("a"), {});
115
- await driver.put("d/b.txt", bytes("bb"), {});
116
- assert.equal(await driver.exists("d/a.txt"), true);
117
- assert.equal(await driver.exists("d/missing.txt"), false);
118
- const stat = await driver.stat("d/b.txt");
119
- assert.ok(stat);
120
- assert.equal(stat.size, 2);
121
- assert.equal(await driver.stat("d/missing.txt"), null);
122
- const items = await driver.list("d/");
123
- assert.deepEqual(items.map((i) => i.key), ["d/a.txt", "d/b.txt"]);
124
- await driver.delete("d/a.txt");
125
- assert.equal(await driver.exists("d/a.txt"), false);
126
- });
127
- test("list honors cursor and limit", async () => {
128
- const driver = makeDriver();
129
- await driver.put("p/1", bytes("1"), {});
130
- await driver.put("p/2", bytes("2"), {});
131
- await driver.put("p/3", bytes("3"), {});
132
- const limited = await driver.list("p/", { limit: 2 });
133
- assert.deepEqual(limited.map((i) => i.key), ["p/1", "p/2"]);
134
- const afterCursor = await driver.list("p/", { cursor: "p/1" });
135
- assert.deepEqual(afterCursor.map((i) => i.key), ["p/2", "p/3"]);
136
- });
137
- test("get on a missing key reports found:false", async () => {
138
- const driver = makeDriver();
139
- const result = await driver.get("nope");
140
- assert.equal(result.found, false);
141
- });
142
- // ── streaming ──────────────────────────────────────────────────────────────────
143
- test("putStream/getStream round-trip through the injected client", async () => {
144
- const { Readable } = await import("node:stream");
145
- const driver = makeDriver();
146
- const payload = bytes("streamed gcs payload");
147
- await driver.putStream("s/obj.bin", Readable.from([Buffer.from(payload)]), {
148
- contentType: "application/octet-stream",
149
- });
150
- const stream = await driver.getStream("s/obj.bin");
151
- const chunks = [];
152
- for await (const chunk of stream)
153
- chunks.push(Buffer.from(chunk));
154
- assert.deepEqual(new Uint8Array(Buffer.concat(chunks)), payload);
155
- });
156
- test("getStream throws NotFoundError for a missing key", async () => {
157
- const driver = makeDriver();
158
- await assert.rejects(() => driver.getStream("absent"), (err) => {
159
- assert.ok(err instanceof Error);
160
- assert.equal(err.name, "NotFoundError");
161
- return true;
162
- });
163
- });
164
- // ── advanced capabilities are left undefined for facade simulation ─────────────
165
- test("advanced capabilities are undefined (simulated by the facade)", () => {
166
- const driver = makeDriver();
167
- assert.equal(driver.multipart, undefined);
168
- assert.equal(driver.resumable, undefined);
169
- assert.equal(driver.versioning, undefined);
170
- assert.equal(driver.signedUrl, undefined);
171
- assert.equal(driver.lifecycle, undefined);
172
- });
173
- // ── configuration guards ──────────────────────────────────────────────────────
174
- test("createGoogleCloudStorageDriver throws StorageConfigError when no client is injected", () => {
175
- assert.throws(() => createGoogleCloudStorageDriver(undefined), (err) => {
176
- assert.ok(err instanceof StorageConfigError);
177
- assert.equal(err.provider, "gcs");
178
- return true;
179
- });
180
- });
181
- test("connectGoogleCloudStorageDriver throws StorageConfigError when the GCS SDK is absent", async () => {
182
- await assert.rejects(() => connectGoogleCloudStorageDriver({ bucket: "b" }), (err) => {
183
- assert.ok(err instanceof StorageConfigError);
184
- assert.equal(err.provider, "gcs");
185
- return true;
186
- });
187
- });
188
- test("connectGoogleCloudStorageDriver throws StorageConfigError when bucket is missing", async () => {
189
- await assert.rejects(() => connectGoogleCloudStorageDriver({ bucket: "" }), (err) => {
190
- assert.ok(err instanceof StorageConfigError);
191
- assert.equal(err.provider, "gcs");
192
- return true;
193
- });
194
- });
195
- // ── shared contract-conformance suite ─────────────────────────────────────────
196
- registerStorageDriverContractTests("gcs", () => createGoogleCloudStorageDriver(makeFakeClient(), { clock: fixedClock }), test);
197
- //# sourceMappingURL=gcs-driver.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gcs-driver.test.js","sourceRoot":"","sources":["../../src/tests/gcs-driver.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=image.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"image.test.d.ts","sourceRoot":"","sources":["../../src/tests/image.test.ts"],"names":[],"mappings":""}
@@ -1,102 +0,0 @@
1
- // Unit tests for the image processor's error handling and caching (task 19.2).
2
- //
3
- // Verifies the Requirement 14 semantics that guard and cache image
4
- // transformations over the zero-dependency `memory` provider, driving the
5
- // processor through the public `storage.images.transform(key, operations)`
6
- // surface with a structural fake `imageCodec`:
7
- //
8
- // - unsupported-format error: transforming a non-image source (e.g. a
9
- // `text/plain` object) throws `UnsupportedImageError` and leaves the source
10
- // Object completely unmodified — its bytes and its metadata are intact,
11
- // regardless of whether processing would otherwise succeed (Requirement 14.4).
12
- // - cache-hit reuse: two identical transform requests on the same unchanged
13
- // source invoke the injected codec only ONCE (the second request is served
14
- // from the cache) and produce the same variant (Requirement 14.3).
15
- //
16
- // Uses the Node.js built-in test runner (node:test); executed via
17
- // `node --test dist/tests/*.test.js`.
18
- //
19
- // Requirements: 14.3, 14.4
20
- import test from "node:test";
21
- import assert from "node:assert/strict";
22
- import { createStorage } from "../facade.js";
23
- import { UnsupportedImageError } from "../errors.js";
24
- const fixedClock = () => 1_700_000_000_000;
25
- /**
26
- * Build a structural fake `ImageCodec` whose `transform` returns deterministic
27
- * bytes and counts how many times it was invoked, so a test can assert the
28
- * processor cache prevents re-invocation for identical requests.
29
- */
30
- function makeFakeCodec() {
31
- const codec = {
32
- calls: 0,
33
- transform(bytes, operation) {
34
- codec.calls += 1;
35
- // Deterministic output derived only from the requested output format, so
36
- // identical requests would (absent caching) produce identical bytes.
37
- const marker = `variant:${operation.format ?? "png"}`;
38
- return new TextEncoder().encode(marker);
39
- },
40
- };
41
- return codec;
42
- }
43
- test("transforming a non-image source throws UnsupportedImageError (Req 14.4)", async () => {
44
- const codec = makeFakeCodec();
45
- const storage = createStorage({ provider: "memory", imageCodec: codec, clock: fixedClock });
46
- await storage.put("notes.txt", "just some text", { contentType: "text/plain" });
47
- await assert.rejects(() => storage.images.transform("notes.txt", { resize: { width: 10, height: 10 } }), UnsupportedImageError);
48
- // The guard must run before any codec call.
49
- assert.equal(codec.calls, 0);
50
- });
51
- test("a rejected non-image transform leaves the source Object unmodified (Req 14.4)", async () => {
52
- const codec = makeFakeCodec();
53
- const storage = createStorage({ provider: "memory", imageCodec: codec, clock: fixedClock });
54
- await storage.put("notes.txt", "just some text", { contentType: "text/plain" });
55
- const before = await storage.get("notes.txt");
56
- const beforeBytes = Buffer.from(before.bytes);
57
- const beforeMeta = before.metadata;
58
- assert.ok(beforeMeta);
59
- await assert.rejects(() => storage.images.transform("notes.txt", { format: "png", resize: { width: 4 } }), UnsupportedImageError);
60
- const after = await storage.get("notes.txt");
61
- assert.ok(after.metadata);
62
- // Bytes are byte-for-byte intact.
63
- assert.ok(beforeBytes.equals(Buffer.from(after.bytes)));
64
- assert.equal(Buffer.from(after.bytes).toString(), "just some text");
65
- // Metadata is intact: identity, size, content type, and checksum unchanged.
66
- assert.equal(after.metadata.key, beforeMeta.key);
67
- assert.equal(after.metadata.size, beforeMeta.size);
68
- assert.equal(after.metadata.contentType, "text/plain");
69
- assert.equal(after.metadata.checksum, beforeMeta.checksum);
70
- assert.equal(after.metadata.etag, beforeMeta.etag);
71
- assert.equal(after.metadata.updatedAt, beforeMeta.updatedAt);
72
- });
73
- test("identical transform requests invoke the codec only once (Req 14.3)", async () => {
74
- const codec = makeFakeCodec();
75
- const storage = createStorage({ provider: "memory", imageCodec: codec, clock: fixedClock });
76
- const pngBytes = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 1, 2, 3, 4]);
77
- await storage.put("photo.png", pngBytes, { contentType: "image/png" });
78
- const operations = { resize: { width: 100, height: 100 }, format: "webp" };
79
- const first = await storage.images.transform("photo.png", operations);
80
- const second = await storage.images.transform("photo.png", operations);
81
- // The codec performed the pixel work exactly once; the second request was a
82
- // cache hit (Requirement 14.3).
83
- assert.equal(codec.calls, 1);
84
- // Both requests produced the same variant.
85
- assert.equal(second.key, first.key);
86
- assert.equal(second.checksum, first.checksum);
87
- assert.equal(second.etag, first.etag);
88
- assert.equal(second.size, first.size);
89
- assert.equal(second.contentType, first.contentType);
90
- assert.equal(first.contentType, "image/webp");
91
- });
92
- test("distinct transform parameters are not served from the cache (Req 14.3)", async () => {
93
- const codec = makeFakeCodec();
94
- const storage = createStorage({ provider: "memory", imageCodec: codec, clock: fixedClock });
95
- const pngBytes = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 5, 6, 7, 8]);
96
- await storage.put("photo.png", pngBytes, { contentType: "image/png" });
97
- await storage.images.transform("photo.png", { resize: { width: 50 }, format: "png" });
98
- await storage.images.transform("photo.png", { resize: { width: 60 }, format: "png" });
99
- // Different parameters are a cache miss, so the codec runs for each.
100
- assert.equal(codec.calls, 2);
101
- });
102
- //# sourceMappingURL=image.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"image.test.js","sourceRoot":"","sources":["../../src/tests/image.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=lifecycle.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lifecycle.test.d.ts","sourceRoot":"","sources":["../../src/tests/lifecycle.test.ts"],"names":[],"mappings":""}
@@ -1,171 +0,0 @@
1
- // Unit tests for the lifecycle engine wired into the storage facade (task
2
- // 15.1).
3
- //
4
- // Verifies the Requirement 13 semantics over the zero-dependency `memory`
5
- // provider (which has no native `lifecycle` capability, so the engine simulates
6
- // rule evaluation over the driver primitives, measuring object age against the
7
- // injected clock):
8
- //
9
- // - all four rule types are supported (13.1): delete-after-days,
10
- // archive-after-months, expire-temp-uploads, move-to-cold.
11
- // - each qualifying object is actioned exactly once — a repeated evaluation
12
- // produces no further action on already-actioned objects (13.2).
13
- // - actions are simulated in memory for MemoryStorageDriver (13.3).
14
- // - age thresholds and optional prefixes scope which objects qualify.
15
- // - internal bookkeeping keys (e.g. version snapshots) are never actioned by
16
- // age-based rules.
17
- //
18
- // Uses the Node.js built-in test runner (node:test); executed via
19
- // `node --test dist/tests/*.test.js`.
20
- //
21
- // Requirements: 13.1, 13.2, 13.3
22
- import test from "node:test";
23
- import assert from "node:assert/strict";
24
- import { createStorage } from "../facade.js";
25
- import { LifecycleEngine, ARCHIVE_KEY_PREFIX } from "../lifecycle.js";
26
- import { MemoryStorageDriver } from "../drivers/memory.js";
27
- const DAY = 24 * 60 * 60 * 1000;
28
- const T0 = 1_700_000_000_000;
29
- /** Build a facade + backing driver sharing a mutable clock for age control. */
30
- function makeStorage() {
31
- let now = T0;
32
- const clock = () => now;
33
- const driver = new MemoryStorageDriver({ clock });
34
- const storage = createStorage({ provider: "memory", driver, clock });
35
- return {
36
- storage,
37
- driver,
38
- setTime: (value) => {
39
- now = value;
40
- },
41
- };
42
- }
43
- test("delete-after-days deletes aged objects and keeps young ones (Req 13.1)", async () => {
44
- const { storage, setTime } = makeStorage();
45
- setTime(T0);
46
- await storage.put("old", "a");
47
- setTime(T0 + 10 * DAY);
48
- await storage.put("young", "b");
49
- // Evaluate 10 days after the first write: "old" is 10 days old, "young" 0.
50
- const outcomes = await storage.applyLifecycle({ type: "delete-after-days", days: 5 });
51
- assert.deepEqual(outcomes, [{ key: "old", action: "deleted" }]);
52
- assert.equal(await storage.exists("old"), false);
53
- assert.equal(await storage.exists("young"), true);
54
- });
55
- test("delete-after-days applies exactly once (Req 13.2)", async () => {
56
- const { storage, setTime } = makeStorage();
57
- setTime(T0);
58
- await storage.put("a", "x");
59
- await storage.put("b", "y");
60
- setTime(T0 + 30 * DAY);
61
- const first = await storage.applyLifecycle({ type: "delete-after-days", days: 7 });
62
- assert.equal(first.length, 2);
63
- // A second evaluation finds nothing further to delete.
64
- const second = await storage.applyLifecycle({ type: "delete-after-days", days: 7 });
65
- assert.deepEqual(second, []);
66
- });
67
- test("delete-after-days honors the optional prefix", async () => {
68
- const { storage, setTime } = makeStorage();
69
- setTime(T0);
70
- await storage.put("logs/one", "x");
71
- await storage.put("logs/two", "y");
72
- await storage.put("keep/three", "z");
73
- setTime(T0 + 30 * DAY);
74
- const outcomes = await storage.applyLifecycle({
75
- type: "delete-after-days",
76
- days: 1,
77
- prefix: "logs/",
78
- });
79
- assert.deepEqual(outcomes.map((o) => o.key).sort(), ["logs/one", "logs/two"]);
80
- assert.equal(await storage.exists("keep/three"), true);
81
- });
82
- test("archive-after-months relocates aged objects under the archive prefix (Req 13.1)", async () => {
83
- const { storage, driver, setTime } = makeStorage();
84
- setTime(T0);
85
- await storage.put("report", "payload", { contentType: "text/plain" });
86
- setTime(T0 + 90 * DAY); // ~3 months
87
- const outcomes = await storage.applyLifecycle({ type: "archive-after-months", months: 2 });
88
- assert.deepEqual(outcomes, [{ key: "report", action: "archived" }]);
89
- // The original key no longer resolves; the content is preserved under the
90
- // reserved archive prefix.
91
- assert.equal(await storage.exists("report"), false);
92
- const archived = await driver.get(`${ARCHIVE_KEY_PREFIX}report`);
93
- assert.equal(archived.found, true);
94
- assert.equal(Buffer.from(archived.bytes).toString(), "payload");
95
- });
96
- test("archive-after-months applies exactly once (Req 13.2)", async () => {
97
- const { storage, setTime } = makeStorage();
98
- setTime(T0);
99
- await storage.put("report", "payload");
100
- setTime(T0 + 90 * DAY);
101
- const first = await storage.applyLifecycle({ type: "archive-after-months", months: 1 });
102
- assert.equal(first.length, 1);
103
- const second = await storage.applyLifecycle({ type: "archive-after-months", months: 1 });
104
- assert.deepEqual(second, []);
105
- });
106
- test("expire-temp-uploads deletes aged transient multipart state (Req 13.1, 13.3)", async () => {
107
- const { storage, setTime } = makeStorage();
108
- setTime(T0);
109
- const uploadId = await storage.createMultipartUpload("big", { contentType: "text/plain" });
110
- await storage.uploadPart(uploadId, 1, new TextEncoder().encode("part-1"));
111
- setTime(T0 + 60_000);
112
- const outcomes = await storage.applyLifecycle({ type: "expire-temp-uploads", afterMs: 30_000 });
113
- assert.equal(outcomes.length, 1);
114
- assert.equal(outcomes[0].action, "expired");
115
- assert.ok(outcomes[0].key.startsWith(".multipart/"));
116
- // Exactly once: a second evaluation finds nothing further to expire.
117
- const second = await storage.applyLifecycle({ type: "expire-temp-uploads", afterMs: 30_000 });
118
- assert.deepEqual(second, []);
119
- });
120
- test("expire-temp-uploads leaves young transient state untouched", async () => {
121
- const { storage, setTime } = makeStorage();
122
- setTime(T0);
123
- const uploadId = await storage.createMultipartUpload("big", { contentType: "text/plain" });
124
- await storage.uploadPart(uploadId, 1, new TextEncoder().encode("part-1"));
125
- setTime(T0 + 5_000);
126
- const outcomes = await storage.applyLifecycle({ type: "expire-temp-uploads", afterMs: 30_000 });
127
- assert.deepEqual(outcomes, []);
128
- });
129
- test("move-to-cold relocates aged objects under coldPrefix exactly once (Req 13.1, 13.2)", async () => {
130
- const { storage, driver, setTime } = makeStorage();
131
- setTime(T0);
132
- await storage.put("data/a", "alpha");
133
- setTime(T0 + 40 * DAY);
134
- const outcomes = await storage.applyLifecycle({
135
- type: "move-to-cold",
136
- afterDays: 30,
137
- coldPrefix: "cold/",
138
- prefix: "data/",
139
- });
140
- assert.deepEqual(outcomes, [{ key: "data/a", action: "moved" }]);
141
- assert.equal(await storage.exists("data/a"), false);
142
- const cold = await driver.get("cold/data/a");
143
- assert.equal(cold.found, true);
144
- assert.equal(Buffer.from(cold.bytes).toString(), "alpha");
145
- // A second evaluation does not move the already-tiered object again.
146
- const second = await storage.applyLifecycle({
147
- type: "move-to-cold",
148
- afterDays: 30,
149
- coldPrefix: "cold/",
150
- prefix: "data/",
151
- });
152
- assert.deepEqual(second, []);
153
- });
154
- test("age-based rules never action internal version-snapshot keys", async () => {
155
- // With versioning enabled the overwrite snapshots prior content under the
156
- // reserved `.versions/` key space. A delete-after-days over the whole key
157
- // space must action only the real object, never the snapshot.
158
- const versioned = createStorage({ provider: "memory", versioning: true, clock: () => T0 });
159
- await versioned.put("k", "v1");
160
- await versioned.put("k", "v2"); // snapshots prior content under `.versions/`
161
- assert.equal((await versioned.listVersions("k")).length, 1);
162
- const outcomes = await versioned.applyLifecycle({ type: "delete-after-days", days: 0 });
163
- // Only the real object "k" is actioned; the snapshot under `.versions/` is not.
164
- assert.deepEqual(outcomes, [{ key: "k", action: "deleted" }]);
165
- assert.equal((await versioned.listVersions("k")).length, 1);
166
- });
167
- test("LifecycleEngine is exported and constructible", () => {
168
- const engine = new LifecycleEngine({ driver: new MemoryStorageDriver({ clock: () => T0 }) });
169
- assert.ok(engine instanceof LifecycleEngine);
170
- });
171
- //# sourceMappingURL=lifecycle.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lifecycle.test.js","sourceRoot":"","sources":["../../src/tests/lifecycle.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=local-driver.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-driver.test.d.ts","sourceRoot":"","sources":["../../src/tests/local-driver.test.ts"],"names":[],"mappings":""}