Skip to content

Commit c65c203

Browse files
authored
test(client-s3): add integration test for selectObjectContent (#7325)
1 parent 7032872 commit c65c203

File tree

3 files changed

+75
-86
lines changed

3 files changed

+75
-86
lines changed

clients/client-s3/test/e2e/S3.browser.e2e.spec.ts

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { S3, SelectObjectContentEventStream, waitUntilObjectExists } from "@aws-sdk/client-s3";
1+
import type { S3, waitUntilObjectExists } from "@aws-sdk/client-s3";
22
import { fromNodeProviderChain } from "@aws-sdk/credential-providers";
33
import { FetchHttpHandler } from "@smithy/fetch-http-handler";
44
import { Browser } from "happy-dom";
@@ -315,50 +315,6 @@ describe("@aws-sdk/client-s3", () => {
315315
});
316316
});
317317

318-
describe("selectObjectContent", () => {
319-
const csvFile = `user_name,age
320-
jsrocks,13
321-
node4life,22
322-
esfuture,29`;
323-
324-
beforeEach(async () => {
325-
Key = `${Date.now()}`;
326-
await client.putObject({ Bucket, Key, Body: csvFile });
327-
});
328-
329-
afterEach(async () => {
330-
await client.deleteObject({ Bucket, Key });
331-
});
332-
333-
it("should succeed", async () => {
334-
onTestFailed(setTestFailed);
335-
const { Payload } = await client.selectObjectContent({
336-
Bucket,
337-
Key,
338-
ExpressionType: "SQL",
339-
Expression: "SELECT user_name FROM S3Object WHERE cast(age as int) > 20",
340-
InputSerialization: {
341-
CSV: {
342-
FileHeaderInfo: "USE",
343-
RecordDelimiter: "\n",
344-
FieldDelimiter: ",",
345-
},
346-
},
347-
OutputSerialization: {
348-
CSV: {},
349-
},
350-
});
351-
const events: SelectObjectContentEventStream[] = [];
352-
for await (const event of Payload!) {
353-
events.push(event);
354-
}
355-
expect(events.length).toEqual(3);
356-
expect(new TextDecoder().decode(events[0].Records?.Payload)).toEqual("node4life\nesfuture\n");
357-
expect(events[1].Stats?.Details).toBeDefined();
358-
expect(events[2].End).toBeDefined();
359-
});
360-
});
361-
362318
describe("Multi-region access point", () => {
363319
beforeEach(async () => {
364320
Key = `${Date.now()}`;

clients/client-s3/test/e2e/S3.e2e.spec.ts

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import "@aws-sdk/signature-v4-crt";
22

3-
import { ChecksumAlgorithm, S3, SelectObjectContentEventStream } from "@aws-sdk/client-s3";
3+
import { ChecksumAlgorithm, S3 } from "@aws-sdk/client-s3";
44
import { afterAll, afterEach, beforeAll, describe, expect, test as it } from "vitest";
55

66
import { getIntegTestResources } from "../../../../tests/e2e/get-integ-test-resources";
@@ -231,46 +231,6 @@ describe("@aws-sdk/client-s3", () => {
231231
});
232232
});
233233

234-
describe("selectObjectContent", () => {
235-
const csvFile = `user_name,age
236-
jsrocks,13
237-
node4life,22
238-
esfuture,29`;
239-
beforeAll(async () => {
240-
Key = `${Date.now()}`;
241-
await client.putObject({ Bucket, Key, Body: csvFile });
242-
});
243-
afterAll(async () => {
244-
await client.deleteObject({ Bucket, Key });
245-
});
246-
it("should succeed", async () => {
247-
const { Payload } = await client.selectObjectContent({
248-
Bucket,
249-
Key,
250-
ExpressionType: "SQL",
251-
Expression: "SELECT user_name FROM S3Object WHERE cast(age as int) > 20",
252-
InputSerialization: {
253-
CSV: {
254-
FileHeaderInfo: "USE",
255-
RecordDelimiter: "\n",
256-
FieldDelimiter: ",",
257-
},
258-
},
259-
OutputSerialization: {
260-
CSV: {},
261-
},
262-
});
263-
const events: SelectObjectContentEventStream[] = [];
264-
for await (const event of Payload!) {
265-
events.push(event);
266-
}
267-
expect(events.length).toEqual(3);
268-
expect(new TextDecoder().decode(events[0].Records?.Payload)).toEqual("node4life\nesfuture\n");
269-
expect(events[1].Stats?.Details).toBeDefined();
270-
expect(events[2].End).toBeDefined();
271-
});
272-
});
273-
274234
describe("Multi-region access point", () => {
275235
beforeAll(async () => {
276236
Key = `${Date.now()}`;
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import { S3 } from "@aws-sdk/client-s3";
2+
import { HttpResponse } from "@smithy/protocol-http";
3+
import { Readable } from "stream";
4+
import { describe, expect, test as it } from "vitest";
5+
6+
import { requireRequestsFrom } from "../../../../private/aws-util-test/src";
7+
8+
describe("selectObjectContent", () => {
9+
const credentials = {
10+
accessKeyId: "INTEG",
11+
secretAccessKey: "INTEG",
12+
};
13+
14+
it("should make correct request", async () => {
15+
const client = new S3({ region: "us-west-2", credentials });
16+
17+
requireRequestsFrom(client)
18+
.toMatch({
19+
hostname: /aws-sdk-js-integ-test-bucket\.s3\.us-west-2\.amazonaws\.com/,
20+
method: "POST",
21+
path: "/test-key",
22+
headers: {
23+
authorization: /AWS4-HMAC-SHA256 Credential/,
24+
"content-type": "application/xml",
25+
"x-amz-content-sha256": /./,
26+
},
27+
body(xmlBody) {
28+
expect(xmlBody).toContain(
29+
"<Expression>SELECT user_name FROM S3Object WHERE cast(age as int) &gt; 20</Expression>"
30+
);
31+
expect(xmlBody).toContain("<ExpressionType>SQL</ExpressionType>");
32+
},
33+
})
34+
.respondWith(
35+
new HttpResponse({
36+
statusCode: 200,
37+
body: Readable.from([
38+
`<?xml version="1.0" encoding="UTF-8"?>`,
39+
`<Payload>`,
40+
`<Records><Payload>blob</Payload></Records>`,
41+
`<Stats><Details><BytesProcessed>100</BytesProcessed><BytesReturned>50</BytesReturned><BytesScanned>100</BytesScanned></Details></Stats>`,
42+
`<Progress><Details><BytesProcessed>100</BytesProcessed><BytesReturned>50</BytesReturned><BytesScanned>100</BytesScanned></Details></Progress>`,
43+
`<Cont></Cont>`,
44+
`<End></End>`,
45+
`</Payload>`,
46+
]),
47+
})
48+
);
49+
50+
const response = await client.selectObjectContent({
51+
Bucket: "aws-sdk-js-integ-test-bucket",
52+
Key: "test-key",
53+
ExpressionType: "SQL",
54+
Expression: "SELECT user_name FROM S3Object WHERE cast(age as int) > 20",
55+
InputSerialization: {
56+
CSV: {
57+
FileHeaderInfo: "USE",
58+
RecordDelimiter: "\n",
59+
FieldDelimiter: ",",
60+
},
61+
},
62+
OutputSerialization: {
63+
CSV: {},
64+
},
65+
});
66+
67+
expect.hasAssertions();
68+
expect(response).toHaveProperty("$metadata");
69+
expect(response.$metadata.httpStatusCode).toBe(200);
70+
expect(response).toHaveProperty("Payload");
71+
expect(response.Payload).toBeDefined();
72+
});
73+
});

0 commit comments

Comments
 (0)