1 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
3 import { expect } from 'chai'
4 import { HttpStatusCode } from '@shared/models'
11 setAccessTokensToServers,
13 } from '@shared/server-commands'
15 describe('Test logs', function () {
16 let server: PeerTubeServer
17 let logsCommand: LogsCommand
19 before(async function () {
22 server = await createSingleServer(1)
23 await setAccessTokensToServers([ server ])
25 logsCommand = server.logs
28 describe('With the standard log file', function () {
30 it('Should get logs with a start date', async function () {
33 await server.videos.upload({ attributes: { name: 'video 1' } })
34 await waitJobs([ server ])
36 const now = new Date()
38 await server.videos.upload({ attributes: { name: 'video 2' } })
39 await waitJobs([ server ])
41 const body = await logsCommand.getLogs({ startDate: now })
42 const logsString = JSON.stringify(body)
44 expect(logsString.includes('video 1')).to.be.false
45 expect(logsString.includes('video 2')).to.be.true
48 it('Should get logs with an end date', async function () {
51 await server.videos.upload({ attributes: { name: 'video 3' } })
52 await waitJobs([ server ])
54 const now1 = new Date()
56 await server.videos.upload({ attributes: { name: 'video 4' } })
57 await waitJobs([ server ])
59 const now2 = new Date()
61 await server.videos.upload({ attributes: { name: 'video 5' } })
62 await waitJobs([ server ])
64 const body = await logsCommand.getLogs({ startDate: now1, endDate: now2 })
65 const logsString = JSON.stringify(body)
67 expect(logsString.includes('video 3')).to.be.false
68 expect(logsString.includes('video 4')).to.be.true
69 expect(logsString.includes('video 5')).to.be.false
72 it('Should filter by level', async function () {
75 const now = new Date()
77 await server.videos.upload({ attributes: { name: 'video 6' } })
78 await waitJobs([ server ])
81 const body = await logsCommand.getLogs({ startDate: now, level: 'info' })
82 const logsString = JSON.stringify(body)
84 expect(logsString.includes('video 6')).to.be.true
88 const body = await logsCommand.getLogs({ startDate: now, level: 'warn' })
89 const logsString = JSON.stringify(body)
91 expect(logsString.includes('video 6')).to.be.false
95 it('Should filter by tag', async function () {
96 const now = new Date()
98 const { uuid } = await server.videos.upload({ attributes: { name: 'video 6' } })
99 await waitJobs([ server ])
102 const body = await logsCommand.getLogs({ startDate: now, level: 'debug', tagsOneOf: [ 'toto' ] })
103 expect(body).to.have.lengthOf(0)
107 const body = await logsCommand.getLogs({ startDate: now, level: 'debug', tagsOneOf: [ uuid ] })
108 expect(body).to.not.have.lengthOf(0)
110 for (const line of body) {
111 expect(line.tags).to.contain(uuid)
116 it('Should log ping requests', async function () {
117 const now = new Date()
119 await server.servers.ping()
121 const body = await logsCommand.getLogs({ startDate: now, level: 'info' })
122 const logsString = JSON.stringify(body)
124 expect(logsString.includes('/api/v1/ping')).to.be.true
127 it('Should not log ping requests', async function () {
130 await killallServers([ server ])
132 await server.run({ log: { log_ping_requests: false } })
134 const now = new Date()
136 await server.servers.ping()
138 const body = await logsCommand.getLogs({ startDate: now, level: 'info' })
139 const logsString = JSON.stringify(body)
141 expect(logsString.includes('/api/v1/ping')).to.be.false
145 describe('With the audit log', function () {
147 it('Should get logs with a start date', async function () {
150 await server.videos.upload({ attributes: { name: 'video 7' } })
151 await waitJobs([ server ])
153 const now = new Date()
155 await server.videos.upload({ attributes: { name: 'video 8' } })
156 await waitJobs([ server ])
158 const body = await logsCommand.getAuditLogs({ startDate: now })
159 const logsString = JSON.stringify(body)
161 expect(logsString.includes('video 7')).to.be.false
162 expect(logsString.includes('video 8')).to.be.true
164 expect(body).to.have.lengthOf(1)
168 const message = JSON.parse(item.message)
169 expect(message.domain).to.equal('videos')
170 expect(message.action).to.equal('create')
173 it('Should get logs with an end date', async function () {
176 await server.videos.upload({ attributes: { name: 'video 9' } })
177 await waitJobs([ server ])
179 const now1 = new Date()
181 await server.videos.upload({ attributes: { name: 'video 10' } })
182 await waitJobs([ server ])
184 const now2 = new Date()
186 await server.videos.upload({ attributes: { name: 'video 11' } })
187 await waitJobs([ server ])
189 const body = await logsCommand.getAuditLogs({ startDate: now1, endDate: now2 })
190 const logsString = JSON.stringify(body)
192 expect(logsString.includes('video 9')).to.be.false
193 expect(logsString.includes('video 10')).to.be.true
194 expect(logsString.includes('video 11')).to.be.false
198 describe('When creating log from the client', function () {
200 it('Should create a warn client log', async function () {
201 const now = new Date()
203 await server.logs.createLogClient({
206 url: 'http://example.com',
207 message: 'my super client message'
212 const body = await logsCommand.getLogs({ startDate: now })
213 const logsString = JSON.stringify(body)
215 expect(logsString.includes('my super client message')).to.be.true
218 it('Should create an error authenticated client log', async function () {
219 const now = new Date()
221 await server.logs.createLogClient({
223 url: 'https://example.com/page1',
225 message: 'my super client message 2',
226 userAgent: 'super user agent',
228 stackTrace: 'super stack trace'
232 const body = await logsCommand.getLogs({ startDate: now })
233 const logsString = JSON.stringify(body)
235 expect(logsString.includes('my super client message 2')).to.be.true
236 expect(logsString.includes('super user agent')).to.be.true
237 expect(logsString.includes('super stack trace')).to.be.true
238 expect(logsString.includes('{hello}')).to.be.true
239 expect(logsString.includes('https://example.com/page1')).to.be.true
242 it('Should refuse to create client logs', async function () {
247 accept_client_log: false
251 await server.logs.createLogClient({
254 url: 'http://example.com',
255 message: 'my super client message'
257 expectedStatus: HttpStatusCode.FORBIDDEN_403
262 after(async function () {
263 await cleanupTests([ server ])