Merge pull request #12789 from nupplaphil/bug/flasky_test

[tests] Fix flaky tests
This commit is contained in:
Hypolite Petovan 2023-02-13 17:06:26 -05:00 committed by GitHub
commit 262f960120
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 163 additions and 109 deletions

View File

@ -71,7 +71,11 @@ trait DatabaseTestTrait
} }
foreach ($rows as $row) { foreach ($rows as $row) {
if (is_array($row)) {
$dba->insert($tableName, $row, true); $dba->insert($tableName, $row, true);
} else {
throw new \Exception('row isn\'t an array');
}
} }
} }
} }

View File

@ -32,6 +32,8 @@ use GuzzleHttp\HandlerStack;
*/ */
trait DiceHttpMockHandlerTrait trait DiceHttpMockHandlerTrait
{ {
use FixtureTestTrait;
/** /**
* Handler for mocking requests anywhere for testing purpose * Handler for mocking requests anywhere for testing purpose
* *
@ -41,9 +43,7 @@ trait DiceHttpMockHandlerTrait
protected function setupHttpMockHandler(): void protected function setupHttpMockHandler(): void
{ {
if (!empty($this->httpRequestHandler) && $this->httpRequestHandler instanceof HandlerStack) { $this->setUpFixtures();
return;
}
$this->httpRequestHandler = HandlerStack::create(); $this->httpRequestHandler = HandlerStack::create();
@ -59,10 +59,8 @@ trait DiceHttpMockHandlerTrait
DI::init($newDice); DI::init($newDice);
} }
protected function tearDown(): void protected function tearDownHandler(): void
{ {
\Mockery::close(); $this->tearDownFixtures();
parent::tearDown();
} }
} }

View File

@ -39,71 +39,21 @@ use Friendica\Test\Util\VFSTrait;
/** /**
* Parent class for test cases requiring fixtures * Parent class for test cases requiring fixtures
*/ */
abstract class FixtureTest extends DatabaseTest abstract class FixtureTest extends MockedTest
{ {
use VFSTrait; use FixtureTestTrait;
/** @var Dice */
protected $dice;
/**
* Create variables used by tests.
*/
protected function setUp(): void protected function setUp(): void
{ {
$this->setUpVfsDir();
parent::setUp(); parent::setUp();
$server = $_SERVER; $this->setUpFixtures();
$server['REQUEST_METHOD'] = Router::GET;
$this->dice = (new Dice())
->addRules(include __DIR__ . '/../static/dependencies.config.php')
->addRule(ConfigFileManager::class, [
'instanceOf' => Config::class,
'call' => [['createConfigFileManager', [$this->root->url(), $server,],
Dice::CHAIN_CALL]]])
->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true])
->addRule(IHandleSessions::class, ['instanceOf' => Memory::class, 'shared' => true, 'call' => null])
->addRule(Arguments::class, [
'instanceOf' => Arguments::class,
'call' => [
['determine', [$server, $_GET], Dice::CHAIN_CALL],
],
]);
DI::init($this->dice);
$config = $this->dice->create(IManageConfigValues::class);
$config->set('database', 'disable_pdo', true);
/** @var Database $dba */
$dba = $this->dice->create(Database::class);
$dba->setTestmode(true);
if (DI::lock()->acquire('Test-checkInitialValues', 0)) {
DBStructure::checkInitialValues();
DI::lock()->release('Test-checkInitialValues');
} }
// Load the API dataset for the whole API protected function tearDown(): void
$this->loadFixture(__DIR__ . '/datasets/api.fixture.php', $dba);
}
protected function useHttpMethod(string $method = Router::GET)
{ {
$server = $_SERVER; $this->tearDownFixtures();
$server['REQUEST_METHOD'] = $method;
$this->dice = $this->dice parent::tearDown();
->addRule(Arguments::class, [
'instanceOf' => Arguments::class,
'call' => [
['determine', [$server, $_GET], Dice::CHAIN_CALL],
],
]);
DI::init($this->dice);
} }
} }

105
tests/FixtureTestTrait.php Normal file
View File

@ -0,0 +1,105 @@
<?php
/**
* @copyright Copyright (C) 2010-2023, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Test;
use Dice\Dice;
use Friendica\App\Arguments;
use Friendica\App\Router;
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\Config\Factory\Config;
use Friendica\Core\Config\Util\ConfigFileManager;
use Friendica\Core\Session\Capability\IHandleSessions;
use Friendica\Core\Session\Type\Memory;
use Friendica\Database\Database;
use Friendica\Database\DBStructure;
use Friendica\DI;
use Friendica\Test\Util\Database\StaticDatabase;
use Friendica\Test\Util\VFSTrait;
trait FixtureTestTrait
{
use VFSTrait;
use DatabaseTestTrait;
/** @var Dice */
protected $dice;
/**
* Create variables used by tests.
*/
protected function setUpFixtures(): void
{
$this->setUpVfsDir();
$this->setUpDb();
$server = $_SERVER;
$server['REQUEST_METHOD'] = Router::GET;
$this->dice = (new Dice())
->addRules(include __DIR__ . '/../static/dependencies.config.php')
->addRule(ConfigFileManager::class, [
'instanceOf' => Config::class,
'call' => [['createConfigFileManager', [$this->root->url(), $server,], Dice::CHAIN_CALL]]])
->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true])
->addRule(IHandleSessions::class, ['instanceOf' => Memory::class, 'shared' => true, 'call' => null])
->addRule(Arguments::class, [
'instanceOf' => Arguments::class,
'call' => [
['determine', [$server, $_GET], Dice::CHAIN_CALL],
],
]);
DI::init($this->dice, true);
$config = $this->dice->create(IManageConfigValues::class);
$config->set('database', 'disable_pdo', true);
/** @var Database $dba */
$dba = $this->dice->create(Database::class);
$dba->setTestmode(true);
DBStructure::checkInitialValues();
// Load the API dataset for the whole API
$this->loadFixture(__DIR__ . '/datasets/api.fixture.php', $dba);
}
protected function tearDownFixtures(): void
{
$this->tearDownDb();
}
protected function useHttpMethod(string $method = Router::GET)
{
$server = $_SERVER;
$server['REQUEST_METHOD'] = $method;
$this->dice = $this->dice
->addRule(Arguments::class, [
'instanceOf' => Arguments::class,
'call' => [
['determine', [$server, $_GET], Dice::CHAIN_CALL],
],
]);
DI::init($this->dice);
}
}

View File

@ -21,7 +21,6 @@
namespace Friendica\Test\functional; namespace Friendica\Test\functional;
use Dice\Dice;
use Friendica\App; use Friendica\App;
use Friendica\Core\Cache\Capability\ICanCache; use Friendica\Core\Cache\Capability\ICanCache;
use Friendica\Core\Cache\Capability\ICanCacheInMemory; use Friendica\Core\Cache\Capability\ICanCacheInMemory;
@ -29,37 +28,17 @@ use Friendica\Core\Config\ValueObject\Cache;
use Friendica\Core\Config\Capability\IManageConfigValues; use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\Lock\Capability\ICanLock; use Friendica\Core\Lock\Capability\ICanLock;
use Friendica\Database\Database; use Friendica\Database\Database;
use Friendica\Test\Util\VFSTrait; use Friendica\Test\FixtureTest;
use Friendica\Util\BasePath; use Friendica\Util\BasePath;
use Friendica\Core\Config\Util\ConfigFileManager; use Friendica\Core\Config\Util\ConfigFileManager;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class DependencyCheckTest extends TestCase class DependencyCheckTest extends FixtureTest
{ {
use VFSTrait;
/**
* @var Dice
*/
private $dice;
protected function setUp() : void protected function setUp() : void
{ {
parent::setUp(); parent::setUp();
$this->setUpVfsDir();
$this->dice = (new Dice())
->addRules(include __DIR__ . '/../../static/dependencies.config.php')
->addRule(BasePath::class, [
'constructParams' => [
$this->root->url(),
[],
],
])
->addRule(LoggerInterface::class, ['constructParams' => ['test']]);
/** @var IManageConfigValues $config */ /** @var IManageConfigValues $config */
$config = $this->dice->create(IManageConfigValues::class); $config = $this->dice->create(IManageConfigValues::class);
$config->set('system', 'logfile', $this->root->url() . '/logs/friendica.log'); $config->set('system', 'logfile', $this->root->url() . '/logs/friendica.log');
@ -75,6 +54,9 @@ class DependencyCheckTest extends TestCase
self::assertInstanceOf(BasePath::class, $basePath); self::assertInstanceOf(BasePath::class, $basePath);
self::assertEquals($this->root->url(), $basePath->getPath()); self::assertEquals($this->root->url(), $basePath->getPath());
/** @var Database $dba */
$dba = $this->dice->create(Database::class);
} }
/** /**

View File

@ -21,15 +21,15 @@
namespace Friendica\Test\src\Console; namespace Friendica\Test\src\Console;
use Dice\Dice;
use Friendica\Console\ServerBlock; use Friendica\Console\ServerBlock;
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\DI;
use Friendica\Moderation\DomainPatternBlocklist; use Friendica\Moderation\DomainPatternBlocklist;
use Friendica\Test\FixtureTestTrait;
use Mockery; use Mockery;
class ServerBlockConsoleTest extends ConsoleTest class ServerBlockConsoleTest extends ConsoleTest
{ {
use FixtureTestTrait;
protected $defaultBlockList = [ protected $defaultBlockList = [
[ [
'domain' => 'social.nobodyhasthe.biz', 'domain' => 'social.nobodyhasthe.biz',
@ -49,9 +49,18 @@ class ServerBlockConsoleTest extends ConsoleTest
{ {
parent::setUp(); parent::setUp();
$this->setUpFixtures();
$this->blocklistMock = Mockery::mock(DomainPatternBlocklist::class); $this->blocklistMock = Mockery::mock(DomainPatternBlocklist::class);
} }
protected function tearDown(): void
{
$this->tearDownFixtures();
parent::tearDown();
}
/** /**
* Test to list the default blocked servers * Test to list the default blocked servers
*/ */
@ -80,11 +89,6 @@ CONS;
*/ */
public function testAddBlockedServer() public function testAddBlockedServer()
{ {
$dice = new Dice();
$dice = $dice->addRules(include __DIR__ . '/../../../static/dependencies.config.php');
DI::init($dice, true);
$this->blocklistMock $this->blocklistMock
->shouldReceive('addPattern') ->shouldReceive('addPattern')
->with('testme.now', 'I like it!') ->with('testme.now', 'I like it!')
@ -105,11 +109,6 @@ CONS;
*/ */
public function testUpdateBlockedServer() public function testUpdateBlockedServer()
{ {
$dice = new Dice();
$dice = $dice->addRules(include __DIR__ . '/../../../static/dependencies.config.php');
DI::init($dice, true);
$this->blocklistMock $this->blocklistMock
->shouldReceive('addPattern') ->shouldReceive('addPattern')
->with('pod.ordoevangelistarum.com', 'Other reason') ->with('pod.ordoevangelistarum.com', 'Other reason')
@ -130,11 +129,6 @@ CONS;
*/ */
public function testRemoveBlockedServer() public function testRemoveBlockedServer()
{ {
$dice = new Dice();
$dice = $dice->addRules(include __DIR__ . '/../../../static/dependencies.config.php');
DI::init($dice, true);
$this->blocklistMock $this->blocklistMock
->shouldReceive('removePattern') ->shouldReceive('removePattern')
->with('pod.ordoevangelistarum.com') ->with('pod.ordoevangelistarum.com')

View File

@ -21,9 +21,9 @@
namespace Friendica\Test\src\Content; namespace Friendica\Test\src\Content;
use Friendica\Test\MockedTest; use Friendica\Test\DatabaseTest;
class PageInfoTest extends MockedTest class PageInfoTest extends DatabaseTest
{ {
public function dataGetRelevantUrlFromBody() public function dataGetRelevantUrlFromBody()
{ {

View File

@ -38,6 +38,13 @@ class HTTPClientTest extends MockedTest
$this->setupHttpMockHandler(); $this->setupHttpMockHandler();
} }
protected function tearDown(): void
{
$this->tearDownHandler();
parent::tearDown();
}
/** /**
* Test for issue https://github.com/friendica/friendica/issues/10473#issuecomment-907749093 * Test for issue https://github.com/friendica/friendica/issues/10473#issuecomment-907749093
*/ */

View File

@ -23,10 +23,10 @@ namespace Friendica\Test\src\Network;
use Friendica\Network\Probe; use Friendica\Network\Probe;
use Friendica\Test\DiceHttpMockHandlerTrait; use Friendica\Test\DiceHttpMockHandlerTrait;
use Friendica\Test\FixtureTest; use Friendica\Test\MockedTest;
use GuzzleHttp\Middleware; use GuzzleHttp\Middleware;
class ProbeTest extends FixtureTest class ProbeTest extends MockedTest
{ {
use DiceHttpMockHandlerTrait; use DiceHttpMockHandlerTrait;
@ -37,6 +37,13 @@ class ProbeTest extends FixtureTest
$this->setupHttpMockHandler(); $this->setupHttpMockHandler();
} }
protected function tearDown(): void
{
$this->tearDownHandler();
parent::tearDown();
}
const TEMPLATENOBASE = ' const TEMPLATENOBASE = '
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en-us"> <html lang="en-us">

View File

@ -40,6 +40,13 @@ class ImagesTest extends MockedTest
$this->setupHttpMockHandler(); $this->setupHttpMockHandler();
} }
protected function tearDown(): void
{
$this->tearDownFixtures();
parent::tearDown();
}
public function dataImages() public function dataImages()
{ {
return [ return [