PasswordValidatorExtensionTest::testGetSetParams()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
c 2
b 0
f 0
nc 1
nop 0
dl 0
loc 9
rs 10
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 testGetSetParams()
18
    {
19
        $mock = ['handler' => []];
20
21
        /** @var PasswordValidatorExtension $extension */
22
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
23
        $extension->setParams($mock);
24
25
        $this->assertEquals($mock, $extension->getParams());
26
    }
27
28
    public function testUpdateValidatePasswordAllowAll()
29
    {
30
        Config::modify()->set(HaveIBeenPwnedService::class, 'allow_pwnd', true);
31
        Config::modify()->set(HaveIBeenPwnedService::class, 'save_pwnd', false);
32
        $body = file_get_contents(__DIR__ . '/../fixtures/pwnd1234.txt');
33
        $body2 = file_get_contents(__DIR__ . '/../fixtures/breachmails.json');
34
        // This sets up the mock client to respond to the request it gets
35
        // with an HTTP 200 containing your mock body.
36
        $mock = new MockHandler([
37
            new Response(123, [], $body),
38
            new Response(123, [], $body2),
39
        ]);
40
41
        /** @var PasswordValidatorExtension $extension */
42
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
43
        $extension->setParams(['handler' => $mock]);
44
        /** @var Member $member */
45
        $member = Member::create();
46
        /** @var ValidationResult $valid */
47
        $valid = ValidationResult::create();
48
        $extension->updateValidatePassword('123', $member, $valid);
49
50
        $this->assertTrue($valid->isValid());
51
        $this->assertEquals(1014565, $member->PasswordIsPwnd);
52
        $this->assertEquals('', $member->BreachedSites);
53
    }
54
55
    public function testUpdatePasswordValidateTemporarily()
56
    {
57
        /** @var PasswordValidatorExtension $extension */
58
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
59
        /** @var Member $member */
60
        $member = Member::create(['PwndDisabled' => 'true']);
61
        /** @var ValidationResult $valid */
62
        $valid = ValidationResult::create();
63
        $extension->updateValidatePassword('password', $member, $valid);
64
65
        $this->assertTrue($valid->isValid());
66
        $this->assertEquals(0, $member->PasswordIsPwnd);
67
        $this->assertEquals('', $member->BreachedSites);
68
    }
69
70
    public function testUpdateValidatePasswordDeny()
71
    {
72
        Config::modify()->set(HaveIBeenPwnedService::class, 'allow_pwnd', false);
73
        Config::modify()->set(HaveIBeenPwnedService::class, 'save_pwnd', false);
74
        /** @var PasswordValidatorExtension $extension */
75
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
76
77
        /** @var Member $member */
78
        $member = Member::create();
79
        /** @var ValidationResult $valid */
80
        $valid = ValidationResult::create();
81
82
        $body = file_get_contents(__DIR__ . '/../fixtures/pwnd123.txt');
83
        // This sets up the mock client to respond to the request it gets
84
        // with an HTTP 200 containing your mock body.
85
        $mock = new MockHandler([
86
            new Response(123, [], $body),
87
        ]);
88
89
        $extension->setParams(['handler' => $mock]);
90
        $extension->updateValidatePassword('123', $member, $valid);
91
92
        $this->assertFalse($valid->isValid());
93
    }
94
95
    public function testStoredBreached()
96
    {
97
        Config::modify()->set(HaveIBeenPwnedService::class, 'allow_pwnd', false);
98
        Config::modify()->set(HaveIBeenPwnedService::class, 'save_pwnd', false);
99
100
101
        /** @var PasswordValidatorExtension $extension */
102
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
103
104
        /** @var Member $member */
105
        $member = Member::create(['Email' => '[email protected]']);
106
        /** @var ValidationResult $valid */
107
        $valid = ValidationResult::create();
108
109
        $body = file_get_contents(__DIR__ . '/../fixtures/pwnd1234.txt');
110
        $body2 = file_get_contents(__DIR__ . '/../fixtures/breachmails.json');
111
        // This sets up the mock client to respond to the request it gets
112
        // with an HTTP 200 containing your mock body.
113
        $mock = new MockHandler([
114
            new Response(123, [], $body),
115
            new Response(123, [], $body2),
116
        ]);
117
118
        $extension->setParams(['handler' => $mock]);
119
        $extension->updateValidatePassword('1234', $member, $valid);
120
121
        $messages = $valid->getMessages();
122
123
        $this->assertCount(1, $messages);
124
        $this->assertEmpty($member->BreachedSites);
125
126
        Config::modify()->set(HaveIBeenPwnedService::class, 'save_pwnd', true);
127
128
        /** @var ValidationResult $valid */
129
        $valid = ValidationResult::create();
130
131
        $mock = new MockHandler([
132
            new Response(123, [], $body),
133
            new Response(123, [], $body2),
134
        ]);
135
136
        $extension->setParams(['handler' => $mock]);
137
        $extension->updateValidatePassword('1234', $member, $valid);
138
139
        $this->assertContains('2fast4u', $member->BreachedSites);
140
    }
141
142
    protected function setUp()
143
    {
144
        return parent::setUp(); // TODO: Change the autogenerated stub
145
    }
146
147
    protected function tearDown()
148
    {
149
        /** @var Member|null $member */
150
        $member = Member::get()->filter(['Email' => '[email protected]'])->first();
151
        if ($member !== null) {
152
            $member->delete();
153
        }
154
        parent::tearDown(); // TODO: Change the autogenerated stub
155
    }
156
}
157