Passed
Push — master ( 05b9f0...2260f3 )
by Simon
01:51
created

sswordDenyAtTen()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 30
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 16
nc 1
nop 0
dl 0
loc 30
rs 9.7333
c 0
b 0
f 0
1
<?php
2
3
namespace Firesphere\HaveIBeenPwnd\Tests;
4
5
use Firesphere\HaveIBeenPwnd\Extensions\PasswordValidatorExtension;
6
use Firesphere\HaveIBeenPwnd\Services\HaveIBeenPwndService;
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\Debug;
12
use SilverStripe\Dev\SapphireTest;
13
use SilverStripe\ORM\ValidationResult;
14
use SilverStripe\Security\Member;
15
16
class PasswordValidatorExtensionTest extends SapphireTest
17
{
18
    public function testUpdateValidatePasswordAllowAll()
19
    {
20
        Config::modify()->set(HaveIBeenPwndService::class, 'allow_pwnd', true);
21
        Config::modify()->set(HaveIBeenPwndService::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(HaveIBeenPwndService::class, 'allow_pwnd', false);
40
        Config::modify()->set(HaveIBeenPwndService::class, 'save_pwnd', false);
41
        /** @var PasswordValidatorExtension $extension */
42
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
43
44
        /** @var Member $member */
45
        $member = Member::create();
46
        /** @var ValidationResult $valid */
47
        $valid = ValidationResult::create();
48
49
        $body = file_get_contents(__DIR__ . '/../fixtures/pwnd123.txt');
50
        // This sets up the mock client to respond to the request it gets
51
        // with an HTTP 200 containing your mock body.
52
        $mock = new MockHandler([
53
            new Response(123, [], $body),
54
        ]);
55
56
        $extension->updateValidatePassword('123', $member, $valid, ['handler' => $mock]);
57
58
        $this->assertFalse($valid->isValid());
59
    }
60
61
    public function testStoredBreached()
62
    {
63
        Config::modify()->set(HaveIBeenPwndService::class, 'allow_pwnd', false);
64
        Config::modify()->set(HaveIBeenPwndService::class, 'save_pwnd', false);
65
66
67
        /** @var PasswordValidatorExtension $extension */
68
        $extension = Injector::inst()->get(PasswordValidatorExtension::class);
69
70
        /** @var Member $member */
71
        $member = Member::create(['Email' => '[email protected]']);
72
        /** @var ValidationResult $valid */
73
        $valid = ValidationResult::create();
74
75
        $body = file_get_contents(__DIR__ . '/../fixtures/pwnd1234.txt');
76
        $body2 = file_get_contents(__DIR__ . '/../fixtures/breachmails.json');
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, [], $body2),
82
        ]);
83
84
        $extension->updateValidatePassword('1234', $member, $valid, ['handler' => $mock]);
85
86
        $messages = $valid->getMessages();
87
88
        $this->assertEquals(1, count($messages));
89
        $this->assertEmpty($member->BreachedSites);
90
91
        Config::modify()->set(HaveIBeenPwndService::class, 'save_pwnd', true);
92
93
        /** @var ValidationResult $valid */
94
        $valid = ValidationResult::create();
95
96
        $mock = new MockHandler([
97
            new Response(123, [], $body),
98
            new Response(123, [], $body2),
99
        ]);
100
101
        $extension->updateValidatePassword('1234', $member, $valid, ['handler' => $mock]);
102
103
        $messages = $valid->getMessages();
104
105
        $this->assertContains('2fast4u', $member->BreachedSites);
106
        $this->assertContains('2fast4u', $messages[1]['message']);
107
    }
108
}
109