Skip to content

Commit 5fdaa1f

Browse files
committed
Add test for ConfirmsPasswords
1 parent b9919d5 commit 5fdaa1f

File tree

2 files changed

+72
-5
lines changed

2 files changed

+72
-5
lines changed

src/Auth/Concerns/ConfirmsPasswords.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
namespace CraftCms\Cms\Auth\Concerns;
66

7-
use CraftCms\Cms\Cms;
87
use Illuminate\Support\Facades\Auth;
98
use Illuminate\Support\Facades\Date;
109
use Illuminate\Support\Facades\Session;
@@ -31,7 +30,7 @@ protected function isPasswordConfirmed(): bool
3130
{
3231
$maximumSecondsSinceConfirmation = config('auth.password_timeout', 900);
3332

34-
if ($maximumSecondsSinceConfirmation === 0) {
33+
if ($maximumSecondsSinceConfirmation === -1) {
3534
return true;
3635
}
3736

@@ -46,15 +45,16 @@ protected function confirmedPasswordTimeout(): int|false
4645

4746
if ($confirmedAt !== null) {
4847
$diff = Date::now()->unix() - $confirmedAt;
48+
$remainingTime = $maximumSecondsSinceConfirmation - $diff;
4949

50-
if ($diff >= $maximumSecondsSinceConfirmation) {
51-
return $diff;
50+
if ($remainingTime >= 0) {
51+
return $remainingTime;
5252
}
5353
}
5454
}
5555

5656
// If it has been disabled, return false.
57-
if (Cms::config()->elevatedSessionDuration === 0) {
57+
if (config('auth.password_timeout') === -1) {
5858
return false;
5959
}
6060

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
use CraftCms\Cms\Auth\Concerns\ConfirmsPasswords;
4+
use CraftCms\Cms\User\Elements\User;
5+
use Illuminate\Support\Facades\Date;
6+
use Illuminate\Support\Facades\Session;
7+
use Symfony\Component\HttpKernel\Exception\HttpException;
8+
9+
use function Pest\Laravel\actingAs;
10+
use function Pest\Laravel\travel;
11+
12+
class TestConfirmsPasswords
13+
{
14+
use ConfirmsPasswords;
15+
16+
public function __call(string $name, array $arguments)
17+
{
18+
return $this->$name(...$arguments);
19+
}
20+
}
21+
22+
beforeEach(function () {
23+
actingAs(User::find()->first());
24+
});
25+
26+
test('it can mark a password as confirmed', function () {
27+
Date::setTestNow(now());
28+
29+
expect(Session::get('auth.password_confirmed_at'))->toBeNull();
30+
expect(new TestConfirmsPasswords()->isPasswordConfirmed())->toBeFalse();
31+
32+
new TestConfirmsPasswords()->confirmPassword();
33+
34+
expect(Session::get('auth.password_confirmed_at'))->toBe(now()->unix());
35+
expect(new TestConfirmsPasswords()->isPasswordConfirmed())->toBeTrue();
36+
});
37+
38+
test('it can require password to be confirmed', function () {
39+
$this->expectException(HttpException::class);
40+
41+
new TestConfirmsPasswords()->requireConfirmedPassword();
42+
});
43+
44+
test('timeout returns seconds until confirmation is required', function () {
45+
Date::setTestNow(now());
46+
$timeout = config('auth.password_timeout');
47+
48+
expect(new TestConfirmsPasswords()->confirmedPasswordTimeout())->toBe(0);
49+
50+
new TestConfirmsPasswords()->confirmPassword();
51+
52+
expect(new TestConfirmsPasswords()->confirmedPasswordTimeout())->toBe($timeout);
53+
54+
travel(5)->seconds();
55+
56+
expect(new TestConfirmsPasswords()->confirmedPasswordTimeout())->toBe($timeout - 5);
57+
});
58+
59+
test('password confirmation can be disabled', function () {
60+
expect(new TestConfirmsPasswords()->confirmedPasswordTimeout())->toBe(0);
61+
expect(new TestConfirmsPasswords()->isPasswordConfirmed())->toBeFalse();
62+
63+
config()->set('auth.password_timeout', -1);
64+
65+
expect(new TestConfirmsPasswords()->confirmedPasswordTimeout())->toBeFalse();
66+
expect(new TestConfirmsPasswords()->isPasswordConfirmed())->toBeTrue();
67+
});

0 commit comments

Comments
 (0)