Passed
Branch master (acb862)
by Simon
03:16
created

testUpdateValidatePasswordDeny()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 10
nc 1
nop 0
dl 0
loc 22
rs 9.9332
c 0
b 0
f 0
1
<?php
2
3
namespace Firesphere\HaveIBeenPwned\Tests;
4
5
use Firesphere\HaveIBeenPwned\Extensions\PasswordValidatorExtension;
6
use Firesphere\HaveIBeenPwned\Services\HaveIBeenPwnedService;
7
use GuzzleHttp\Handler\MockHandler;
8
use GuzzleHttp\Psr7\Response;
9
use SilverStripe\Core\Config\Config;
10
use SilverStripe\Core\Injector\Injector;
11
use SilverStripe\Dev\SapphireTest;
12
use SilverStripe\ORM\ValidationResult;
13
use SilverStripe\Security\Member;
14
15
class PasswordValidatorExtensionTest extends SapphireTest
16
{
17
    public function testUpdateValidatePasswordAllowAll()
18
    {
19
        Config::modify()->set(HaveIBeenPwnedService::class, 'allow_pwnd', true);
20
        Config::modify()->set(HaveIBeenPwnedService::class, 'save_pwnd', false);
21
        $body = file_get_contents(__DIR__ . '/../fixtures/pwnd1234.txt');
22
        $body2 = file_get_contents(__DIR__ . '/../fixtures/breachmails.json');
23
        // This sets up the mock client to respond to the request it gets
24
        // with an HTTP 200 containing your mock body.
25
        $mock = new MockHandler([
26
            new Response(123, [], $body),
27
            new Response(123, [], $body2),
28
        ]);
29
30
        /** @var PasswordValidatorExtension $extension */
31
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
32
33
        /** @var Member $member */
34
        $member = Member::create();
35
        /** @var ValidationResult $valid */
36
        $valid = ValidationResult::create();
37
        $extension->updateValidatePassword('123', $member, $valid, null, ['handler' => $mock]);
38
39
        $this->assertTrue($valid->isValid());
40
        $this->assertEquals(1014565, $member->PasswordIsPwnd);
41
        $this->assertEquals('', $member->BreachedSites);
42
    }
43
44
    public function testUpdatePasswordValidateTemporarily()
45
    {
46
        /** @var PasswordValidatorExtension $extension */
47
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
48
        /** @var Member $member */
49
        $member = Member::create(['PwndDisabled' => 'true']);
50
        /** @var ValidationResult $valid */
51
        $valid = ValidationResult::create();
52
        $extension->updateValidatePassword('password', $member, $valid, null);
53
54
        $this->assertTrue($valid->isValid());
55
        $this->assertEquals(0, $member->PasswordIsPwnd);
56
        $this->assertEquals('', $member->BreachedSites);
57
    }
58
59
    public function testUpdateValidatePasswordDeny()
60
    {
61
        Config::modify()->set(HaveIBeenPwnedService::class, 'allow_pwnd', false);
62
        Config::modify()->set(HaveIBeenPwnedService::class, 'save_pwnd', false);
63
        /** @var PasswordValidatorExtension $extension */
64
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
65
66
        /** @var Member $member */
67
        $member = Member::create();
68
        /** @var ValidationResult $valid */
69
        $valid = ValidationResult::create();
70
71
        $body = file_get_contents(__DIR__ . '/../fixtures/pwnd123.txt');
72
        // This sets up the mock client to respond to the request it gets
73
        // with an HTTP 200 containing your mock body.
74
        $mock = new MockHandler([
75
            new Response(123, [], $body),
76
        ]);
77
78
        $extension->updateValidatePassword('123', $member, $valid, null, ['handler' => $mock]);
79
80
        $this->assertFalse($valid->isValid());
81
    }
82
83
    public function testStoredBreached()
84
    {
85
        Config::modify()->set(HaveIBeenPwnedService::class, 'allow_pwnd', false);
86
        Config::modify()->set(HaveIBeenPwnedService::class, 'save_pwnd', false);
87
88
89
        /** @var PasswordValidatorExtension $extension */
90
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
91
92
        /** @var Member $member */
93
        $member = Member::create(['Email' => '[email protected]']);
94
        /** @var ValidationResult $valid */
95
        $valid = ValidationResult::create();
96
97
        $body = file_get_contents(__DIR__ . '/../fixtures/pwnd1234.txt');
98
        $body2 = file_get_contents(__DIR__ . '/../fixtures/breachmails.json');
99
        // This sets up the mock client to respond to the request it gets
100
        // with an HTTP 200 containing your mock body.
101
        $mock = new MockHandler([
102
            new Response(123, [], $body),
103
            new Response(123, [], $body2),
104
        ]);
105
106
        $extension->updateValidatePassword('1234', $member, $valid, null, ['handler' => $mock]);
107
108
        $messages = $valid->getMessages();
109
110
        $this->assertCount(1, $messages);
111
        $this->assertEmpty($member->BreachedSites);
112
113
        Config::modify()->set(HaveIBeenPwnedService::class, 'save_pwnd', true);
114
115
        /** @var ValidationResult $valid */
116
        $valid = ValidationResult::create();
117
118
        $mock = new MockHandler([
119
            new Response(123, [], $body),
120
            new Response(123, [], $body2),
121
        ]);
122
123
        $extension->updateValidatePassword('1234', $member, $valid, null, ['handler' => $mock]);
124
125
        $this->assertContains('2fast4u', $member->BreachedSites);
126
    }
127
128
    protected function setUp()
129
    {
130
        return parent::setUp(); // TODO: Change the autogenerated stub
131
    }
132
133
    protected function tearDown()
134
    {
135
        /** @var Member|null $member */
136
        $member = Member::get()->filter(['Email' => '[email protected]'])->first();
137
        if ($member) {
0 ignored issues
show
introduced by
$member is of type SilverStripe\Security\Member, thus it always evaluated to true.
Loading history...
138
            $member->delete();
139
        }
140
        parent::tearDown(); // TODO: Change the autogenerated stub
141
    }
142
}
143