File size: 2,073 Bytes
e8c33fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
const test = require('node:test');
const assert = require('node:assert/strict');

// Clear cached module to get a fresh in-memory log each run
delete require.cache[require.resolve('../utils/errorLogger')];
const { logError, getMemoryLog, clearMemoryLog } = require('../utils/errorLogger');

test('logError stores entry in memory log', () => {
  const before = getMemoryLog().length;
  const err = new Error('Test database error');
  logError(err, { code: 'TEST_ERROR', statusCode: 500 });
  const log = getMemoryLog();
  assert.equal(log.length, before + 1, 'should append one entry');
  const entry = log[0];
  assert.equal(entry.message, 'Test database error');
  assert.equal(entry.code, 'TEST_ERROR');
  assert.equal(entry.statusCode, 500);
  assert.ok(entry.timestamp, 'should have timestamp');
  assert.ok(entry.type, 'should have error type');
});

test('logError does not throw with null error', () => {
  assert.doesNotThrow(() => logError(null));
});

test('logError does not throw with undefined context', () => {
  assert.doesNotThrow(() => logError(new Error('bare call')));
});

test('logError extracts request context', () => {
  const err = new Error('Route error');
  const req = {
    originalUrl: '/api/test',
    method: 'POST',
    ip: '127.0.0.1',
    headers: { 'user-agent': 'test-agent' },
    user: { id: 'user-123' },
    body: { title: 'x' },
  };
  logError(err, { req, code: 'REQUEST_FAILED', statusCode: 500 });
  const entry = getMemoryLog()[0];
  assert.equal(entry.request.url, '/api/test');
  assert.equal(entry.request.method, 'POST');
  assert.equal(entry.userId, 'user-123');
});

test('clearMemoryLog empties the buffer', () => {
  logError(new Error('to clear'));
  clearMemoryLog();
  assert.equal(getMemoryLog().length, 0, 'buffer should be empty after clearMemoryLog');
});

test('ring buffer is capped at 500 entries', () => {
  clearMemoryLog();
  for (let i = 0; i < 510; i++) {
    logError(new Error(`error ${i}`));
  }
  assert.ok(getMemoryLog().length <= 500, 'buffer must not exceed 500 entries');
  clearMemoryLog();
});