@@ -2,151 +2,66 @@ import { cliui } from '@poppinss/cliui';
22import type { SyncExpectationResult } from '@vitest/expect' ;
33import { expect } from 'vitest' ;
44import {
5+ type ExpectedMessage ,
56 type LogLevel ,
6- extractLevel ,
7- extractMessage ,
7+ extractLogDetails ,
88 hasExpectedMessage ,
9- messageContains ,
109} from './ui-logger.matcher.utils' ;
1110
1211type CliUi = ReturnType < typeof cliui > ;
1312
1413export type CustomUiLoggerMatchers = {
15- toHaveLoggedMessage : ( expected : string ) => void ;
16- toHaveLoggedNthMessage : ( nth : number , expected : string ) => void ;
17- toHaveLoggedLevel : ( expected : LogLevel ) => void ;
18- toHaveLoggedNthLevel : ( nth : number , expected : LogLevel ) => void ;
19- toHaveLoggedMessageContaining : ( expected : string ) => void ;
20- toHaveLoggedNthMessageContaining : ( nth : number , expected : string ) => void ;
21- toHaveLogged : ( ) => void ;
14+ toHaveLogged : ( level : LogLevel , message : ExpectedMessage ) => void ;
15+ toHaveNthLogged : (
16+ nth : number ,
17+ level : LogLevel ,
18+ message : ExpectedMessage ,
19+ ) => void ;
2220 toHaveLoggedTimes : ( times : number ) => void ;
21+ toHaveLogs : ( ) => void ;
2322} ;
2423
2524expect . extend ( {
26- toHaveLoggedMessage : assertMessageLogged ,
27- toHaveLoggedNthMessage : assertNthMessageLogged ,
28- toHaveLoggedLevel : assertLevelLogged ,
29- toHaveLoggedNthLevel : assertNthLevelLogged ,
30- toHaveLoggedMessageContaining : assertMessageContaining ,
31- toHaveLoggedNthMessageContaining : assertNthMessageContaining ,
32- toHaveLogged : assertLogs ,
25+ toHaveLogged : assertLogged ,
26+ toHaveNthLogged : assertNthLogged ,
3327 toHaveLoggedTimes : assertLogCount ,
28+ toHaveLogs : assertLogs ,
3429} ) ;
3530
36- function assertMessageLogged (
31+ function assertLogged (
3732 actual : CliUi ,
38- expected : string ,
33+ level : LogLevel ,
34+ message : ExpectedMessage ,
3935) : SyncExpectationResult {
40- const messages = actual . logger
41- . getRenderer ( )
42- . getLogs ( )
43- . map ( ( { message } ) => extractMessage ( message ) ) ;
36+ const logs = extractLogDetails ( actual . logger ) ;
4437
45- const pass = messages . some ( msg => hasExpectedMessage ( expected , msg ) ) ;
38+ const pass = logs . some (
39+ log => log . level === level && hasExpectedMessage ( message , log . message ) ,
40+ ) ;
4641 return {
4742 pass,
4843 message : ( ) =>
4944 pass
50- ? `Expected not to have logged : ${ expected } `
51- : `Expected to have logged: ${ expected } }` ,
45+ ? `Expected not to find a log with level " ${ level } " and message matching : ${ message } `
46+ : `Expected a log with level " ${ level } " and message matching: ${ message } ` ,
5247 } ;
5348}
5449
55- function assertNthMessageLogged (
50+ function assertNthLogged (
5651 actual : CliUi ,
5752 nth : number ,
58- expected : string ,
53+ level : LogLevel ,
54+ message : ExpectedMessage ,
5955) : SyncExpectationResult {
60- const messages = actual . logger
61- . getRenderer ( )
62- . getLogs ( )
63- . map ( ( { message } ) => extractMessage ( message ) ) ;
56+ const log = extractLogDetails ( actual . logger ) [ nth - 1 ] ;
6457
65- const pass = hasExpectedMessage ( expected , messages [ nth - 1 ] ) ;
58+ const pass = log ?. level === level && hasExpectedMessage ( message , log . message ) ;
6659 return {
6760 pass,
6861 message : ( ) =>
6962 pass
70- ? `Expected not to have logged at position ${ nth } : ${ expected } `
71- : `Expected to have logged at position ${ nth } : ${ expected } ` ,
72- } ;
73- }
74-
75- function assertLevelLogged (
76- actual : CliUi ,
77- expected : LogLevel ,
78- ) : SyncExpectationResult {
79- const levels = actual . logger
80- . getRenderer ( )
81- . getLogs ( )
82- . map ( ( { message } ) => extractLevel ( message ) ) ;
83-
84- const pass = levels . includes ( expected ) ;
85- return {
86- pass,
87- message : ( ) =>
88- pass
89- ? `Expected not to have ${ expected } log level`
90- : `Expected to have ${ expected } log level` ,
91- } ;
92- }
93-
94- function assertNthLevelLogged (
95- actual : CliUi ,
96- nth : number ,
97- expected : LogLevel ,
98- ) : SyncExpectationResult {
99- const levels = actual . logger
100- . getRenderer ( )
101- . getLogs ( )
102- . map ( ( { message } ) => extractLevel ( message ) ) ;
103-
104- const pass = levels [ nth - 1 ] === expected ;
105- return {
106- pass,
107- message : ( ) =>
108- pass
109- ? `Expected not to have log level at position ${ nth } : ${ expected } `
110- : `Expected to have log level at position ${ nth } : ${ expected } ` ,
111- } ;
112- }
113-
114- function assertMessageContaining (
115- actual : CliUi ,
116- expected : string ,
117- ) : SyncExpectationResult {
118- const messages = actual . logger
119- . getRenderer ( )
120- . getLogs ( )
121- . map ( ( { message } ) => extractMessage ( message ) ) ;
122-
123- const pass = messages . some ( msg => messageContains ( expected , msg ) ) ;
124- return {
125- pass,
126- message : ( ) =>
127- pass
128- ? `Expected not to find a message containing: ${ expected } `
129- : `Expected to find a message containing: ${ expected } , but none matched.` ,
130- } ;
131- }
132-
133- function assertNthMessageContaining (
134- actual : CliUi ,
135- nth : number ,
136- expected : string ,
137- ) : SyncExpectationResult {
138- const messages = actual . logger
139- . getRenderer ( )
140- . getLogs ( )
141- . map ( ( { message } ) => extractMessage ( message ) ) ;
142-
143- const pass = messageContains ( expected , messages [ nth - 1 ] ) ;
144- return {
145- pass,
146- message : ( ) =>
147- pass
148- ? `Expected not to find the fragment "${ expected } " in the message at position ${ nth } `
149- : `Expected to find the fragment "${ expected } " in the message at position ${ nth } , but it was not found.` ,
63+ ? `Expected not to find a log at position ${ nth } with level "${ level } " and message matching: ${ message } `
64+ : `Expected a log at position ${ nth } with level "${ level } " and message matching: ${ message } ` ,
15065 } ;
15166}
15267
@@ -158,8 +73,8 @@ function assertLogs(actual: CliUi): SyncExpectationResult {
15873 pass,
15974 message : ( ) =>
16075 pass
161- ? `Expected not to have any logs`
162- : `Expected to have some logs, but no logs were produced` ,
76+ ? `Expected no logs, but found ${ logs . length } `
77+ : `Expected some logs, but no logs were produced` ,
16378 } ;
16479}
16580
@@ -174,7 +89,7 @@ function assertLogCount(
17489 pass,
17590 message : ( ) =>
17691 pass
177- ? `Expected not to have exactly ${ expected } logs`
178- : `Expected to have ${ expected } logs, but got ${ logs . length } ` ,
92+ ? `Expected not to find exactly ${ expected } logs, but found ${ logs . length } `
93+ : `Expected exactly ${ expected } logs, but found ${ logs . length } ` ,
17994 } ;
18095}
0 commit comments