Completed
Push — master ( c22cf2...8f56fe )
by Robbie
23s
created

VerifyHandlerTest   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 4
eloc 28
dl 0
loc 64
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A getVerifyTests() 0 8 1
A testVerifyValidatesCodes() 0 7 1
A scaffoldVerifyParams() 0 17 1
A testVerifyInvalidatesCodesThatHaveBeenUsed() 0 17 1
1
<?php
2
3
namespace SilverStripe\MFA\Tests\BackupCode;
4
5
use PHPUnit_Framework_MockObject_MockObject;
6
use SilverStripe\Control\HTTPRequest;
7
use SilverStripe\Core\Injector\Injector;
8
use SilverStripe\Dev\SapphireTest;
9
use SilverStripe\MFA\BackupCode\VerifyHandler;
10
use SilverStripe\MFA\Extension\MemberExtension;
11
use SilverStripe\MFA\Model\RegisteredMethod;
12
use SilverStripe\MFA\Store\StoreInterface;
13
use SilverStripe\ORM\DataObject;
14
use SilverStripe\Security\Member;
15
16
class VerifyHandlerTest extends SapphireTest
17
{
18
    protected static $fixture_file = 'VerifyHandlerTest.yml';
19
20
    /**
21
     * @dataProvider getVerifyTests
22
     */
23
    public function testVerifyValidatesCodes($expectedResult, $input, $message)
24
    {
25
        $handler = new VerifyHandler();
26
27
        // Test a code with invalid characters
28
        list ($request, $store, $method) = $this->scaffoldVerifyParams($input);
29
        $this->assertSame($expectedResult, $handler->verify($request, $store, $method)->isSuccessful(), $message);
30
    }
31
32
    public function testVerifyInvalidatesCodesThatHaveBeenUsed()
33
    {
34
        $handler = new VerifyHandler();
35
36
        // Test a code with invalid characters
37
        list ($request, $store, $method) = $this->scaffoldVerifyParams('123456');
38
        $this->assertTrue($handler->verify($request, $store, $method)->isSuccessful());
39
40
        $method = DataObject::get_by_id(RegisteredMethod::class, $method->ID);
41
        $codes = json_decode($method->Data, true);
42
43
        $this->assertCount(3, $codes, 'Only 3 codes remain against the method');
44
45
        list ($request, $store, $method) = $this->scaffoldVerifyParams('123456');
46
        $this->assertFalse(
47
            $handler->verify($request, $store, $method)->isSuccessful(),
48
            'Attempting to validate the previously used code now returns false'
49
        );
50
    }
51
52
    public function getVerifyTests()
53
    {
54
        return [
55
            [false, 'asw123', 'Invalid characters are handled'],
56
            [false, '', 'Empty codes are handled'],
57
            [false, null, 'Null input is handled'],
58
            [false, str_pad('', 10000, 'code'), 'Long codes are handled'],
59
            [true, '123456', 'Valid codes are valid'],
60
        ];
61
    }
62
63
    protected function scaffoldVerifyParams($userInput)
64
    {
65
        /** @var Member|MemberExtension $member */
66
        $member = $this->objFromFixture(Member::class, 'guy');
67
68
        /** @var HTTPRequest|PHPUnit_Framework_MockObject_MockObject $request */
69
        $request = $this->createMock(HTTPRequest::class);
70
        $request->expects($this->once())->method('getBody')->willReturn("{\"code\":\"{$userInput}\"}");
71
72
        /** @var StoreInterface|PHPUnit_Framework_MockObject_MockObject $store */
73
        $store = $this->createMock(StoreInterface::class);
74
        $store->expects($this->any())->method('getMember')->willReturn($member);
75
76
        /** @var RegisteredMethod $registeredMethod */
77
        $registeredMethod = $member->RegisteredMFAMethods()->first();
78
79
        return [$request, $store, $registeredMethod];
80
    }
81
}
82