Skip to content

Commit d0080a1

Browse files
committed
Update partial tests
1 parent 1a7c69b commit d0080a1

11 files changed

+233
-33
lines changed

client/dist/main.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/src/js/partialuserforms/partialsubmission.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const baseDomain = document.baseURI;
2-
const submitURL = 'partialuserform';
2+
const submitURL = 'partialuserform/save';
33
const buttons = () => Array.from(document.body.querySelectorAll('form.userform ul li.step-button-wrapper button'));
44
const formElements = () => Array.from(document.body.querySelectorAll('form.userform [name]:not([type=hidden]):not([type=submit])'));
55

phpunit.xml.dist

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<phpunit bootstrap="vendor/silverstripe/framework/tests/bootstrap.php"
22
colors="true">
33

4-
<testsuite name="Default">
4+
<testsuite name="Default">
55
<directory>tests</directory>
66
</testsuite>
77
<filter>
@@ -15,4 +15,10 @@
1515
<group>sanitychecks</group>
1616
</exclude>
1717
</groups>
18-
</phpunit>
18+
19+
<php>
20+
<get name="flush" value="1" />
21+
<ini name="memory_limit" value="512M" />
22+
<ini name="date.timezone" value="Pacific/Auckland" />
23+
</php>
24+
</phpunit>

src/controllers/PartialUserFormController.php

+15-10
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,15 @@
66
use Firesphere\PartialUserforms\Models\PartialFormSubmission;
77
use SilverStripe\CMS\Controllers\ContentController;
88
use SilverStripe\Control\HTTPRequest;
9-
use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
109
use SilverStripe\ORM\DataObject;
1110
use SilverStripe\ORM\ValidationException;
1211
use SilverStripe\UserForms\Control\UserDefinedFormController;
1312
use SilverStripe\UserForms\Model\EditableFormField;
1413
use SilverStripe\View\Requirements;
1514

1615
/**
17-
* Class \Firesphere\PartialUserforms\Controllers\PartialUserFormController
18-
*
16+
* Class PartialUserFormController
17+
* @package Firesphere\PartialUserforms\Controllers
1918
*/
2019
class PartialUserFormController extends ContentController
2120
{
@@ -28,7 +27,7 @@ class PartialUserFormController extends ContentController
2827
* @var array
2928
*/
3029
private static $url_handlers = [
31-
'' => 'savePartialSubmission',
30+
'save' => 'savePartialSubmission',
3231
'$Key/$Token' => 'partial',
3332
];
3433

@@ -42,11 +41,16 @@ class PartialUserFormController extends ContentController
4241

4342
/**
4443
* @param HTTPRequest $request
45-
* @return int
44+
* @return int|mixed|void
4645
* @throws ValidationException
46+
* @throws \SilverStripe\Control\HTTPResponse_Exception
4747
*/
4848
public function savePartialSubmission(HTTPRequest $request)
4949
{
50+
if (!$request->isPOST()) {
51+
return $this->httpError(404);
52+
}
53+
5054
$postVars = $request->postVars();
5155
$editableField = null;
5256

@@ -128,18 +132,19 @@ protected function createOrUpdateSubmission($formData)
128132
*/
129133
public function partial(HTTPRequest $request)
130134
{
131-
// Ensure this URL doesn't get picked up by HTTP caches
132-
HTTPCacheControlMiddleware::singleton()->disableCache();
133-
134135
$key = $request->param('Key');
135136
$token = $request->param('Token');
136137

137138
$partial = PartialFormSubmission::get()->find('Token', $token);
138-
if (!$partial || !$partial->UserDefinedFormID) {
139+
if (!$token || !$partial || !$partial->UserDefinedFormID) {
139140
return $this->httpError(404);
140141
}
141142

142143
if ($partial->generateKey($token) === $key) {
144+
// Set the session if the last session has expired
145+
if (!$request->getSession()->get(self::SESSION_KEY)) {
146+
$request->getSession()->set(self::SESSION_KEY, $partial->ID);
147+
}
143148

144149
// TODO: Recognize visitor with the password
145150
// TODO: Populate form values
@@ -156,7 +161,7 @@ public function partial(HTTPRequest $request)
156161
'Content' => $this->obj('Content'),
157162
'Form' => $controller->Form(),
158163
'Link' => $partial->getPartialLink()
159-
])->renderWith(['PartialUserform', 'Page']);
164+
])->renderWith(['PartialUserForm', 'Page']);
160165
} else {
161166
return $this->httpError(404);
162167
}

src/models/PartialFieldSubmission.php

+23-5
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
namespace Firesphere\PartialUserforms\Models;
44

5+
use SilverStripe\Security\Member;
56
use SilverStripe\UserForms\Model\Submission\SubmittedFormField;
67

78
/**
8-
* Class \Firesphere\PartialUserforms\Models\PartialFieldSubmission
9+
* Class PartialFieldSubmission
910
*
1011
* @property int $SubmittedFormID
1112
* @method PartialFormSubmission SubmittedForm()
13+
* @package Firesphere\PartialUserforms\Models
1214
*/
1315
class PartialFieldSubmission extends SubmittedFormField
1416
{
@@ -25,7 +27,11 @@ class PartialFieldSubmission extends SubmittedFormField
2527
*/
2628
public function canCreate($member = null, $context = [])
2729
{
28-
return $this->SubmittedForm()->canCreate();
30+
if ($this->SubmittedFormID) {
31+
return $this->SubmittedForm()->canCreate($member, $context);
32+
}
33+
34+
return parent::canCreate($member);
2935
}
3036

3137
/**
@@ -35,7 +41,11 @@ public function canCreate($member = null, $context = [])
3541
*/
3642
public function canView($member = null)
3743
{
38-
return $this->SubmittedForm()->canView();
44+
if ($this->SubmittedFormID) {
45+
return $this->SubmittedForm()->canView($member);
46+
}
47+
48+
return parent::canView($member);
3949
}
4050

4151
/**
@@ -45,7 +55,11 @@ public function canView($member = null)
4555
*/
4656
public function canEdit($member = null)
4757
{
48-
return $this->SubmittedForm()->canEdit();
58+
if ($this->SubmittedFormID) {
59+
return $this->SubmittedForm()->canEdit($member);
60+
}
61+
62+
return parent::canEdit($member);
4963
}
5064

5165
/**
@@ -55,6 +69,10 @@ public function canEdit($member = null)
5569
*/
5670
public function canDelete($member = null)
5771
{
58-
return $this->SubmittedForm()->canDelete();
72+
if ($this->SubmittedFormID) {
73+
return $this->SubmittedForm()->canDelete($member);
74+
}
75+
76+
return parent::canDelete($member);
5977
}
6078
}

src/models/PartialFormSubmission.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,6 @@ protected function generateToken()
214214
*/
215215
public function generateKey($token)
216216
{
217-
return hash_pbkdf2('sha256', $token, $this->PartialTokenSalt, 1000, 16);
217+
return hash_pbkdf2('sha256', $token, $this->TokenSalt, 1000, 16);
218218
}
219219
}

tests/fixtures/partialformtest.yml

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
SilverStripe\UserForms\Model\UserDefinedForm:
2+
form1:
3+
Title: Form 1
14
Firesphere\PartialUserForms\Models\PartialFieldSubmission:
25
field1:
36
Name: 'fullname'
@@ -13,11 +16,11 @@ Firesphere\PartialUserForms\Models\PartialFieldSubmission:
1316
Title: 'Question'
1417
Firesphere\PartialUserforms\Models\PartialFormSubmission:
1518
submission1:
16-
ParentID: 1
19+
UserDefinedForm: =>SilverStripe\UserForms\Model\UserDefinedForm.form1
20+
Parent: =>SilverStripe\UserForms\Model\UserDefinedForm.form1
1721
PartialFields: =>Firesphere\PartialUserForms\Models\PartialFieldSubmission.field1,=>Firesphere\PartialUserForms\Models\PartialFieldSubmission.field2,=>Firesphere\PartialUserForms\Models\PartialFieldSubmission.field3
18-
SilverStripe\UserForms\Model\UserDefinedForm:
19-
form1:
20-
Title: Form 1
22+
TokenSalt: aa11ss22dd33ff44
23+
Token: q1w2e3r4t5y6u7i8
2124
SilverStripe\UserForms\Model\EditableFormField\EditableTextField:
2225
textfield1:
2326
Name: 'Field1'
@@ -33,4 +36,4 @@ SilverStripe\UserForms\Model\EditableFormField\EditableTextField:
3336
Name: 'Field3'
3437
Title: 'Field 3'
3538
ParentClass: SilverStripe\UserForms\Model\UserDefinedForm
36-
Parent: =>SilverStripe\UserForms\Model\UserDefinedForm.form1
39+
Parent: =>SilverStripe\UserForms\Model\UserDefinedForm.form1

tests/helpers/TestHelper.php

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Firesphere\PartialUserforms\Tests;
4+
5+
/**
6+
* A simple helper class for tests
7+
* @package Firesphere\PartialUserforms\Tests
8+
*/
9+
class TestHelper
10+
{
11+
/**
12+
* Call protected/private method of a class
13+
*
14+
* @param Object $object
15+
* @param string $methodName
16+
* @param array $parameters
17+
* @return mixed
18+
* @throws \ReflectionException
19+
*
20+
* @link https://jtreminio.com/blog/unit-testing-tutorial-part-iii-testing-protected-private-methods-coverage-reports-and-crap/
21+
*/
22+
public static function invokeMethod(&$object, $methodName, array $parameters = array())
23+
{
24+
$reflection = new \ReflectionClass(get_class($object));
25+
$method = $reflection->getMethod($methodName);
26+
$method->setAccessible(true);
27+
28+
return $method->invokeArgs($object, $parameters);
29+
}
30+
}

tests/unit/PartialFieldSubmissionTest.php

+12-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Firesphere\PartialUserforms\Models\PartialFormSubmission;
77
use SilverStripe\Dev\SapphireTest;
88
use SilverStripe\Security\DefaultAdminService;
9-
use SilverStripe\Security\Security;
9+
use SilverStripe\Security\Member;
1010
use SilverStripe\UserForms\Model\UserDefinedForm;
1111

1212
class PartialFieldSubmissionTest extends SapphireTest
@@ -26,40 +26,40 @@ public function testCanView()
2626
$this->assertTrue($this->field->canView());
2727

2828
$member = DefaultAdminService::singleton()->findOrCreateAdmin('admin@example.com');
29-
Security::setCurrentUser($member);
29+
$this->logInAs($member);
3030

3131
$this->assertTrue($this->field->canView($member));
3232
}
3333

3434
public function testCanCreate()
3535
{
36-
Security::setCurrentUser(null);
36+
Member::currentUser()->logOut();
3737
$this->assertFalse($this->field->canCreate());
3838

3939
$member = DefaultAdminService::singleton()->findOrCreateAdmin('admin@example.com');
40-
Security::setCurrentUser($member);
40+
$this->logInAs($member);
4141

4242
$this->assertTrue($this->field->canCreate($member));
4343
}
4444

4545
public function testCanEdit()
4646
{
47-
Security::setCurrentUser(null);
47+
Member::currentUser()->logOut();
4848
$this->assertFalse($this->field->canEdit());
4949

5050
$member = DefaultAdminService::singleton()->findOrCreateAdmin('admin@example.com');
51-
Security::setCurrentUser($member);
51+
$this->logInAs($member);
5252

5353
$this->assertTrue($this->field->canEdit($member));
5454
}
5555

5656
public function testCanDelete()
5757
{
58-
Security::setCurrentUser(null);
58+
Member::currentUser()->logOut();
5959
$this->assertFalse($this->field->canDelete());
6060

6161
$member = DefaultAdminService::singleton()->findOrCreateAdmin('admin@example.com');
62-
Security::setCurrentUser($member);
62+
$this->logInAs($member);
6363

6464
$this->assertTrue($this->field->canDelete($member));
6565
}
@@ -70,8 +70,12 @@ protected function setUp()
7070
$partialForm = PartialFormSubmission::create();
7171
$udf = UserDefinedForm::create(['Title' => 'Test'])->write();
7272
$partialForm->UserDefinedFormID = $udf;
73+
$partialForm->UserDefinedFormClass = UserDefinedForm::class;
7374
$partialFormID = $partialForm->write();
7475
$this->field->SubmittedFormID = $partialFormID;
76+
// testCanCreate() will most likely be an error due to SubmittedForm returning a parent's permission
77+
// without checking if Parent exists, so have to set the SubmittedForm parent
78+
$this->field->SubmittedForm()->ParentID = $udf;
7579

7680
return parent::setUp();
7781
}

0 commit comments

Comments
 (0)