aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/tests/api/check-params/logs.ts
blob: 2496cee3117cae6287820df2f2193533dc3781c4 (plain) (blame)
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
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */

import { expect } from 'chai'
import { HttpStatusCode } from '@shared/models'
import { cleanupTests, createSingleServer, makeGetRequest, PeerTubeServer, setAccessTokensToServers } from '@shared/server-commands'

describe('Test logs API validators', function () {
  const path = '/api/v1/server/logs'
  let server: PeerTubeServer
  let userAccessToken = ''

  // ---------------------------------------------------------------

  before(async function () {
    this.timeout(120000)

    server = await createSingleServer(1)

    await setAccessTokensToServers([ server ])

    const user = {
      username: 'user1',
      password: 'my super password'
    }
    await server.users.create({ username: user.username, password: user.password })
    userAccessToken = await server.login.getAccessToken(user)
  })

  describe('When getting logs', function () {

    it('Should fail with a non authenticated user', async function () {
      await makeGetRequest({
        url: server.url,
        path,
        expectedStatus: HttpStatusCode.UNAUTHORIZED_401
      })
    })

    it('Should fail with a non admin user', async function () {
      await makeGetRequest({
        url: server.url,
        path,
        token: userAccessToken,
        expectedStatus: HttpStatusCode.FORBIDDEN_403
      })
    })

    it('Should fail with a missing startDate query', async function () {
      await makeGetRequest({
        url: server.url,
        path,
        token: server.accessToken,
        expectedStatus: HttpStatusCode.BAD_REQUEST_400
      })
    })

    it('Should fail with a bad startDate query', async function () {
      await makeGetRequest({
        url: server.url,
        path,
        token: server.accessToken,
        query: { startDate: 'toto' },
        expectedStatus: HttpStatusCode.BAD_REQUEST_400
      })
    })

    it('Should fail with a bad endDate query', async function () {
      await makeGetRequest({
        url: server.url,
        path,
        token: server.accessToken,
        query: { startDate: new Date().toISOString(), endDate: 'toto' },
        expectedStatus: HttpStatusCode.BAD_REQUEST_400
      })
    })

    it('Should fail with a bad level parameter', async function () {
      await makeGetRequest({
        url: server.url,
        path,
        token: server.accessToken,
        query: { startDate: new Date().toISOString(), level: 'toto' },
        expectedStatus: HttpStatusCode.BAD_REQUEST_400
      })
    })

    it('Should succeed with the correct params', async function () {
      await makeGetRequest({
        url: server.url,
        path,
        token: server.accessToken,
        query: { startDate: new Date().toISOString() },
        expectedStatus: HttpStatusCode.OK_200
      })
    })
  })

  describe('When creating client logs', function () {
    const base = {
      level: 'warn' as 'warn',
      message: 'my super message',
      url: 'https://example.com/toto'
    }
    const expectedStatus = HttpStatusCode.BAD_REQUEST_400

    it('Should fail with an invalid level', async function () {
      await server.logs.createLogClient({ payload: { ...base, level: '' as any }, expectedStatus })
      await server.logs.createLogClient({ payload: { ...base, level: undefined }, expectedStatus })
      await server.logs.createLogClient({ payload: { ...base, level: 'toto' as any }, expectedStatus })
    })

    it('Should fail with an invalid message', async function () {
      await server.logs.createLogClient({ payload: { ...base, message: undefined }, expectedStatus })
      await server.logs.createLogClient({ payload: { ...base, message: '' }, expectedStatus })
      await server.logs.createLogClient({ payload: { ...base, message: 'm'.repeat(2500) }, expectedStatus })
    })

    it('Should fail with an invalid url', async function () {
      await server.logs.createLogClient({ payload: { ...base, url: undefined }, expectedStatus })
      await server.logs.createLogClient({ payload: { ...base, url: 'toto' }, expectedStatus })
    })

    it('Should fail with an invalid stackTrace', async function () {
      await server.logs.createLogClient({ payload: { ...base, stackTrace: 's'.repeat(20000) }, expectedStatus })
    })

    it('Should fail with an invalid userAgent', async function () {
      await server.logs.createLogClient({ payload: { ...base, userAgent: 's'.repeat(500) }, expectedStatus })
    })

    it('Should fail with an invalid meta', async function () {
      await server.logs.createLogClient({ payload: { ...base, meta: 's'.repeat(10000) }, expectedStatus })
    })

    it('Should succeed with the correct params', async function () {
      await server.logs.createLogClient({ payload: { ...base, stackTrace: 'stackTrace', meta: '{toto}', userAgent: 'userAgent' } })
    })

    it('Should rate limit log creation', async function () {
      let fail = false

      for (let i = 0; i < 10; i++) {
        try {
          await server.logs.createLogClient({ token: null, payload: base })
        } catch {
          fail = true
        }
      }

      expect(fail).to.be.true
    })
  })

  after(async function () {
    await cleanupTests([ server ])
  })
})