Skip to content

Commit 3100b18

Browse files
authored
Merge pull request #37126 from VickyStash/ts-migration/index-test
[No QA] [TS migration] Migrate 'index.js' test to TypeScript
2 parents fef79df + 7d53f28 commit 3100b18

File tree

2 files changed

+69
-49
lines changed

2 files changed

+69
-49
lines changed

src/libs/E2E/client.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,19 @@ import Routes from '../../../tests/e2e/server/routes';
33
import type {NetworkCacheMap, TestConfig} from './types';
44

55
type TestResult = {
6+
/** Name of the test */
67
name: string;
8+
9+
/** The branch where test were running */
710
branch?: string;
11+
12+
/** Duration in milliseconds */
813
duration?: number;
14+
15+
/** Optional, if set indicates that the test run failed and has no valid results. */
916
error?: string;
17+
18+
/** Render count */
1019
renderCount?: number;
1120
};
1221

@@ -113,3 +122,4 @@ export default {
113122
updateNetworkCache,
114123
getNetworkCache,
115124
};
125+
export type {TestResult, NativeCommand};

tests/e2e/server/index.js renamed to tests/e2e/server/index.ts

Lines changed: 59 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,42 @@
11
import {createServer} from 'http';
2+
import type {IncomingMessage, ServerResponse} from 'http';
3+
import type {NativeCommand, TestResult} from '@libs/E2E/client';
4+
import type {NetworkCacheMap, TestConfig} from '@libs/E2E/types';
25
import config from '../config';
36
import * as nativeCommands from '../nativeCommands';
47
import * as Logger from '../utils/logger';
58
import Routes from './routes';
69

7-
const PORT = process.env.PORT || config.SERVER_PORT;
10+
type NetworkCache = {
11+
appInstanceId: string;
12+
cache: NetworkCacheMap;
13+
};
14+
15+
type RequestData = TestResult | NativeCommand | NetworkCache;
16+
17+
type TestStartedListener = (testConfig?: TestConfig) => void;
18+
19+
type TestDoneListener = () => void;
20+
21+
type TestResultListener = (testResult: TestResult) => void;
22+
23+
type AddListener<TListener> = (listener: TListener) => void;
24+
25+
type ServerInstance = {
26+
setTestConfig: (testConfig: TestConfig) => void;
27+
addTestStartedListener: AddListener<TestStartedListener>;
28+
addTestResultListener: AddListener<TestResultListener>;
29+
addTestDoneListener: AddListener<TestDoneListener>;
30+
start: () => Promise<void>;
31+
stop: () => Promise<Error | undefined>;
32+
};
33+
34+
const PORT = process.env.PORT ?? config.SERVER_PORT;
835

936
// Gets the request data as a string
10-
const getReqData = (req) => {
37+
const getReqData = (req: IncomingMessage): Promise<string> => {
1138
let data = '';
12-
req.on('data', (chunk) => {
39+
req.on('data', (chunk: string) => {
1340
data += chunk;
1441
});
1542

@@ -21,16 +48,16 @@ const getReqData = (req) => {
2148
};
2249

2350
// Expects a POST request with JSON data. Returns parsed JSON data.
24-
const getPostJSONRequestData = (req, res) => {
51+
const getPostJSONRequestData = <TRequestData extends RequestData>(req: IncomingMessage, res: ServerResponse<IncomingMessage>): Promise<TRequestData | undefined> | undefined => {
2552
if (req.method !== 'POST') {
2653
res.statusCode = 400;
2754
res.end('Unsupported method');
2855
return;
2956
}
3057

31-
return getReqData(req).then((data) => {
58+
return getReqData(req).then((data): TRequestData | undefined => {
3259
try {
33-
return JSON.parse(data);
60+
return JSON.parse(data) as TRequestData;
3461
} catch (e) {
3562
Logger.info('❌ Failed to parse request data', data);
3663
res.statusCode = 400;
@@ -39,9 +66,9 @@ const getPostJSONRequestData = (req, res) => {
3966
});
4067
};
4168

42-
const createListenerState = () => {
43-
const listeners = [];
44-
const addListener = (listener) => {
69+
const createListenerState = <TListener>(): [TListener[], AddListener<TListener>] => {
70+
const listeners: TListener[] = [];
71+
const addListener = (listener: TListener) => {
4572
listeners.push(listener);
4673
return () => {
4774
const index = listeners.indexOf(listener);
@@ -54,20 +81,6 @@ const createListenerState = () => {
5481
return [listeners, addListener];
5582
};
5683

57-
/**
58-
* The test result object that a client might submit to the server.
59-
* @typedef TestResult
60-
* @property {string} name
61-
* @property {number} duration Milliseconds
62-
* @property {string} [error] Optional, if set indicates that the test run failed and has no valid results.
63-
*/
64-
65-
/**
66-
* @callback listener
67-
* @param {TestResult} testResult
68-
*/
69-
70-
// eslint-disable-next-line valid-jsdoc
7184
/**
7285
* Creates a new http server.
7386
* The server just has two endpoints:
@@ -78,35 +91,32 @@ const createListenerState = () => {
7891
*
7992
* It returns an instance to which you can add listeners for the test results, and test done events.
8093
*/
81-
const createServerInstance = () => {
82-
const [testStartedListeners, addTestStartedListener] = createListenerState();
83-
const [testResultListeners, addTestResultListener] = createListenerState();
84-
const [testDoneListeners, addTestDoneListener] = createListenerState();
85-
86-
let activeTestConfig;
87-
const networkCache = {};
88-
89-
/**
90-
* @param {TestConfig} testConfig
91-
*/
92-
const setTestConfig = (testConfig) => {
94+
const createServerInstance = (): ServerInstance => {
95+
const [testStartedListeners, addTestStartedListener] = createListenerState<TestStartedListener>();
96+
const [testResultListeners, addTestResultListener] = createListenerState<TestResultListener>();
97+
const [testDoneListeners, addTestDoneListener] = createListenerState<TestDoneListener>();
98+
99+
let activeTestConfig: TestConfig | undefined;
100+
const networkCache: Record<string, NetworkCacheMap> = {};
101+
102+
const setTestConfig = (testConfig: TestConfig) => {
93103
activeTestConfig = testConfig;
94104
};
95105

96-
const server = createServer((req, res) => {
106+
const server = createServer((req, res): ServerResponse<IncomingMessage> | void => {
97107
res.statusCode = 200;
98108
switch (req.url) {
99109
case Routes.testConfig: {
100110
testStartedListeners.forEach((listener) => listener(activeTestConfig));
101-
if (activeTestConfig == null) {
111+
if (!activeTestConfig) {
102112
throw new Error('No test config set');
103113
}
104114
return res.end(JSON.stringify(activeTestConfig));
105115
}
106116

107117
case Routes.testResults: {
108-
getPostJSONRequestData(req, res).then((data) => {
109-
if (data == null) {
118+
getPostJSONRequestData<TestResult>(req, res)?.then((data) => {
119+
if (!data) {
110120
// The getPostJSONRequestData function already handled the response
111121
return;
112122
}
@@ -128,9 +138,9 @@ const createServerInstance = () => {
128138
}
129139

130140
case Routes.testNativeCommand: {
131-
getPostJSONRequestData(req, res)
132-
.then((data) =>
133-
nativeCommands.executeFromPayload(data.actionName, data.payload).then((status) => {
141+
getPostJSONRequestData<NativeCommand>(req, res)
142+
?.then((data) =>
143+
nativeCommands.executeFromPayload(data?.actionName, data?.payload).then((status) => {
134144
if (status) {
135145
res.end('ok');
136146
return;
@@ -148,8 +158,8 @@ const createServerInstance = () => {
148158
}
149159

150160
case Routes.testGetNetworkCache: {
151-
getPostJSONRequestData(req, res).then((data) => {
152-
const appInstanceId = data && data.appInstanceId;
161+
getPostJSONRequestData<NetworkCache>(req, res)?.then((data) => {
162+
const appInstanceId = data?.appInstanceId;
153163
if (!appInstanceId) {
154164
res.statusCode = 400;
155165
res.end('Invalid request missing appInstanceId');
@@ -164,9 +174,9 @@ const createServerInstance = () => {
164174
}
165175

166176
case Routes.testUpdateNetworkCache: {
167-
getPostJSONRequestData(req, res).then((data) => {
168-
const appInstanceId = data && data.appInstanceId;
169-
const cache = data && data.cache;
177+
getPostJSONRequestData<NetworkCache>(req, res)?.then((data) => {
178+
const appInstanceId = data?.appInstanceId;
179+
const cache = data?.cache;
170180
if (!appInstanceId || !cache) {
171181
res.statusCode = 400;
172182
res.end('Invalid request missing appInstanceId or cache');
@@ -192,11 +202,11 @@ const createServerInstance = () => {
192202
addTestResultListener,
193203
addTestDoneListener,
194204
start: () =>
195-
new Promise((resolve) => {
205+
new Promise<void>((resolve) => {
196206
server.listen(PORT, resolve);
197207
}),
198208
stop: () =>
199-
new Promise((resolve) => {
209+
new Promise<Error | undefined>((resolve) => {
200210
server.close(resolve);
201211
}),
202212
};

0 commit comments

Comments
 (0)