application: refactor version checks, move to ApplicationUtils
Relates to #372 Modifications: - move checkUpdate() to ApplicationUtils - reduce file I/O operations during version checks - apply coding conventions - add test coverage Tools: - create a sandbox directory for tests Signed-off-by: VirtualTam <virtualtam@flibidi.net>
This commit is contained in:
parent
61873e3ded
commit
4bf35ba56b
8 changed files with 331 additions and 35 deletions
|
@ -5,12 +5,230 @@
|
|||
|
||||
require_once 'application/ApplicationUtils.php';
|
||||
|
||||
/**
|
||||
* Fake ApplicationUtils class to avoid HTTP requests
|
||||
*/
|
||||
class FakeApplicationUtils extends ApplicationUtils
|
||||
{
|
||||
public static $VERSION_CODE = '';
|
||||
|
||||
/**
|
||||
* Toggle HTTP requests, allow overriding the version code
|
||||
*/
|
||||
public static function getLatestGitVersionCode($url, $timeout=0)
|
||||
{
|
||||
return self::$VERSION_CODE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Unitary tests for Shaarli utilities
|
||||
*/
|
||||
class ApplicationUtilsTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
protected static $testUpdateFile = 'sandbox/update.txt';
|
||||
protected static $testVersion = '0.5.0';
|
||||
protected static $versionPattern = '/^\d+\.\d+\.\d+$/';
|
||||
|
||||
/**
|
||||
* Reset test data for each test
|
||||
*/
|
||||
public function setUp()
|
||||
{
|
||||
FakeApplicationUtils::$VERSION_CODE = '';
|
||||
if (file_exists(self::$testUpdateFile)) {
|
||||
unlink(self::$testUpdateFile);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the latest version code available on Git
|
||||
*
|
||||
* Expected format: Semantic Versioning - major.minor.patch
|
||||
*/
|
||||
public function testGetLatestGitVersionCode()
|
||||
{
|
||||
$testTimeout = 10;
|
||||
|
||||
$this->assertEquals(
|
||||
'0.5.4',
|
||||
ApplicationUtils::getLatestGitVersionCode(
|
||||
'https://raw.githubusercontent.com/shaarli/Shaarli/'
|
||||
.'v0.5.4/shaarli_version.php',
|
||||
$testTimeout
|
||||
)
|
||||
);
|
||||
$this->assertRegexp(
|
||||
self::$versionPattern,
|
||||
ApplicationUtils::getLatestGitVersionCode(
|
||||
'https://raw.githubusercontent.com/shaarli/Shaarli/'
|
||||
.'master/shaarli_version.php',
|
||||
$testTimeout
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to retrieve the latest version from an invalid URL
|
||||
*/
|
||||
public function testGetLatestGitVersionCodeInvalidUrl()
|
||||
{
|
||||
$this->assertFalse(
|
||||
ApplicationUtils::getLatestGitVersionCode('htttp://null.io', 0)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test update checks - the user is logged off
|
||||
*/
|
||||
public function testCheckUpdateLoggedOff()
|
||||
{
|
||||
$this->assertFalse(
|
||||
ApplicationUtils::checkUpdate(self::$testVersion, 'null', 0, false, false)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test update checks - the user has disabled updates
|
||||
*/
|
||||
public function testCheckUpdateUserDisabled()
|
||||
{
|
||||
$this->assertFalse(
|
||||
ApplicationUtils::checkUpdate(self::$testVersion, 'null', 0, false, true)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* A newer version is available
|
||||
*/
|
||||
public function testCheckUpdateNewVersionNew()
|
||||
{
|
||||
$newVersion = '1.8.3';
|
||||
FakeApplicationUtils::$VERSION_CODE = $newVersion;
|
||||
|
||||
$version = FakeApplicationUtils::checkUpdate(
|
||||
self::$testVersion,
|
||||
self::$testUpdateFile,
|
||||
100,
|
||||
true,
|
||||
true
|
||||
);
|
||||
|
||||
$this->assertEquals($newVersion, $version);
|
||||
}
|
||||
|
||||
/**
|
||||
* No available information about versions
|
||||
*/
|
||||
public function testCheckUpdateNewVersionUnavailable()
|
||||
{
|
||||
$version = FakeApplicationUtils::checkUpdate(
|
||||
self::$testVersion,
|
||||
self::$testUpdateFile,
|
||||
100,
|
||||
true,
|
||||
true
|
||||
);
|
||||
|
||||
$this->assertFalse($version);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shaarli is up-to-date
|
||||
*/
|
||||
public function testCheckUpdateNewVersionUpToDate()
|
||||
{
|
||||
FakeApplicationUtils::$VERSION_CODE = self::$testVersion;
|
||||
|
||||
$version = FakeApplicationUtils::checkUpdate(
|
||||
self::$testVersion,
|
||||
self::$testUpdateFile,
|
||||
100,
|
||||
true,
|
||||
true
|
||||
);
|
||||
|
||||
$this->assertFalse($version);
|
||||
}
|
||||
|
||||
/**
|
||||
* Time-traveller's Shaarli
|
||||
*/
|
||||
public function testCheckUpdateNewVersionMaartiMcFly()
|
||||
{
|
||||
FakeApplicationUtils::$VERSION_CODE = '0.4.1';
|
||||
|
||||
$version = FakeApplicationUtils::checkUpdate(
|
||||
self::$testVersion,
|
||||
self::$testUpdateFile,
|
||||
100,
|
||||
true,
|
||||
true
|
||||
);
|
||||
|
||||
$this->assertFalse($version);
|
||||
}
|
||||
|
||||
/**
|
||||
* The version has been checked recently and Shaarli is up-to-date
|
||||
*/
|
||||
public function testCheckUpdateNewVersionTwiceUpToDate()
|
||||
{
|
||||
FakeApplicationUtils::$VERSION_CODE = self::$testVersion;
|
||||
|
||||
// Create the update file
|
||||
$version = FakeApplicationUtils::checkUpdate(
|
||||
self::$testVersion,
|
||||
self::$testUpdateFile,
|
||||
100,
|
||||
true,
|
||||
true
|
||||
);
|
||||
|
||||
$this->assertFalse($version);
|
||||
|
||||
// Reuse the update file
|
||||
$version = FakeApplicationUtils::checkUpdate(
|
||||
self::$testVersion,
|
||||
self::$testUpdateFile,
|
||||
100,
|
||||
true,
|
||||
true
|
||||
);
|
||||
|
||||
$this->assertFalse($version);
|
||||
}
|
||||
|
||||
/**
|
||||
* The version has been checked recently and Shaarli is outdated
|
||||
*/
|
||||
public function testCheckUpdateNewVersionTwiceOutdated()
|
||||
{
|
||||
$newVersion = '1.8.3';
|
||||
FakeApplicationUtils::$VERSION_CODE = $newVersion;
|
||||
|
||||
// Create the update file
|
||||
$version = FakeApplicationUtils::checkUpdate(
|
||||
self::$testVersion,
|
||||
self::$testUpdateFile,
|
||||
100,
|
||||
true,
|
||||
true
|
||||
);
|
||||
$this->assertEquals($newVersion, $version);
|
||||
|
||||
// Reuse the update file
|
||||
$version = FakeApplicationUtils::checkUpdate(
|
||||
self::$testVersion,
|
||||
self::$testUpdateFile,
|
||||
100,
|
||||
true,
|
||||
true
|
||||
);
|
||||
$this->assertEquals($newVersion, $version);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check supported PHP versions
|
||||
*/
|
||||
|
|
|
@ -11,10 +11,10 @@ require_once 'application/Cache.php';
|
|||
/**
|
||||
* Unitary tests for cached pages
|
||||
*/
|
||||
class CachedTest extends PHPUnit_Framework_TestCase
|
||||
class CacheTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
// test cache directory
|
||||
protected static $testCacheDir = 'tests/dummycache';
|
||||
protected static $testCacheDir = 'sandbox/dummycache';
|
||||
|
||||
// dummy cached file names / content
|
||||
protected static $pages = array('a', 'toto', 'd7b59c');
|
||||
|
@ -56,7 +56,7 @@ class CachedTest extends PHPUnit_Framework_TestCase
|
|||
public function testPurgeCachedPagesMissingDir()
|
||||
{
|
||||
$this->assertEquals(
|
||||
'Cannot purge tests/dummycache_missing: no directory',
|
||||
'Cannot purge sandbox/dummycache_missing: no directory',
|
||||
purgeCachedPages(self::$testCacheDir.'_missing')
|
||||
);
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ require_once 'application/CachedPage.php';
|
|||
class CachedPageTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
// test cache directory
|
||||
protected static $testCacheDir = 'tests/pagecache';
|
||||
protected static $testCacheDir = 'sandbox/pagecache';
|
||||
protected static $url = 'http://shaar.li/?do=atom';
|
||||
protected static $filename;
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ require_once 'tests/utils/ReferenceLinkDB.php';
|
|||
class LinkDBTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
// datastore to test write operations
|
||||
protected static $testDatastore = 'tests/datastore.php';
|
||||
protected static $testDatastore = 'sandbox/datastore.php';
|
||||
protected static $refDB = null;
|
||||
protected static $publicLinkDB = null;
|
||||
protected static $privateLinkDB = null;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue