Passed
Pull Request — master (#156)
by Robbie
02:00
created

testFinishRegistrationAssertsValidMethod()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 23
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 15
dl 0
loc 23
rs 9.7666
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace SilverStripe\MFA\Tests\Controller;
4
5
use PHPUnit_Framework_MockObject_MockObject;
6
use SilverStripe\Admin\AdminRootController;
7
use SilverStripe\Control\Controller;
8
use SilverStripe\Core\Injector\Injector;
9
use SilverStripe\Dev\FunctionalTest;
10
use SilverStripe\MFA\Service\MethodRegistry;
11
use SilverStripe\MFA\Store\SessionStore;
12
use SilverStripe\MFA\Tests\Stub\BasicMath\Method as BasicMathMethod;
13
use SilverStripe\Security\Member;
14
use SilverStripe\SecurityExtensions\Service\SudoModeServiceInterface;
0 ignored issues
show
Bug introduced by
The type SilverStripe\SecurityExt...udoModeServiceInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
15
16
class AdminRegistrationControllerTest extends FunctionalTest
17
{
18
    protected static $fixture_file = 'AdminRegistrationControllerTest.yml';
19
20
    protected function setUp()
21
    {
22
        parent::setUp();
23
24
        MethodRegistry::config()->set('methods', [
25
            BasicMathMethod::class,
26
        ]);
27
28
        /** @var SudoModeServiceInterface&PHPUnit_Framework_MockObject_MockObject $sudoModeService */
29
        $sudoModeService = $this->createMock(SudoModeServiceInterface::class);
30
        $sudoModeService->expects($this->any())->method('check')->willReturn(true);
31
        Injector::inst()->registerService($sudoModeService, SudoModeServiceInterface::class);
32
    }
33
34
    public function testStartRegistrationAssertsValidMethod()
35
    {
36
        $this->logInAs($this->objFromFixture(Member::class, 'sally_smith'));
37
38
        $result = $this->get(Controller::join_links(AdminRootController::admin_url(), 'mfa', 'register/foo'));
39
40
        $this->assertSame(400, $result->getStatusCode());
41
        $this->assertContains('No such method is available', $result->getBody());
42
    }
43
44
    public function testStartRegistrationReturns200Response()
45
    {
46
        $this->logInAs($this->objFromFixture(Member::class, 'sally_smith'));
47
        $method = new BasicMathMethod();
48
49
        $result = $this->get(
50
            Controller::join_links(
51
                AdminRootController::admin_url(),
52
                'mfa',
53
                'register',
54
                $method->getURLSegment()
55
            )
56
        );
57
58
        $this->assertSame(200, $result->getStatusCode());
59
    }
60
61
    public function testFinishRegistrationGracefullyHandlesInvalidSessions()
62
    {
63
        $this->logInAs($this->objFromFixture(Member::class, 'sally_smith'));
64
        $method = new BasicMathMethod();
65
66
        $result = $this->post(
67
            Controller::join_links(
68
                AdminRootController::admin_url(),
69
                'mfa',
70
                'register',
71
                $method->getURLSegment()
72
            ),
73
            ['dummy' => 'data']
74
        );
75
76
        $this->assertSame(400, $result->getStatusCode());
77
        $this->assertContains('Invalid session', $result->getBody());
78
    }
79
80
    public function testFinishRegistrationAssertsValidMethod()
81
    {
82
        /** @var Member $member */
83
        $member = $this->objFromFixture(Member::class, 'sally_smith');
84
        $this->logInAs($member);
85
        $method = new BasicMathMethod();
86
87
        $store = new SessionStore($member);
88
        $store->setMethod($method->getURLSegment());
89
        $this->session()->set(SessionStore::SESSION_KEY, $store);
90
91
        $result = $this->post(
92
            Controller::join_links(
93
                AdminRootController::admin_url(),
94
                'mfa',
95
                'register',
96
                'foo'
97
            ),
98
            ['dummy' => 'data']
99
        );
100
101
        $this->assertSame(400, $result->getStatusCode());
102
        $this->assertContains('No such method is available', $result->getBody());
103
    }
104
105
    public function testFinishRegistrationCompletesWhenValid()
106
    {
107
        /** @var Member $member */
108
        $member = $this->objFromFixture(Member::class, 'sally_smith');
109
        $this->logInAs($member);
110
        $method = new BasicMathMethod();
111
112
        $store = new SessionStore($member);
113
        $store->setMethod($method->getURLSegment());
114
        $this->session()->set(SessionStore::SESSION_KEY, $store);
115
116
        $result = $this->post(
117
            Controller::join_links(
118
                AdminRootController::admin_url(),
119
                'mfa',
120
                'register',
121
                $method->getURLSegment()
122
            ),
123
            ['dummy' => 'data'],
124
            null,
125
            $this->session(),
126
            json_encode(['number' => 7])
127
        );
128
129
        $this->assertSame(201, $result->getStatusCode());
130
    }
131
132
    public function testEnforcesSudoMode()
133
    {
134
        $sudoModeService = $this->createMock(SudoModeServiceInterface::class);
135
        $sudoModeService->expects($this->any())->method('check')->willReturn(false);
136
        Injector::inst()->registerService($sudoModeService, SudoModeServiceInterface::class);
137
138
        /** @var Member $member */
139
        $member = $this->objFromFixture(Member::class, 'sally_smith');
140
        $this->logInAs($member);
141
        $method = new BasicMathMethod();
142
143
        $store = new SessionStore($member);
144
        $store->setMethod($method->getURLSegment());
145
        $this->session()->set(SessionStore::SESSION_KEY, $store);
146
147
        $result = $this->post(
148
            Controller::join_links(
149
                AdminRootController::admin_url(),
150
                'mfa',
151
                'register',
152
                $method->getURLSegment()
153
            ),
154
            ['dummy' => 'data'],
155
            null,
156
            $this->session(),
157
            json_encode(['number' => 7])
158
        );
159
160
        $this->assertSame(400, $result->getStatusCode());
161
        $this->assertContains('Invalid session', $result->getBody());
162
    }
163
}
164