diff --git a/.travis.yml b/.travis.yml
index 3558479f8..82e46b706 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -8,39 +8,29 @@ import:
jobs:
include:
- - php: 7.4
+ - php: 7.3
env:
- DB=MYSQL
- - REQUIRE_INSTALLER="4.6.x-dev"
+ - REQUIRE_INSTALLER="4.x-dev"
- NPM_TEST=1
- - php: 7.1
- env:
- - DB=MYSQL
- - REQUIRE_INSTALLER="4.6.x-dev"
- - PHPUNIT_TEST=1
- - php: 7.2
- env:
- - DB=PGSQL
- - REQUIRE_INSTALLER="4.6.x-dev"
- - PHPUNIT_TEST=1
- php: 7.3
env:
- - DB=MYSQL
- - REQUIRE_INSTALLER="4.7.x-dev"
+ - DB=PGSQL
+ - REQUIRE_INSTALLER="4.x-dev"
- PHPUNIT_TEST=1
- PHPCS_TEST=1
- - php: 7.3
+ - php: 7.4
env:
- DB=MYSQL
- - REQUIRE_INSTALLER="4.7.x-dev"
- - BEHAT_TEST=1
- - BEHAT_SUITE="userforms"
+ - REQUIRE_INSTALLER="4.x-dev"
+ - PHPUNIT_COVERAGE_TEST=1
- php: 7.4
env:
- DB=MYSQL
- REQUIRE_INSTALLER="4.x-dev"
- - PHPUNIT_COVERAGE_TEST=1
- - php: nightly
+ - BEHAT_TEST=1
+ - BEHAT_SUITE="userforms"
+ - php: 8.0
env:
- DB=MYSQL
- REQUIRE_INSTALLER="4.x-dev"
diff --git a/composer.json b/composer.json
index 346e9b234..d5afa1971 100644
--- a/composer.json
+++ b/composer.json
@@ -30,7 +30,8 @@
}
],
"require": {
- "php": ">=7.1",
+ "php": "^7.3 || ^8.0",
+ "silverstripe/framework": "^4.10",
"silverstripe/cms": "^4.6",
"symbiote/silverstripe-gridfieldextensions": "^3.1",
"silverstripe/segment-field": "^2.0",
@@ -38,7 +39,7 @@
"silverstripe/mimevalidator": "^2.0"
},
"require-dev": {
- "sminnee/phpunit": "^5.7",
+ "phpunit/phpunit": "^9.5",
"squizlabs/php_codesniffer": "^3.0"
},
"autoload": {
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 50a2f923e..777d77277 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -1,7 +1,9 @@
-
- tests/
-
+
+
+ tests/
+
+
code/
diff --git a/tests/Extension/UserFormFieldEditorExtensionTest.php b/tests/Extension/UserFormFieldEditorExtensionTest.php
index 18e29a3b0..067d6e4b6 100644
--- a/tests/Extension/UserFormFieldEditorExtensionTest.php
+++ b/tests/Extension/UserFormFieldEditorExtensionTest.php
@@ -15,7 +15,7 @@ class UserFormFieldEditorExtensionTest extends SapphireTest
UserFormBlockStub::class,
];
- protected function setUp()
+ protected function setUp(): void
{
parent::setUp();
$page = $this->objFromFixture(UserDefinedForm::class, 'page');
diff --git a/tests/Model/Recipient/UserFormRecipientItemRequestTest.php b/tests/Model/Recipient/UserFormRecipientItemRequestTest.php
index 65b20b314..ef8e17382 100644
--- a/tests/Model/Recipient/UserFormRecipientItemRequestTest.php
+++ b/tests/Model/Recipient/UserFormRecipientItemRequestTest.php
@@ -38,10 +38,10 @@ public function testShowInReportsAffectsPreview()
$request = new UserFormRecipientItemRequest(null, null, $recipient, null, '');
$html = $request->preview()->getValue();
foreach ($falseClasses as $class) {
- $this->assertNotContains('My' . $class, $html);
+ $this->assertStringNotContainsString('My' . $class, $html);
}
foreach ($trueClasses as $class) {
- $this->assertContains('My' . $class, $html);
+ $this->assertStringContainsString('My' . $class, $html);
}
}
}
diff --git a/tests/php/Control/UserDefinedFormAdminTest.php b/tests/php/Control/UserDefinedFormAdminTest.php
index 0f054ea6a..1effe7520 100644
--- a/tests/php/Control/UserDefinedFormAdminTest.php
+++ b/tests/php/Control/UserDefinedFormAdminTest.php
@@ -38,7 +38,7 @@ class UserDefinedFormAdminTest extends FunctionalTest
{
protected static $fixture_file = '../UserFormsTest.yml';
- protected function setUp()
+ protected function setUp(): void
{
parent::setUp();
@@ -401,7 +401,7 @@ public function testGetFolderPermissionValidRequest()
$response->getStatusCode(),
'Valid request is successfull'
);
- $this->assertContains('Unrestricted access, uploads will be visible to anyone', $response->getBody());
+ $this->assertStringContainsString('Unrestricted access, uploads will be visible to anyone', $response->getBody());
$folder = Folder::find('restricted-folder');
$response = $this->get($url . http_build_query(['FolderID' => 0]));
@@ -410,7 +410,7 @@ public function testGetFolderPermissionValidRequest()
$response->getStatusCode(),
'Valid request for root folder is successful'
);
- $this->assertContains('Unrestricted access, uploads will be visible to anyone', $response->getBody());
+ $this->assertStringContainsString('Unrestricted access, uploads will be visible to anyone', $response->getBody());
$folder = Folder::find('restricted-folder');
$response = $this->get($url . http_build_query(['FolderID' => $folder->ID]));
@@ -419,7 +419,7 @@ public function testGetFolderPermissionValidRequest()
$response->getStatusCode(),
'Valid request for root folder is successful'
);
- $this->assertContains('Restricted access, uploads will be visible to logged-in users ', $response->getBody());
+ $this->assertStringContainsString('Restricted access, uploads will be visible to logged-in users ', $response->getBody());
$this->logInWithPermission('ADMIN');
$adminOnlyFolder = Folder::find('admin-only');
@@ -429,7 +429,7 @@ public function testGetFolderPermissionValidRequest()
$response->getStatusCode(),
'Valid request for folder restricted to group is successful'
);
- $this->assertContains('Restricted access, uploads will be visible to the following groups: Administrators', $response->getBody());
+ $this->assertStringContainsString('Restricted access, uploads will be visible to the following groups: Administrators', $response->getBody());
}
public function testGetFormSubmissionFolder()
diff --git a/tests/php/Control/UserDefinedFormControllerTest.php b/tests/php/Control/UserDefinedFormControllerTest.php
index b907027f9..a198f4134 100644
--- a/tests/php/Control/UserDefinedFormControllerTest.php
+++ b/tests/php/Control/UserDefinedFormControllerTest.php
@@ -39,7 +39,7 @@ class UserDefinedFormControllerTest extends FunctionalTest
protected static $disable_themes = true;
- protected function setUp()
+ protected function setUp(): void
{
parent::setUp();
@@ -49,7 +49,7 @@ protected function setUp()
Config::modify()->merge(SSViewer::class, 'themes', ['simple', '$default']);
}
- public function tearDown()
+ protected function tearDown(): void
{
TestAssetStore::reset();
parent::tearDown();
@@ -105,11 +105,11 @@ public function testProcess()
$this->assertEmailSent('nohtml@example.com', 'no-reply@example.com', 'Email Subject');
$nohtml = $this->findEmail('nohtml@example.com', 'no-reply@example.com', 'Email Subject');
- $this->assertContains('Basic Text Field: Basic Value', $nohtml['Content'], 'Email contains no html');
+ $this->assertStringContainsString('Basic Text Field: Basic Value', $nohtml['Content'], 'Email contains no html');
// submitted html tags are not escaped because the email is being sent as text/plain
$value = 'My body text Basic Value HTML';
- $this->assertContains($value, $nohtml['Content'], 'Email contains the merge field value');
+ $this->assertStringContainsString($value, $nohtml['Content'], 'Email contains the merge field value');
// no data
$this->assertEmailSent('nodata@example.com', 'no-reply@example.com', 'Email Subject');
@@ -123,7 +123,7 @@ public function testProcess()
// check to see if the user was redirected (301)
$this->assertEquals($response->getStatusCode(), 302);
$location = $response->getHeader('Location');
- $this->assertContains('finished', $location);
+ $this->assertStringContainsString('finished', $location);
$this->assertStringEndsWith('#uff', $location);
// check that multiple email addresses are supported in to and from
@@ -142,7 +142,7 @@ public function testValidation()
$this->get($form->URLSegment);
/** @var HTTPResponse $response */
$response = $this->submitForm('UserForm_Form_' . $form->ID, null, []);
- $this->assertContains('This field is required', $response->getBody());
+ $this->assertStringContainsString('This field is required', $response->getBody());
// Post with all fields, but invalid email
$this->get($form->URLSegment);
@@ -151,7 +151,7 @@ public function testValidation()
'required-email' => 'invalid',
'required-text' => 'bob'
]);
- $this->assertContains('Please enter an email address', $response->getBody());
+ $this->assertStringContainsString('Please enter an email address', $response->getBody());
// Post with only required
$this->get($form->URLSegment);
@@ -159,7 +159,7 @@ public function testValidation()
$response = $this->submitForm('UserForm_Form_' . $form->ID, null, [
'required-text' => 'bob'
]);
- $this->assertContains("Thanks, we've received your submission.", $response->getBody());
+ $this->assertStringContainsString("Thanks, we've received your submission.", $response->getBody());
}
public function testFinished()
@@ -172,7 +172,7 @@ public function testFinished()
$response = $this->get($form->URLSegment.'/finished');
- $this->assertContains($form->OnCompleteMessage, $response->getBody());
+ $this->assertStringContainsString($form->OnCompleteMessage, $response->getBody());
}
public function testAppendingFinished()
@@ -185,7 +185,7 @@ public function testAppendingFinished()
$response = $this->get($form->URLSegment.'/finished');
- $this->assertNotContains($form->OnCompleteMessage, $response->getBody());
+ $this->assertStringNotContainsString($form->OnCompleteMessage, $response->getBody());
}
public function testForm()
@@ -320,7 +320,7 @@ public function testRenderingIntoTemplateWithDisabledInterpolation()
$parser = new CSSContentParser($html);
// Assert Content has been rendered with the shortcode in place
- $this->assertContains('Here is my form
$UserDefinedForm
Thank you for filling it out
', $html);
+ $this->assertStringContainsString('Here is my form
$UserDefinedForm
Thank you for filling it out
', $html);
// And the form in the $From area
$this->assertArrayHasKey(0, $parser->getBySelector('form#UserForm_Form_' . $form->ID));
// check for the input
diff --git a/tests/php/Model/EditableCustomRuleTest.php b/tests/php/Model/EditableCustomRuleTest.php
index c87b9490c..e717cd39e 100644
--- a/tests/php/Model/EditableCustomRuleTest.php
+++ b/tests/php/Model/EditableCustomRuleTest.php
@@ -23,7 +23,7 @@ public function testBuildExpression()
$this->assertNotEmpty($result1['operation']);
//Check for equals sign
- $this->assertContains('==', $result1['operation']);
+ $this->assertStringContainsString('==', $result1['operation']);
/** @var EditableCustomRule $rule2 */
$rule2 = $this->objFromFixture(EditableCustomRule::class, 'rule2');
@@ -34,7 +34,7 @@ public function testBuildExpression()
$this->assertNotEmpty($result2['operation']);
//Check for greater than sign
- $this->assertContains('>', $result2['operation']);
+ $this->assertStringContainsString('>', $result2['operation']);
}
/**
@@ -133,11 +133,9 @@ public function testValidateAgainstFormData($condition, $targetValue, $value, $e
);
}
- /**
- * @expectedException LogicException
- */
public function testValidateAgainstFormDataWithNonSenseRule()
{
+ $this->expectException(\LogicException::class);
$rule1 = $this->objFromFixture(EditableCustomRule::class, 'rule1');
$rule1->ConditionOption = 'NonSenseRule';
$rule1->validateAgainstFormData(['CountrySelection' => 'booya']);
diff --git a/tests/php/Model/EditableFormField/EditableCountryDropdownFieldTest.php b/tests/php/Model/EditableFormField/EditableCountryDropdownFieldTest.php
index 4bbd0196e..4426ead80 100644
--- a/tests/php/Model/EditableFormField/EditableCountryDropdownFieldTest.php
+++ b/tests/php/Model/EditableFormField/EditableCountryDropdownFieldTest.php
@@ -12,7 +12,7 @@ public function testGetIcon()
{
$field = new EditableCountryDropdownField;
- $this->assertContains('/images/editabledropdown.png', $field->getIcon());
+ $this->assertStringContainsString('/images/editabledropdown.png', $field->getIcon());
}
public function testAllowEmptyTitle()
diff --git a/tests/php/Model/EditableFormField/EditableFileFieldTest.php b/tests/php/Model/EditableFormField/EditableFileFieldTest.php
index 72b21b0eb..1b659ac0e 100644
--- a/tests/php/Model/EditableFormField/EditableFileFieldTest.php
+++ b/tests/php/Model/EditableFormField/EditableFileFieldTest.php
@@ -22,7 +22,7 @@ class EditableFileFieldTest extends SapphireTest
/**
* Hold the server default max file size upload limit for later
*/
- protected function setUp()
+ protected function setUp(): void
{
parent::setUp();
@@ -48,7 +48,7 @@ public function testValidateFileSizeFieldValue()
{
$fileField = $this->objFromFixture(EditableFileField::class, 'file-field');
- $this->setExpectedException(ValidationException::class);
+ $this->expectException(ValidationException::class);
$fileField->MaxFileSizeMB = $this->php_max_file_size * 2;
$fileField->write();
}
diff --git a/tests/php/Model/EditableFormField/EditableLiteralFieldTest.php b/tests/php/Model/EditableFormField/EditableLiteralFieldTest.php
index c12f77fa7..fa2753031 100644
--- a/tests/php/Model/EditableFormField/EditableLiteralFieldTest.php
+++ b/tests/php/Model/EditableFormField/EditableLiteralFieldTest.php
@@ -15,7 +15,7 @@
*/
class EditableLiteralFieldTest extends SapphireTest
{
- protected function setUp()
+ protected function setUp(): void
{
parent::setUp();
$cmsConfig = HTMLEditorConfig::get('cms');
@@ -48,11 +48,11 @@ public function testHideLabel()
'Title' => 'Test label'
]);
- $this->assertContains('Test label', $field->getFormField()->FieldHolder());
+ $this->assertStringContainsString('Test label', $field->getFormField()->FieldHolder());
$this->assertEquals('Test label', $field->getFormField()->Title());
$field->HideLabel = true;
- $this->assertNotContains('Test label', $field->getFormField()->FieldHolder());
+ $this->assertStringNotContainsString('Test label', $field->getFormField()->FieldHolder());
$this->assertEmpty($field->getFormField()->Title());
}
diff --git a/tests/php/Model/EditableFormField/EditableNumericFieldTest.php b/tests/php/Model/EditableFormField/EditableNumericFieldTest.php
index 035649ccb..afcd0add6 100644
--- a/tests/php/Model/EditableFormField/EditableNumericFieldTest.php
+++ b/tests/php/Model/EditableFormField/EditableNumericFieldTest.php
@@ -24,7 +24,7 @@ public function testValidateAddsErrorWhenMinValueIsGreaterThanMaxValue()
$result = $field->validate();
$this->assertFalse($result->isValid(), 'Validation should fail when min is greater than max');
- $this->assertContains('Minimum length should be less than the maximum length', $result->serialize());
+ $this->assertStringContainsString('Minimum length should be less than the maximum length', $result->serialize());
}
public function testValidate()
diff --git a/tests/php/Model/EditableFormFieldTest.php b/tests/php/Model/EditableFormFieldTest.php
index 3058c8692..7bda25013 100644
--- a/tests/php/Model/EditableFormFieldTest.php
+++ b/tests/php/Model/EditableFormFieldTest.php
@@ -184,9 +184,9 @@ public function testUniqueName()
$checkboxField->write();
// Test values are in the expected format
- $this->assertRegExp('/^EditableTextField_.+/', $textfield1->Name);
- $this->assertRegExp('/^EditableTextField_.+/', $textfield2->Name);
- $this->assertRegExp('/^EditableCheckbox_.+/', $checkboxField->Name);
+ $this->assertMatchesRegularExpression('/^EditableTextField_.+/', $textfield1->Name);
+ $this->assertMatchesRegularExpression('/^EditableTextField_.+/', $textfield2->Name);
+ $this->assertMatchesRegularExpression('/^EditableCheckbox_.+/', $checkboxField->Name);
$this->assertNotEquals($textfield1->Name, $textfield2->Name);
}
@@ -238,7 +238,7 @@ public function testGetIcon()
{
$field = new EditableTextField;
- $this->assertContains('/images/editabletextfield.png', $field->getIcon());
+ $this->assertStringContainsString('/images/editabletextfield.png', $field->getIcon());
}
public function displayedProvider()
diff --git a/tests/php/Model/Recipient/EmailRecipientTest.php b/tests/php/Model/Recipient/EmailRecipientTest.php
index 0de6ae8e6..481d0ccc2 100644
--- a/tests/php/Model/Recipient/EmailRecipientTest.php
+++ b/tests/php/Model/Recipient/EmailRecipientTest.php
@@ -20,21 +20,19 @@ public function testShortcodesAreRenderedInEmailPreviewContent()
$recipient->EmailBodyHtml = 'Some email content. About us: [sitetree_link,id=' . $page->ID . '].
';
$result = $recipient->getEmailBodyContent();
- $this->assertContains('/about-us/', $result);
+ $this->assertStringContainsString('/about-us/', $result);
$recipient->SendPlain = true;
$recipient->EmailBody = 'Some email content. About us: [sitetree_link,id=' . $page->ID . '].';
$result = $recipient->getEmailBodyContent();
- $this->assertContains('/about-us/', $result);
+ $this->assertStringContainsString('/about-us/', $result);
}
- /**
- * @expectedException \SilverStripe\ORM\ValidationException
- * @expectedExceptionMessage "Send email to" address or field is required
- */
public function testEmptyRecipientFailsValidation()
{
+ $this->expectException(\SilverStripe\ORM\ValidationException::class);
+ $this->expectExceptionMessage('"Send email to" address or field is required');
$recipient = new EmailRecipient();
$recipient->EmailFrom = 'test@example.com';
$recipient->write();
diff --git a/tests/php/Model/SubmittedFileFieldTest.php b/tests/php/Model/SubmittedFileFieldTest.php
index 91db2f933..397dcc046 100644
--- a/tests/php/Model/SubmittedFileFieldTest.php
+++ b/tests/php/Model/SubmittedFileFieldTest.php
@@ -11,14 +11,14 @@
class SubmittedFileFieldTest extends SapphireTest
{
- public function setUp()
+ protected function setUp(): void
{
parent::setUp();
TestAssetStore::activate('SubmittedFileFieldTest');
}
- public function tearDown()
+ protected function tearDown(): void
{
TestAssetStore::reset();
@@ -40,7 +40,7 @@ public function testDeletingSubmissionRemovesFile()
$submittedFile->ParentID = $submittedForm->ID;
$submittedFile->write();
- $this->assertContains('test-SubmittedFileFieldTest', $submittedFile->getFileName(), 'Submitted file is linked');
+ $this->assertStringContainsString('test-SubmittedFileFieldTest', $submittedFile->getFileName(), 'Submitted file is linked');
$submittedForm->delete();
$fileId = $file->ID;
diff --git a/tests/php/Model/UserDefinedFormTest.php b/tests/php/Model/UserDefinedFormTest.php
index 1c0e7b9c6..6f040f487 100644
--- a/tests/php/Model/UserDefinedFormTest.php
+++ b/tests/php/Model/UserDefinedFormTest.php
@@ -37,7 +37,7 @@ class UserDefinedFormTest extends FunctionalTest
UserDefinedForm::class => [UserFormFieldEditorExtension::class],
];
- protected function setUp()
+ protected function setUp(): void
{
parent::setUp();
Email::config()->update('admin_email', 'no-reply@example.com');
@@ -526,12 +526,12 @@ public function testIndex()
$result = $this->get($page->Link());
$body = Convert::nl2os($result->getBody(), ''); // strip out newlines
$this->assertFalse($result->isError());
- $this->assertContains('Here is my form
Thank you for filling it out
', $body);
+ $this->assertStringContainsString('Here is my form
Thank you for filling it out
', $body);
- $this->assertNotContains('$UserDefinedForm
', $body);
- $this->assertNotContains('', $body);
- $this->assertNotContains('
Thank you for filling it out
', $body);
+ $this->assertStringNotContainsString('$UserDefinedForm
', $body);
+ $this->assertStringNotContainsString('', $body);
+ $this->assertStringNotContainsString('Thank you for filling it out
', $body);
}
public function testEmailAddressValidation()
@@ -546,8 +546,8 @@ public function testEmailAddressValidation()
$result = $recipient->validate();
$this->assertFalse($result->isValid());
$this->assertNotEmpty($result->getMessages());
- $this->assertContains('filtered.example.com', $result->getMessages()[0]['message']);
- $this->assertNotContains('filtered2@example.com', $result->getMessages()[0]['message']);
+ $this->assertStringContainsString('filtered.example.com', $result->getMessages()[0]['message']);
+ $this->assertStringNotContainsString('filtered2@example.com', $result->getMessages()[0]['message']);
// test valid email addresses pass validation
$recipient = $this->objFromFixture(