Verbessere die Handhabung von Datumsbereichen in der Worklog-Abfrage und füge Fehlerbehandlung für Statistikabfragen in den Komponenten hinzu.
All checks were successful
Deploy production / deploy (push) Successful in 42s
All checks were successful
Deploy production / deploy (push) Successful in 42s
This commit is contained in:
@@ -101,3 +101,74 @@ test('Status: keine Fehlzeit für kranken Montag, Pausen angerechnet, laufende W
|
||||
assert.equal(stats.adjustedEndTodayWeek, '16:30');
|
||||
assert.equal(stats.totalOvertime, '+5:49');
|
||||
});
|
||||
|
||||
// Repository nicht ersetzen: Genau dort muss die Datumsabfrage funktionieren.
|
||||
const { Op } = require('sequelize');
|
||||
const weekController = require('../src/controllers/WeekOverviewController');
|
||||
const timeController = require('../src/controllers/TimeEntryController');
|
||||
const actualFindByDateRange = repository.findByDateRange;
|
||||
|
||||
function responseRecorder() {
|
||||
return {
|
||||
statusCode: 200,
|
||||
status(code) { this.statusCode = code; return this; },
|
||||
json(body) { this.body = body; return this; }
|
||||
};
|
||||
}
|
||||
|
||||
function setupRepositoryFlow(t) {
|
||||
setupWeek(t);
|
||||
mock(t, repository, 'findByDateRange', actualFindByDateRange);
|
||||
mock(t, database, 'getModels', () => ({
|
||||
Worklog: {
|
||||
findAll: async options => {
|
||||
assert.equal(options.where.user_id, 1);
|
||||
const range = options.where.tstamp[Op.between];
|
||||
assert.equal(range[0].getTime(), new Date('2026-10-26T00:00:00').getTime());
|
||||
assert.equal(range[1].getTime(), new Date('2026-11-01T23:59:59.999').getTime());
|
||||
return [{ id: 1, state: 'start work', tstamp: '2026-10-27 08:00:00' }];
|
||||
}
|
||||
},
|
||||
User: { findByPk: async () => ({ daily_hours: 8 }) },
|
||||
Timewish: { findOne: async () => null, findAll: async () => [] }
|
||||
}));
|
||||
mock(t, service, '_calculateTotalOvertime', async () => ({ minutes: 349, formatted: '+5:49' }));
|
||||
}
|
||||
|
||||
test('Wochen-API durchläuft echte Repository-Abfrage und liefert aktuelle Woche', async t => {
|
||||
setupRepositoryFlow(t);
|
||||
const res = responseRecorder();
|
||||
await weekController.getWeekOverview({ user: { userId: 1 }, query: { weekOffset: '0' } }, res);
|
||||
assert.equal(res.statusCode, 200);
|
||||
assert.equal(res.body.data.weekStart, '2026-10-26');
|
||||
assert.equal(res.body.data.weekEnd, '2026-11-01');
|
||||
assert.equal(res.body.data.days[0].sick.hours, 8);
|
||||
});
|
||||
|
||||
test('Statistik-API durchläuft echte Repository-Abfrage und liefert Werte statt Fehlerobjekt', async t => {
|
||||
setupRepositoryFlow(t);
|
||||
const res = responseRecorder();
|
||||
await timeController.getStats({ user: { userId: 1 } }, res);
|
||||
assert.equal(res.statusCode, 200);
|
||||
assert.equal(res.body.overtime, '+0:00');
|
||||
assert.equal(res.body.nonWorkingHours, '8:00');
|
||||
assert.match(res.body.open, /^\d{2}:\d{2}:\d{2}$/);
|
||||
});
|
||||
|
||||
test('Repository: Arbeitszeitpaare verwenden den vollständigen Datumsbereich', async t => {
|
||||
const start = new Date('2026-10-26T00:00:00');
|
||||
const end = new Date('2026-11-01T23:59:59.999');
|
||||
let queried = false;
|
||||
mock(t, database, 'getModels', () => ({ Worklog: { findAll: async options => {
|
||||
queried = true;
|
||||
assert.deepEqual(options.where.tstamp[Op.between], [start, end]);
|
||||
return [
|
||||
{ id: 1, state: 'start work', tstamp: '2026-10-27 08:00:00' },
|
||||
{ id: 2, state: 'stop work', tstamp: '2026-10-27 16:00:00', relatedTo_id: 1 }
|
||||
];
|
||||
} } }));
|
||||
const pairs = await repository.findPairsByUserInDateRange(1, start, end);
|
||||
assert.equal(queried, true);
|
||||
assert.equal(pairs.length, 1);
|
||||
assert.equal(pairs[0].end_id, 2);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user