forked from SolidOS/solid-ui
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlog.test.ts
More file actions
195 lines (165 loc) · 7.99 KB
/
log.test.ts
File metadata and controls
195 lines (165 loc) · 7.99 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
import { silenceDebugMessages } from './helpers/debugger'
import * as api from '../../src/index'
import * as log from '../../src/log'
import { JSDOM } from 'jsdom'
silenceDebugMessages()
const window = new JSDOM('<!DOCTYPE html><div id="status"></div>').window
const dom = window.document
const status = dom.getElementById('status')!
describe('log', () => {
it('is exposed in public API', () => expect(api.log).toBe(log))
describe('with document', () => {
beforeEach(() => (log.setInternals(window, dom)))
afterEach(() => (log.clear()))
describe('msg', () => {
beforeEach(() => log.msg('foo'))
it('adds line to #status', () => expect(status.children.length).toBe(1))
it('adds time and text to #status', () => expect(status.children[0].innerHTML).toMatch(/\d[\d]?:\d[\d]?:\d[\d]? \[mesg\] foo/))
})
describe('order of logs by default', () => {
beforeEach(() => {
log.msg('foo')
log.msg('bar')
})
it('should add new messages on bottom', () => expect(status.children[0].innerHTML).toContain('foo'))
})
describe('changing order of logs', () => {
beforeEach(() => {
log.logAscending()
log.msg('foo')
log.msg('bar')
})
afterEach(() => (log.logDescending()))
it('should add new messages on top', () => expect(status.children[0].innerHTML).toContain('bar'))
})
describe('warn', () => {
beforeEach(() => log.warn('bar'))
it('adds line to #status', () => expect(status.children.length).toBe(1))
it('adds time and text to #status', () => expect(status.children[0].innerHTML).toMatch(/\d[\d]?:\d[\d]?:\d[\d]? \[warn\] bar/))
})
describe('debug', () => {
beforeEach(() => log.debug('baz'))
it('does not add line to #status by default', () => expect(status.children.length).toBe(0))
})
describe('info', () => {
beforeEach(() => log.info('foo'))
it('does not add line to #status by default', () => expect(status.children.length).toBe(0))
})
describe('error', () => {
beforeEach(() => log.error('bar'))
it('adds line to #status', () => expect(status.children.length).toBe(1))
it('adds time and text to #status', () => expect(status.children[0].innerHTML).toMatch(/\d[\d]?:\d[\d]?:\d[\d]? \[eror\] bar/))
})
describe('success', () => {
beforeEach(() => log.success('baz'))
it('does not add line to #status by default', () => expect(status.children.length).toBe(0))
})
describe('alert', () => {
beforeEach(() => (window.alert = jest.fn())) // not supported by JSDOM anyway
beforeEach(() => (log.alert('foo')))
it('calls alert', () => expect(window.alert).toHaveBeenCalledWith('foo'))
})
describe('clear', () => {
beforeEach(() => {
log.msg('bar')
log.clear()
})
it('clears #status', () => expect(status.children.length).toBe(0))
})
describe('setLevel', () => {
afterEach(() => (log.setLevel(log.LogLevel.Error + log.LogLevel.Warning + log.LogLevel.Message)))
it('can set so only error are logged', () => expect(setLevelAndCallAllLogsAndReturnLengthOfStatusChildren(log.LogLevel.Error)).toBe(2))
it('can set so only warning are logged', () => expect(setLevelAndCallAllLogsAndReturnLengthOfStatusChildren(log.LogLevel.Warning)).toBe(2))
it('can set so only message are logged', () => expect(setLevelAndCallAllLogsAndReturnLengthOfStatusChildren(log.LogLevel.Message)).toBe(2))
it('can set so only success are logged', () => expect(setLevelAndCallAllLogsAndReturnLengthOfStatusChildren(log.LogLevel.Success)).toBe(2))
it('can set so only info are logged', () => expect(setLevelAndCallAllLogsAndReturnLengthOfStatusChildren(log.LogLevel.Info)).toBe(2))
it('can set so only debug are logged', () => expect(setLevelAndCallAllLogsAndReturnLengthOfStatusChildren(log.LogLevel.Debug)).toBe(2))
it('can set so all are logged', () => expect(setLevelAndCallAllLogsAndReturnLengthOfStatusChildren(log.LogLevel.All)).toBe(7))
it('can set so only error and info are logged', () => expect(setLevelAndCallAllLogsAndReturnLengthOfStatusChildren(log.LogLevel.Error + log.LogLevel.Info)).toBe(3))
})
describe('dumpHTML', () => {
let body
beforeEach(() => {
body = log.escapeForXML(dom.body.innerHTML)
log.dumpHTML()
})
it('logs content of document.body', () => expect(status.children[0].innerHTML).toContain(body))
})
})
describe('without document', () => {
let _log
beforeEach(() => (log.setInternals(undefined, undefined)))
beforeEach(() => {
_log = console.log
console.log = jest.fn() // could have used jest.spyOn(console, 'log'), but that does not prevent logging to console
})
afterEach(() => (console.assert = _log))
describe('msg', () => {
beforeEach(() => log.msg('foo'))
it('calls console.log', () => expect(console.log).toHaveBeenCalledWith('foo'))
})
describe('warn', () => {
beforeEach(() => log.warn('bar'))
it('calls console.log', () => expect(console.log).toHaveBeenCalledWith('bar'))
})
describe('debug', () => {
beforeEach(() => log.debug('baz'))
it('does not call console.log', () => expect(console.log).not.toHaveBeenCalled())
})
describe('info', () => {
beforeEach(() => log.debug('foo'))
it('does not call console.log', () => expect(console.log).not.toHaveBeenCalled())
})
describe('error', () => {
beforeEach(() => log.error('bar'))
it('calls console.log', () => expect(console.log).toHaveBeenCalledWith('bar'))
})
describe('success', () => {
beforeEach(() => log.success('baz'))
it('does not call console.log', () => expect(console.log).not.toHaveBeenCalled())
})
describe('alert', () => {
beforeEach(() => (log.alert('foo')))
it('calls console.log', () => expect(console.log).toHaveBeenCalledWith('foo'))
})
describe('clear', () => {
beforeEach(() => log.clear())
it('does nothing', () => expect(console.log).not.toHaveBeenCalled())
})
describe('setLevel', () => {
afterEach(() => (log.setLevel(log.LogLevel.Error + log.LogLevel.Warning + log.LogLevel.Message)))
it('can set so only error are logged', () => expect(setLevelAndCallAllLogsAndReturnConsoleLog(log.LogLevel.Error)).toHaveBeenCalledTimes(2))
it('can set so only warning are logged', () => expect(setLevelAndCallAllLogsAndReturnConsoleLog(log.LogLevel.Warning)).toHaveBeenCalledTimes(2))
it('can set so only message are logged', () => expect(setLevelAndCallAllLogsAndReturnConsoleLog(log.LogLevel.Message)).toHaveBeenCalledTimes(2))
it('can set so only success are logged', () => expect(setLevelAndCallAllLogsAndReturnConsoleLog(log.LogLevel.Success)).toHaveBeenCalledTimes(2))
it('can set so only info are logged', () => expect(setLevelAndCallAllLogsAndReturnConsoleLog(log.LogLevel.Info)).toHaveBeenCalledTimes(2))
it('can set so only debug are logged', () => expect(setLevelAndCallAllLogsAndReturnConsoleLog(log.LogLevel.Debug)).toHaveBeenCalledTimes(2))
it('can set so all are logged', () => expect(setLevelAndCallAllLogsAndReturnConsoleLog(log.LogLevel.All)).toHaveBeenCalledTimes(7))
it('can set so only error and info are logged', () => expect(setLevelAndCallAllLogsAndReturnConsoleLog(log.LogLevel.Error + log.LogLevel.Info)).toHaveBeenCalledTimes(3))
})
describe('dumpHTML', () => {
beforeEach(() => log.dumpHTML())
it('does nothing', () => expect(console.log).not.toHaveBeenCalled())
})
})
})
function setLevelAndCallAllLogsAndReturnLengthOfStatusChildren (level: number) {
log.setLevel(level)
log.msg('msg')
log.warn('warn')
log.debug('debug')
log.info('info')
log.error('error')
log.success('success')
return status.children.length
}
function setLevelAndCallAllLogsAndReturnConsoleLog (level: number) {
log.setLevel(level)
log.msg('msg')
log.warn('warn')
log.debug('debug')
log.info('info')
log.error('error')
log.success('success')
return console.log
}