diff --git a/packages/@winglang/sdk/src/cloud/bucket.ts b/packages/@winglang/sdk/src/cloud/bucket.ts
index 21f071719fb..7907ac817a4 100644
--- a/packages/@winglang/sdk/src/cloud/bucket.ts
+++ b/packages/@winglang/sdk/src/cloud/bucket.ts
@@ -152,6 +152,7 @@ export class Bucket extends Resource {
BucketInflightMethods.TRY_GET,
BucketInflightMethods.TRY_GET_JSON,
BucketInflightMethods.TRY_DELETE,
+ BucketInflightMethods.SIGNED_URL,
BucketInflightMethods.METADATA,
BucketInflightMethods.COPY,
BucketInflightMethods.RENAME,
diff --git a/packages/@winglang/sdk/src/target-sim/bucket.inflight.ts b/packages/@winglang/sdk/src/target-sim/bucket.inflight.ts
index 884bbcf3938..35abd33fec0 100644
--- a/packages/@winglang/sdk/src/target-sim/bucket.inflight.ts
+++ b/packages/@winglang/sdk/src/target-sim/bucket.inflight.ts
@@ -302,7 +302,7 @@ export class Bucket implements IBucketClient, ISimulatorResourceInstance {
message: `Signed URL (key=${key})`,
activity: async () => {
throw new Error(
- `signedUrl is not implemented yet for sim (key=${key})`
+ `signedUrl is not implemented yet for the simulator (key=${key})`
);
},
});
diff --git a/packages/@winglang/sdk/src/target-sim/bucket.ts b/packages/@winglang/sdk/src/target-sim/bucket.ts
index d782e2f561a..1e8a859f96a 100644
--- a/packages/@winglang/sdk/src/target-sim/bucket.ts
+++ b/packages/@winglang/sdk/src/target-sim/bucket.ts
@@ -49,6 +49,7 @@ export class Bucket extends cloud.Bucket implements ISimulatorResource {
[cloud.BucketInflightMethods.TRY_GET]: [],
[cloud.BucketInflightMethods.TRY_GET_JSON]: [],
[cloud.BucketInflightMethods.TRY_DELETE]: [],
+ [cloud.BucketInflightMethods.SIGNED_URL]: [],
[cloud.BucketInflightMethods.METADATA]: [],
[cloud.BucketInflightMethods.COPY]: [],
[cloud.BucketInflightMethods.RENAME]: [],
diff --git a/packages/@winglang/sdk/test/target-sim/__snapshots__/file-counter.test.ts.snap b/packages/@winglang/sdk/test/target-sim/__snapshots__/file-counter.test.ts.snap
index 11ea546b06f..8c79e3c0884 100644
--- a/packages/@winglang/sdk/test/target-sim/__snapshots__/file-counter.test.ts.snap
+++ b/packages/@winglang/sdk/test/target-sim/__snapshots__/file-counter.test.ts.snap
@@ -89,6 +89,7 @@ async exists(...args) { return this.backend.exists(...args); }
async tryGet(...args) { return this.backend.tryGet(...args); }
async tryGetJson(...args) { return this.backend.tryGetJson(...args); }
async tryDelete(...args) { return this.backend.tryDelete(...args); }
+async signedUrl(...args) { return this.backend.signedUrl(...args); }
async metadata(...args) { return this.backend.metadata(...args); }
async copy(...args) { return this.backend.copy(...args); }
async rename(...args) { return this.backend.rename(...args); }
diff --git a/packages/@winglang/sdk/test/target-sim/bucket.test.ts b/packages/@winglang/sdk/test/target-sim/bucket.test.ts
index 189c55f1301..8f86c51061b 100644
--- a/packages/@winglang/sdk/test/target-sim/bucket.test.ts
+++ b/packages/@winglang/sdk/test/target-sim/bucket.test.ts
@@ -77,11 +77,6 @@ test("bucket on event creates 3 topics, and sends the right event and key in the
bucket.onEvent(testInflight);
const s = await app.startSimulator();
- s.onTrace({
- callback: (trace) => {
- console.log(trace);
- },
- });
const client = s.getResource("/my_bucket") as cloud.IBucketClient;
const logClient = s.getResource("/log_bucket") as cloud.IBucketClient;
@@ -943,6 +938,21 @@ test("bucket ignores corrupted state file", async () => {
expect(files).toEqual(["b"]);
});
+test("signedUrl is not implemented for the simulator", async () => {
+ // GIVEN
+ const app = new SimApp();
+ new cloud.Bucket(app, "my_bucket");
+
+ const s = await app.startSimulator();
+ const client = s.getResource("/my_bucket") as cloud.IBucketClient;
+
+ // THEN
+ await expect(() => client.signedUrl("key")).rejects.toThrowError(
+ "signedUrl is not implemented yet"
+ );
+ await s.stop();
+});
+
// Deceided to seperate this feature in a different release,(see https://github.com/winglang/wing/issues/4143)
// test("Given a bucket when reaching to a non existent key, signed url it should throw an error", async () => {
diff --git a/tests/sdk_tests/bucket/signed_url.test.w b/tests/sdk_tests/bucket/signed_url.test.w
index 83ce560b826..5df8b055127 100644
--- a/tests/sdk_tests/bucket/signed_url.test.w
+++ b/tests/sdk_tests/bucket/signed_url.test.w
@@ -5,94 +5,98 @@ bring expect;
let bucket = new cloud.Bucket();
-test "signedUrl GET (implicit)" {
- let KEY = "tempfile.txt";
- let VALUE = "Hello, Wing!";
+// TODO: signedUrl is not implemented for the simulator yet
+// https://github.com/winglang/wing/issues/1383
+if util.env("WING_TARGET") != "sim" {
+ test "signedUrl GET (implicit)" {
+ let KEY = "tempfile.txt";
+ let VALUE = "Hello, Wing!";
- bucket.put(KEY, VALUE);
+ bucket.put(KEY, VALUE);
- let getSignedUrl = bucket.signedUrl(KEY);
+ let getSignedUrl = bucket.signedUrl(KEY);
- // Download file from private bucket using GET presigned URL
- let output = util.shell("curl \"{getSignedUrl}\"");
+ // Download file from private bucket using GET presigned URL
+ let output = util.shell("curl \"{getSignedUrl}\"");
- expect.equal(output, VALUE);
-}
+ expect.equal(output, VALUE);
+ }
-test "signedUrl GET (explicit)" {
- let KEY = "tempfile.txt";
- let VALUE = "Hello, Wing!";
+ test "signedUrl GET (explicit)" {
+ let KEY = "tempfile.txt";
+ let VALUE = "Hello, Wing!";
- bucket.put(KEY, VALUE);
+ bucket.put(KEY, VALUE);
- let getSignedUrl = bucket.signedUrl(KEY, { action: cloud.BucketSignedUrlAction.DOWNLOAD });
+ let getSignedUrl = bucket.signedUrl(KEY, { action: cloud.BucketSignedUrlAction.DOWNLOAD });
- // Download file from private bucket using GET presigned URL
- let output = util.shell("curl \"{getSignedUrl}\"");
+ // Download file from private bucket using GET presigned URL
+ let output = util.shell("curl \"{getSignedUrl}\"");
- expect.equal(output, VALUE);
-}
+ expect.equal(output, VALUE);
+ }
-test "signedUrl GET with non-existent key" {
- let assertThrows = (expected: str, block: (): void) => {
- let var error = false;
- try {
- block();
- } catch actual {
- expect.equal(actual, expected);
- error = true;
- }
- expect.equal(error, true);
- };
- let UNEXISTING_KEY = "no-such-file.txt";
- let OBJECT_DOES_NOT_EXIST_ERROR = "Cannot provide signed url for a non-existent key (key={UNEXISTING_KEY})";
-
- assertThrows(OBJECT_DOES_NOT_EXIST_ERROR, () => {
- bucket.signedUrl(UNEXISTING_KEY);
- });
-}
+ test "signedUrl GET with non-existent key" {
+ let assertThrows = (expected: str, block: (): void) => {
+ let var error = false;
+ try {
+ block();
+ } catch actual {
+ expect.equal(actual, expected);
+ error = true;
+ }
+ expect.equal(error, true);
+ };
+ let UNEXISTING_KEY = "no-such-file.txt";
+ let OBJECT_DOES_NOT_EXIST_ERROR = "Cannot provide signed url for a non-existent key (key={UNEXISTING_KEY})";
-test "signedUrl PUT" {
- let KEY = "tempfile.txt";
- let VALUE = "Hello, Wing!";
+ assertThrows(OBJECT_DOES_NOT_EXIST_ERROR, () => {
+ bucket.signedUrl(UNEXISTING_KEY);
+ });
+ }
- let tempDir = fs.mkdtemp();
- let tempFile = fs.join(tempDir, KEY);
- fs.writeFile(tempFile, VALUE);
+ test "signedUrl PUT" {
+ let KEY = "tempfile.txt";
+ let VALUE = "Hello, Wing!";
- let putSignedUrl = bucket.signedUrl(KEY, { action: cloud.BucketSignedUrlAction.UPLOAD });
+ let tempDir = fs.mkdtemp();
+ let tempFile = fs.join(tempDir, KEY);
+ fs.writeFile(tempFile, VALUE);
- // Upload file to private bucket using PUT presigned URL
- util.shell("curl -X PUT -T \"{tempFile}\" \"{putSignedUrl}\"");
+ let putSignedUrl = bucket.signedUrl(KEY, { action: cloud.BucketSignedUrlAction.UPLOAD });
- expect.equal(bucket.get(KEY), VALUE);
-}
+ // Upload file to private bucket using PUT presigned URL
+ util.shell("curl -X PUT -T \"{tempFile}\" \"{putSignedUrl}\"");
+
+ expect.equal(bucket.get(KEY), VALUE);
+ }
+
+ test "signedUrl duration option is respected" {
+ let isExpiredTokenError = (output: str) => {
+ let target = util.env("WING_TARGET");
+ let var result = false;
-test "signedUrl duration option is respected" {
- let isExpiredTokenError = (output: str) => {
- let target = util.env("WING_TARGET");
- let var result = false;
+ if target == "tf-aws" {
+ result = output.contains("AccessDenied
Request has expired");
+ } else if target == "tf-gcp" {
+ result = output.contains("ExpiredToken
Invalid argument.");
+ }
- if target == "tf-aws" {
- result = output.contains("AccessDenied
Request has expired");
- } else if target == "tf-gcp" {
- result = output.contains("ExpiredToken
Invalid argument.");
- }
-
- return result;
- };
+ return result;
+ };
- let KEY = "tempfile.txt";
- let VALUE = "Hello, Wing!";
+ let KEY = "tempfile.txt";
+ let VALUE = "Hello, Wing!";
- bucket.put(KEY, VALUE);
+ bucket.put(KEY, VALUE);
- let getSignedUrl = bucket.signedUrl(KEY, { duration: 1s });
+ let getSignedUrl = bucket.signedUrl(KEY, { duration: 1s });
- util.sleep(2s);
+ util.sleep(2s);
- // Download file from private bucket using expired GET presigned URL
- let output = util.shell("curl \"{getSignedUrl}\"");
+ // Download file from private bucket using expired GET presigned URL
+ let output = util.shell("curl \"{getSignedUrl}\"");
- expect.equal(isExpiredTokenError(output), true);
+ expect.equal(isExpiredTokenError(output), true);
+ }
}
diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_test_sim.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_test_sim.md
index 8bf2edb8a4b..a8f66ecc040 100644
--- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_test_sim.md
+++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_test_sim.md
@@ -2,12 +2,11 @@
## stdout.log
```log
-Error: Resource root/Default/Bucket does not support inflight operation signedUrl.
-It might not be implemented yet.
+pass ─ cors.test.wsim (no tests)
-Tests 1 unsupported (1)
+Tests 1 passed (1)
Snapshots 1 skipped
-Test Files 1 unsupported (1)
+Test Files 1 passed (1)
Duration
```
diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/signed_url.test.w_test_sim.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/signed_url.test.w_test_sim.md
index f4e0ff995b0..b39fe7d0e69 100644
--- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/signed_url.test.w_test_sim.md
+++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/signed_url.test.w_test_sim.md
@@ -2,12 +2,11 @@
## stdout.log
```log
-Error: Resource root/Default/Bucket does not support inflight operation signedUrl.
-It might not be implemented yet.
+pass ─ signed_url.test.wsim (no tests)
-Tests 1 unsupported (1)
+Tests 1 passed (1)
Snapshots 1 skipped
-Test Files 1 unsupported (1)
+Test Files 1 passed (1)
Duration
```