@@ -4,8 +4,9 @@ jest.mock('n8n-workflow', () => ({
4
4
} ) ) ;
5
5
6
6
import type { GlobalConfig , InstanceSettingsConfig } from '@n8n/config' ;
7
- import { mock } from 'jest-mock-extended' ;
7
+ import { mock , captor } from 'jest-mock-extended' ;
8
8
import { LoggerProxy } from 'n8n-workflow' ;
9
+ import winston from 'winston' ;
9
10
10
11
import { Logger } from '../logger' ;
11
12
@@ -37,6 +38,10 @@ describe('Logger', () => {
37
38
} ) ;
38
39
39
40
describe ( 'transports' , ( ) => {
41
+ afterEach ( ( ) => {
42
+ jest . restoreAllMocks ( ) ;
43
+ } ) ;
44
+
40
45
test ( 'if `console` selected, should set console transport' , ( ) => {
41
46
const globalConfig = mock < GlobalConfig > ( {
42
47
logging : {
@@ -57,29 +62,93 @@ describe('Logger', () => {
57
62
expect ( transport . constructor . name ) . toBe ( 'Console' ) ;
58
63
} ) ;
59
64
60
- test ( 'if `file` selected, should set file transport' , ( ) => {
61
- const globalConfig = mock < GlobalConfig > ( {
62
- logging : {
63
- level : 'info' ,
64
- outputs : [ 'file' ] ,
65
- scopes : [ ] ,
66
- file : {
67
- fileSizeMax : 100 ,
68
- fileCountMax : 16 ,
69
- location : 'logs/n8n.log' ,
65
+ describe ( '`file`' , ( ) => {
66
+ test ( 'should set file transport' , ( ) => {
67
+ const globalConfig = mock < GlobalConfig > ( {
68
+ logging : {
69
+ level : 'info' ,
70
+ outputs : [ 'file' ] ,
71
+ scopes : [ ] ,
72
+ file : {
73
+ fileSizeMax : 100 ,
74
+ fileCountMax : 16 ,
75
+ location : 'logs/n8n.log' ,
76
+ } ,
70
77
} ,
71
- } ,
78
+ } ) ;
79
+
80
+ const logger = new Logger (
81
+ globalConfig ,
82
+ mock < InstanceSettingsConfig > ( { n8nFolder : '/tmp' } ) ,
83
+ ) ;
84
+
85
+ const { transports } = logger . getInternalLogger ( ) ;
86
+
87
+ expect ( transports ) . toHaveLength ( 1 ) ;
88
+
89
+ const [ transport ] = transports ;
90
+
91
+ expect ( transport . constructor . name ) . toBe ( 'File' ) ;
72
92
} ) ;
73
93
74
- const logger = new Logger ( globalConfig , mock < InstanceSettingsConfig > ( { n8nFolder : '/tmp' } ) ) ;
94
+ test ( 'should accept absolute paths' , ( ) => {
95
+ // ARRANGE
96
+ const location = '/tmp/n8n.log' ;
97
+ const globalConfig = mock < GlobalConfig > ( {
98
+ logging : {
99
+ level : 'info' ,
100
+ outputs : [ 'file' ] ,
101
+ scopes : [ ] ,
102
+ file : { fileSizeMax : 100 , fileCountMax : 16 , location } ,
103
+ } ,
104
+ } ) ;
105
+ const OriginalFile = winston . transports . File ;
106
+ const FileSpy = jest . spyOn ( winston . transports , 'File' ) . mockImplementation ( ( ...args ) => {
107
+ return new OriginalFile ( ...args ) ;
108
+ } ) ;
75
109
76
- const { transports } = logger . getInternalLogger ( ) ;
110
+ // ACT
111
+ new Logger ( globalConfig , mock < InstanceSettingsConfig > ( { n8nFolder : '/tmp' } ) ) ;
77
112
78
- expect ( transports ) . toHaveLength ( 1 ) ;
113
+ // ASSERT
114
+ const fileOptionsCaptor = captor < string > ( ) ;
79
115
80
- const [ transport ] = transports ;
116
+ expect ( FileSpy ) . toHaveBeenCalledTimes ( 1 ) ;
117
+ expect ( FileSpy ) . toHaveBeenCalledWith ( fileOptionsCaptor ) ;
118
+ expect ( fileOptionsCaptor . value ) . toMatchObject ( { filename : location } ) ;
119
+ } ) ;
81
120
82
- expect ( transport . constructor . name ) . toBe ( 'File' ) ;
121
+ test ( 'should accept relative paths' , ( ) => {
122
+ // ARRANGE
123
+ const location = 'tmp/n8n.log' ;
124
+ const n8nFolder = '/tmp/n8n' ;
125
+ const globalConfig = mock < GlobalConfig > ( {
126
+ logging : {
127
+ level : 'info' ,
128
+ outputs : [ 'file' ] ,
129
+ scopes : [ ] ,
130
+ file : {
131
+ fileSizeMax : 100 ,
132
+ fileCountMax : 16 ,
133
+ location,
134
+ } ,
135
+ } ,
136
+ } ) ;
137
+ const OriginalFile = winston . transports . File ;
138
+ const FileSpy = jest . spyOn ( winston . transports , 'File' ) . mockImplementation ( ( ...args ) => {
139
+ return new OriginalFile ( ...args ) ;
140
+ } ) ;
141
+
142
+ // ACT
143
+ new Logger ( globalConfig , mock < InstanceSettingsConfig > ( { n8nFolder } ) ) ;
144
+
145
+ // ASSERT
146
+ const fileOptionsCaptor = captor < string > ( ) ;
147
+
148
+ expect ( FileSpy ) . toHaveBeenCalledTimes ( 1 ) ;
149
+ expect ( FileSpy ) . toHaveBeenCalledWith ( fileOptionsCaptor ) ;
150
+ expect ( fileOptionsCaptor . value ) . toMatchObject ( { filename : `${ n8nFolder } /${ location } ` } ) ;
151
+ } ) ;
83
152
} ) ;
84
153
} ) ;
85
154
0 commit comments