feat(m15): full test completion + quality gate + validation fixes

- Add E2E notifications.spec (member-added notification -> list -> mark read)
  and activity-log.spec (board_posted + todo_created recorded)
- Set Playwright workers=1 for deterministic full-suite runs (SSE test under
  parallel load); full E2E suite (18 tests / 13 specs incl. 12 mandated
  scenarios) green
- Quality gate: 251 unit/integration tests, lint clean, typecheck clean,
  build succeeds, coverage 91.13% Repository/Service (>=80%)
- Validation fixes (mandatory): SearchService now searches ALL items
  (large pageSize) instead of first page only; MeetingService.
  checkScheduleConflicts now requires membership (actorId) to prevent
  non-member info enumeration
This commit is contained in:
Ken Yasue
2026-06-25 02:54:48 +02:00
parent 2bc883cb6f
commit f9720850b2
7 changed files with 145 additions and 5 deletions

View File

@ -91,6 +91,7 @@ describe('MeetingService', () => {
}).meeting;
// 新しいミーティング(10:30-11:30)は重複
const conflicts = service.checkScheduleConflicts(
authorId,
projectId,
[memberId],
'2026-06-15T10:30:00',
@ -109,6 +110,7 @@ describe('MeetingService', () => {
memberIds: [memberId],
});
const conflicts = service.checkScheduleConflicts(
authorId,
projectId,
[memberId],
'2026-06-15T11:00:00',
@ -125,6 +127,7 @@ describe('MeetingService', () => {
memberIds: [memberId],
}).meeting;
const conflicts = service.checkScheduleConflicts(
authorId,
projectId,
[memberId],
'2026-06-15T10:30:00',
@ -144,6 +147,7 @@ describe('MeetingService', () => {
createdById: memberId,
});
const conflicts = service.checkScheduleConflicts(
authorId,
projectId,
[memberId],
'2026-06-15T10:30:00',
@ -169,6 +173,7 @@ describe('MeetingService', () => {
orderIndex: 0,
});
const conflicts = service.checkScheduleConflicts(
authorId,
projectId,
[memberId],
'2026-06-15T10:00:00',
@ -194,6 +199,7 @@ describe('MeetingService', () => {
orderIndex: 0,
});
const conflicts = service.checkScheduleConflicts(
authorId,
projectId,
[memberId],
'2026-06-15T10:00:00',