Skip to content

Commit fac4ca5

Browse files
Merge remote-tracking branch 'origin/improvement/CLDSRV-724-mdSearch-related-functional-tests' into test/sylvain/sdk-migration
2 parents 4f2f2f5 + fc3948c commit fac4ca5

File tree

4 files changed

+183
-134
lines changed

4 files changed

+183
-134
lines changed

tests/functional/aws-node-sdk/test/mdSearch/basicSearch.js

Lines changed: 54 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
const {
2+
CreateBucketCommand,
3+
DeleteBucketCommand,
4+
PutObjectCommand,
5+
DeleteObjectsCommand,
6+
} = require('@aws-sdk/client-s3');
17
const s3Client = require('./utils/s3SDK');
28
const { runAndCheckSearch, runIfMongo } = require('./utils/helpers');
39

@@ -10,33 +16,33 @@ const updatedUserMetadata = { food: 'cake' };
1016

1117
runIfMongo('Basic search', () => {
1218
const bucketName = `basicsearchmebucket${Date.now()}`;
13-
before(done => {
14-
s3Client.createBucket({ Bucket: bucketName }, err => {
15-
if (err) {
16-
return done(err);
17-
}
18-
return s3Client.putObject({ Bucket: bucketName, Key: objectKey,
19-
Metadata: userMetadata, Tagging: objectTagData }, err => {
20-
if (err) {
21-
return done(err);
22-
}
23-
return s3Client.putObject({ Bucket: bucketName,
24-
Key: hiddenKey, Tagging: hiddenTagData }, done);
25-
});
26-
});
27-
});
28-
29-
after(done => {
30-
s3Client.deleteObjects({ Bucket: bucketName, Delete: { Objects: [
31-
{ Key: objectKey },
32-
{ Key: hiddenKey }],
33-
} },
34-
err => {
35-
if (err) {
36-
return done(err);
37-
}
38-
return s3Client.deleteBucket({ Bucket: bucketName }, done);
39-
});
19+
20+
before(async () => {
21+
await s3Client.send(new CreateBucketCommand({ Bucket: bucketName }));
22+
await s3Client.send(new PutObjectCommand({
23+
Bucket: bucketName,
24+
Key: objectKey,
25+
Metadata: userMetadata,
26+
Tagging: objectTagData,
27+
}));
28+
await s3Client.send(new PutObjectCommand({
29+
Bucket: bucketName,
30+
Key: hiddenKey,
31+
Tagging: hiddenTagData,
32+
}));
33+
});
34+
35+
after(async () => {
36+
await s3Client.send(new DeleteObjectsCommand({
37+
Bucket: bucketName,
38+
Delete: {
39+
Objects: [
40+
{ Key: objectKey },
41+
{ Key: hiddenKey },
42+
],
43+
},
44+
}));
45+
await s3Client.send(new DeleteBucketCommand({ Bucket: bucketName }));
4046
});
4147

4248
it('should list object with searched for system metadata', done => {
@@ -87,8 +93,13 @@ runIfMongo('Basic search', () => {
8793

8894
describe('search when overwrite object', () => {
8995
before(done => {
90-
s3Client.putObject({ Bucket: bucketName, Key: objectKey,
91-
Metadata: updatedUserMetadata }, done);
96+
s3Client.send(new PutObjectCommand({
97+
Bucket: bucketName,
98+
Key: objectKey,
99+
Metadata: updatedUserMetadata,
100+
}))
101+
.then(() => done())
102+
.catch(done);
92103
});
93104

94105
it('should list object with searched for updated user metadata',
@@ -104,12 +115,17 @@ runIfMongo('Basic search', () => {
104115

105116
runIfMongo('Search when no objects in bucket', () => {
106117
const bucketName = `noobjectbucket${Date.now()}`;
118+
107119
before(done => {
108-
s3Client.createBucket({ Bucket: bucketName }, done);
120+
s3Client.send(new CreateBucketCommand({ Bucket: bucketName }))
121+
.then(() => done())
122+
.catch(done);
109123
});
110124

111125
after(done => {
112-
s3Client.deleteBucket({ Bucket: bucketName }, done);
126+
s3Client.send(new DeleteBucketCommand({ Bucket: bucketName }))
127+
.then(() => done())
128+
.catch(done);
113129
});
114130

115131
it('should return empty listing when no objects in bucket', done => {
@@ -121,12 +137,17 @@ runIfMongo('Search when no objects in bucket', () => {
121137

122138
runIfMongo('Invalid regular expression searches', () => {
123139
const bucketName = `badregex-${Date.now()}`;
140+
124141
before(done => {
125-
s3Client.createBucket({ Bucket: bucketName }, done);
142+
s3Client.send(new CreateBucketCommand({ Bucket: bucketName }))
143+
.then(() => done())
144+
.catch(done);
126145
});
127146

128147
after(done => {
129-
s3Client.deleteBucket({ Bucket: bucketName }, done);
148+
s3Client.send(new DeleteBucketCommand({ Bucket: bucketName }))
149+
.then(() => done())
150+
.catch(done);
130151
});
131152

132153
it('should return error if pattern is invalid', done => {

tests/functional/aws-node-sdk/test/mdSearch/utils/helpers.js

Lines changed: 95 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,27 @@
11
const assert = require('assert');
22
const async = require('async');
3+
const {
4+
ListObjectsCommand,
5+
ListObjectVersionsCommand,
6+
DeleteObjectsCommand,
7+
} = require('@aws-sdk/client-s3');
38

49
function _deleteVersionList(s3Client, versionList, bucket, callback) {
510
if (versionList === undefined || versionList.length === 0) {
611
return callback();
712
}
8-
const params = { Bucket: bucket, Delete: { Objects: [] } };
9-
versionList.forEach(version => {
10-
params.Delete.Objects.push({
11-
Key: version.Key, VersionId: version.VersionId });
12-
});
13-
14-
return s3Client.deleteObjects(params, callback);
13+
const params = {
14+
Bucket: bucket,
15+
Delete: {
16+
Objects: versionList.map(version => ({
17+
Key: version.Key,
18+
VersionId: version.VersionId,
19+
})),
20+
},
21+
};
22+
return s3Client.send(new DeleteObjectsCommand(params))
23+
.then(() => callback())
24+
.catch(callback);
1525
}
1626

1727
const testUtils = {};
@@ -21,62 +31,93 @@ testUtils.runIfMongo = process.env.S3METADATA === 'mongodb' ?
2131

2232
testUtils.runAndCheckSearch = (s3Client, bucketName, encodedSearch, listVersions,
2333
testResult, done) => {
24-
let searchRequest;
25-
if (listVersions) {
26-
searchRequest = s3Client.listObjectVersions({ Bucket: bucketName });
27-
searchRequest.on('build', () => {
28-
searchRequest.httpRequest.path =
29-
`/${bucketName}?search=${encodedSearch}&&versions`;
30-
});
31-
searchRequest.on('success', res => {
32-
if (testResult) {
33-
assert.notStrictEqual(res.data.Versions[0].VersionId, undefined);
34-
if (Array.isArray(testResult)) {
35-
assert.strictEqual(res.data.Versions.length, testResult.length);
36-
async.forEachOf(testResult, (expected, i, next) => {
37-
assert.strictEqual(res.data.Versions[i].Key, expected);
38-
next();
39-
});
34+
const makeRequest = async () => {
35+
try {
36+
const input = {
37+
Bucket: bucketName,
38+
};
39+
40+
let command;
41+
if (listVersions) {
42+
command = new ListObjectVersionsCommand(input);
43+
} else {
44+
command = new ListObjectsCommand(input);
45+
}
46+
47+
// Add middleware to inject the search query parameter
48+
// SDK v3 automatically encodes query parameters, so we decode first to avoid double-encoding
49+
command.middlewareStack.add(
50+
next => async args => {
51+
if (!args.request.query) {
52+
// eslint-disable-next-line no-param-reassign
53+
args.request.query = {};
54+
}
55+
// Decode the already-encoded search string since SDK v3 will encode it again
56+
// eslint-disable-next-line no-param-reassign
57+
args.request.query.search = decodeURIComponent(encodedSearch);
58+
if (listVersions) {
59+
// eslint-disable-next-line no-param-reassign
60+
args.request.query.versions = '';
61+
}
62+
63+
return next(args);
64+
},
65+
{
66+
step: 'build',
67+
name: 'addSearchQuery',
68+
}
69+
);
70+
71+
const res = await s3Client.send(command);
72+
73+
if (listVersions) {
74+
if (testResult) {
75+
assert.notStrictEqual(res.Versions[0].VersionId, undefined);
76+
if (Array.isArray(testResult)) {
77+
assert.strictEqual(res.Versions.length, testResult.length);
78+
async.forEachOf(testResult, (expected, i, next) => {
79+
assert.strictEqual(res.Versions[i].Key, expected);
80+
next();
81+
}, done);
82+
return;
83+
} else {
84+
assert(res.Versions[0], 'should be Contents listed');
85+
assert.strictEqual(res.Versions[0].Key, testResult);
86+
assert.strictEqual(res.Versions.length, 1);
87+
}
4088
} else {
41-
assert(res.data.Versions[0], 'should be Contents listed');
42-
assert.strictEqual(res.data.Versions[0].Key, testResult);
43-
assert.strictEqual(res.data.Versions.length, 1);
89+
assert.strictEqual(res.Versions.length, 0);
4490
}
4591
} else {
46-
assert.strictEqual(res.data.Versions.length, 0);
92+
if (testResult && typeof testResult === 'object' && testResult.code) {
93+
done(new Error('Expected error but got success'));
94+
}
95+
if (testResult) {
96+
assert(res.Contents[0], 'should be Contents listed');
97+
assert.strictEqual(res.Contents[0].Key, testResult);
98+
assert.strictEqual(res.Contents.length, 1);
99+
} else {
100+
assert.strictEqual(res.Contents?.length, undefined);
101+
}
47102
}
48-
return done();
49-
});
50-
} else {
51-
searchRequest = s3Client.listObjects({ Bucket: bucketName });
52-
searchRequest.on('build', () => {
53-
searchRequest.httpRequest.path =
54-
`/${bucketName}?search=${encodedSearch}`;
55-
});
56-
searchRequest.on('success', res => {
57-
if (testResult) {
58-
assert(res.data.Contents[0], 'should be Contents listed');
59-
assert.strictEqual(res.data.Contents[0].Key, testResult);
60-
assert.strictEqual(res.data.Contents.length, 1);
61-
} else {
62-
assert.strictEqual(res.data.Contents.length, 0);
103+
done();
104+
} catch (err) {
105+
if (testResult && typeof testResult === 'object' && testResult.code) {
106+
assert.strictEqual(err.name, testResult.code);
107+
assert.strictEqual(err.message, testResult.message);
108+
done();
63109
}
64-
return done();
65-
});
66-
}
67-
searchRequest.on('error', err => {
68-
if (testResult) {
69-
assert.strictEqual(err.code, testResult.code);
70-
assert.strictEqual(err.message, testResult.message);
110+
done(err);
71111
}
72-
return done();
73-
});
74-
searchRequest.send();
112+
};
113+
makeRequest();
75114
};
76115

77116
testUtils.removeAllVersions = (s3Client, bucket, callback) => {
78117
async.waterfall([
79-
cb => s3Client.listObjectVersions({ Bucket: bucket }, cb),
118+
cb => s3Client.send(new ListObjectVersionsCommand({ Bucket: bucket }))
119+
.then(data => cb(null, data))
120+
.catch(cb),
80121
(data, cb) => _deleteVersionList(s3Client, data.DeleteMarkers, bucket,
81122
err => cb(err, data)),
82123
(data, cb) => _deleteVersionList(s3Client, data.Versions, bucket,
@@ -88,7 +129,7 @@ testUtils.removeAllVersions = (s3Client, bucket, callback) => {
88129
KeyMarker: data.NextKeyMarker,
89130
VersionIdMarker: data.NextVersionIdMarker,
90131
};
91-
return this.removeAllVersions(params, cb);
132+
return testUtils.removeAllVersions(s3Client, params, cb);
92133
}
93134
return cb();
94135
},
Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,4 @@
1-
const S3 = require('aws-sdk').S3;
1+
const { S3Client } = require('@aws-sdk/client-s3');
2+
const getConfig = require('../../support/config');
23

3-
const config = {
4-
sslEnabled: false,
5-
endpoint: 'http://127.0.0.1:8000',
6-
apiVersions: { s3: '2006-03-01' },
7-
signatureCache: false,
8-
signatureVersion: 'v4',
9-
region: 'us-east-1',
10-
s3ForcePathStyle: true,
11-
accessKeyId: 'accessKey1',
12-
secretAccessKey: 'verySecretKey1',
13-
};
14-
15-
const client = new S3(config);
16-
17-
module.exports = client;
4+
module.exports = new S3Client(getConfig('default'));

0 commit comments

Comments
 (0)