otp_secret = 'AAAA'; $controlTotp = TOTP::create($account->otp_secret); $validator = new TotpValidator(['account' => $account]); $result = $this->callProtected($validator, 'validateValue', 123456); $this->assertSame([E::TOTP_INCORRECT, []], $result); $result = $this->callProtected($validator, 'validateValue', $controlTotp->now()); $this->assertNull($result); $result = $this->callProtected($validator, 'validateValue', $controlTotp->at(time() - 31)); $this->assertNull($result); $at = time() - 400; $validator->timestamp = $at; $result = $this->callProtected($validator, 'validateValue', $controlTotp->now()); $this->assertSame([E::TOTP_INCORRECT, []], $result); $result = $this->callProtected($validator, 'validateValue', $controlTotp->at($at)); $this->assertNull($result); $at = fn(): ?int => null; $validator->timestamp = $at; $result = $this->callProtected($validator, 'validateValue', $controlTotp->now()); $this->assertNull($result); $at = fn(): int => time() - 700; $validator->timestamp = $at; $result = $this->callProtected($validator, 'validateValue', $controlTotp->at($at())); $this->assertNull($result); } }