Skip to content

Commit 17febb4

Browse files
chore: refactor test filters to typescript (mongodb#4054)
Co-authored-by: Bailey Pearson <[email protected]>
1 parent db00ac4 commit 17febb4

16 files changed

+196
-167
lines changed

test/mocha_mongodb.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"source-map-support/register",
55
"ts-node/register",
66
"test/tools/runner/chai-addons.js",
7-
"test/tools/runner/hooks/configuration.js",
7+
"test/tools/runner/hooks/configuration.ts",
88
"test/tools/runner/hooks/unhandled_checker.ts",
99
"test/tools/runner/hooks/leak_checker.ts",
1010
"test/tools/runner/hooks/legacy_crud_shims.ts"

test/tools/runner/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export class TestConfiguration {
7979
serverApi: ServerApi;
8080
activeResources: number;
8181
isSrv: boolean;
82+
serverlessCredentials: { username: string | undefined; password: string | undefined };
8283

8384
constructor(private uri: string, private context: Record<string, any>) {
8485
const url = new ConnectionString(uri);

test/tools/runner/filters/api_version_filter.js renamed to test/tools/runner/filters/api_version_filter.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
1-
'use strict';
1+
import { Filter } from './filter';
22

33
/**
44
* Filter for the MongoDB API Version required for the test
55
*
6-
* example:
6+
* @example
7+
* ```js
78
* metadata: {
89
* requires: {
910
* apiVersion: '1'
1011
* }
1112
* }
13+
* ```
1214
*/
13-
class ApiVersionFilter {
15+
export class ApiVersionFilter extends Filter {
16+
apiVersion: string | undefined;
1417
constructor() {
18+
super();
1519
// Get environmental variables that are known
1620
this.apiVersion = process.env.MONGODB_API_VERSION;
1721
}
1822

19-
filter(test) {
23+
filter(test: { metadata?: MongoDBMetadataUI }) {
2024
if (!test.metadata) return true;
2125
if (!test.metadata.requires) return true;
2226
const apiVersion = test.metadata.requires.apiVersion;
@@ -33,5 +37,3 @@ class ApiVersionFilter {
3337
return apiVersion === this.apiVersion;
3438
}
3539
}
36-
37-
module.exports = ApiVersionFilter;

test/tools/runner/filters/auth_filter.js renamed to test/tools/runner/filters/auth_filter.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
1-
'use strict';
1+
import { Filter } from './filter';
22

33
/**
44
* Filter for authorization enabled or disabled on the server
55
*
6-
* example:
6+
* @example
7+
* ```js
78
* metadata: {
89
* requires: {
910
* auth: 'enabled' | 'disabled'
1011
* }
1112
* }
13+
* ```
1214
*/
13-
class AuthFilter {
15+
export class AuthFilter extends Filter {
16+
isAuthEnabled: boolean;
1417
constructor() {
18+
super();
1519
this.isAuthEnabled = process.env.AUTH === 'auth';
1620
}
1721

18-
filter(test) {
22+
filter(test: { metadata?: MongoDBMetadataUI }) {
1923
if (!test.metadata) return true;
2024
if (!test.metadata.requires) return true;
2125
if (!test.metadata.requires.auth) return true;
@@ -33,5 +37,3 @@ class AuthFilter {
3337
);
3438
}
3539
}
36-
37-
module.exports = AuthFilter;

test/tools/runner/filters/client_encryption_filter.js renamed to test/tools/runner/filters/client_encryption_filter.ts

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
1-
'use strict';
1+
import { readFile } from 'fs/promises';
2+
import { dirname, resolve } from 'path';
3+
import * as process from 'process';
24

3-
const { readFileSync } = require('fs');
4-
const { resolve } = require('path');
5-
const process = require('process');
5+
import { type MongoClient } from '../../../mongodb';
6+
import { Filter } from './filter';
67

78
/**
89
* Filter for whether or not a test needs / doesn't need Client Side Encryption
910
*
10-
* example:
11+
* @example
12+
* ```js
1113
* metadata: {
1214
* requires: {
1315
* clientSideEncryption: true|false
1416
* }
1517
* }
18+
* ```
1619
*/
1720

18-
class ClientSideEncryptionFilter {
19-
initializeFilter(client, context, callback) {
21+
export class ClientSideEncryptionFilter extends Filter {
22+
enabled: boolean;
23+
static version = null;
24+
25+
override async initializeFilter(client: MongoClient, context: Record<string, any>) {
2026
const CSFLE_KMS_PROVIDERS = process.env.CSFLE_KMS_PROVIDERS;
2127
let mongodbClientEncryption;
2228
try {
@@ -27,11 +33,12 @@ class ClientSideEncryptionFilter {
2733
}
2834
}
2935

30-
const { version } = JSON.parse(
31-
readFileSync(
32-
resolve(__dirname, '../../../../node_modules/mongodb-client-encryption', 'package.json')
36+
ClientSideEncryptionFilter.version ??= JSON.parse(
37+
await readFile(
38+
resolve(dirname(require.resolve('mongodb-client-encryption')), '..', 'package.json'),
39+
'utf8'
3340
)
34-
);
41+
).version;
3542

3643
this.enabled = !!(CSFLE_KMS_PROVIDERS && mongodbClientEncryption);
3744

@@ -40,13 +47,11 @@ class ClientSideEncryptionFilter {
4047
enabled: this.enabled,
4148
mongodbClientEncryption,
4249
CSFLE_KMS_PROVIDERS,
43-
version
50+
version: ClientSideEncryptionFilter.version
4451
};
45-
46-
callback();
4752
}
4853

49-
filter(test) {
54+
filter(test: { metadata?: MongoDBMetadataUI }) {
5055
const clientSideEncryption =
5156
test.metadata && test.metadata.requires && test.metadata.requires.clientSideEncryption;
5257

@@ -66,5 +71,3 @@ class ClientSideEncryptionFilter {
6671
return this.enabled;
6772
}
6873
}
69-
70-
module.exports = ClientSideEncryptionFilter;

test/tools/runner/filters/filter.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { type Test } from 'mocha';
2+
3+
import { type MongoClient } from '../../../mongodb';
4+
5+
export abstract class Filter {
6+
async initializeFilter(_client: MongoClient, _context: Record<string, any>): Promise<void> {
7+
return;
8+
}
9+
10+
abstract filter(test: Test): string | boolean;
11+
}
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
'use strict';
2-
31
/**
42
* Generic filter than can run predicates.
53
*
64
* Predicates cannot be async. The test is skipped if the predicate returns
75
* a string. The string returned should be a skip reason.
86
*
9-
* example:
7+
* @example
8+
* ```js
109
* metadata: {
1110
* requires: {
1211
* predicate: (test: Mocha.Test) => true | string
1312
* }
1413
* }
14+
* ```
1515
*/
1616

17-
class GenericPredicateFilter {
18-
filter(test) {
19-
/** @type{ ((test?: Mocha.Test) => string | true) | undefined } */
20-
const predicate = test?.metadata?.requires?.predicate;
17+
import { type Test } from 'mocha';
18+
19+
import { Filter } from './filter';
2120

21+
export class GenericPredicateFilter extends Filter {
22+
filter(test: Test & { metadata?: MongoDBMetadataUI }) {
23+
const predicate = test?.metadata?.requires?.predicate;
2224
return predicate?.(test) ?? true;
2325
}
2426
}
25-
26-
module.exports = GenericPredicateFilter;

test/tools/runner/filters/idms_mock_server_filter.js renamed to test/tools/runner/filters/idms_mock_server_filter.ts

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
'use strict';
1+
import { get } from 'http';
22

3-
const { get } = require('http');
3+
import { Filter } from './filter';
44

55
async function isMockServerSetup() {
66
const url = (() => {
@@ -11,7 +11,7 @@ async function isMockServerSetup() {
1111
url.searchParams.append('resource', 'https://vault.azure.net');
1212
return url;
1313
})();
14-
return new Promise((resolve, reject) => {
14+
return new Promise<void>((resolve, reject) => {
1515
get(url, res => {
1616
if (res.statusCode === 200) {
1717
return resolve();
@@ -26,24 +26,28 @@ async function isMockServerSetup() {
2626
/**
2727
* Filter for tests that require the mock idms server to be running.
2828
*
29-
* example:
29+
* @example
30+
* ```js
3031
* metadata: {
3132
* requires: {
3233
* idmsMockServer: true
3334
* }
3435
* }
36+
* ```
3537
*/
36-
class IDMSMockServerFilter {
37-
initializeFilter(client, context, callback) {
38-
isMockServerSetup()
39-
.then(
40-
() => (this.isRunning = true),
41-
() => (this.isRunning = false)
42-
)
43-
.then(() => callback());
38+
export class IDMSMockServerFilter extends Filter {
39+
isRunning: boolean;
40+
41+
override async initializeFilter() {
42+
try {
43+
await isMockServerSetup();
44+
this.isRunning = true;
45+
} catch (error) {
46+
this.isRunning = false;
47+
}
4448
}
4549

46-
filter(test) {
50+
filter(test: { metadata?: MongoDBMetadataUI }) {
4751
if (!test.metadata) return true;
4852
if (!test.metadata.requires) return true;
4953
if (!test.metadata.requires.idmsMockServer) return true;
@@ -58,5 +62,3 @@ class IDMSMockServerFilter {
5862
return this.isRunning;
5963
}
6064
}
61-
62-
module.exports = IDMSMockServerFilter;

test/tools/runner/filters/mongodb_topology_filter.js renamed to test/tools/runner/filters/mongodb_topology_filter.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
1-
'use strict';
2-
const { TopologyType } = require('../../../mongodb');
1+
import { type MongoClient, TopologyType } from '../../../mongodb';
2+
import { Filter } from './filter';
33

44
/**
55
* Filter for the MongoDB topology required for the test
66
*
7-
* example:
7+
* @example
8+
* ```js
89
* metadata: {
910
* requires: {
1011
* topology: 'single' | 'replicaset' | 'sharded'
1112
* }
1213
* }
14+
* ```
1315
*/
14-
class MongoDBTopologyFilter {
15-
initializeFilter(client, context, callback) {
16-
let type = client.topology.description.type;
16+
export class MongoDBTopologyFilter extends Filter {
17+
runtimeTopology: string;
18+
19+
override async initializeFilter(client: MongoClient, context: Record<string, any>) {
20+
const type = client.topology?.description.type;
21+
if (type == null) throw new Error('unexpected nullish type' + client.topology?.description);
1722
context.topologyType = type;
1823
this.runtimeTopology = topologyTypeToString(type);
19-
callback();
2024
}
2125

22-
filter(test) {
26+
filter(test: { metadata?: MongoDBMetadataUI }) {
2327
if (!test.metadata) return true;
2428
if (!test.metadata.requires) return true;
2529
if (!test.metadata.requires.topology) return true;
@@ -72,5 +76,3 @@ function topologyTypeToString(topologyType) {
7276

7377
return 'single';
7478
}
75-
76-
module.exports = MongoDBTopologyFilter;

test/tools/runner/filters/mongodb_version_filter.js

Lines changed: 0 additions & 47 deletions
This file was deleted.

0 commit comments

Comments
 (0)