storage = \OC::$server->query(BackupCodeStorage::class); $this->notificationManager = $this->createMock(IManager::class); $this->notificationManager->method('createNotification') ->willReturn(\OC::$server->query(IManager::class)->createNotification()); $this->overwriteService(IManager::class, $this->notificationManager); } public function testSimpleWorkFlow(): void { $user = $this->getMockBuilder(IUser::class)->getMock(); $user->expects($this->any()) ->method('getUID') ->willReturn($this->testUID); $this->notificationManager->expects($this->once()) ->method('markProcessed') ->with($this->callback(function (INotification $notification) { return $notification->getUser() === $this->testUID && $notification->getObjectType() === 'create' && $notification->getObjectId() === 'codes' && $notification->getApp() === 'twofactor_backupcodes'; })); // Create codes $codes = $this->storage->createCodes($user, 5); $this->assertCount(5, $codes); $this->assertTrue($this->storage->hasBackupCodes($user)); $initialState = [ 'enabled' => true, 'total' => 5, 'used' => 0, ]; $this->assertEquals($initialState, $this->storage->getBackupCodesState($user)); // Use codes $code = $codes[2]; $this->assertTrue($this->storage->validateCode($user, $code)); // Code must not be used twice $this->assertFalse($this->storage->validateCode($user, $code)); // Invalid codes are invalid $this->assertFalse($this->storage->validateCode($user, 'I DO NOT EXIST')); $stateAfter = [ 'enabled' => true, 'total' => 5, 'used' => 1, ]; $this->assertEquals($stateAfter, $this->storage->getBackupCodesState($user)); // Deplete codes $this->assertTrue($this->storage->validateCode($user, $codes[0])); $this->assertTrue($this->storage->validateCode($user, $codes[1])); $this->assertTrue($this->storage->validateCode($user, $codes[3])); $this->assertTrue($this->storage->validateCode($user, $codes[4])); $stateAllUsed = [ 'enabled' => true, 'total' => 5, 'used' => 5, ]; $this->assertEquals($stateAllUsed, $this->storage->getBackupCodesState($user)); } }