Skip to content

Commit 8eec494

Browse files
committed
test(user_status): add tests for backup row protection in cleanup and queries
- testFindAllExcludesBackups: verify findAll() doesn't return backup rows - testFindAllRecentExcludesBackups: verify findAllRecent() excludes backups - testClearOlderThanClearAtPreservesBackups: verify backup rows survive clear_at cleanup - testClearStatusesOlderThanPreservesBackups: verify backup statuses aren't overwritten to OFFLINE by age-based cleanup - testHandleWithCorrectEvent: verify removeBackupUserStatus() is also called when a user is deleted AI-Assisted-By: Claude Opus 4.6
1 parent 1ae4f19 commit 8eec494

2 files changed

Lines changed: 80 additions & 2 deletions

File tree

apps/user_status/tests/Unit/Db/UserStatusMapperTest.php

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,24 @@ public function testGetFindAll(): void {
4747
$this->assertEquals('user2', $offsetResults[0]->getUserId());
4848
}
4949

50+
public function testFindAllExcludesBackups(): void {
51+
$this->insertSampleStatuses();
52+
53+
$backup = new UserStatus();
54+
$backup->setUserId('_backupuser');
55+
$backup->setStatus('dnd');
56+
$backup->setStatusTimestamp(5000);
57+
$backup->setIsUserDefined(true);
58+
$backup->setIsBackup(true);
59+
$this->mapper->insert($backup);
60+
61+
$allResults = $this->mapper->findAll();
62+
$this->assertCount(3, $allResults);
63+
64+
$userIds = array_map(fn ($s) => $s->getUserId(), $allResults);
65+
$this->assertNotContains('_backupuser', $userIds);
66+
}
67+
5068
public function testFindAllRecent(): void {
5169
$this->insertSampleStatuses();
5270

@@ -56,6 +74,26 @@ public function testFindAllRecent(): void {
5674
$this->assertEquals('user1', $allResults[1]->getUserId());
5775
}
5876

77+
public function testFindAllRecentExcludesBackups(): void {
78+
$this->insertSampleStatuses();
79+
80+
$backup = new UserStatus();
81+
$backup->setUserId('_backupuser');
82+
$backup->setStatus('dnd');
83+
$backup->setStatusTimestamp(7000);
84+
$backup->setStatusMessageTimestamp(7000);
85+
$backup->setIsUserDefined(true);
86+
$backup->setIsBackup(true);
87+
$backup->setCustomMessage('Backed up status');
88+
$this->mapper->insert($backup);
89+
90+
$allResults = $this->mapper->findAllRecent(10, 0);
91+
$this->assertCount(2, $allResults);
92+
93+
$userIds = array_map(fn ($s) => $s->getUserId(), $allResults);
94+
$this->assertNotContains('_backupuser', $userIds);
95+
}
96+
5997
public function testGetFind(): void {
6098
$this->insertSampleStatuses();
6199

@@ -190,6 +228,43 @@ public function testClearOlderThanClearAt(): void {
190228
$this->mapper->findByUserId('user1');
191229
}
192230

231+
public function testClearOlderThanClearAtPreservesBackups(): void {
232+
$backup = new UserStatus();
233+
$backup->setUserId('_user1');
234+
$backup->setStatus('dnd');
235+
$backup->setStatusTimestamp(5000);
236+
$backup->setIsUserDefined(true);
237+
$backup->setIsBackup(true);
238+
$backup->setClearAt(50000);
239+
$this->mapper->insert($backup);
240+
241+
$this->mapper->clearOlderThanClearAt(55000);
242+
243+
// Backup should survive cleanup despite having expired clear_at
244+
$backupStatus = $this->mapper->findByUserId('user1', true);
245+
$this->assertEquals('_user1', $backupStatus->getUserId());
246+
$this->assertEquals('dnd', $backupStatus->getStatus());
247+
$this->assertTrue($backupStatus->getIsBackup());
248+
}
249+
250+
public function testClearStatusesOlderThanPreservesBackups(): void {
251+
$backup = new UserStatus();
252+
$backup->setUserId('_user1');
253+
$backup->setStatus('online');
254+
$backup->setStatusTimestamp(1000);
255+
$backup->setIsUserDefined(false);
256+
$backup->setIsBackup(true);
257+
$this->mapper->insert($backup);
258+
259+
$this->mapper->clearStatusesOlderThan(5000, 8000);
260+
261+
// Backup should survive cleanup despite old timestamp
262+
$backupStatus = $this->mapper->findByUserId('user1', true);
263+
$this->assertEquals('online', $backupStatus->getStatus());
264+
$this->assertFalse($backupStatus->getIsUserDefined());
265+
$this->assertEquals(1000, $backupStatus->getStatusTimestamp());
266+
}
267+
193268
private function insertSampleStatuses(): void {
194269
$userStatus1 = new UserStatus();
195270
$userStatus1->setUserId('admin');

apps/user_status/tests/Unit/Listener/UserDeletedListenerTest.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,17 @@ protected function setUp(): void {
2828

2929
public function testHandleWithCorrectEvent(): void {
3030
$user = $this->createMock(IUser::class);
31-
$user->expects($this->once())
32-
->method('getUID')
31+
$user->method('getUID')
3332
->willReturn('john.doe');
3433

3534
$this->service->expects($this->once())
3635
->method('removeUserStatus')
3736
->with('john.doe');
3837

38+
$this->service->expects($this->once())
39+
->method('removeBackupUserStatus')
40+
->with('john.doe');
41+
3942
$event = new UserDeletedEvent($user);
4043
$this->listener->handle($event);
4144
}

0 commit comments

Comments
 (0)