mirror of
https://code.mensbeam.com/MensBeam/Arsse.git
synced 2024-12-23 09:02:41 +00:00
Full coverage! Fixes #66
This commit is contained in:
parent
728eecfbb5
commit
71c7cd8fb1
10 changed files with 149 additions and 12 deletions
|
@ -12,18 +12,14 @@ class Service {
|
||||||
const DRIVER_NAMES = [
|
const DRIVER_NAMES = [
|
||||||
'serial' => \JKingWeb\Arsse\Service\Serial\Driver::class,
|
'serial' => \JKingWeb\Arsse\Service\Serial\Driver::class,
|
||||||
'subprocess' => \JKingWeb\Arsse\Service\Subprocess\Driver::class,
|
'subprocess' => \JKingWeb\Arsse\Service\Subprocess\Driver::class,
|
||||||
'curl' => \JKingWeb\Arsse\Service\Curl\Driver::class,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
/** @var Service\Driver */
|
/** @var Service\Driver */
|
||||||
protected $drv;
|
protected $drv;
|
||||||
/** @var \DateInterval */
|
|
||||||
protected $interval;
|
|
||||||
|
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
$driver = Arsse::$conf->serviceDriver;
|
$driver = Arsse::$conf->serviceDriver;
|
||||||
$this->drv = new $driver();
|
$this->drv = new $driver();
|
||||||
$this->interval = Arsse::$conf->serviceFrequency;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function watch(bool $loop = true): \DateTimeInterface {
|
public function watch(bool $loop = true): \DateTimeInterface {
|
||||||
|
@ -34,12 +30,12 @@ class Service {
|
||||||
$list = Arsse::$db->feedListStale();
|
$list = Arsse::$db->feedListStale();
|
||||||
if ($list) {
|
if ($list) {
|
||||||
$this->drv->queue(...$list);
|
$this->drv->queue(...$list);
|
||||||
|
unset($list);
|
||||||
$this->drv->exec();
|
$this->drv->exec();
|
||||||
$this->drv->clean();
|
$this->drv->clean();
|
||||||
unset($list);
|
|
||||||
}
|
}
|
||||||
static::cleanupPost();
|
static::cleanupPost();
|
||||||
$t->add($this->interval);
|
$t->add(Arsse::$conf->serviceFrequency);
|
||||||
// @codeCoverageIgnoreStart
|
// @codeCoverageIgnoreStart
|
||||||
if ($loop) {
|
if ($loop) {
|
||||||
do {
|
do {
|
||||||
|
|
|
@ -11,5 +11,5 @@ interface Driver {
|
||||||
public static function requirementsMet(): bool;
|
public static function requirementsMet(): bool;
|
||||||
public function queue(int ...$feeds): int;
|
public function queue(int ...$feeds): int;
|
||||||
public function exec(): int;
|
public function exec(): int;
|
||||||
public function clean(): bool;
|
public function clean(): int;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,8 +36,9 @@ class Driver implements \JKingWeb\Arsse\Service\Driver {
|
||||||
return Arsse::$conf->serviceQueueWidth - sizeof($this->queue);
|
return Arsse::$conf->serviceQueueWidth - sizeof($this->queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function clean(): bool {
|
public function clean(): int {
|
||||||
|
$out = sizeof($this->queue);
|
||||||
$this->queue = [];
|
$this->queue = [];
|
||||||
return true;
|
return $out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ class Driver implements \JKingWeb\Arsse\Service\Driver {
|
||||||
$id = (int) array_shift($this->queue);
|
$id = (int) array_shift($this->queue);
|
||||||
$php = escapeshellarg(\PHP_BINARY);
|
$php = escapeshellarg(\PHP_BINARY);
|
||||||
$arsse = escapeshellarg($_SERVER['argv'][0]);
|
$arsse = escapeshellarg($_SERVER['argv'][0]);
|
||||||
array_push($pp, popen("$php $arsse feed refresh $id", "r"));
|
array_push($pp, $this->execCmd("$php $arsse feed refresh $id"));
|
||||||
}
|
}
|
||||||
while ($pp) {
|
while ($pp) {
|
||||||
$p = array_pop($pp);
|
$p = array_pop($pp);
|
||||||
|
@ -43,8 +43,14 @@ class Driver implements \JKingWeb\Arsse\Service\Driver {
|
||||||
return Arsse::$conf->serviceQueueWidth - sizeof($this->queue);
|
return Arsse::$conf->serviceQueueWidth - sizeof($this->queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function clean(): bool {
|
/** @codeCoverageIgnore */
|
||||||
|
protected function execCmd(string $cmd) {
|
||||||
|
return popen($cmd, "r");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function clean(): int {
|
||||||
|
$out = sizeof($this->queue);
|
||||||
$this->queue = [];
|
$this->queue = [];
|
||||||
return true;
|
return $out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
47
tests/cases/Service/TestSerial.php
Normal file
47
tests/cases/Service/TestSerial.php
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
<?php
|
||||||
|
/** @license MIT
|
||||||
|
* Copyright 2017 J. King, Dustin Wilson et al.
|
||||||
|
* See LICENSE and AUTHORS files for details */
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace JKingWeb\Arsse\TestCase\Service;
|
||||||
|
|
||||||
|
use JKingWeb\Arsse\Arsse;
|
||||||
|
use JKingWeb\Arsse\Database;
|
||||||
|
use JKingWeb\Arsse\Service\Driver as DriverInterface;
|
||||||
|
use JKingWeb\Arsse\Service\Serial\Driver;
|
||||||
|
|
||||||
|
/** @covers \JKingWeb\Arsse\Service\Serial\Driver */
|
||||||
|
class TestSerial extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||||
|
public function setUp() {
|
||||||
|
self::clearData();
|
||||||
|
self::setConf();
|
||||||
|
Arsse::$db = \Phake::mock(Database::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testConstruct() {
|
||||||
|
$this->assertTrue(Driver::requirementsMet());
|
||||||
|
$this->assertInstanceOf(DriverInterface::class, new Driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFetchDriverName() {
|
||||||
|
$this->assertTrue(strlen(Driver::driverName()) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testEnqueueFeeds() {
|
||||||
|
$d = new Driver;
|
||||||
|
$this->assertSame(3, $d->queue(1, 2, 3));
|
||||||
|
$this->assertSame(5, $d->queue(4, 5));
|
||||||
|
$this->assertSame(5, $d->clean());
|
||||||
|
$this->assertSame(1, $d->queue(5));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRefreshFeeds() {
|
||||||
|
$d = new Driver;
|
||||||
|
$d->queue(1, 4, 3);
|
||||||
|
$this->assertSame(Arsse::$conf->serviceQueueWidth, $d->exec());
|
||||||
|
\Phake::verify(Arsse::$db)->feedUpdate(1);
|
||||||
|
\Phake::verify(Arsse::$db)->feedUpdate(4);
|
||||||
|
\Phake::verify(Arsse::$db)->feedUpdate(3);
|
||||||
|
}
|
||||||
|
}
|
|
@ -59,4 +59,25 @@ class TestService extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||||
\Phake::verify(Arsse::$db)->articleCleanup();
|
\Phake::verify(Arsse::$db)->articleCleanup();
|
||||||
\Phake::verify(Arsse::$db)->driverMaintenance();
|
\Phake::verify(Arsse::$db)->driverMaintenance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testRefreshFeeds() {
|
||||||
|
// set up mock database actions
|
||||||
|
\Phake::when(Arsse::$db)->metaSet->thenReturn(true);
|
||||||
|
\Phake::when(Arsse::$db)->feedCleanup->thenReturn(true);
|
||||||
|
\Phake::when(Arsse::$db)->sessionCleanup->thenReturn(true);
|
||||||
|
\Phake::when(Arsse::$db)->articleCleanup->thenReturn(0);
|
||||||
|
\Phake::when(Arsse::$db)->feedListStale->thenReturn([1,2,3]);
|
||||||
|
// perform the test
|
||||||
|
$d = \Phake::mock(\JKingWeb\Arsse\Service\Driver::class);
|
||||||
|
$s = new \JKingWeb\Arsse\Test\Service($d);
|
||||||
|
$this->assertInstanceOf(\DateTimeInterface::class, $s->watch(false));
|
||||||
|
// verify invocations
|
||||||
|
\Phake::verify($d)->queue(1, 2, 3);
|
||||||
|
\Phake::verify($d)->exec();
|
||||||
|
\Phake::verify($d)->clean();
|
||||||
|
\Phake::verify(Arsse::$db)->feedCleanup();
|
||||||
|
\Phake::verify(Arsse::$db)->sessionCleanup();
|
||||||
|
\Phake::verify(Arsse::$db)->articleCleanup();
|
||||||
|
\Phake::verify(Arsse::$db)->metaSet("service_last_checkin", $this->anything(), "datetime");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
48
tests/cases/Service/TestSubprocess.php
Normal file
48
tests/cases/Service/TestSubprocess.php
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
<?php
|
||||||
|
/** @license MIT
|
||||||
|
* Copyright 2017 J. King, Dustin Wilson et al.
|
||||||
|
* See LICENSE and AUTHORS files for details */
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace JKingWeb\Arsse\TestCase\Service;
|
||||||
|
|
||||||
|
use JKingWeb\Arsse\Arsse;
|
||||||
|
use JKingWeb\Arsse\Database;
|
||||||
|
use JKingWeb\Arsse\Service\Driver as DriverInterface;
|
||||||
|
use JKingWeb\Arsse\Service\Subprocess\Driver;
|
||||||
|
|
||||||
|
/** @covers \JKingWeb\Arsse\Service\Subprocess\Driver */
|
||||||
|
class TestSubprocess extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||||
|
public function setUp() {
|
||||||
|
self::clearData();
|
||||||
|
self::setConf();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testConstruct() {
|
||||||
|
$this->assertTrue(Driver::requirementsMet());
|
||||||
|
$this->assertInstanceOf(DriverInterface::class, new Driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFetchDriverName() {
|
||||||
|
$this->assertTrue(strlen(Driver::driverName()) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testEnqueueFeeds() {
|
||||||
|
$d = new Driver;
|
||||||
|
$this->assertSame(3, $d->queue(1, 2, 3));
|
||||||
|
$this->assertSame(5, $d->queue(4, 5));
|
||||||
|
$this->assertSame(5, $d->clean());
|
||||||
|
$this->assertSame(1, $d->queue(5));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRefreshFeeds() {
|
||||||
|
$d = \Phake::partialMock(Driver::class);
|
||||||
|
\Phake::when($d)->execCmd->thenReturnCallback(function(string $cmd) {
|
||||||
|
// FIXME: Does this work in Windows?
|
||||||
|
return popen("echo ".escapeshellarg($cmd), "r");
|
||||||
|
});
|
||||||
|
$this->assertSame(3, $d->queue(1, 4, 3));
|
||||||
|
$this->assertSame(Arsse::$conf->serviceQueueWidth, $d->exec());
|
||||||
|
\Phake::verify($d, \Phake::times(3))->execCmd;
|
||||||
|
}
|
||||||
|
}
|
|
@ -37,6 +37,9 @@ class TestArsse extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testLoadNewData() {
|
public function testLoadNewData() {
|
||||||
|
if (!\JKingWeb\Arsse\Db\SQLite3\Driver::requirementsMet() && !\JKingWeb\Arsse\Db\SQLite3\PDODriver::requirementsMet()) {
|
||||||
|
$this->markTestSkipped("A functional SQLite interface is required for this test");
|
||||||
|
}
|
||||||
$conf = (new Conf)->import(['dbSQLite3File' => ":memory:"]);
|
$conf = (new Conf)->import(['dbSQLite3File' => ":memory:"]);
|
||||||
Arsse::load($conf);
|
Arsse::load($conf);
|
||||||
$this->assertInstanceOf(Conf::class, Arsse::$conf);
|
$this->assertInstanceOf(Conf::class, Arsse::$conf);
|
||||||
|
|
13
tests/lib/Service.php
Normal file
13
tests/lib/Service.php
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<?php
|
||||||
|
/** @license MIT
|
||||||
|
* Copyright 2017 J. King, Dustin Wilson et al.
|
||||||
|
* See LICENSE and AUTHORS files for details */
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace JKingWeb\Arsse\Test;
|
||||||
|
|
||||||
|
class Service extends \JKingWeb\Arsse\Service {
|
||||||
|
public function __construct(\JKingWeb\Arsse\Service\Driver $drv) {
|
||||||
|
$this->drv = $drv;
|
||||||
|
}
|
||||||
|
}
|
|
@ -128,6 +128,8 @@
|
||||||
</testsuite>
|
</testsuite>
|
||||||
<testsuite name="Admin tools">
|
<testsuite name="Admin tools">
|
||||||
<file>cases/Service/TestService.php</file>
|
<file>cases/Service/TestService.php</file>
|
||||||
|
<file>cases/Service/TestSerial.php</file>
|
||||||
|
<file>cases/Service/TestSubprocess.php</file>
|
||||||
<file>cases/CLI/TestCLI.php</file>
|
<file>cases/CLI/TestCLI.php</file>
|
||||||
<file>cases/TestArsse.php</file>
|
<file>cases/TestArsse.php</file>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
|
|
Loading…
Reference in a new issue