-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlogger.test.ts
More file actions
243 lines (209 loc) · 6.63 KB
/
logger.test.ts
File metadata and controls
243 lines (209 loc) · 6.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
import { beforeEach, describe, expect, it, jest } from "bun:test"
import { initLogger, log } from "./logger.ts"
describe("logger", () => {
let mockBackend: {
info: jest.MockedFunction<any>
warn: jest.MockedFunction<any>
error: jest.MockedFunction<any>
debug?: jest.MockedFunction<any>
}
beforeEach(() => {
mockBackend = {
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
debug: jest.fn(),
}
})
describe("initLogger", () => {
it("should initialize with backend and debug flag", () => {
expect(() => initLogger(mockBackend, true)).not.toThrow()
})
})
describe("log.info", () => {
beforeEach(() => {
initLogger(mockBackend, false)
})
it("should call backend.info with prefixed message", () => {
log.info("test message")
expect(mockBackend.info).toHaveBeenCalledWith(
"basic-memory: test message",
)
})
it("should pass through additional arguments", () => {
log.info("test message", { extra: "data" }, 123)
expect(mockBackend.info).toHaveBeenCalledWith(
"basic-memory: test message",
{ extra: "data" },
123,
)
})
})
describe("log.warn", () => {
beforeEach(() => {
initLogger(mockBackend, false)
})
it("should call backend.warn with prefixed message", () => {
log.warn("warning message")
expect(mockBackend.warn).toHaveBeenCalledWith(
"basic-memory: warning message",
)
})
it("should pass through additional arguments", () => {
log.warn("warning message", { extra: "data" })
expect(mockBackend.warn).toHaveBeenCalledWith(
"basic-memory: warning message",
{ extra: "data" },
)
})
})
describe("log.error", () => {
beforeEach(() => {
initLogger(mockBackend, false)
})
it("should call backend.error with prefixed message", () => {
log.error("error message")
expect(mockBackend.error).toHaveBeenCalledWith(
"basic-memory: error message",
)
})
it("should append error message when Error is provided", () => {
const error = new Error("Something went wrong")
log.error("error message", error)
expect(mockBackend.error).toHaveBeenCalledWith(
"basic-memory: error message — Something went wrong",
)
})
it("should append string when string error is provided", () => {
log.error("error message", "string error")
expect(mockBackend.error).toHaveBeenCalledWith(
"basic-memory: error message — string error",
)
})
it("should handle non-string, non-Error values", () => {
log.error("error message", 123)
expect(mockBackend.error).toHaveBeenCalledWith(
"basic-memory: error message — 123",
)
log.error("error message", null)
expect(mockBackend.error).toHaveBeenCalledWith(
"basic-memory: error message — null",
)
log.error("error message", undefined)
expect(mockBackend.error).toHaveBeenCalledWith(
"basic-memory: error message",
)
})
it("should handle empty/falsy error values", () => {
log.error("error message", "")
expect(mockBackend.error).toHaveBeenCalledWith(
"basic-memory: error message",
)
log.error("error message", 0)
expect(mockBackend.error).toHaveBeenCalledWith(
"basic-memory: error message — 0",
)
})
})
describe("log.debug", () => {
describe("when debug is enabled", () => {
beforeEach(() => {
initLogger(mockBackend, true)
})
it("should call backend.debug with prefixed message", () => {
log.debug("debug message")
expect(mockBackend.debug).toHaveBeenCalledWith(
"basic-memory [debug]: debug message",
)
})
it("should pass through additional arguments", () => {
log.debug("debug message", { data: "test" })
expect(mockBackend.debug).toHaveBeenCalledWith(
"basic-memory [debug]: debug message",
{ data: "test" },
)
})
it("should fallback to info if backend.debug is not available", () => {
delete mockBackend.debug
initLogger(mockBackend, true)
log.debug("debug message")
expect(mockBackend.info).toHaveBeenCalledWith(
"basic-memory [debug]: debug message",
)
})
})
describe("when debug is disabled", () => {
beforeEach(() => {
initLogger(mockBackend, false)
})
it("should not call any backend methods", () => {
log.debug("debug message")
expect(mockBackend.info).not.toHaveBeenCalled()
expect(mockBackend.warn).not.toHaveBeenCalled()
expect(mockBackend.error).not.toHaveBeenCalled()
expect(mockBackend.debug).not.toHaveBeenCalled()
})
})
})
describe("before initialization", () => {
it("should not throw when using log methods before init", () => {
// Create new logger state by not calling initLogger
expect(() => {
log.info("test")
log.warn("test")
log.error("test")
log.debug("test")
}).not.toThrow()
})
})
describe("backend without debug method", () => {
beforeEach(() => {
const simpleBackend = {
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
// no debug method
}
initLogger(simpleBackend, true)
mockBackend = simpleBackend as any
})
it("should use info method as fallback for debug", () => {
log.debug("debug message")
expect(mockBackend.info).toHaveBeenCalledWith(
"basic-memory [debug]: debug message",
)
})
})
describe("logger state isolation", () => {
it("should maintain separate state for debug flag", () => {
// First init with debug disabled
initLogger(mockBackend, false)
log.debug("should not appear")
expect(mockBackend.debug).not.toHaveBeenCalled()
// Re-init with debug enabled
mockBackend.debug?.mockClear()
initLogger(mockBackend, true)
log.debug("should appear")
expect(mockBackend.debug).toHaveBeenCalled()
})
it("should maintain separate backend instances", () => {
const backend1 = {
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
}
const backend2 = {
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
}
initLogger(backend1, false)
log.info("message 1")
expect(backend1.info).toHaveBeenCalled()
expect(backend2.info).not.toHaveBeenCalled()
initLogger(backend2, false)
log.info("message 2")
expect(backend2.info).toHaveBeenCalled()
})
})
})