Add PHP unit tests and page tests.
Run "composer install", then "composer test".
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
namespace Xxx\Tests\Unit;
|
||||
|
||||
use Xxx\Tests\Support\FakeRecaptcha;
|
||||
use Xxx\Tests\Support\TestCase;
|
||||
|
||||
// validate_data() in publish/post.lib.php
|
||||
class ValidateDataTest extends TestCase {
|
||||
private function validate(array $post, bool $captcha = TRUE): array {
|
||||
if ($captcha)
|
||||
$_SESSION['captcha_ok'] = time();
|
||||
$this->request(array(), $post + array('title' => 'Title', 'author' => 'Ann', 'story' => '<p>x</p>'));
|
||||
$this->assertTrue(validate_data());
|
||||
return $GLOBALS['validate'];
|
||||
}
|
||||
|
||||
public function testACompleteStoryPasses(): void {
|
||||
$this->assertSame(array(), $this->validate(array()));
|
||||
}
|
||||
|
||||
public function testTitleAndAuthorAreNeeded(): void {
|
||||
$this->assertSame(array('author' => 'You have not submitted an author.', 'title' => 'You have not submitted a title.'),
|
||||
$this->validate(array('title' => '', 'author' => '')));
|
||||
}
|
||||
|
||||
public function testArraysCountAsEmpty(): void {
|
||||
$this->assertArrayHasKey('title', $this->validate(array('title' => array('x'))));
|
||||
}
|
||||
|
||||
public function testRemovingTheImageNeedsText(): void {
|
||||
$this->assertSame(array('story' => "You've tried to remove an image without replacing it with text."),
|
||||
$this->validate(array('remove_img' => '1', 'story' => '')));
|
||||
$GLOBALS['validate'] = array();
|
||||
$this->assertSame(array(), $this->validate(array('remove_img' => '1')));
|
||||
}
|
||||
|
||||
public function testVisitorsNeedTheCaptcha(): void {
|
||||
FakeRecaptcha::install('{"success": false}');
|
||||
$this->assertSame(array('captcha' => 'Please complete the captcha.'), $this->validate(array('g-recaptcha-response' => 'r'), FALSE));
|
||||
}
|
||||
|
||||
public function testASolvedCaptchaIsRemembered(): void {
|
||||
FakeRecaptcha::install('{"success": true}');
|
||||
$this->assertSame(array(), $this->validate(array('g-recaptcha-response' => 'r'), FALSE));
|
||||
$this->assertGreaterThan(time() - 5, $_SESSION['captcha_ok']);
|
||||
}
|
||||
|
||||
public function testAnOldCaptchaPassDoesNotCount(): void {
|
||||
FakeRecaptcha::install('{"success": false}');
|
||||
$_SESSION['captcha_ok'] = time() - CAPTCHA_PASS_SECONDS - 1;
|
||||
$this->assertArrayHasKey('captcha', $this->validate(array(), FALSE));
|
||||
}
|
||||
|
||||
public function testEditorsNeedNoCaptcha(): void {
|
||||
FakeRecaptcha::install('{"success": false}');
|
||||
$this->asEditor();
|
||||
$this->assertSame(array(), $this->validate(array(), FALSE));
|
||||
$this->assertSame(array(), FakeRecaptcha::$requests);
|
||||
}
|
||||
|
||||
public function testUploadErrorsAreReported(): void {
|
||||
$_FILES['upload'] = array('name' => 'a.png', 'tmp_name' => '', 'error' => UPLOAD_ERR_INI_SIZE);
|
||||
$this->assertSame(array('upload' => 'There was an error uploading the file (1)'), $this->validate(array()));
|
||||
}
|
||||
|
||||
public function testNoFileIsNotAnError(): void {
|
||||
$_FILES['upload'] = array('name' => '', 'tmp_name' => '', 'error' => UPLOAD_ERR_NO_FILE);
|
||||
$this->assertSame(array(), $this->validate(array()));
|
||||
}
|
||||
|
||||
public function testTheUploadMustBeAnImage(): void {
|
||||
$file = $this->tmp . '/upload';
|
||||
file_put_contents($file, 'This is not an image, but it is long enough to read.');
|
||||
$_FILES['upload'] = array('name' => '<b>notes</b>.txt', 'tmp_name' => $file, 'error' => UPLOAD_ERR_OK);
|
||||
$this->assertSame(array('upload' => "<b>notes</b>.txt wasn't an image file. Please go back."), $this->validate(array()));
|
||||
}
|
||||
|
||||
public function testAnImageUploadPasses(): void {
|
||||
$file = $this->tmp . '/upload';
|
||||
file_put_contents($file, self::png());
|
||||
$_FILES['upload'] = array('name' => 'a.png', 'tmp_name' => $file, 'error' => UPLOAD_ERR_OK);
|
||||
$this->assertSame(array(), $this->validate(array()));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user