Skip to content

Commit 91a26eb

Browse files
committed
fix: Fixed tests
1 parent 94deacc commit 91a26eb

5 files changed

Lines changed: 44 additions & 30 deletions

File tree

src/plugins/message-sender.test.ts

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { MessageForResultSender } from './message-sender.js';
21
import { ChildProcess } from 'node:child_process';
32
import { EventEmitter } from 'node:events';
43
import { Readable } from 'stream';
54
import { describe, expect, it } from 'vitest';
65
import { returnMessageCmd } from './plugin-process.js';
76
import { clearInterval, clearTimeout } from 'node:timers';
7+
import { sendIpcMessageForResult } from './message-sender';
8+
import { PluginMessage } from './plugin-message.js';
89

910
describe('Message sender tests', async () => {
1011
const mockChildProcess = () => {
@@ -18,11 +19,12 @@ describe('Message sender tests', async () => {
1819

1920
it('Is able to send a message and await a result', async () => {
2021
const cProcess = mockChildProcess();
22+
const message = PluginMessage.create('message1', null)
2123

2224
const result = await Promise.all([
23-
MessageForResultSender.send({ cmd: 'message1', data: null }, cProcess),
25+
sendIpcMessageForResult(message, cProcess),
2426
setTimeout(() => {
25-
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null });
27+
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null, requestId: message.requestId });
2628
}, 100),
2729
])
2830

@@ -33,11 +35,12 @@ describe('Message sender tests', async () => {
3335

3436
it('Clears all listeners', async () => {
3537
const cProcess = mockChildProcess();
38+
const message = PluginMessage.create('message1', null)
3639

3740
const result = await Promise.all([
38-
MessageForResultSender.send({ cmd: 'message1', data: null }, cProcess),
41+
sendIpcMessageForResult(message, cProcess),
3942
setTimeout(() => {
40-
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null });
43+
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null, requestId: message.requestId });
4144
}, 100),
4245
])
4346

@@ -48,26 +51,28 @@ describe('Message sender tests', async () => {
4851

4952
it('Is able to send a message and timeout if not received', async () => {
5053
const cProcess = mockChildProcess();
54+
const message = PluginMessage.create('message1', null)
5155

5256
await expect(() => Promise.all([
53-
MessageForResultSender.send({ cmd: 'message1', data: null }, cProcess, 100),
57+
sendIpcMessageForResult(message, cProcess, 100),
5458
setTimeout(() => {
55-
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null });
59+
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null, requestId: message.requestId });
5660
}, 200),
5761
])).rejects.toThrowError();
5862
})
5963

6064
it('Is able to send a message and not timeout if stdout is returned', async () => {
6165
const cProcess = mockChildProcess();
66+
const message = PluginMessage.create('message1', null)
6267

6368
// Explanation:
6469
// 1. Send a message and set the timeout to be 100ms
6570
// 2. Make the return message come back in 200ms
6671
// 3. Periodically send a stdout every 50ms. This should not throw
6772
const [result, timer, interval] = await Promise.all([
68-
MessageForResultSender.send({ cmd: 'message1', data: null }, cProcess, 100),
73+
sendIpcMessageForResult(message, cProcess, 100),
6974
setTimeout(() => {
70-
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null });
75+
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null, requestId: message.requestId });
7176
}, 200),
7277
setInterval(() => {
7378
cProcess.stdout!.emit('data', 'message');
@@ -83,15 +88,16 @@ describe('Message sender tests', async () => {
8388

8489
it('Is able to send a message and not timeout if stderr is returned', async () => {
8590
const cProcess = mockChildProcess();
91+
const message = PluginMessage.create('message1', null)
8692

8793
// Explanation:
8894
// 1. Send a message and set the timeout to be 100ms
8995
// 2. Make the return message come back in 200ms
9096
// 3. Periodically send a stdout every 50ms. This should not throw
9197
const [result, timer, interval] = await Promise.all([
92-
MessageForResultSender.send({ cmd: 'message1', data: null }, cProcess, 100),
98+
sendIpcMessageForResult(message, cProcess, 100),
9399
setTimeout(() => {
94-
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null });
100+
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null, requestId: message.requestId });
95101
}, 200),
96102
setInterval(() => {
97103
cProcess.stderr!.emit('data', 'message');
@@ -107,18 +113,19 @@ describe('Message sender tests', async () => {
107113

108114
it('Is able to send a message and not timeout if a non-resolving message is sent (like a sudo request)', async () => {
109115
const cProcess = mockChildProcess();
116+
const message = PluginMessage.create('message1', null)
110117

111118
// Explanation:
112119
// 1. Send a message and set the timeout to be 100ms
113120
// 2. Make the return message come back in 200ms
114121
// 3. Periodically send a stdout every 50ms. This should not throw
115122
const [result, timer, interval] = await Promise.all([
116-
MessageForResultSender.send({ cmd: 'message1', data: null }, cProcess, 100),
123+
sendIpcMessageForResult(message, cProcess, 100),
117124
setTimeout(() => {
118-
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null });
125+
cProcess.emit('message', { cmd: returnMessageCmd('message1'), data: null, requestId: message.requestId });
119126
}, 200),
120127
setInterval(() => {
121-
cProcess.emit('message', { cmd: 'non-resolving', data: null })
128+
cProcess.emit('message', { cmd: 'non-resolving', data: null, requestId: 'dshghdjsag' })
122129
}, 50),
123130
])
124131

src/plugins/plugin-process.test.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { ChildProcess } from 'node:child_process';
55
import { Readable } from 'stream';
66
import { PluginProcess } from './plugin-process.js';
77
import { mock } from 'node:test';
8-
import * as chaiAsPromised from 'chai-as-promised';
8+
import { PluginMessage } from './plugin-message.js';
9+
import { sendIpcMessageForResult } from './message-sender.js';
910

1011
describe('Plugin IPC Bridge tests', async () => {
1112

@@ -21,21 +22,23 @@ describe('Plugin IPC Bridge tests', async () => {
2122
it('send a message', async () => {
2223
const process = mockChildProcess();
2324
const sendMock = mock.method(process, 'send');
25+
const message = PluginMessage.create('message', 'data');
2426

2527
const ipcBridge = new PluginProcess(process);
26-
ipcBridge.sendMessage({ cmd: 'message', data: 'data' })
28+
ipcBridge.sendMessage(message)
2729

2830
expect(sendMock.mock.calls.length).to.eq(1);
29-
expect(sendMock.mock.calls[0].arguments[0]).to.deep.eq({ cmd: 'message', data: 'data' });
31+
expect(sendMock.mock.calls[0].arguments[0]).toMatchObject({ cmd: 'message', data: 'data', requestId: expect.stringContaining('') });
3032
})
3133

3234
it('send a message and receives the response', async () => {
3335
const process = mockChildProcess();
3436
const ipcBridge = new PluginProcess(process);
37+
const message = PluginMessage.create('message', 'data');
3538

3639
const [result] = await Promise.all([
37-
ipcBridge.sendMessageForResult({ cmd: 'message', data: 'data' }),
38-
setTimeout(() => process.emit('message', { cmd: 'message_Response', data: 'data' }), 50),
40+
sendIpcMessageForResult(message, ipcBridge.process),
41+
setTimeout(() => process.emit('message', { cmd: 'message_Response', data: 'data', requestId: message.requestId }), 50),
3942
]);
4043

4144
expect(result).toMatchObject({
@@ -47,9 +50,10 @@ describe('Plugin IPC Bridge tests', async () => {
4750
it('validates bad responses', async () => {
4851
const process = mockChildProcess();
4952
const ipcBridge = new PluginProcess(process);
53+
const message = PluginMessage.create('message', 'data');
5054

5155
await expect(async () => Promise.all([
52-
ipcBridge.sendMessageForResult({ cmd: 'message_Response', data: 'data' }),
56+
sendIpcMessageForResult(message, ipcBridge.process),
5357
setTimeout(() => process.emit('message', 'data'), 50),
5458
])
5559
).rejects.toThrow()
@@ -58,12 +62,13 @@ describe('Plugin IPC Bridge tests', async () => {
5862
it('does not leave additional listeners', async () => {
5963
const process = mockChildProcess();
6064
const ipcBridge = new PluginProcess(process);
65+
const message = PluginMessage.create('message', 'data');
6166

6267
// NodeJS promise.all is executed in order
6368
await Promise.all([
64-
ipcBridge.sendMessageForResult({ cmd: 'message', data: 'data' }),
69+
sendIpcMessageForResult(message, ipcBridge.process),
6570
setTimeout(() => expect(process.listeners('message').length).to.eq(1), 25),
66-
setTimeout(() => process.emit('message', { cmd: 'message_Response', data: 'data' }), 50),
71+
setTimeout(() => process.emit('message', { cmd: 'message_Response', data: 'data', requestId: message.requestId }), 50),
6772
]);
6873

6974
expect(process.listeners('message').length).to.eq(0);
@@ -74,12 +79,13 @@ describe('Plugin IPC Bridge tests', async () => {
7479
it('does not interfere with existing listeners', async () => {
7580
const process = mockChildProcess();
7681
const ipcBridge = new PluginProcess(process);
82+
const message = PluginMessage.create('message', 'data');
7783
process.on('message', () => {})
7884

7985
await Promise.all([
80-
ipcBridge.sendMessageForResult({ cmd: 'message', data: 'data' }),
86+
sendIpcMessageForResult(message, ipcBridge.process),
8187
setTimeout(() => expect(process.listeners('message').length).to.eq(2), 25),
82-
setTimeout(() =>process.emit('message', { cmd: 'message_Response', data: 'data' }), 50),
88+
setTimeout(() =>process.emit('message', { cmd: 'message_Response', data: 'data', requestId: message.requestId }), 50),
8389
]);
8490

8591
expect(process.listeners('message').length).to.eq(1);
@@ -88,14 +94,15 @@ describe('Plugin IPC Bridge tests', async () => {
8894
it('allows new listeners to be added while waiting for the result', async () => {
8995
const process = mockChildProcess();
9096
const ipcBridge = new PluginProcess(process);
97+
const message = PluginMessage.create('message', 'data');
9198

9299
await Promise.all([
93-
ipcBridge.sendMessageForResult({ cmd: 'message', data: 'data' }),
100+
sendIpcMessageForResult(message, ipcBridge.process),
94101
setTimeout(() => {
95102
process.on('message', () => {})
96103
expect(process.listeners('message').length).to.eq(2)
97104
}, 25),
98-
setTimeout(() => process.emit('message', { cmd: 'message_Response', data: 'data' }), 50),
105+
setTimeout(() => process.emit('message', { cmd: 'message_Response', data: 'data', requestId: message.requestId }), 50),
99106
]);
100107

101108
expect(process.listeners('message').length).to.eq(1);

src/plugins/resolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export class PluginResolver {
5252

5353
let stats: fsSync.Stats;
5454
try {
55-
stats = await fs.stat(filePath);
55+
stats = await fs.stat(path.resolve(filePath));
5656
} catch (e) {
5757
throw new Error(`Unable to find plugin file path ${filePath}`)
5858
}

test/integration/resolver.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ vi.mock('node:fs/promises', async () => {
1818
describe('Plugin resolver integration test', () => {
1919

2020
it('resolves the default plugin', async () => {
21-
await PluginResolver.resolve('default', '')
22-
expect(fs.existsSync(path.resolve(os.homedir(), '.codify/plugins/default.js'))).to.be.true;
21+
await PluginResolver.resolveAll({ 'default': 'latest' })
22+
expect(fs.existsSync(path.resolve(os.homedir(), '.codify/plugins/default'))).to.be.true;
2323
})
2424

2525
afterEach(() => {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[
2-
{ "type": "project", "plugins": { "default": "../mocks/plugin.ts" } },
2+
{ "type": "project", "plugins": { "default": "./test/orchestrator/mocks/plugin.ts" } },
33
{ "type": "mock", "propA": "abc", "propB": 123, "directory": "~/home" },
44
{ "type": "mock", "propA": "abc", "propB": 12, "directory": "~/home" }
55
]

0 commit comments

Comments
 (0)