Passed
Push — master ( 9ea72e...b2a914 )
by Simon
01:52
created

testStoredBreached()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 29
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 15
nc 1
nop 0
dl 0
loc 29
rs 9.7666
c 0
b 0
f 0
1
<?php
2
3
namespace Firesphere\HaveIBeenPwnd\Tests;
4
5
use Firesphere\HaveIBeenPwnd\Extensions\PasswordValidatorExtension;
6
use GuzzleHttp\Handler\MockHandler;
7
use GuzzleHttp\Psr7\Response;
8
use SilverStripe\Core\Config\Config;
9
use SilverStripe\Core\Injector\Injector;
10
use SilverStripe\Dev\Debug;
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(PasswordValidatorExtension::class, 'allow_pwnd', true);
20
        Config::modify()->set(PasswordValidatorExtension::class, 'pwn_treshold', 0);
21
        Config::modify()->set(PasswordValidatorExtension::class, 'save_pwnd', false);
22
23
        /** @var PasswordValidatorExtension $extension */
24
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
25
26
        /** @var Member $member */
27
        $member = Member::create();
28
        /** @var ValidationResult $valid */
29
        $valid = ValidationResult::create();
30
        $extension->updateValidatePassword('donotcare', $member, $valid);
31
32
        $this->assertTrue($valid->isValid());
33
        $this->assertEquals(0, $member->PasswordIsPwnd);
34
        $this->assertEquals('', $member->BreachedSites);
35
    }
36
37
    public function testUpdateValidatePasswordDeny()
38
    {
39
        Config::modify()->set(PasswordValidatorExtension::class, 'allow_pwnd', false);
40
        Config::modify()->set(PasswordValidatorExtension::class, 'pwn_treshold', 1);
41
        Config::modify()->set(PasswordValidatorExtension::class, 'save_pwnd', false);
42
        /** @var PasswordValidatorExtension $extension */
43
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
44
45
        /** @var Member $member */
46
        $member = Member::create();
47
        /** @var ValidationResult $valid */
48
        $valid = ValidationResult::create();
49
50
        $body = file_get_contents(__DIR__ . '/../fixtures/pwnd123.txt');
51
        // This sets up the mock client to respond to the request it gets
52
        // with an HTTP 200 containing your mock body.
53
        $mock = new MockHandler([
54
            new Response(123, [], $body),
55
        ]);
56
57
        $extension->updateValidatePassword('123', $member, $valid, ['handler' => $mock]);
58
59
        $this->assertFalse($valid->isValid());
60
    }
61
62
    public function testUpdateValidatePasswordDenyAtTen()
63
    {
64
        Config::modify()->set(PasswordValidatorExtension::class, 'allow_pwnd', true);
65
        Config::modify()->set(PasswordValidatorExtension::class, 'pwn_treshold', 10);
66
        Config::modify()->set(PasswordValidatorExtension::class, 'save_pwnd', false);
67
68
        /** @var PasswordValidatorExtension $extension */
69
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
70
71
        /** @var Member $member */
72
        $member = Member::create();
73
        /** @var ValidationResult $valid */
74
        $valid = ValidationResult::create();
75
76
        $body = file_get_contents(__DIR__ . '/../fixtures/pwnd1234.txt');
77
        // This sets up the mock client to respond to the request it gets
78
        // with an HTTP 200 containing your mock body.
79
        $mock = new MockHandler([
80
            new Response(123, [], $body),
81
            new Response(123, [], $body),
82
        ]);
83
84
        $extension->updateValidatePassword('1234', $member, $valid, ['handler' => $mock]);
85
86
        $this->assertTrue($valid->isValid());
87
        $this->assertEquals(3, $member->PasswordIsPwnd);
88
        $extension->updateValidatePassword('12345', $member, $valid, ['handler' => $mock]);
89
90
        $this->assertFalse($valid->isValid());
91
        $this->assertEquals(11, $member->PasswordIsPwnd);
92
    }
93
94
    public function testStoredBreached()
95
    {
96
        Config::modify()->set(PasswordValidatorExtension::class, 'allow_pwnd', false);
97
        Config::modify()->set(PasswordValidatorExtension::class, 'pwn_treshold', 1);
98
        Config::modify()->set(PasswordValidatorExtension::class, 'save_pwnd', true);
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->updateValidatePassword('1234', $member, $valid, ['handler' => $mock]);
119
120
        $messages = $valid->getMessages();
121
        $this->assertContains('2fast4u', $member->BreachedSites);
122
        $this->assertContains('2fast4u', $messages[1]['message']);
123
    }
124
}
125