11import { Compiler } from "webpack" ;
22import { WebpackCompilerPlugin } from "index" ;
3+ import { logger } from "logger" ;
4+ import { listeners } from "cluster" ;
35
46const processExitSpy = jest
57 . spyOn ( process , "exit" )
68 . mockImplementation ( ( ) => undefined as never ) ;
79
8- const consoleLogSpy = jest . spyOn ( console , "log " ) ;
9- const consoleErrorSpy = jest . spyOn ( console , "error" ) ;
10+ const consoleLogSpy = jest . spyOn ( logger , "info " ) ;
11+ const consoleErrorSpy = jest . spyOn ( logger , "error" ) ;
1012
1113const mockCompiler = {
1214 hooks : {
@@ -16,10 +18,17 @@ const mockCompiler = {
1618 } ,
1719} ;
1820
19- const newPlugin = ( listeners : Partial < StageListeners > = { } ) => {
21+ const newPlugin = ( {
22+ listeners = { } ,
23+ stageMessages,
24+ } : {
25+ listeners ?: Partial < StageListeners > ;
26+ stageMessages ?: Partial < StageMessages > ;
27+ } ) => {
2028 const plugin = new WebpackCompilerPlugin ( {
2129 name : "webpack-compiler-plugin" ,
2230 listeners,
31+ stageMessages,
2332 } ) ;
2433 plugin . apply ( ( mockCompiler as unknown ) as Compiler ) ;
2534 return plugin ;
@@ -28,7 +37,7 @@ const newPlugin = (listeners: Partial<StageListeners> = {}) => {
2837afterEach ( ( ) => {
2938 jest . clearAllMocks ( ) ;
3039 const signals = [ "exit" , "SIGINT" , "uncaughtException" ] ;
31- signals . map ( s => process . removeAllListeners ( s ) ) ;
40+ signals . map ( process . removeAllListeners . bind ( process ) ) ;
3241} ) ;
3342afterAll ( jest . restoreAllMocks ) ;
3443
@@ -37,7 +46,7 @@ describe("default listeners", () => {
3746 [ "interrupt" , [ "SIGINT" ] ] ,
3847 [ "buildError" , [ "uncaughtException" , new Error ( "Uncaught Error" ) ] ] ,
3948 ] ) ( "loads with default %s listener" , ( _ , [ event , arg ] ) : void => {
40- newPlugin ( ) ;
49+ newPlugin ( { } ) ;
4150 process . emit (
4251 event as NodeJS . Signals ,
4352 ( arg as unknown ) as NodeJS . Signals ,
@@ -58,7 +67,7 @@ describe("apply listeners", () => {
5867 // eslint-disable-next-line @typescript-eslint/no-explicit-any
5968 ( stage : Stage , [ event , arg ] : [ NodeJS . Signals , any ] ) => {
6069 const mockHandler = jest . fn ( ) ;
61- newPlugin ( { [ stage ] : mockHandler } ) ;
70+ newPlugin ( { listeners : { [ stage ] : mockHandler } } ) ;
6271 process . emit ( event , arg ) ;
6372 expect ( mockHandler ) . toHaveBeenCalledTimes ( 1 ) ;
6473 } ,
@@ -70,7 +79,36 @@ describe("apply listeners", () => {
7079 [ "compileStart" , mockCompiler . hooks . compilation . tap ] ,
7180 ] ) ( "applies handler for stage %s" , ( stage , tapFn ) => {
7281 const mockHandler = jest . fn ( ) ;
73- newPlugin ( { [ stage as Stage ] : mockHandler } ) ;
82+ newPlugin ( { listeners : { [ stage as Stage ] : mockHandler } } ) ;
7483 expect ( tapFn ) . toHaveBeenCalledTimes ( 1 ) ;
84+ tapFn . mock . calls [ 0 ] [ 1 ] ( ) ;
85+ expect ( mockHandler ) . toHaveBeenCalledTimes ( 1 ) ;
86+ } ) ;
87+ } ) ;
88+
89+ describe ( "stage messages" , ( ) => {
90+ it . each ( [
91+ [ "buildStart" , mockCompiler . hooks . afterPlugins . tap ] ,
92+ [ "compileEnd" , mockCompiler . hooks . done . tap ] ,
93+ [ "compileStart" , mockCompiler . hooks . compilation . tap ] ,
94+ ] ) ( "uses default state messages %s" , ( stage , tapFn ) => {
95+ const mockHandler = jest . fn ( ) ;
96+ newPlugin ( { listeners : { [ stage as Stage ] : mockHandler } } ) ;
97+ tapFn . mock . calls [ 0 ] [ 1 ] ( ) ;
98+ expect ( consoleLogSpy . mock . calls ) . toMatchSnapshot ( ) ;
99+ } ) ;
100+
101+ it . each ( [
102+ [ "buildStart" , mockCompiler . hooks . afterPlugins . tap ] ,
103+ [ "compileEnd" , mockCompiler . hooks . done . tap ] ,
104+ [ "compileStart" , mockCompiler . hooks . compilation . tap ] ,
105+ ] ) ( "does not use default state messages %s" , ( stage , tapFn ) => {
106+ const mockHandler = jest . fn ( ) ;
107+ newPlugin ( {
108+ listeners : { [ stage as Stage ] : mockHandler } ,
109+ stageMessages : null ,
110+ } ) ;
111+ tapFn . mock . calls [ 0 ] [ 1 ] ( ) ;
112+ expect ( consoleLogSpy . mock . calls ) . toMatchSnapshot ( ) ;
75113 } ) ;
76114} ) ;
0 commit comments