3392d96cd1502ccdd90fd1f72a21381570d4976e
[poolifier.git] / tests / worker / cluster-worker.test.mjs
1 import { expect } from 'expect'
2 import { restore, stub } from 'sinon'
3
4 import { ClusterWorker } from '../../lib/index.cjs'
5 import { DEFAULT_TASK_NAME } from '../../lib/utils.cjs'
6
7 describe('Cluster worker test suite', () => {
8 afterEach(() => {
9 restore()
10 })
11
12 it('Verify that sync kill handler is called when worker is killed', () => {
13 const worker = new ClusterWorker(() => {}, {
14 killHandler: stub().returns()
15 })
16 worker.isMain = false
17 worker.getMainWorker = stub().returns({
18 id: 1,
19 send: stub().returns()
20 })
21 worker.handleKillMessage()
22 expect(worker.getMainWorker.calledTwice).toBe(true)
23 expect(worker.getMainWorker().send.calledOnce).toBe(true)
24 expect(worker.opts.killHandler.calledOnce).toBe(true)
25 })
26
27 it('Verify that removeTaskFunction() is working', () => {
28 const fn1 = () => {
29 return 1
30 }
31 const fn2 = () => {
32 return 2
33 }
34 const worker = new ClusterWorker({ fn1, fn2 })
35 worker.getMainWorker = stub().returns({
36 id: 1,
37 send: stub().returns()
38 })
39 expect(worker.removeTaskFunction(0, fn1)).toStrictEqual({
40 status: false,
41 error: new TypeError('name parameter is not a string')
42 })
43 expect(worker.removeTaskFunction('', fn1)).toStrictEqual({
44 status: false,
45 error: new TypeError('name parameter is an empty string')
46 })
47 expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toBeInstanceOf(Function)
48 expect(worker.taskFunctions.get('fn1')).toBeInstanceOf(Function)
49 expect(worker.taskFunctions.get('fn2')).toBeInstanceOf(Function)
50 expect(worker.taskFunctions.size).toBe(3)
51 expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toStrictEqual(
52 worker.taskFunctions.get('fn1')
53 )
54 expect(worker.removeTaskFunction(DEFAULT_TASK_NAME)).toStrictEqual({
55 status: false,
56 error: new Error(
57 'Cannot remove the task function with the default reserved name'
58 )
59 })
60 expect(worker.removeTaskFunction('fn1')).toStrictEqual({
61 status: false,
62 error: new Error(
63 'Cannot remove the task function used as the default task function'
64 )
65 })
66 worker.removeTaskFunction('fn2')
67 expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toBeInstanceOf(Function)
68 expect(worker.taskFunctions.get('fn1')).toBeInstanceOf(Function)
69 expect(worker.taskFunctions.get('fn2')).toBeUndefined()
70 expect(worker.taskFunctions.size).toBe(2)
71 expect(worker.getMainWorker.calledTwice).toBe(true)
72 expect(worker.getMainWorker().send.calledOnce).toBe(true)
73 })
74
75 it('Verify that handleError() method is working properly', () => {
76 const error = new Error('Error as an error')
77 const worker = new ClusterWorker(() => {})
78 expect(worker.handleError(error)).not.toBeInstanceOf(Error)
79 expect(worker.handleError(error)).toStrictEqual(error.message)
80 const errorMessage = 'Error as a string'
81 expect(worker.handleError(errorMessage)).toStrictEqual(errorMessage)
82 })
83
84 it('Verify that sendToMainWorker() method invokes the getMainWorker() and send() methods', () => {
85 const worker = new ClusterWorker(() => {})
86 worker.getMainWorker = stub().returns({
87 send: stub().returns()
88 })
89 worker.sendToMainWorker({ ok: 1 })
90 expect(worker.getMainWorker.calledTwice).toBe(true)
91 expect(worker.getMainWorker().send.calledOnce).toBe(true)
92 })
93 })