From cbfdcff2615e901bdc434d06f38a3da8eecbdf8b Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 31 Jul 2016 10:46:17 +0200 Subject: Prepare settings for the API in the admin page and during the install API settings: - api.enabled - api.secret The API settings will be initialized (and the secret generated) with an update method. --- tests/Updater/UpdaterTest.php | 40 ++++++++++++++++++++++++++++++++++++++-- tests/UtilsTest.php | 17 +++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/Updater/UpdaterTest.php b/tests/Updater/UpdaterTest.php index 4948fe52..0171daad 100644 --- a/tests/Updater/UpdaterTest.php +++ b/tests/Updater/UpdaterTest.php @@ -271,7 +271,7 @@ $GLOBALS[\'privateLinkByDefault\'] = true;'; public function testEscapeConfig() { $sandbox = 'sandbox/config'; - copy(self::$configFile .'.json.php', $sandbox .'.json.php'); + copy(self::$configFile . '.json.php', $sandbox . '.json.php'); $this->conf = new ConfigManager($sandbox); $title = ''; $headerLink = ''; @@ -286,7 +286,43 @@ $GLOBALS[\'privateLinkByDefault\'] = true;'; $this->assertEquals(escape($title), $this->conf->get('general.title')); $this->assertEquals(escape($headerLink), $this->conf->get('general.header_link')); $this->assertEquals(escape($redirectorUrl), $this->conf->get('redirector.url')); - unlink($sandbox .'.json.php'); + unlink($sandbox . '.json.php'); + } + + /** + * Test updateMethodApiSettings(): create default settings for the API (enabled + secret). + */ + public function testUpdateApiSettings() + { + $confFile = 'sandbox/config'; + copy(self::$configFile .'.json.php', $confFile .'.json.php'); + $conf = new ConfigManager($confFile); + $updater = new Updater(array(), array(), $conf, true); + + $this->assertFalse($conf->exists('api.enabled')); + $this->assertFalse($conf->exists('api.secret')); + $updater->updateMethodApiSettings(); + $conf->reload(); + $this->assertTrue($conf->get('api.enabled')); + $this->assertTrue($conf->exists('api.secret')); + unlink($confFile .'.json.php'); + } + + /** + * Test updateMethodApiSettings(): already set, do nothing. + */ + public function testUpdateApiSettingsNothingToDo() + { + $confFile = 'sandbox/config'; + copy(self::$configFile .'.json.php', $confFile .'.json.php'); + $conf = new ConfigManager($confFile); + $conf->set('api.enabled', false); + $conf->set('api.secret', ''); + $updater = new Updater(array(), array(), $conf, true); + $updater->updateMethodApiSettings(); + $this->assertFalse($conf->get('api.enabled')); + $this->assertEmpty($conf->get('api.secret')); + unlink($confFile .'.json.php'); } /** diff --git a/tests/UtilsTest.php b/tests/UtilsTest.php index 6a7870c4..0cf9a921 100644 --- a/tests/UtilsTest.php +++ b/tests/UtilsTest.php @@ -253,4 +253,21 @@ class UtilsTest extends PHPUnit_Framework_TestCase is_session_id_valid('c0ZqcWF3VFE2NmJBdm1HMVQ0ZHJ3UmZPbTFsNGhkNHI=') ); } + + /** + * Test generateSecretApi. + */ + public function testGenerateSecretApi() + { + $this->assertEquals(12, strlen(generate_api_secret('foo', 'bar'))); + } + + /** + * Test generateSecretApi with invalid parameters. + */ + public function testGenerateSecretApiInvalid() + { + $this->assertFalse(generate_api_secret('', '')); + $this->assertFalse(generate_api_secret(false, false)); + } } -- cgit v1.2.3 From 18e6796726d73d7dc90ecdd16c181493941f5487 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Thu, 15 Dec 2016 10:13:00 +0100 Subject: REST API structure using Slim framework * REST API routes are handle by Slim. * Every API controller go through ApiMiddleware which handles security. * First service implemented `/info`, for tests purpose. --- tests/api/ApiMiddlewareTest.php | 184 +++++++++++++++++++++++++++++++++ tests/api/ApiUtilsTest.php | 206 +++++++++++++++++++++++++++++++++++++ tests/api/controllers/InfoTest.php | 113 ++++++++++++++++++++ 3 files changed, 503 insertions(+) create mode 100644 tests/api/ApiMiddlewareTest.php create mode 100644 tests/api/ApiUtilsTest.php create mode 100644 tests/api/controllers/InfoTest.php (limited to 'tests') diff --git a/tests/api/ApiMiddlewareTest.php b/tests/api/ApiMiddlewareTest.php new file mode 100644 index 00000000..4d4dd9b9 --- /dev/null +++ b/tests/api/ApiMiddlewareTest.php @@ -0,0 +1,184 @@ +conf = new \ConfigManager('tests/utils/config/configJson.json.php'); + $this->conf->set('api.secret', 'NapoleonWasALizard'); + + $this->refDB = new \ReferenceLinkDB(); + $this->refDB->write(self::$testDatastore); + + $this->container = new Container(); + $this->container['conf'] = $this->conf; + } + + /** + * After every test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testDatastore); + } + + /** + * Invoke the middleware with the API disabled: + * should return a 401 error Unauthorized. + */ + public function testInvokeMiddlewareApiDisabled() + { + $this->conf->set('api.enabled', false); + $mw = new ApiMiddleware($this->container); + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'REQUEST_URI' => '/echo', + ]); + $request = Request::createFromEnvironment($env); + $response = new Response(); + /** @var Response $response */ + $response = $mw($request, $response, null); + + $this->assertEquals(401, $response->getStatusCode()); + $body = json_decode((string) $response->getBody()); + $this->assertEquals('Not authorized', $body); + } + + /** + * Invoke the middleware with the API disabled in debug mode: + * should return a 401 error Unauthorized - with a specific message and a stacktrace. + */ + public function testInvokeMiddlewareApiDisabledDebug() + { + $this->conf->set('api.enabled', false); + $this->conf->set('dev.debug', true); + $mw = new ApiMiddleware($this->container); + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'REQUEST_URI' => '/echo', + ]); + $request = Request::createFromEnvironment($env); + $response = new Response(); + /** @var Response $response */ + $response = $mw($request, $response, null); + + $this->assertEquals(401, $response->getStatusCode()); + $body = json_decode((string) $response->getBody()); + $this->assertEquals('Not authorized: API is disabled', $body->message); + $this->assertContains('ApiAuthorizationException', $body->stacktrace); + } + + /** + * Invoke the middleware without a token (debug): + * should return a 401 error Unauthorized - with a specific message and a stacktrace. + */ + public function testInvokeMiddlewareNoTokenProvidedDebug() + { + $this->conf->set('dev.debug', true); + $mw = new ApiMiddleware($this->container); + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'REQUEST_URI' => '/echo', + ]); + $request = Request::createFromEnvironment($env); + $response = new Response(); + /** @var Response $response */ + $response = $mw($request, $response, null); + + $this->assertEquals(401, $response->getStatusCode()); + $body = json_decode((string) $response->getBody()); + $this->assertEquals('Not authorized: JWT token not provided', $body->message); + $this->assertContains('ApiAuthorizationException', $body->stacktrace); + } + + /** + * Invoke the middleware without a secret set in settings (debug): + * should return a 401 error Unauthorized - with a specific message and a stacktrace. + */ + public function testInvokeMiddlewareNoSecretSetDebug() + { + $this->conf->set('dev.debug', true); + $this->conf->set('api.secret', ''); + $mw = new ApiMiddleware($this->container); + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'REQUEST_URI' => '/echo', + 'HTTP_JWT'=> 'jwt', + ]); + $request = Request::createFromEnvironment($env); + $response = new Response(); + /** @var Response $response */ + $response = $mw($request, $response, null); + + $this->assertEquals(401, $response->getStatusCode()); + $body = json_decode((string) $response->getBody()); + $this->assertEquals('Not authorized: Token secret must be set in Shaarli\'s administration', $body->message); + $this->assertContains('ApiAuthorizationException', $body->stacktrace); + } + + /** + * Invoke the middleware without an invalid JWT token (debug): + * should return a 401 error Unauthorized - with a specific message and a stacktrace. + * + * Note: specific JWT errors tests are handled in ApiUtilsTest. + */ + public function testInvokeMiddlewareInvalidJwtDebug() + { + $this->conf->set('dev.debug', true); + $mw = new ApiMiddleware($this->container); + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'REQUEST_URI' => '/echo', + 'HTTP_JWT'=> 'bad jwt', + ]); + $request = Request::createFromEnvironment($env); + $response = new Response(); + /** @var Response $response */ + $response = $mw($request, $response, null); + + $this->assertEquals(401, $response->getStatusCode()); + $body = json_decode((string) $response->getBody()); + $this->assertEquals('Not authorized: Malformed JWT token', $body->message); + $this->assertContains('ApiAuthorizationException', $body->stacktrace); + } +} diff --git a/tests/api/ApiUtilsTest.php b/tests/api/ApiUtilsTest.php new file mode 100644 index 00000000..10da1459 --- /dev/null +++ b/tests/api/ApiUtilsTest.php @@ -0,0 +1,206 @@ +generateCustomJwtToken('notJSON', '{"JSON":1}', 'secret'); + ApiUtils::validateJwtToken($token, 'secret'); + } + + /** + * Test validateJwtToken() with a JWT token with a an invalid payload (not JSON). + * + * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException + * @expectedExceptionMessage Invalid JWT payload + */ + public function testValidateJwtTokenInvalidPayload() + { + $token = $this->generateCustomJwtToken('{"JSON":1}', 'notJSON', 'secret'); + ApiUtils::validateJwtToken($token, 'secret'); + } + + /** + * Test validateJwtToken() with a JWT token without issued time. + * + * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException + * @expectedExceptionMessage Invalid JWT issued time + */ + public function testValidateJwtTokenInvalidTimeEmpty() + { + $token = $this->generateCustomJwtToken('{"JSON":1}', '{"JSON":1}', 'secret'); + ApiUtils::validateJwtToken($token, 'secret'); + } + + /** + * Test validateJwtToken() with an expired JWT token. + * + * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException + * @expectedExceptionMessage Invalid JWT issued time + */ + public function testValidateJwtTokenInvalidTimeExpired() + { + $token = $this->generateCustomJwtToken('{"JSON":1}', '{"iat":' . (time() - 600) . '}', 'secret'); + ApiUtils::validateJwtToken($token, 'secret'); + } + + /** + * Test validateJwtToken() with a JWT token issued in the future. + * + * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException + * @expectedExceptionMessage Invalid JWT issued time + */ + public function testValidateJwtTokenInvalidTimeFuture() + { + $token = $this->generateCustomJwtToken('{"JSON":1}', '{"iat":' . (time() + 60) . '}', 'secret'); + ApiUtils::validateJwtToken($token, 'secret'); + } +} diff --git a/tests/api/controllers/InfoTest.php b/tests/api/controllers/InfoTest.php new file mode 100644 index 00000000..2916eed8 --- /dev/null +++ b/tests/api/controllers/InfoTest.php @@ -0,0 +1,113 @@ +conf = new \ConfigManager('tests/utils/config/configJson.json.php'); + $this->refDB = new \ReferenceLinkDB(); + $this->refDB->write(self::$testDatastore); + + $this->container = new Container(); + $this->container['conf'] = $this->conf; + $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + + $this->controller = new Info($this->container); + } + + /** + * After every test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testDatastore); + } + + /** + * Test /info service. + */ + public function testGetInfo() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->getInfo($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + + $this->assertEquals(8, $data['global_counter']); + $this->assertEquals(2, $data['private_counter']); + $this->assertEquals('Shaarli', $data['settings']['title']); + $this->assertEquals('?', $data['settings']['header_link']); + $this->assertEquals('UTC', $data['settings']['timezone']); + $this->assertEquals(\ConfigManager::$DEFAULT_PLUGINS, $data['settings']['enabled_plugins']); + $this->assertEquals(false, $data['settings']['default_private_links']); + + $title = 'My links'; + $headerLink = 'http://shaarli.tld'; + $timezone = 'Europe/Paris'; + $enabledPlugins = array('foo', 'bar'); + $defaultPrivateLinks = true; + $this->conf->set('general.title', $title); + $this->conf->set('general.header_link', $headerLink); + $this->conf->set('general.timezone', $timezone); + $this->conf->set('general.enabled_plugins', $enabledPlugins); + $this->conf->set('privacy.default_private_links', $defaultPrivateLinks); + + $response = $this->controller->getInfo($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + + $this->assertEquals(8, $data['global_counter']); + $this->assertEquals(2, $data['private_counter']); + $this->assertEquals($title, $data['settings']['title']); + $this->assertEquals($headerLink, $data['settings']['header_link']); + $this->assertEquals($timezone, $data['settings']['timezone']); + $this->assertEquals($enabledPlugins, $data['settings']['enabled_plugins']); + $this->assertEquals($defaultPrivateLinks, $data['settings']['default_private_links']); + } +} -- cgit v1.2.3 From db90dfcbbc406b50381f17a72f24095fee91bb09 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 2 Aug 2016 11:55:49 +0200 Subject: Move PubSubHubbub code as a default plugin --- tests/FeedBuilderTest.php | 14 --------- tests/plugins/PluginPubsubhubbubTest.php | 54 ++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 tests/plugins/PluginPubsubhubbubTest.php (limited to 'tests') diff --git a/tests/FeedBuilderTest.php b/tests/FeedBuilderTest.php index 06a44506..a590306d 100644 --- a/tests/FeedBuilderTest.php +++ b/tests/FeedBuilderTest.php @@ -75,7 +75,6 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase $data = $feedBuilder->buildData(); // Test headers (RSS) $this->assertEquals(self::$RSS_LANGUAGE, $data['language']); - $this->assertEmpty($data['pubsubhub_url']); $this->assertRegExp('/Wed, 03 Aug 2016 09:30:33 \+\d{4}/', $data['last_update']); $this->assertEquals(true, $data['show_dates']); $this->assertEquals('http://host.tld/index.php?do=feed', $data['self_link']); @@ -210,19 +209,6 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase $this->assertTrue($data['show_dates']); } - /** - * Test buildData with hide dates settings. - */ - public function testBuildDataPubsubhub() - { - $feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_ATOM, self::$serverInfo, null, false); - $feedBuilder->setLocale(self::$LOCALE); - $feedBuilder->setPubsubhubUrl('http://pubsubhub.io'); - $data = $feedBuilder->buildData(); - $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); - $this->assertEquals('http://pubsubhub.io', $data['pubsubhub_url']); - } - /** * Test buildData when Shaarli is served from a subdirectory */ diff --git a/tests/plugins/PluginPubsubhubbubTest.php b/tests/plugins/PluginPubsubhubbubTest.php new file mode 100644 index 00000000..24dd7a11 --- /dev/null +++ b/tests/plugins/PluginPubsubhubbubTest.php @@ -0,0 +1,54 @@ +set('plugins.PUBSUBHUB_URL', $hub); + $data['_PAGE_'] = Router::$PAGE_FEED_RSS; + + $data = hook_pubsubhubbub_render_feed($data, $conf); + $expected = ''; + $this->assertEquals($expected, $data['feed_plugins_header'][0]); + } + + /** + * Test render_feed hook with an ATOM feed. + */ + function testPubSubAtomRenderFeed() + { + $hub = 'http://domain.hub'; + $conf = new ConfigManager(self::$configFile); + $conf->set('plugins.PUBSUBHUB_URL', $hub); + $data['_PAGE_'] = Router::$PAGE_FEED_ATOM; + + $data = hook_pubsubhubbub_render_feed($data, $conf); + $expected = ''; + $this->assertEquals($expected, $data['feed_plugins_header'][0]); + } +} -- cgit v1.2.3 From b3051a6aae446e063c3b6fa4a6a600357a9f24af Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 20 Dec 2016 11:06:22 +0100 Subject: Fixes presence of empty tags for private tags and in search results * Private tags: make sure empty tags are properly filtered * Search results: * Use preg_split instead of function combination * Add normalize_spaces to remove extra whitespaces displaying empty tags search --- tests/UtilsTest.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/UtilsTest.php b/tests/UtilsTest.php index 0cf9a921..c885f552 100644 --- a/tests/UtilsTest.php +++ b/tests/UtilsTest.php @@ -253,7 +253,7 @@ class UtilsTest extends PHPUnit_Framework_TestCase is_session_id_valid('c0ZqcWF3VFE2NmJBdm1HMVQ0ZHJ3UmZPbTFsNGhkNHI=') ); } - + /** * Test generateSecretApi. */ @@ -270,4 +270,16 @@ class UtilsTest extends PHPUnit_Framework_TestCase $this->assertFalse(generate_api_secret('', '')); $this->assertFalse(generate_api_secret(false, false)); } + + /** + * Test normalize_spaces. + */ + public function testNormalizeSpace() + { + $str = ' foo bar is important '; + $this->assertEquals('foo bar is important', normalize_spaces($str)); + $this->assertEquals('foo', normalize_spaces('foo')); + $this->assertEquals('', normalize_spaces('')); + $this->assertEquals(null, normalize_spaces(null)); + } } -- cgit v1.2.3 From 8e4be773685f7dff074f23e2df13072577091f44 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 3 Jan 2017 14:17:05 +0100 Subject: Hide default port in local URL behind a reverse proxy --- tests/HttpUtils/ServerUrlTest.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'tests') diff --git a/tests/HttpUtils/ServerUrlTest.php b/tests/HttpUtils/ServerUrlTest.php index 8a55a220..7fdad659 100644 --- a/tests/HttpUtils/ServerUrlTest.php +++ b/tests/HttpUtils/ServerUrlTest.php @@ -68,6 +68,19 @@ class ServerUrlTest extends PHPUnit_Framework_TestCase ) ); + $this->assertEquals( + 'https://host.tld', + server_url( + array( + 'HTTPS' => 'Off', + 'SERVER_NAME' => 'host.tld', + 'SERVER_PORT' => '80', + 'HTTP_X_FORWARDED_PROTO' => 'https', + 'HTTP_X_FORWARDED_PORT' => '443' + ) + ) + ); + $this->assertEquals( 'https://host.tld:4974', server_url( -- cgit v1.2.3 From eaf2524887f1e867784fa5cbde62ac74c1d75640 Mon Sep 17 00:00:00 2001 From: VirtualTam Date: Tue, 3 Jan 2017 17:04:18 +0100 Subject: URL cleanup: add 'campaign_' to the annoying parameters Closes https://github.com/shaarli/Shaarli/issues/735 Signed-off-by: VirtualTam --- tests/Url/CleanupUrlTest.php | 102 ++++++++++++++++++++++++++++--------------- 1 file changed, 68 insertions(+), 34 deletions(-) (limited to 'tests') diff --git a/tests/Url/CleanupUrlTest.php b/tests/Url/CleanupUrlTest.php index ba9a0437..1407d7d2 100644 --- a/tests/Url/CleanupUrlTest.php +++ b/tests/Url/CleanupUrlTest.php @@ -8,7 +8,13 @@ require_once 'application/Url.php'; class CleanupUrlTest extends PHPUnit_Framework_TestCase { /** - * Clean empty UrlThanks for building nothing + * @var string reference URL + */ + protected $ref = 'http://domain.tld:3000'; + + + /** + * Clean empty URL */ public function testCleanupUrlEmpty() { @@ -16,59 +22,87 @@ class CleanupUrlTest extends PHPUnit_Framework_TestCase } /** - * Clean an already cleaned Url + * Clean an already cleaned URL */ public function testCleanupUrlAlreadyClean() { - $ref = 'http://domain.tld:3000'; - $this->assertEquals($ref, cleanup_url($ref)); - $ref = $ref.'/path/to/dir/'; - $this->assertEquals($ref, cleanup_url($ref)); + $this->assertEquals($this->ref, cleanup_url($this->ref)); + $this->ref2 = $this->ref.'/path/to/dir/'; + $this->assertEquals($this->ref2, cleanup_url($this->ref2)); + } + + /** + * Clean URL fragments + */ + public function testCleanupUrlFragment() + { + $this->assertEquals($this->ref, cleanup_url($this->ref.'#tk.rss_all')); + $this->assertEquals($this->ref, cleanup_url($this->ref.'#xtor=RSS-')); + $this->assertEquals($this->ref, cleanup_url($this->ref.'#xtor=RSS-U3ht0tkc4b')); + } + + /** + * Clean URL query - single annoying parameter + */ + public function testCleanupUrlQuerySingle() + { + $this->assertEquals($this->ref, cleanup_url($this->ref.'?action_object_map=junk')); + $this->assertEquals($this->ref, cleanup_url($this->ref.'?action_ref_map=Cr4p!')); + $this->assertEquals($this->ref, cleanup_url($this->ref.'?action_type_map=g4R84g3')); + + $this->assertEquals($this->ref, cleanup_url($this->ref.'?fb_stuff=v41u3')); + $this->assertEquals($this->ref, cleanup_url($this->ref.'?fb=71m3w4573')); + + $this->assertEquals($this->ref, cleanup_url($this->ref.'?utm_campaign=zomg')); + $this->assertEquals($this->ref, cleanup_url($this->ref.'?utm_medium=numnum')); + $this->assertEquals($this->ref, cleanup_url($this->ref.'?utm_source=c0d3')); + $this->assertEquals($this->ref, cleanup_url($this->ref.'?utm_term=1n4l')); + + $this->assertEquals($this->ref, cleanup_url($this->ref.'?xtor=some-url')); + + $this->assertEquals($this->ref, cleanup_url($this->ref.'?campaign_name=junk')); + $this->assertEquals($this->ref, cleanup_url($this->ref.'?campaign_start=junk')); + $this->assertEquals($this->ref, cleanup_url($this->ref.'?campaign_item_index=junk')); } /** - * Clean Url needing cleaning + * Clean URL query - multiple annoying parameters */ - public function testCleanupUrlNeedClean() + public function testCleanupUrlQueryMultiple() { - $ref = 'http://domain.tld:3000'; - $this->assertEquals($ref, cleanup_url($ref.'#tk.rss_all')); - $this->assertEquals($ref, cleanup_url($ref.'#xtor=RSS-')); - $this->assertEquals($ref, cleanup_url($ref.'#xtor=RSS-U3ht0tkc4b')); - $this->assertEquals($ref, cleanup_url($ref.'?action_object_map=junk')); - $this->assertEquals($ref, cleanup_url($ref.'?action_ref_map=Cr4p!')); - $this->assertEquals($ref, cleanup_url($ref.'?action_type_map=g4R84g3')); - - $this->assertEquals($ref, cleanup_url($ref.'?fb_stuff=v41u3')); - $this->assertEquals($ref, cleanup_url($ref.'?fb=71m3w4573')); - - $this->assertEquals($ref, cleanup_url($ref.'?utm_campaign=zomg')); - $this->assertEquals($ref, cleanup_url($ref.'?utm_medium=numnum')); - $this->assertEquals($ref, cleanup_url($ref.'?utm_source=c0d3')); - $this->assertEquals($ref, cleanup_url($ref.'?utm_term=1n4l')); - - $this->assertEquals($ref, cleanup_url($ref.'?xtor=some-url')); - $this->assertEquals($ref, cleanup_url($ref.'?xtor=some-url&fb=som3th1ng')); - $this->assertEquals($ref, cleanup_url( - $ref.'?fb=stuff&utm_campaign=zomg&utm_medium=numnum&utm_source=c0d3' + $this->assertEquals($this->ref, cleanup_url($this->ref.'?xtor=some-url&fb=som3th1ng')); + + $this->assertEquals($this->ref, cleanup_url( + $this->ref.'?fb=stuff&utm_campaign=zomg&utm_medium=numnum&utm_source=c0d3' )); - $this->assertEquals($ref, cleanup_url( - $ref.'?xtor=some-url&fb=som3th1ng#tk.rss_all' + + $this->assertEquals($this->ref, cleanup_url( + $this->ref.'?campaign_start=zomg&campaign_name=numnum' + )); + } + + /** + * Clean URL query - multiple annoying parameters and fragment + */ + public function testCleanupUrlQueryFragment() + { + $this->assertEquals($this->ref, cleanup_url( + $this->ref.'?xtor=some-url&fb=som3th1ng#tk.rss_all' )); // ditch annoying query params and fragment, keep useful params $this->assertEquals( - $ref.'?my=stuff&is=kept', + $this->ref.'?my=stuff&is=kept', cleanup_url( - $ref.'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#tk.rss_all' + $this->ref.'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#tk.rss_all' ) ); // ditch annoying query params, keep useful params and fragment $this->assertEquals( - $ref.'?my=stuff&is=kept#again', + $this->ref.'?my=stuff&is=kept#again', cleanup_url( - $ref.'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#again' + $this->ref.'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#again' ) ); } -- cgit v1.2.3 From 7a9daac56dc64ec1ddb12adece3e1a8f71778cc7 Mon Sep 17 00:00:00 2001 From: VirtualTam Date: Wed, 4 Jan 2017 11:41:05 +0100 Subject: API: fix JWT signature verification Fixes https://github.com/shaarli/Shaarli/issues/737 Added: - Base64Url utilities Fixed: - use URL-safe Base64 encoding/decoding functions - use byte representations for HMAC digests - all JWT parts are Base64Url-encoded See: - https://en.wikipedia.org/wiki/JSON_Web_Token - https://tools.ietf.org/html/rfc7519 - https://scotch.io/tutorials/the-anatomy-of-a-json-web-token - https://jwt.io/introduction/ - https://en.wikipedia.org/wiki/Base64#URL_applications - https://secure.php.net/manual/en/function.base64-encode.php#103849 Signed-off-by: VirtualTam --- tests/api/ApiUtilsTest.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'tests') diff --git a/tests/api/ApiUtilsTest.php b/tests/api/ApiUtilsTest.php index 10da1459..4b2fa3b2 100644 --- a/tests/api/ApiUtilsTest.php +++ b/tests/api/ApiUtilsTest.php @@ -2,6 +2,9 @@ namespace Shaarli\Api; +use Shaarli\Base64Url; + + /** * Class ApiUtilsTest */ @@ -24,14 +27,14 @@ class ApiUtilsTest extends \PHPUnit_Framework_TestCase */ public static function generateValidJwtToken($secret) { - $header = base64_encode('{ + $header = Base64Url::encode('{ "typ": "JWT", "alg": "HS512" }'); - $payload = base64_encode('{ + $payload = Base64Url::encode('{ "iat": '. time() .' }'); - $signature = hash_hmac('sha512', $header .'.'. $payload , $secret); + $signature = Base64Url::encode(hash_hmac('sha512', $header .'.'. $payload , $secret, true)); return $header .'.'. $payload .'.'. $signature; } @@ -46,9 +49,9 @@ class ApiUtilsTest extends \PHPUnit_Framework_TestCase */ public static function generateCustomJwtToken($header, $payload, $secret) { - $header = base64_encode($header); - $payload = base64_encode($payload); - $signature = hash_hmac('sha512', $header . '.' . $payload, $secret); + $header = Base64Url::encode($header); + $payload = Base64Url::encode($payload); + $signature = Base64Url::encode(hash_hmac('sha512', $header . '.' . $payload, $secret, true)); return $header . '.' . $payload . '.' . $signature; } -- cgit v1.2.3 From adc4aee80f7cd3242f65f0b316af2b560a64712c Mon Sep 17 00:00:00 2001 From: Knah Tsaeb Date: Wed, 7 Dec 2016 11:58:25 +0100 Subject: Change templates set through administration UI --- tests/ApplicationUtilsTest.php | 3 +++ 1 file changed, 3 insertions(+) (limited to 'tests') diff --git a/tests/ApplicationUtilsTest.php b/tests/ApplicationUtilsTest.php index 861b8d4e..634bd0ed 100644 --- a/tests/ApplicationUtilsTest.php +++ b/tests/ApplicationUtilsTest.php @@ -289,6 +289,7 @@ class ApplicationUtilsTest extends PHPUnit_Framework_TestCase $conf->set('resource.page_cache', 'pagecache'); $conf->set('resource.raintpl_tmp', 'tmp'); $conf->set('resource.raintpl_tpl', 'tpl'); + $conf->set('resource.theme', 'default'); $conf->set('resource.update_check', 'data/lastupdatecheck.txt'); $this->assertEquals( @@ -312,10 +313,12 @@ class ApplicationUtilsTest extends PHPUnit_Framework_TestCase $conf->set('resource.page_cache', 'null/pagecache'); $conf->set('resource.raintpl_tmp', 'null/tmp'); $conf->set('resource.raintpl_tpl', 'null/tpl'); + $conf->set('resource.raintpl_theme', 'null/tpl/default'); $conf->set('resource.update_check', 'null/data/lastupdatecheck.txt'); $this->assertEquals( array( '"null/tpl" directory is not readable', + '"null/tpl/default" directory is not readable', '"null/cache" directory is not readable', '"null/cache" directory is not writable', '"null/data" directory is not readable', -- cgit v1.2.3 From a0df06517bada0f811b464017ce385290e02c2bf Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 3 Jan 2017 11:42:21 +0100 Subject: Minor improvements regarding #705 (coding style, unit tests, etc.) --- tests/ApplicationUtilsTest.php | 44 ++++++++++++++++++++++++++++++++++ tests/Updater/UpdaterTest.php | 1 + tests/utils/config/configJson.json.php | 3 ++- 3 files changed, 47 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/ApplicationUtilsTest.php b/tests/ApplicationUtilsTest.php index 634bd0ed..c39649e8 100644 --- a/tests/ApplicationUtilsTest.php +++ b/tests/ApplicationUtilsTest.php @@ -331,4 +331,48 @@ class ApplicationUtilsTest extends PHPUnit_Framework_TestCase ApplicationUtils::checkResourcePermissions($conf) ); } + + /** + * Test getThemes() with existing theme directories. + */ + public function testGetThemes() + { + $themes = ['theme1', 'default', 'Bl1p_- bL0p']; + foreach ($themes as $theme) { + mkdir('sandbox/tpl/'. $theme, 0777, true); + } + + // include a file which should be ignored + touch('sandbox/tpl/supertheme'); + + $res = ApplicationUtils::getThemes('sandbox/tpl/'); + foreach ($res as $theme) { + $this->assertTrue(in_array($theme, $themes)); + } + $this->assertFalse(in_array('supertheme', $res)); + + foreach ($themes as $theme) { + rmdir('sandbox/tpl/'. $theme); + } + unlink('sandbox/tpl/supertheme'); + rmdir('sandbox/tpl'); + } + + /** + * Test getThemes() without any theme dir. + */ + public function testGetThemesEmpty() + { + mkdir('sandbox/tpl/', 0777, true); + $this->assertEquals([], ApplicationUtils::getThemes('sandbox/tpl/')); + rmdir('sandbox/tpl/'); + } + + /** + * Test getThemes() with an invalid path. + */ + public function testGetThemesInvalid() + { + $this->assertEquals([], ApplicationUtils::getThemes('nope')); + } } diff --git a/tests/Updater/UpdaterTest.php b/tests/Updater/UpdaterTest.php index 0171daad..a1530996 100644 --- a/tests/Updater/UpdaterTest.php +++ b/tests/Updater/UpdaterTest.php @@ -2,6 +2,7 @@ require_once 'application/config/ConfigManager.php'; require_once 'tests/Updater/DummyUpdater.php'; +require_once 'inc/rain.tpl.class.php'; /** * Class UpdaterTest. diff --git a/tests/utils/config/configJson.json.php b/tests/utils/config/configJson.json.php index 06a302e8..13d38c66 100644 --- a/tests/utils/config/configJson.json.php +++ b/tests/utils/config/configJson.json.php @@ -24,7 +24,8 @@ }, "resource": { "datastore": "tests\/utils\/config\/datastore.php", - "data_dir": "tests\/utils\/config" + "data_dir": "tests\/utils\/config", + "raintpl_tpl": "tpl/" }, "plugins": { "WALLABAG_VERSION": 1 -- cgit v1.2.3 From 04a0e8ea34c241fdf6bd30b11f5242656f9cd1c2 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 3 Jan 2017 12:01:25 +0100 Subject: Updater: keep custom theme preference with the new theme setting --- tests/ApplicationUtilsTest.php | 44 --------------------------------- tests/ThemeUtilsTest.php | 55 ++++++++++++++++++++++++++++++++++++++++++ tests/Updater/UpdaterTest.php | 44 +++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 44 deletions(-) create mode 100644 tests/ThemeUtilsTest.php (limited to 'tests') diff --git a/tests/ApplicationUtilsTest.php b/tests/ApplicationUtilsTest.php index c39649e8..634bd0ed 100644 --- a/tests/ApplicationUtilsTest.php +++ b/tests/ApplicationUtilsTest.php @@ -331,48 +331,4 @@ class ApplicationUtilsTest extends PHPUnit_Framework_TestCase ApplicationUtils::checkResourcePermissions($conf) ); } - - /** - * Test getThemes() with existing theme directories. - */ - public function testGetThemes() - { - $themes = ['theme1', 'default', 'Bl1p_- bL0p']; - foreach ($themes as $theme) { - mkdir('sandbox/tpl/'. $theme, 0777, true); - } - - // include a file which should be ignored - touch('sandbox/tpl/supertheme'); - - $res = ApplicationUtils::getThemes('sandbox/tpl/'); - foreach ($res as $theme) { - $this->assertTrue(in_array($theme, $themes)); - } - $this->assertFalse(in_array('supertheme', $res)); - - foreach ($themes as $theme) { - rmdir('sandbox/tpl/'. $theme); - } - unlink('sandbox/tpl/supertheme'); - rmdir('sandbox/tpl'); - } - - /** - * Test getThemes() without any theme dir. - */ - public function testGetThemesEmpty() - { - mkdir('sandbox/tpl/', 0777, true); - $this->assertEquals([], ApplicationUtils::getThemes('sandbox/tpl/')); - rmdir('sandbox/tpl/'); - } - - /** - * Test getThemes() with an invalid path. - */ - public function testGetThemesInvalid() - { - $this->assertEquals([], ApplicationUtils::getThemes('nope')); - } } diff --git a/tests/ThemeUtilsTest.php b/tests/ThemeUtilsTest.php new file mode 100644 index 00000000..e44564be --- /dev/null +++ b/tests/ThemeUtilsTest.php @@ -0,0 +1,55 @@ +assertTrue(in_array($theme, $themes)); + } + $this->assertFalse(in_array('supertheme', $res)); + + foreach ($themes as $theme) { + rmdir('sandbox/tpl/'. $theme); + } + unlink('sandbox/tpl/supertheme'); + rmdir('sandbox/tpl'); + } + + /** + * Test getThemes() without any theme dir. + */ + public function testGetThemesEmpty() + { + mkdir('sandbox/tpl/', 0755, true); + $this->assertEquals([], ThemeUtils::getThemes('sandbox/tpl/')); + rmdir('sandbox/tpl/'); + } + + /** + * Test getThemes() with an invalid path. + */ + public function testGetThemesInvalid() + { + $this->assertEquals([], ThemeUtils::getThemes('nope')); + } +} diff --git a/tests/Updater/UpdaterTest.php b/tests/Updater/UpdaterTest.php index a1530996..1d15cfaa 100644 --- a/tests/Updater/UpdaterTest.php +++ b/tests/Updater/UpdaterTest.php @@ -422,4 +422,48 @@ $GLOBALS[\'privateLinkByDefault\'] = true;'; $this->assertTrue($updater->updateMethodDatastoreIds()); $this->assertEquals($checksum, hash_file('sha1', self::$testDatastore)); } + + /** + * Test defaultTheme update with default settings: nothing to do. + */ + public function testDefaultThemeWithDefaultSettings() + { + $sandbox = 'sandbox/config'; + copy(self::$configFile . '.json.php', $sandbox . '.json.php'); + $this->conf = new ConfigManager($sandbox); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodDefaultTheme()); + + $this->assertEquals('tpl/', $this->conf->get('resource.raintpl_tpl')); + $this->assertEquals('default', $this->conf->get('resource.theme')); + $this->conf = new ConfigManager($sandbox); + $this->assertEquals('tpl/', $this->conf->get('resource.raintpl_tpl')); + $this->assertEquals('default', $this->conf->get('resource.theme')); + unlink($sandbox . '.json.php'); + } + + /** + * Test defaultTheme update with a custom theme in a subfolder + */ + public function testDefaultThemeWithCustomTheme() + { + $theme = 'iamanartist'; + $sandbox = 'sandbox/config'; + copy(self::$configFile . '.json.php', $sandbox . '.json.php'); + $this->conf = new ConfigManager($sandbox); + mkdir('sandbox/'. $theme); + touch('sandbox/'. $theme .'/linklist.html'); + $this->conf->set('resource.raintpl_tpl', 'sandbox/'. $theme .'/'); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodDefaultTheme()); + + $this->assertEquals('sandbox', $this->conf->get('resource.raintpl_tpl')); + $this->assertEquals($theme, $this->conf->get('resource.theme')); + $this->conf = new ConfigManager($sandbox); + $this->assertEquals('sandbox', $this->conf->get('resource.raintpl_tpl')); + $this->assertEquals($theme, $this->conf->get('resource.theme')); + unlink($sandbox . '.json.php'); + unlink('sandbox/'. $theme .'/linklist.html'); + rmdir('sandbox/'. $theme); + } } -- cgit v1.2.3 From 93b1fe54fb99efff30eec0d405cc7319fbbc1f95 Mon Sep 17 00:00:00 2001 From: VirtualTam Date: Thu, 5 Jan 2017 19:33:06 +0100 Subject: Cleanup: explicit method visibility Signed-off-by: VirtualTam --- tests/Url/UrlTest.php | 8 ++-- tests/plugins/PlugQrcodeTest.php | 67 ------------------------------ tests/plugins/PluginAddlinkTest.php | 10 ++--- tests/plugins/PluginArchiveorgTest.php | 10 ++--- tests/plugins/PluginIssoTest.php | 14 +++---- tests/plugins/PluginMarkdownTest.php | 20 ++++----- tests/plugins/PluginPlayvideosTest.php | 6 +-- tests/plugins/PluginPubsubhubbubTest.php | 6 +-- tests/plugins/PluginQrcodeTest.php | 67 ++++++++++++++++++++++++++++++ tests/plugins/PluginReadityourselfTest.php | 10 ++--- tests/plugins/PluginWallabagTest.php | 8 ++-- tests/plugins/WallabagInstanceTest.php | 8 ++-- 12 files changed, 115 insertions(+), 119 deletions(-) delete mode 100644 tests/plugins/PlugQrcodeTest.php create mode 100644 tests/plugins/PluginQrcodeTest.php (limited to 'tests') diff --git a/tests/Url/UrlTest.php b/tests/Url/UrlTest.php index 05862372..aa2f2234 100644 --- a/tests/Url/UrlTest.php +++ b/tests/Url/UrlTest.php @@ -157,7 +157,7 @@ class UrlTest extends PHPUnit_Framework_TestCase /** * Test add trailing slash. */ - function testAddTrailingSlash() + public function testAddTrailingSlash() { $strOn = 'http://randomstr.com/test/'; $strOff = 'http://randomstr.com/test'; @@ -168,7 +168,7 @@ class UrlTest extends PHPUnit_Framework_TestCase /** * Test valid HTTP url. */ - function testUrlIsHttp() + public function testUrlIsHttp() { $url = new Url(self::$baseUrl); $this->assertTrue($url->isHttp()); @@ -177,7 +177,7 @@ class UrlTest extends PHPUnit_Framework_TestCase /** * Test non HTTP url. */ - function testUrlIsNotHttp() + public function testUrlIsNotHttp() { $url = new Url('ftp://save.tld/mysave'); $this->assertFalse($url->isHttp()); @@ -186,7 +186,7 @@ class UrlTest extends PHPUnit_Framework_TestCase /** * Test International Domain Name to ASCII conversion */ - function testIdnToAscii() + public function testIdnToAscii() { $ind = 'http://www.académie-française.fr/'; $expected = 'http://www.xn--acadmie-franaise-npb1a.fr/'; diff --git a/tests/plugins/PlugQrcodeTest.php b/tests/plugins/PlugQrcodeTest.php deleted file mode 100644 index 86dc7f29..00000000 --- a/tests/plugins/PlugQrcodeTest.php +++ /dev/null @@ -1,67 +0,0 @@ - $str, - 'links' => array( - array( - 'url' => $str, - ) - ) - ); - - $data = hook_qrcode_render_linklist($data); - $link = $data['links'][0]; - // data shouldn't be altered - $this->assertEquals($str, $data['title']); - $this->assertEquals($str, $link['url']); - - // plugin data - $this->assertEquals(1, count($link['link_plugin'])); - $this->assertNotFalse(strpos($link['link_plugin'][0], $str)); - } - - /** - * Test render_footer hook. - */ - function testQrcodeFooter() - { - $str = 'stuff'; - $data = array($str => $str); - $data['_PAGE_'] = Router::$PAGE_LINKLIST; - - $data = hook_qrcode_render_footer($data); - $this->assertEquals($str, $data[$str]); - $this->assertEquals(1, count($data['js_files'])); - - $data = array($str => $str); - $data['_PAGE_'] = $str; - $this->assertEquals($str, $data[$str]); - $this->assertArrayNotHasKey('js_files', $data); - } -} diff --git a/tests/plugins/PluginAddlinkTest.php b/tests/plugins/PluginAddlinkTest.php index a2f25bec..b77fe12a 100644 --- a/tests/plugins/PluginAddlinkTest.php +++ b/tests/plugins/PluginAddlinkTest.php @@ -16,7 +16,7 @@ class PluginAddlinkTest extends PHPUnit_Framework_TestCase /** * Reset plugin path. */ - function setUp() + public function setUp() { PluginManager::$PLUGINS_PATH = 'plugins'; } @@ -24,7 +24,7 @@ class PluginAddlinkTest extends PHPUnit_Framework_TestCase /** * Test render_header hook while logged in. */ - function testAddlinkHeaderLoggedIn() + public function testAddlinkHeaderLoggedIn() { $str = 'stuff'; $data = array($str => $str); @@ -46,7 +46,7 @@ class PluginAddlinkTest extends PHPUnit_Framework_TestCase /** * Test render_header hook while logged out. */ - function testAddlinkHeaderLoggedOut() + public function testAddlinkHeaderLoggedOut() { $str = 'stuff'; $data = array($str => $str); @@ -61,7 +61,7 @@ class PluginAddlinkTest extends PHPUnit_Framework_TestCase /** * Test render_includes hook while logged in. */ - function testAddlinkIncludesLoggedIn() + public function testAddlinkIncludesLoggedIn() { $str = 'stuff'; $data = array($str => $str); @@ -86,7 +86,7 @@ class PluginAddlinkTest extends PHPUnit_Framework_TestCase * Test render_includes hook. * Should not affect css files while logged out. */ - function testAddlinkIncludesLoggedOut() + public function testAddlinkIncludesLoggedOut() { $str = 'stuff'; $data = array($str => $str); diff --git a/tests/plugins/PluginArchiveorgTest.php b/tests/plugins/PluginArchiveorgTest.php index 4daa4c9d..fecd5f2c 100644 --- a/tests/plugins/PluginArchiveorgTest.php +++ b/tests/plugins/PluginArchiveorgTest.php @@ -15,7 +15,7 @@ class PluginArchiveorgTest extends PHPUnit_Framework_TestCase /** * Reset plugin path */ - function setUp() + public function setUp() { PluginManager::$PLUGINS_PATH = 'plugins'; } @@ -23,7 +23,7 @@ class PluginArchiveorgTest extends PHPUnit_Framework_TestCase /** * Test render_linklist hook on external links. */ - function testArchiveorgLinklistOnExternalLinks() + public function testArchiveorgLinklistOnExternalLinks() { $str = 'http://randomstr.com/test'; @@ -48,13 +48,12 @@ class PluginArchiveorgTest extends PHPUnit_Framework_TestCase // plugin data $this->assertEquals(1, count($link['link_plugin'])); $this->assertNotFalse(strpos($link['link_plugin'][0], $str)); - } /** * Test render_linklist hook on internal links. */ - function testArchiveorgLinklistOnInternalLinks() + public function testArchiveorgLinklistOnInternalLinks() { $internalLink1 = 'http://shaarli.shaarli/?qvMAqg'; $internalLinkRealURL1 = '?qvMAqg'; @@ -101,7 +100,6 @@ class PluginArchiveorgTest extends PHPUnit_Framework_TestCase ) ); - $data = hook_archiveorg_render_linklist($data); // Case n°1: first link type, public @@ -136,7 +134,5 @@ class PluginArchiveorgTest extends PHPUnit_Framework_TestCase $link = $data['links'][5]; $this->assertArrayNotHasKey('link_plugin', $link); - } - } diff --git a/tests/plugins/PluginIssoTest.php b/tests/plugins/PluginIssoTest.php index 6b7904dd..03def208 100644 --- a/tests/plugins/PluginIssoTest.php +++ b/tests/plugins/PluginIssoTest.php @@ -12,7 +12,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase /** * Reset plugin path */ - function setUp() + public function setUp() { PluginManager::$PLUGINS_PATH = 'plugins'; } @@ -20,7 +20,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase /** * Test Isso init without errors. */ - function testWallabagInitNoError() + public function testWallabagInitNoError() { $conf = new ConfigManager(''); $conf->set('plugins.ISSO_SERVER', 'value'); @@ -31,7 +31,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase /** * Test Isso init with errors. */ - function testWallabagInitError() + public function testWallabagInitError() { $conf = new ConfigManager(''); $errors = isso_init($conf); @@ -41,7 +41,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase /** * Test render_linklist hook with valid settings to display the comment form. */ - function testIssoDisplayed() + public function testIssoDisplayed() { $conf = new ConfigManager(''); $conf->set('plugins.ISSO_SERVER', 'value'); @@ -81,7 +81,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase /** * Test isso plugin when multiple links are displayed (shouldn't be displayed). */ - function testIssoMultipleLinks() + public function testIssoMultipleLinks() { $conf = new ConfigManager(''); $conf->set('plugins.ISSO_SERVER', 'value'); @@ -113,7 +113,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase /** * Test isso plugin when using search (shouldn't be displayed). */ - function testIssoNotDisplayedWhenSearch() + public function testIssoNotDisplayedWhenSearch() { $conf = new ConfigManager(''); $conf->set('plugins.ISSO_SERVER', 'value'); @@ -141,7 +141,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase /** * Test isso plugin without server configuration (shouldn't be displayed). */ - function testIssoWithoutConf() + public function testIssoWithoutConf() { $data = 'abc'; $conf = new ConfigManager(''); diff --git a/tests/plugins/PluginMarkdownTest.php b/tests/plugins/PluginMarkdownTest.php index 17ef2280..d359b2a1 100644 --- a/tests/plugins/PluginMarkdownTest.php +++ b/tests/plugins/PluginMarkdownTest.php @@ -16,7 +16,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase /** * Reset plugin path */ - function setUp() + public function setUp() { PluginManager::$PLUGINS_PATH = 'plugins'; } @@ -25,7 +25,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase * Test render_linklist hook. * Only check that there is basic markdown rendering. */ - function testMarkdownLinklist() + public function testMarkdownLinklist() { $markdown = '# My title' . PHP_EOL . 'Very interesting content.'; $data = array( @@ -45,7 +45,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase * Test render_daily hook. * Only check that there is basic markdown rendering. */ - function testMarkdownDaily() + public function testMarkdownDaily() { $markdown = '# My title' . PHP_EOL . 'Very interesting content.'; $data = array( @@ -69,7 +69,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase /** * Test reverse_text2clickable(). */ - function testReverseText2clickable() + public function testReverseText2clickable() { $text = 'stuff http://hello.there/is=someone#here otherstuff'; $clickableText = text2clickable($text, ''); @@ -80,7 +80,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase /** * Test reverse_nl2br(). */ - function testReverseNl2br() + public function testReverseNl2br() { $text = 'stuff' . PHP_EOL . 'otherstuff'; $processedText = nl2br($text); @@ -91,7 +91,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase /** * Test reverse_space2nbsp(). */ - function testReverseSpace2nbsp() + public function testReverseSpace2nbsp() { $text = ' stuff' . PHP_EOL . ' otherstuff and another'; $processedText = space2nbsp($text); @@ -102,7 +102,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase /** * Test sanitize_html(). */ - function testSanitizeHtml() + public function testSanitizeHtml() { $input = '< script src="js.js"/>'; $input .= '< script attr>alert(\'xss\');'; @@ -119,7 +119,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase /** * Test the no markdown tag. */ - function testNoMarkdownTag() + public function testNoMarkdownTag() { $str = 'All _work_ and `no play` makes Jack a *dull* boy.'; $data = array( @@ -158,7 +158,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase /** * Test that a close value to nomarkdown is not understand as nomarkdown (previous value `.nomarkdown`). */ - function testNoMarkdownNotExcactlyMatching() + public function testNoMarkdownNotExcactlyMatching() { $str = 'All _work_ and `no play` makes Jack a *dull* boy.'; $data = array( @@ -176,7 +176,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase /** * Test hashtag links processed with markdown. */ - function testMarkdownHashtagLinks() + public function testMarkdownHashtagLinks() { $md = file_get_contents('tests/plugins/resources/markdown.md'); $md = format_description($md); diff --git a/tests/plugins/PluginPlayvideosTest.php b/tests/plugins/PluginPlayvideosTest.php index be1ef774..29ad047f 100644 --- a/tests/plugins/PluginPlayvideosTest.php +++ b/tests/plugins/PluginPlayvideosTest.php @@ -16,7 +16,7 @@ class PluginPlayvideosTest extends PHPUnit_Framework_TestCase /** * Reset plugin path */ - function setUp() + public function setUp() { PluginManager::$PLUGINS_PATH = 'plugins'; } @@ -24,7 +24,7 @@ class PluginPlayvideosTest extends PHPUnit_Framework_TestCase /** * Test render_linklist hook. */ - function testPlayvideosHeader() + public function testPlayvideosHeader() { $str = 'stuff'; $data = array($str => $str); @@ -43,7 +43,7 @@ class PluginPlayvideosTest extends PHPUnit_Framework_TestCase /** * Test render_footer hook. */ - function testPlayvideosFooter() + public function testPlayvideosFooter() { $str = 'stuff'; $data = array($str => $str); diff --git a/tests/plugins/PluginPubsubhubbubTest.php b/tests/plugins/PluginPubsubhubbubTest.php index 24dd7a11..1bd87935 100644 --- a/tests/plugins/PluginPubsubhubbubTest.php +++ b/tests/plugins/PluginPubsubhubbubTest.php @@ -17,7 +17,7 @@ class PluginPubsubhubbubTest extends PHPUnit_Framework_TestCase /** * Reset plugin path */ - function setUp() + public function setUp() { PluginManager::$PLUGINS_PATH = 'plugins'; } @@ -25,7 +25,7 @@ class PluginPubsubhubbubTest extends PHPUnit_Framework_TestCase /** * Test render_feed hook with an RSS feed. */ - function testPubSubRssRenderFeed() + public function testPubSubRssRenderFeed() { $hub = 'http://domain.hub'; $conf = new ConfigManager(self::$configFile); @@ -40,7 +40,7 @@ class PluginPubsubhubbubTest extends PHPUnit_Framework_TestCase /** * Test render_feed hook with an ATOM feed. */ - function testPubSubAtomRenderFeed() + public function testPubSubAtomRenderFeed() { $hub = 'http://domain.hub'; $conf = new ConfigManager(self::$configFile); diff --git a/tests/plugins/PluginQrcodeTest.php b/tests/plugins/PluginQrcodeTest.php new file mode 100644 index 00000000..211ee89c --- /dev/null +++ b/tests/plugins/PluginQrcodeTest.php @@ -0,0 +1,67 @@ + $str, + 'links' => array( + array( + 'url' => $str, + ) + ) + ); + + $data = hook_qrcode_render_linklist($data); + $link = $data['links'][0]; + // data shouldn't be altered + $this->assertEquals($str, $data['title']); + $this->assertEquals($str, $link['url']); + + // plugin data + $this->assertEquals(1, count($link['link_plugin'])); + $this->assertNotFalse(strpos($link['link_plugin'][0], $str)); + } + + /** + * Test render_footer hook. + */ + public function testQrcodeFooter() + { + $str = 'stuff'; + $data = array($str => $str); + $data['_PAGE_'] = Router::$PAGE_LINKLIST; + + $data = hook_qrcode_render_footer($data); + $this->assertEquals($str, $data[$str]); + $this->assertEquals(1, count($data['js_files'])); + + $data = array($str => $str); + $data['_PAGE_'] = $str; + $this->assertEquals($str, $data[$str]); + $this->assertArrayNotHasKey('js_files', $data); + } +} diff --git a/tests/plugins/PluginReadityourselfTest.php b/tests/plugins/PluginReadityourselfTest.php index 532db146..30470ab7 100644 --- a/tests/plugins/PluginReadityourselfTest.php +++ b/tests/plugins/PluginReadityourselfTest.php @@ -15,7 +15,7 @@ class PluginReadityourselfTest extends PHPUnit_Framework_TestCase /** * Reset plugin path */ - function setUp() + public function setUp() { PluginManager::$PLUGINS_PATH = 'plugins'; } @@ -23,7 +23,7 @@ class PluginReadityourselfTest extends PHPUnit_Framework_TestCase /** * Test Readityourself init without errors. */ - function testReadityourselfInitNoError() + public function testReadityourselfInitNoError() { $conf = new ConfigManager(''); $conf->set('plugins.READITYOUSELF_URL', 'value'); @@ -34,7 +34,7 @@ class PluginReadityourselfTest extends PHPUnit_Framework_TestCase /** * Test Readityourself init with errors. */ - function testReadityourselfInitError() + public function testReadityourselfInitError() { $conf = new ConfigManager(''); $errors = readityourself_init($conf); @@ -44,7 +44,7 @@ class PluginReadityourselfTest extends PHPUnit_Framework_TestCase /** * Test render_linklist hook. */ - function testReadityourselfLinklist() + public function testReadityourselfLinklist() { $conf = new ConfigManager(''); $conf->set('plugins.READITYOUSELF_URL', 'value'); @@ -72,7 +72,7 @@ class PluginReadityourselfTest extends PHPUnit_Framework_TestCase /** * Test without config: nothing should happened. */ - function testReadityourselfLinklistWithoutConfig() + public function testReadityourselfLinklistWithoutConfig() { $conf = new ConfigManager(''); $conf->set('plugins.READITYOUSELF_URL', null); diff --git a/tests/plugins/PluginWallabagTest.php b/tests/plugins/PluginWallabagTest.php index 2c268cbd..30351f46 100644 --- a/tests/plugins/PluginWallabagTest.php +++ b/tests/plugins/PluginWallabagTest.php @@ -15,7 +15,7 @@ class PluginWallabagTest extends PHPUnit_Framework_TestCase /** * Reset plugin path */ - function setUp() + public function setUp() { PluginManager::$PLUGINS_PATH = 'plugins'; } @@ -23,7 +23,7 @@ class PluginWallabagTest extends PHPUnit_Framework_TestCase /** * Test wallabag init without errors. */ - function testWallabagInitNoError() + public function testWallabagInitNoError() { $conf = new ConfigManager(''); $conf->set('plugins.WALLABAG_URL', 'value'); @@ -34,7 +34,7 @@ class PluginWallabagTest extends PHPUnit_Framework_TestCase /** * Test wallabag init with errors. */ - function testWallabagInitError() + public function testWallabagInitError() { $conf = new ConfigManager(''); $errors = wallabag_init($conf); @@ -44,7 +44,7 @@ class PluginWallabagTest extends PHPUnit_Framework_TestCase /** * Test render_linklist hook. */ - function testWallabagLinklist() + public function testWallabagLinklist() { $conf = new ConfigManager(''); $conf->set('plugins.WALLABAG_URL', 'value'); diff --git a/tests/plugins/WallabagInstanceTest.php b/tests/plugins/WallabagInstanceTest.php index 7c14c1df..2c466871 100644 --- a/tests/plugins/WallabagInstanceTest.php +++ b/tests/plugins/WallabagInstanceTest.php @@ -15,7 +15,7 @@ class WallabagInstanceTest extends PHPUnit_Framework_TestCase /** * Reset plugin path */ - function setUp() + public function setUp() { $this->instance = 'http://some.url'; } @@ -23,7 +23,7 @@ class WallabagInstanceTest extends PHPUnit_Framework_TestCase /** * Test WallabagInstance with API V1. */ - function testWallabagInstanceV1() + public function testWallabagInstanceV1() { $instance = new WallabagInstance($this->instance, 1); $expected = $this->instance . '/?plainurl='; @@ -34,7 +34,7 @@ class WallabagInstanceTest extends PHPUnit_Framework_TestCase /** * Test WallabagInstance with API V2. */ - function testWallabagInstanceV2() + public function testWallabagInstanceV2() { $instance = new WallabagInstance($this->instance, 2); $expected = $this->instance . '/bookmarklet?url='; @@ -45,7 +45,7 @@ class WallabagInstanceTest extends PHPUnit_Framework_TestCase /** * Test WallabagInstance with an invalid API version. */ - function testWallabagInstanceInvalidVersion() + public function testWallabagInstanceInvalidVersion() { $instance = new WallabagInstance($this->instance, false); $expected = $this->instance . '/?plainurl='; -- cgit v1.2.3 From 63ef549749fac9d0e302842f06e7794d1daabc13 Mon Sep 17 00:00:00 2001 From: VirtualTam Date: Sat, 7 Jan 2017 22:23:47 +0100 Subject: API: expect JWT in the Authorization header Relates to https://github.com/shaarli/Shaarli/pull/731 Added: - require the presence of the 'Authorization' header Changed: - use the HTTP Bearer Token authorization schema See: - https://jwt.io/introduction/#how-do-json-web-tokens-work- - https://tools.ietf.org/html/rfc6750 - http://security.stackexchange.com/q/108662 Signed-off-by: VirtualTam --- tests/api/ApiMiddlewareTest.php | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'tests') diff --git a/tests/api/ApiMiddlewareTest.php b/tests/api/ApiMiddlewareTest.php index 4d4dd9b9..d9753b1d 100644 --- a/tests/api/ApiMiddlewareTest.php +++ b/tests/api/ApiMiddlewareTest.php @@ -143,7 +143,7 @@ class ApiMiddlewareTest extends \PHPUnit_Framework_TestCase $env = Environment::mock([ 'REQUEST_METHOD' => 'GET', 'REQUEST_URI' => '/echo', - 'HTTP_JWT'=> 'jwt', + 'HTTP_AUTHORIZATION'=> 'Bearer jwt', ]); $request = Request::createFromEnvironment($env); $response = new Response(); @@ -157,7 +157,30 @@ class ApiMiddlewareTest extends \PHPUnit_Framework_TestCase } /** - * Invoke the middleware without an invalid JWT token (debug): + * Invoke the middleware with an invalid JWT token header + */ + public function testInvalidJwtAuthHeaderDebug() + { + $this->conf->set('dev.debug', true); + $mw = new ApiMiddleware($this->container); + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'REQUEST_URI' => '/echo', + 'HTTP_AUTHORIZATION'=> 'PolarBearer jwt', + ]); + $request = Request::createFromEnvironment($env); + $response = new Response(); + /** @var Response $response */ + $response = $mw($request, $response, null); + + $this->assertEquals(401, $response->getStatusCode()); + $body = json_decode((string) $response->getBody()); + $this->assertEquals('Not authorized: Invalid JWT header', $body->message); + $this->assertContains('ApiAuthorizationException', $body->stacktrace); + } + + /** + * Invoke the middleware with an invalid JWT token (debug): * should return a 401 error Unauthorized - with a specific message and a stacktrace. * * Note: specific JWT errors tests are handled in ApiUtilsTest. @@ -169,7 +192,7 @@ class ApiMiddlewareTest extends \PHPUnit_Framework_TestCase $env = Environment::mock([ 'REQUEST_METHOD' => 'GET', 'REQUEST_URI' => '/echo', - 'HTTP_JWT'=> 'bad jwt', + 'HTTP_AUTHORIZATION'=> 'Bearer jwt', ]); $request = Request::createFromEnvironment($env); $response = new Response(); -- cgit v1.2.3 From c3b00963fe22479e87998c82bc83827a54c8d972 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Thu, 22 Dec 2016 14:36:45 +0100 Subject: REST API: implement getLinks service See http://shaarli.github.io/api-documentation/#links-links-collection-get --- tests/api/ApiUtilsTest.php | 65 ++++++ tests/api/controllers/LinksTest.php | 393 ++++++++++++++++++++++++++++++++++++ 2 files changed, 458 insertions(+) create mode 100644 tests/api/controllers/LinksTest.php (limited to 'tests') diff --git a/tests/api/ApiUtilsTest.php b/tests/api/ApiUtilsTest.php index 10da1459..516ee686 100644 --- a/tests/api/ApiUtilsTest.php +++ b/tests/api/ApiUtilsTest.php @@ -203,4 +203,69 @@ class ApiUtilsTest extends \PHPUnit_Framework_TestCase $token = $this->generateCustomJwtToken('{"JSON":1}', '{"iat":' . (time() + 60) . '}', 'secret'); ApiUtils::validateJwtToken($token, 'secret'); } + + /** + * Test formatLink() with a link using all useful fields. + */ + public function testFormatLinkComplete() + { + $indexUrl = 'https://domain.tld/sub/'; + $link = [ + 'id' => 12, + 'url' => 'http://lol.lol', + 'shorturl' => 'abc', + 'title' => 'Important Title', + 'description' => 'It is very lol' . PHP_EOL . 'new line', + 'tags' => 'blip .blop ', + 'private' => '1', + 'created' => \DateTime::createFromFormat('Ymd_His', '20170107_160102'), + 'updated' => \DateTime::createFromFormat('Ymd_His', '20170107_160612'), + ]; + + $expected = [ + 'id' => 12, + 'url' => 'http://lol.lol', + 'shorturl' => 'abc', + 'title' => 'Important Title', + 'description' => 'It is very lol' . PHP_EOL . 'new line', + 'tags' => ['blip', '.blop'], + 'private' => true, + 'created' => '2017-01-07T16:01:02+00:00', + 'updated' => '2017-01-07T16:06:12+00:00', + ]; + + $this->assertEquals($expected, ApiUtils::formatLink($link, $indexUrl)); + } + + /** + * Test formatLink() with only minimal fields filled, and internal link. + */ + public function testFormatLinkMinimalNote() + { + $indexUrl = 'https://domain.tld/sub/'; + $link = [ + 'id' => 12, + 'url' => '?abc', + 'shorturl' => 'abc', + 'title' => 'Note', + 'description' => '', + 'tags' => '', + 'private' => '', + 'created' => \DateTime::createFromFormat('Ymd_His', '20170107_160102'), + ]; + + $expected = [ + 'id' => 12, + 'url' => 'https://domain.tld/sub/?abc', + 'shorturl' => 'abc', + 'title' => 'Note', + 'description' => '', + 'tags' => [], + 'private' => false, + 'created' => '2017-01-07T16:01:02+00:00', + 'updated' => '', + ]; + + $this->assertEquals($expected, ApiUtils::formatLink($link, $indexUrl)); + } } diff --git a/tests/api/controllers/LinksTest.php b/tests/api/controllers/LinksTest.php new file mode 100644 index 00000000..4ead26b9 --- /dev/null +++ b/tests/api/controllers/LinksTest.php @@ -0,0 +1,393 @@ +conf = new \ConfigManager('tests/utils/config/configJson.json.php'); + $this->refDB = new \ReferenceLinkDB(); + $this->refDB->write(self::$testDatastore); + + $this->container = new Container(); + $this->container['conf'] = $this->conf; + $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + + $this->controller = new Links($this->container); + } + + /** + * After every test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testDatastore); + } + + /** + * Test basic getLinks service: returns all links. + */ + public function testGetLinks() + { + // Used by index_url(). + $_SERVER['SERVER_NAME'] = 'domain.tld'; + $_SERVER['SERVER_PORT'] = 80; + $_SERVER['SCRIPT_NAME'] = '/'; + + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals($this->refDB->countLinks(), count($data)); + + // Check order + $order = [41, 8, 6, 7, 0, 1, 4, 42]; + $cpt = 0; + foreach ($data as $link) { + $this->assertEquals(self::NB_FIELDS_LINK, count($link)); + $this->assertEquals($order[$cpt++], $link['id']); + } + + // Check first element fields\ + $first = $data[0]; + $this->assertEquals('http://domain.tld/?WDWyig', $first['url']); + $this->assertEquals('WDWyig', $first['shorturl']); + $this->assertEquals('Link title: @website', $first['title']); + $this->assertEquals( + 'Stallman has a beard and is part of the Free Software Foundation (or not). Seriously, read this. #hashtag', + $first['description'] + ); + $this->assertEquals('sTuff', $first['tags'][0]); + $this->assertEquals(false, $first['private']); + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM), + $first['created'] + ); + $this->assertEmpty($first['updated']); + + // Multi tags + $link = $data[1]; + $this->assertEquals(7, count($link['tags'])); + + // Update date + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20160803_093033')->format(\DateTime::ATOM), + $link['updated'] + ); + } + + /** + * Test getLinks service with offset and limit parameter: + * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). + */ + public function testGetLinksOffsetLimit() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'offset=1&limit=1' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(8, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks with limit=all (return all link). + */ + public function testGetLinksLimitAll() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'limit=all' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals($this->refDB->countLinks(), count($data)); + // Check order + $order = [41, 8, 6, 7, 0, 1, 4, 42]; + $cpt = 0; + foreach ($data as $link) { + $this->assertEquals(self::NB_FIELDS_LINK, count($link)); + $this->assertEquals($order[$cpt++], $link['id']); + } + } + + /** + * Test getLinks service with offset and limit parameter: + * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). + */ + public function testGetLinksOffsetTooHigh() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'offset=100' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEmpty(count($data)); + } + + /** + * Test getLinks with private attribute to 1 or true. + */ + public function testGetLinksPrivate() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'private=true' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals($this->refDB->countPrivateLinks(), count($data)); + $this->assertEquals(6, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'private=1' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals($this->refDB->countPrivateLinks(), count($data)); + $this->assertEquals(6, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks with private attribute to false or 0 + */ + public function testGetLinksNotPrivate() + { + $env = Environment::mock( + [ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'private=0' + ] + ); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string)$response->getBody(), true); + $this->assertEquals($this->refDB->countLinks(), count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + + $env = Environment::mock( + [ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'private=false' + ] + ); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string)$response->getBody(), true); + $this->assertEquals($this->refDB->countLinks(), count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks service with offset and limit parameter: + * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). + */ + public function testGetLinksSearchTerm() + { + // Only in description - 1 result + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=Tropical' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(1, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + + // Only in tags - 1 result + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=tag3' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(0, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + + // Multiple results (2) + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=stallman' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(8, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + + // Multiword - 2 results + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=stallman+software' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(8, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + + // URL encoding + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm='. urlencode('@web') + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(8, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + } + + public function testGetLinksSearchTermNoResult() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=nope' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(0, count($data)); + } + + public function testGetLinksSearchTags() + { + // Single tag + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchtags=dev', + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(0, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(4, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + + // Multitag + exclude + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchtags=stuff+-gnu', + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks service with search tags+terms. + */ + public function testGetLinksSearchTermsAndTags() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=poke&searchtags=dev', + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(0, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } +} -- cgit v1.2.3 From 053673cb71a45a38a2eb517c4e630656a5626327 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 15 Jan 2017 17:50:16 +0100 Subject: Remove CSS call for addlink toolbar plugin Fixes #724 --- tests/plugins/PluginAddlinkTest.php | 40 ------------------------------------- 1 file changed, 40 deletions(-) (limited to 'tests') diff --git a/tests/plugins/PluginAddlinkTest.php b/tests/plugins/PluginAddlinkTest.php index b77fe12a..b6239e7f 100644 --- a/tests/plugins/PluginAddlinkTest.php +++ b/tests/plugins/PluginAddlinkTest.php @@ -57,44 +57,4 @@ class PluginAddlinkTest extends PHPUnit_Framework_TestCase $this->assertEquals($str, $data[$str]); $this->assertArrayNotHasKey('fields_toolbar', $data); } - - /** - * Test render_includes hook while logged in. - */ - public function testAddlinkIncludesLoggedIn() - { - $str = 'stuff'; - $data = array($str => $str); - $data['_PAGE_'] = Router::$PAGE_LINKLIST; - $data['_LOGGEDIN_'] = true; - - $data = hook_addlink_toolbar_render_includes($data); - $this->assertEquals($str, $data[$str]); - $this->assertEquals(1, count($data['css_files'])); - - $str = 'stuff'; - $data = array($str => $str); - $data['_PAGE_'] = $str; - $data['_LOGGEDIN_'] = true; - - $data = hook_addlink_toolbar_render_includes($data); - $this->assertEquals($str, $data[$str]); - $this->assertArrayNotHasKey('css_files', $data); - } - - /** - * Test render_includes hook. - * Should not affect css files while logged out. - */ - public function testAddlinkIncludesLoggedOut() - { - $str = 'stuff'; - $data = array($str => $str); - $data['_PAGE_'] = Router::$PAGE_LINKLIST; - $data['_LOGGEDIN_'] = false; - - $data = hook_addlink_toolbar_render_includes($data); - $this->assertEquals($str, $data[$str]); - $this->assertArrayNotHasKey('css_files', $data); - } } -- cgit v1.2.3 From 7f96d9ec21a95cb85d0292b46e18235b20efbcb2 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 16 Jan 2017 13:57:11 +0100 Subject: Update LinkFilter to be able to filter only public links No update regarding the UI or the API for now Fixes #758 --- tests/LinkFilterTest.php | 73 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 10 deletions(-) (limited to 'tests') diff --git a/tests/LinkFilterTest.php b/tests/LinkFilterTest.php index 21d680a5..37d5ca30 100644 --- a/tests/LinkFilterTest.php +++ b/tests/LinkFilterTest.php @@ -12,13 +12,18 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase */ protected static $linkFilter; + /** + * @var ReferenceLinkDB instance + */ + protected static $refDB; + /** * Instanciate linkFilter with ReferenceLinkDB data. */ public static function setUpBeforeClass() { - $refDB = new ReferenceLinkDB(); - self::$linkFilter = new LinkFilter($refDB->getLinks()); + self::$refDB = new ReferenceLinkDB(); + self::$linkFilter = new LinkFilter(self::$refDB->getLinks()); } /** @@ -27,14 +32,30 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase public function testFilter() { $this->assertEquals( - ReferenceLinkDB::$NB_LINKS_TOTAL, + self::$refDB->countLinks(), count(self::$linkFilter->filter('', '')) ); + $this->assertEquals( + self::$refDB->countLinks(), + count(self::$linkFilter->filter('', '', 'all')) + ); + + $this->assertEquals( + self::$refDB->countLinks(), + count(self::$linkFilter->filter('', '', 'randomstr')) + ); + // Private only. $this->assertEquals( - 2, - count(self::$linkFilter->filter('', '', false, true)) + self::$refDB->countPrivateLinks(), + count(self::$linkFilter->filter('', '', false, 'private')) + ); + + // Public only. + $this->assertEquals( + self::$refDB->countPublicLinks(), + count(self::$linkFilter->filter('', '', false, 'public')) ); $this->assertEquals( @@ -58,10 +79,26 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false)) ); + $this->assertEquals( + 4, + count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'all')) + ); + + $this->assertEquals( + 4, + count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'default-blabla')) + ); + // Private only. $this->assertEquals( 1, - count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, true)) + count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'private')) + ); + + // Public only. + $this->assertEquals( + 3, + count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'public')) ); } @@ -253,14 +290,30 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase public function testFilterFullTextTags() { $this->assertEquals( - 2, - count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'gnu')) + 6, + count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web')) + ); + + $this->assertEquals( + 6, + count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', 'all')) + ); + + $this->assertEquals( + 6, + count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', 'bla')) ); // Private only. $this->assertEquals( 1, - count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, true)) + count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, 'private')) + ); + + // Public only. + $this->assertEquals( + 5, + count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, 'public')) ); } @@ -409,7 +462,7 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase LinkFilter::$FILTER_TAG, $hashtag, false, - true + 'private' )) ); } -- cgit v1.2.3 From c37a6f820b0a213ee2d5980a96aafac262aeb97a Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 17 Jan 2017 18:51:40 +0100 Subject: REST API - getLinks: support the visibility parameter --- tests/api/controllers/LinksTest.php | 50 ++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 28 deletions(-) (limited to 'tests') diff --git a/tests/api/controllers/LinksTest.php b/tests/api/controllers/LinksTest.php index 4ead26b9..284c3a9d 100644 --- a/tests/api/controllers/LinksTest.php +++ b/tests/api/controllers/LinksTest.php @@ -188,25 +188,33 @@ class LinksTest extends \PHPUnit_Framework_TestCase } /** - * Test getLinks with private attribute to 1 or true. + * Test getLinks with visibility parameter set to all */ - public function testGetLinksPrivate() + public function testGetLinksVisibilityAll() { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'private=true' - ]); + $env = Environment::mock( + [ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'visibility=all' + ] + ); $request = Request::createFromEnvironment($env); $response = $this->controller->getLinks($request, new Response()); $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals($this->refDB->countPrivateLinks(), count($data)); - $this->assertEquals(6, $data[0]['id']); + $data = json_decode((string)$response->getBody(), true); + $this->assertEquals($this->refDB->countLinks(), count($data)); + $this->assertEquals(41, $data[0]['id']); $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + /** + * Test getLinks with visibility parameter set to private + */ + public function testGetLinksVisibilityPrivate() + { $env = Environment::mock([ 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'private=1' + 'QUERY_STRING' => 'visibility=private' ]); $request = Request::createFromEnvironment($env); $response = $this->controller->getLinks($request, new Response()); @@ -218,35 +226,21 @@ class LinksTest extends \PHPUnit_Framework_TestCase } /** - * Test getLinks with private attribute to false or 0 + * Test getLinks with visibility parameter set to public */ - public function testGetLinksNotPrivate() + public function testGetLinksVisibilityPublic() { $env = Environment::mock( [ 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'private=0' - ] - ); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string)$response->getBody(), true); - $this->assertEquals($this->refDB->countLinks(), count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - - $env = Environment::mock( - [ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'private=false' + 'QUERY_STRING' => 'visibility=public' ] ); $request = Request::createFromEnvironment($env); $response = $this->controller->getLinks($request, new Response()); $this->assertEquals(200, $response->getStatusCode()); $data = json_decode((string)$response->getBody(), true); - $this->assertEquals($this->refDB->countLinks(), count($data)); + $this->assertEquals($this->refDB->countPublicLinks(), count($data)); $this->assertEquals(41, $data[0]['id']); $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); } -- cgit v1.2.3 From 16e3d006e9e9386001881053f610657525feb188 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 24 Dec 2016 10:30:21 +0100 Subject: REST API: implements getLink by ID service See http://shaarli.github.io/api-documentation/#links-link-get --- tests/api/controllers/GetLinkIdTest.php | 130 +++++++++++ tests/api/controllers/GetLinksTest.php | 388 ++++++++++++++++++++++++++++++++ tests/api/controllers/LinksTest.php | 387 ------------------------------- 3 files changed, 518 insertions(+), 387 deletions(-) create mode 100644 tests/api/controllers/GetLinkIdTest.php create mode 100644 tests/api/controllers/GetLinksTest.php delete mode 100644 tests/api/controllers/LinksTest.php (limited to 'tests') diff --git a/tests/api/controllers/GetLinkIdTest.php b/tests/api/controllers/GetLinkIdTest.php new file mode 100644 index 00000000..1b020505 --- /dev/null +++ b/tests/api/controllers/GetLinkIdTest.php @@ -0,0 +1,130 @@ +conf = new \ConfigManager('tests/utils/config/configJson'); + $this->refDB = new \ReferenceLinkDB(); + $this->refDB->write(self::$testDatastore); + + $this->container = new Container(); + $this->container['conf'] = $this->conf; + $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + + $this->controller = new Links($this->container); + } + + /** + * After each test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testDatastore); + } + + /** + * Test basic getLink service: return link ID=41. + */ + public function testGetLinkId() + { + // Used by index_url(). + $_SERVER['SERVER_NAME'] = 'domain.tld'; + $_SERVER['SERVER_PORT'] = 80; + $_SERVER['SCRIPT_NAME'] = '/'; + + $id = 41; + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->getLink($request, new Response(), ['id' => $id]); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(self::NB_FIELDS_LINK, count($data)); + $this->assertEquals($id, $data['id']); + + // Check link elements + $this->assertEquals('http://domain.tld/?WDWyig', $data['url']); + $this->assertEquals('WDWyig', $data['shorturl']); + $this->assertEquals('Link title: @website', $data['title']); + $this->assertEquals( + 'Stallman has a beard and is part of the Free Software Foundation (or not). Seriously, read this. #hashtag', + $data['description'] + ); + $this->assertEquals('sTuff', $data['tags'][0]); + $this->assertEquals(false, $data['private']); + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM), + $data['created'] + ); + $this->assertEmpty($data['updated']); + } + + /** + * Test basic getLink service: get non existent link => ApiLinkNotFoundException. + * + * @expectedException Shaarli\Api\Exceptions\ApiLinkNotFoundException + * @expectedExceptionMessage Link not found + */ + public function testGetLink404() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + ]); + $request = Request::createFromEnvironment($env); + + $this->controller->getLink($request, new Response(), ['id' => -1]); + } +} diff --git a/tests/api/controllers/GetLinksTest.php b/tests/api/controllers/GetLinksTest.php new file mode 100644 index 00000000..da54fcf1 --- /dev/null +++ b/tests/api/controllers/GetLinksTest.php @@ -0,0 +1,388 @@ +conf = new \ConfigManager('tests/utils/config/configJson'); + $this->refDB = new \ReferenceLinkDB(); + $this->refDB->write(self::$testDatastore); + + $this->container = new Container(); + $this->container['conf'] = $this->conf; + $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + + $this->controller = new Links($this->container); + } + + /** + * After every test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testDatastore); + } + + /** + * Test basic getLinks service: returns all links. + */ + public function testGetLinks() + { + // Used by index_url(). + $_SERVER['SERVER_NAME'] = 'domain.tld'; + $_SERVER['SERVER_PORT'] = 80; + $_SERVER['SCRIPT_NAME'] = '/'; + + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals($this->refDB->countLinks(), count($data)); + + // Check order + $order = [41, 8, 6, 7, 0, 1, 4, 42]; + $cpt = 0; + foreach ($data as $link) { + $this->assertEquals(self::NB_FIELDS_LINK, count($link)); + $this->assertEquals($order[$cpt++], $link['id']); + } + + // Check first element fields + $first = $data[0]; + $this->assertEquals('http://domain.tld/?WDWyig', $first['url']); + $this->assertEquals('WDWyig', $first['shorturl']); + $this->assertEquals('Link title: @website', $first['title']); + $this->assertEquals( + 'Stallman has a beard and is part of the Free Software Foundation (or not). Seriously, read this. #hashtag', + $first['description'] + ); + $this->assertEquals('sTuff', $first['tags'][0]); + $this->assertEquals(false, $first['private']); + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM), + $first['created'] + ); + $this->assertEmpty($first['updated']); + + // Multi tags + $link = $data[1]; + $this->assertEquals(7, count($link['tags'])); + + // Update date + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20160803_093033')->format(\DateTime::ATOM), + $link['updated'] + ); + } + + /** + * Test getLinks service with offset and limit parameter: + * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). + */ + public function testGetLinksOffsetLimit() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'offset=1&limit=1' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(8, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks with limit=all (return all link). + */ + public function testGetLinksLimitAll() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'limit=all' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals($this->refDB->countLinks(), count($data)); + // Check order + $order = [41, 8, 6, 7, 0, 1, 4, 42]; + $cpt = 0; + foreach ($data as $link) { + $this->assertEquals(self::NB_FIELDS_LINK, count($link)); + $this->assertEquals($order[$cpt++], $link['id']); + } + } + + /** + * Test getLinks service with offset and limit parameter: + * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). + */ + public function testGetLinksOffsetTooHigh() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'offset=100' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEmpty(count($data)); + } + + /** + * Test getLinks with visibility parameter set to all + */ + public function testGetLinksVisibilityAll() + { + $env = Environment::mock( + [ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'visibility=all' + ] + ); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string)$response->getBody(), true); + $this->assertEquals($this->refDB->countLinks(), count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks with visibility parameter set to private + */ + public function testGetLinksVisibilityPrivate() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'visibility=private' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals($this->refDB->countPrivateLinks(), count($data)); + $this->assertEquals(6, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks with visibility parameter set to public + */ + public function testGetLinksVisibilityPublic() + { + $env = Environment::mock( + [ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'visibility=public' + ] + ); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string)$response->getBody(), true); + $this->assertEquals($this->refDB->countPublicLinks(), count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks service with offset and limit parameter: + * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). + */ + public function testGetLinksSearchTerm() + { + // Only in description - 1 result + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=Tropical' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(1, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + + // Only in tags - 1 result + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=tag3' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(0, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + + // Multiple results (2) + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=stallman' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(8, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + + // Multiword - 2 results + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=stallman+software' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(8, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + + // URL encoding + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm='. urlencode('@web') + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(8, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + } + + public function testGetLinksSearchTermNoResult() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=nope' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(0, count($data)); + } + + public function testGetLinksSearchTags() + { + // Single tag + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchtags=dev', + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(0, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(4, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + + // Multitag + exclude + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchtags=stuff+-gnu', + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks service with search tags+terms. + */ + public function testGetLinksSearchTermsAndTags() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=poke&searchtags=dev', + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(0, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } +} diff --git a/tests/api/controllers/LinksTest.php b/tests/api/controllers/LinksTest.php deleted file mode 100644 index 284c3a9d..00000000 --- a/tests/api/controllers/LinksTest.php +++ /dev/null @@ -1,387 +0,0 @@ -conf = new \ConfigManager('tests/utils/config/configJson.json.php'); - $this->refDB = new \ReferenceLinkDB(); - $this->refDB->write(self::$testDatastore); - - $this->container = new Container(); - $this->container['conf'] = $this->conf; - $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); - - $this->controller = new Links($this->container); - } - - /** - * After every test, remove the test datastore. - */ - public function tearDown() - { - @unlink(self::$testDatastore); - } - - /** - * Test basic getLinks service: returns all links. - */ - public function testGetLinks() - { - // Used by index_url(). - $_SERVER['SERVER_NAME'] = 'domain.tld'; - $_SERVER['SERVER_PORT'] = 80; - $_SERVER['SCRIPT_NAME'] = '/'; - - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - ]); - $request = Request::createFromEnvironment($env); - - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals($this->refDB->countLinks(), count($data)); - - // Check order - $order = [41, 8, 6, 7, 0, 1, 4, 42]; - $cpt = 0; - foreach ($data as $link) { - $this->assertEquals(self::NB_FIELDS_LINK, count($link)); - $this->assertEquals($order[$cpt++], $link['id']); - } - - // Check first element fields\ - $first = $data[0]; - $this->assertEquals('http://domain.tld/?WDWyig', $first['url']); - $this->assertEquals('WDWyig', $first['shorturl']); - $this->assertEquals('Link title: @website', $first['title']); - $this->assertEquals( - 'Stallman has a beard and is part of the Free Software Foundation (or not). Seriously, read this. #hashtag', - $first['description'] - ); - $this->assertEquals('sTuff', $first['tags'][0]); - $this->assertEquals(false, $first['private']); - $this->assertEquals( - \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM), - $first['created'] - ); - $this->assertEmpty($first['updated']); - - // Multi tags - $link = $data[1]; - $this->assertEquals(7, count($link['tags'])); - - // Update date - $this->assertEquals( - \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20160803_093033')->format(\DateTime::ATOM), - $link['updated'] - ); - } - - /** - * Test getLinks service with offset and limit parameter: - * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). - */ - public function testGetLinksOffsetLimit() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'offset=1&limit=1' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(1, count($data)); - $this->assertEquals(8, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } - - /** - * Test getLinks with limit=all (return all link). - */ - public function testGetLinksLimitAll() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'limit=all' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals($this->refDB->countLinks(), count($data)); - // Check order - $order = [41, 8, 6, 7, 0, 1, 4, 42]; - $cpt = 0; - foreach ($data as $link) { - $this->assertEquals(self::NB_FIELDS_LINK, count($link)); - $this->assertEquals($order[$cpt++], $link['id']); - } - } - - /** - * Test getLinks service with offset and limit parameter: - * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). - */ - public function testGetLinksOffsetTooHigh() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'offset=100' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEmpty(count($data)); - } - - /** - * Test getLinks with visibility parameter set to all - */ - public function testGetLinksVisibilityAll() - { - $env = Environment::mock( - [ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'visibility=all' - ] - ); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string)$response->getBody(), true); - $this->assertEquals($this->refDB->countLinks(), count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } - - /** - * Test getLinks with visibility parameter set to private - */ - public function testGetLinksVisibilityPrivate() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'visibility=private' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals($this->refDB->countPrivateLinks(), count($data)); - $this->assertEquals(6, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } - - /** - * Test getLinks with visibility parameter set to public - */ - public function testGetLinksVisibilityPublic() - { - $env = Environment::mock( - [ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'visibility=public' - ] - ); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string)$response->getBody(), true); - $this->assertEquals($this->refDB->countPublicLinks(), count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } - - /** - * Test getLinks service with offset and limit parameter: - * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). - */ - public function testGetLinksSearchTerm() - { - // Only in description - 1 result - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=Tropical' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(1, count($data)); - $this->assertEquals(1, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - - // Only in tags - 1 result - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=tag3' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(1, count($data)); - $this->assertEquals(0, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - - // Multiple results (2) - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=stallman' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(2, count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - $this->assertEquals(8, $data[1]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); - - // Multiword - 2 results - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=stallman+software' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(2, count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - $this->assertEquals(8, $data[1]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); - - // URL encoding - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm='. urlencode('@web') - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(2, count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - $this->assertEquals(8, $data[1]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); - } - - public function testGetLinksSearchTermNoResult() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=nope' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(0, count($data)); - } - - public function testGetLinksSearchTags() - { - // Single tag - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchtags=dev', - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(2, count($data)); - $this->assertEquals(0, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - $this->assertEquals(4, $data[1]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); - - // Multitag + exclude - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchtags=stuff+-gnu', - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(1, count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } - - /** - * Test getLinks service with search tags+terms. - */ - public function testGetLinksSearchTermsAndTags() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=poke&searchtags=dev', - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(1, count($data)); - $this->assertEquals(0, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } -} -- cgit v1.2.3 From 7dcbfde5ffbc057a44f710e3be7e4856d235e90b Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 27 Feb 2017 20:20:53 +0100 Subject: Set the vintage theme by default for the time being --- tests/Updater/UpdaterTest.php | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'tests') diff --git a/tests/Updater/UpdaterTest.php b/tests/Updater/UpdaterTest.php index 1d15cfaa..de330ae2 100644 --- a/tests/Updater/UpdaterTest.php +++ b/tests/Updater/UpdaterTest.php @@ -466,4 +466,44 @@ $GLOBALS[\'privateLinkByDefault\'] = true;'; unlink('sandbox/'. $theme .'/linklist.html'); rmdir('sandbox/'. $theme); } + + /** + * Test updateMethodDefaultThemeVintage with the default theme enabled. + */ + public function testSetDefaultThemeToVintage() + { + $sandboxConf = 'sandbox/config'; + copy(self::$configFile . '.json.php', $sandboxConf . '.json.php'); + $this->conf = new ConfigManager($sandboxConf); + + $this->conf->set('resource.theme', 'default'); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodDefaultThemeVintage()); + $this->assertEquals('vintage', $this->conf->get('resource.theme')); + + // reload from file + $this->conf = new ConfigManager($sandboxConf); + $this->assertEquals('vintage', $this->conf->get('resource.theme')); + } + + /** + * Test updateMethodDefaultThemeVintage with custom theme enabled => nothing to do. + */ + public function testSetDefaultThemeNothingToDo() + { + $sandboxConf = 'sandbox/config'; + copy(self::$configFile . '.json.php', $sandboxConf . '.json.php'); + $this->conf = new ConfigManager($sandboxConf); + + $theme = 'myawesometheme'; + $this->conf->set('resource.theme', $theme); + $this->conf->write(true); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodDefaultThemeVintage()); + $this->assertEquals($theme, $this->conf->get('resource.theme')); + + // reload from file + $this->conf = new ConfigManager($sandboxConf); + $this->assertEquals($theme, $this->conf->get('resource.theme')); + } } -- cgit v1.2.3 From e03761011521929a375ebb56f21adacb226a3a8d Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 27 Feb 2017 19:45:55 +0100 Subject: Add markdown_escape setting This setting allows to escape HTML in markdown rendering or not. The goal behind it is to avoid XSS issue in shared instances. More info: * the setting is set to true by default * it is set to false for anyone who already have the plugin enabled (avoid breaking existing entries) * improve the HTML sanitization when the setting is set to false - but don't consider it XSS proof * mention the setting in the plugin README --- tests/Updater/UpdaterTest.php | 66 +++++++++++++++++++++++++++++++++++ tests/plugins/PluginMarkdownTest.php | 57 ++++++++++++++++++++++++++---- tests/plugins/resources/markdown.html | 6 ++-- 3 files changed, 120 insertions(+), 9 deletions(-) (limited to 'tests') diff --git a/tests/Updater/UpdaterTest.php b/tests/Updater/UpdaterTest.php index de330ae2..39be88f9 100644 --- a/tests/Updater/UpdaterTest.php +++ b/tests/Updater/UpdaterTest.php @@ -506,4 +506,70 @@ $GLOBALS[\'privateLinkByDefault\'] = true;'; $this->conf = new ConfigManager($sandboxConf); $this->assertEquals($theme, $this->conf->get('resource.theme')); } + + /** + * Test updateMethodEscapeMarkdown with markdown plugin enabled + * => setting markdown_escape set to false. + */ + public function testEscapeMarkdownSettingToFalse() + { + $sandboxConf = 'sandbox/config'; + copy(self::$configFile . '.json.php', $sandboxConf . '.json.php'); + $this->conf = new ConfigManager($sandboxConf); + + $this->conf->set('general.enabled_plugins', ['markdown']); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodEscapeMarkdown()); + $this->assertFalse($this->conf->get('security.markdown_escape')); + + // reload from file + $this->conf = new ConfigManager($sandboxConf); + $this->assertFalse($this->conf->get('security.markdown_escape')); + } + + + /** + * Test updateMethodEscapeMarkdown with markdown plugin disabled + * => setting markdown_escape set to true. + */ + public function testEscapeMarkdownSettingToTrue() + { + $sandboxConf = 'sandbox/config'; + copy(self::$configFile . '.json.php', $sandboxConf . '.json.php'); + $this->conf = new ConfigManager($sandboxConf); + + $this->conf->set('general.enabled_plugins', []); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodEscapeMarkdown()); + $this->assertTrue($this->conf->get('security.markdown_escape')); + + // reload from file + $this->conf = new ConfigManager($sandboxConf); + $this->assertTrue($this->conf->get('security.markdown_escape')); + } + + /** + * Test updateMethodEscapeMarkdown with nothing to do (setting already enabled) + */ + public function testEscapeMarkdownSettingNothingToDoEnabled() + { + $sandboxConf = 'sandbox/config'; + copy(self::$configFile . '.json.php', $sandboxConf . '.json.php'); + $this->conf = new ConfigManager($sandboxConf); + $this->conf->set('security.markdown_escape', true); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodEscapeMarkdown()); + $this->assertTrue($this->conf->get('security.markdown_escape')); + } + + /** + * Test updateMethodEscapeMarkdown with nothing to do (setting already disabled) + */ + public function testEscapeMarkdownSettingNothingToDoDisabled() + { + $this->conf->set('security.markdown_escape', false); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodEscapeMarkdown()); + $this->assertFalse($this->conf->get('security.markdown_escape')); + } } diff --git a/tests/plugins/PluginMarkdownTest.php b/tests/plugins/PluginMarkdownTest.php index d359b2a1..d4cd1b97 100644 --- a/tests/plugins/PluginMarkdownTest.php +++ b/tests/plugins/PluginMarkdownTest.php @@ -13,12 +13,18 @@ require_once 'plugins/markdown/markdown.php'; */ class PluginMarkdownTest extends PHPUnit_Framework_TestCase { + /** + * @var ConfigManager instance. + */ + protected $conf; + /** * Reset plugin path */ public function setUp() { PluginManager::$PLUGINS_PATH = 'plugins'; + $this->conf = new ConfigManager('tests/utils/config/configJson'); } /** @@ -36,7 +42,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase ), ); - $data = hook_markdown_render_linklist($data); + $data = hook_markdown_render_linklist($data, $this->conf); $this->assertNotFalse(strpos($data['links'][0]['description'], '

')); $this->assertNotFalse(strpos($data['links'][0]['description'], '

')); } @@ -61,7 +67,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase ), ); - $data = hook_markdown_render_daily($data); + $data = hook_markdown_render_daily($data, $this->conf); $this->assertNotFalse(strpos($data['cols'][0][0]['formatedDescription'], '

')); $this->assertNotFalse(strpos($data['cols'][0][0]['formatedDescription'], '

')); } @@ -110,6 +116,8 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase $output = escape($input); $input .= 'link'; $output .= 'link'; + $input .= 'link'; + $output .= 'link'; $this->assertEquals($output, sanitize_html($input)); // Do not touch escaped HTML. $input = escape($input); @@ -130,10 +138,10 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase )) ); - $processed = hook_markdown_render_linklist($data); + $processed = hook_markdown_render_linklist($data, $this->conf); $this->assertEquals($str, $processed['links'][0]['description']); - $processed = hook_markdown_render_feed($data); + $processed = hook_markdown_render_feed($data, $this->conf); $this->assertEquals($str, $processed['links'][0]['description']); $data = array( @@ -151,7 +159,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase ), ); - $data = hook_markdown_render_daily($data); + $data = hook_markdown_render_daily($data, $this->conf); $this->assertEquals($str, $data['cols'][0][0]['formatedDescription']); } @@ -169,7 +177,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase )) ); - $data = hook_markdown_render_feed($data); + $data = hook_markdown_render_feed($data, $this->conf); $this->assertContains('', $data['links'][0]['description']); } @@ -185,4 +193,41 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase $data = process_markdown($md); $this->assertEquals($html, $data); } + + /** + * Make sure that the HTML tags are escaped. + */ + public function testMarkdownWithHtmlEscape() + { + $md = '**strong** strong'; + $html = '

strong <strong>strong</strong>

'; + $data = array( + 'links' => array( + 0 => array( + 'description' => $md, + ), + ), + ); + $data = hook_markdown_render_linklist($data, $this->conf); + $this->assertEquals($html, $data['links'][0]['description']); + } + + /** + * Make sure that the HTML tags aren't escaped with the setting set to false. + */ + public function testMarkdownWithHtmlNoEscape() + { + $this->conf->set('security.markdown_escape', false); + $md = '**strong** strong'; + $html = '

strong strong

'; + $data = array( + 'links' => array( + 0 => array( + 'description' => $md, + ), + ), + ); + $data = hook_markdown_render_linklist($data, $this->conf); + $this->assertEquals($html, $data['links'][0]['description']); + } } diff --git a/tests/plugins/resources/markdown.html b/tests/plugins/resources/markdown.html index c0fbe7f4..07a5a32e 100644 --- a/tests/plugins/resources/markdown.html +++ b/tests/plugins/resources/markdown.html @@ -12,11 +12,11 @@
  • two
  • three
  • four
  • -
  • foo #foobar
  • +
  • foo <a href="?addtag=foobar" title="Hashtag foobar">#foobar</a>
  • -

    #foobar foo lol #foo #bar

    -

    fsdfs http://link.tld #foobar http://link.tld

    +

    <a href="?addtag=foobar" title="Hashtag foobar">#foobar</a> foo lol #foo <a href="?addtag=bar" title="Hashtag bar">#bar</a>

    +

    fsdfs http://link.tld <a href="?addtag=foobar" title="Hashtag foobar">#foobar</a> http://link.tld

    http://link.tld #foobar
     next #foo

    Block:

    -- cgit v1.2.3 From 3c66e56435359dc678048193e8ee239d06f79b64 Mon Sep 17 00:00:00 2001 From: VirtualTam Date: Fri, 3 Mar 2017 23:06:12 +0100 Subject: application: introduce the Shaarli\Config namespace Namespaces have been introduced with the REST API, and should be generalized to the whole codebase to manage object scope and benefit from autoloading. See: - https://secure.php.net/manual/en/language.namespaces.php - http://www.php-fig.org/psr/psr-4/ Signed-off-by: VirtualTam --- tests/ApplicationUtilsTest.php | 3 ++- tests/PluginManagerTest.php | 1 + tests/Updater/UpdaterTest.php | 4 +++- tests/api/ApiMiddlewareTest.php | 5 +++-- tests/api/controllers/GetLinkIdTest.php | 5 +++-- tests/api/controllers/GetLinksTest.php | 6 +++--- tests/api/controllers/InfoTest.php | 9 +++++---- tests/config/ConfigJsonTest.php | 11 +++++------ tests/config/ConfigManagerTest.php | 9 +++++---- tests/config/ConfigPhpTest.php | 5 ++--- tests/config/ConfigPluginTest.php | 6 ++++-- tests/plugins/PluginIssoTest.php | 1 + tests/plugins/PluginMarkdownTest.php | 1 + tests/plugins/PluginPubsubhubbubTest.php | 1 + tests/plugins/PluginQrcodeTest.php | 1 - tests/plugins/PluginReadityourselfTest.php | 1 + tests/plugins/PluginWallabagTest.php | 1 + 17 files changed, 41 insertions(+), 29 deletions(-) (limited to 'tests') diff --git a/tests/ApplicationUtilsTest.php b/tests/ApplicationUtilsTest.php index 634bd0ed..ad86e21c 100644 --- a/tests/ApplicationUtilsTest.php +++ b/tests/ApplicationUtilsTest.php @@ -1,9 +1,10 @@ conf = new \ConfigManager('tests/utils/config/configJson.json.php'); + $this->conf = new ConfigManager('tests/utils/config/configJson.json.php'); $this->conf->set('api.secret', 'NapoleonWasALizard'); $this->refDB = new \ReferenceLinkDB(); diff --git a/tests/api/controllers/GetLinkIdTest.php b/tests/api/controllers/GetLinkIdTest.php index 1b020505..45b18e6a 100644 --- a/tests/api/controllers/GetLinkIdTest.php +++ b/tests/api/controllers/GetLinkIdTest.php @@ -2,6 +2,7 @@ namespace Shaarli\Api\Controllers; +use Shaarli\Config\ConfigManager; use Slim\Container; use Slim\Http\Environment; @@ -25,7 +26,7 @@ class GetLinkIdTest extends \PHPUnit_Framework_TestCase protected static $testDatastore = 'sandbox/datastore.php'; /** - * @var \ConfigManager instance + * @var ConfigManager instance */ protected $conf; @@ -54,7 +55,7 @@ class GetLinkIdTest extends \PHPUnit_Framework_TestCase */ public function setUp() { - $this->conf = new \ConfigManager('tests/utils/config/configJson'); + $this->conf = new ConfigManager('tests/utils/config/configJson'); $this->refDB = new \ReferenceLinkDB(); $this->refDB->write(self::$testDatastore); diff --git a/tests/api/controllers/GetLinksTest.php b/tests/api/controllers/GetLinksTest.php index da54fcf1..10330cd9 100644 --- a/tests/api/controllers/GetLinksTest.php +++ b/tests/api/controllers/GetLinksTest.php @@ -1,7 +1,7 @@ conf = new \ConfigManager('tests/utils/config/configJson'); + $this->conf = new ConfigManager('tests/utils/config/configJson'); $this->refDB = new \ReferenceLinkDB(); $this->refDB->write(self::$testDatastore); diff --git a/tests/api/controllers/InfoTest.php b/tests/api/controllers/InfoTest.php index 2916eed8..4beef3f7 100644 --- a/tests/api/controllers/InfoTest.php +++ b/tests/api/controllers/InfoTest.php @@ -1,7 +1,8 @@ conf = new \ConfigManager('tests/utils/config/configJson.json.php'); + $this->conf = new ConfigManager('tests/utils/config/configJson.json.php'); $this->refDB = new \ReferenceLinkDB(); $this->refDB->write(self::$testDatastore); @@ -84,7 +85,7 @@ class InfoTest extends \PHPUnit_Framework_TestCase $this->assertEquals('Shaarli', $data['settings']['title']); $this->assertEquals('?', $data['settings']['header_link']); $this->assertEquals('UTC', $data['settings']['timezone']); - $this->assertEquals(\ConfigManager::$DEFAULT_PLUGINS, $data['settings']['enabled_plugins']); + $this->assertEquals(ConfigManager::$DEFAULT_PLUGINS, $data['settings']['enabled_plugins']); $this->assertEquals(false, $data['settings']['default_private_links']); $title = 'My links'; diff --git a/tests/config/ConfigJsonTest.php b/tests/config/ConfigJsonTest.php index 07f6ab49..3527f83d 100644 --- a/tests/config/ConfigJsonTest.php +++ b/tests/config/ConfigJsonTest.php @@ -1,11 +1,10 @@ empty array. * - * @expectedException Exception + * @expectedException \Exception * @expectedExceptionMessage An error occurred while parsing JSON file: error code #4 */ public function testReadInvalidJson() @@ -112,7 +111,7 @@ class ConfigJsonTest extends PHPUnit_Framework_TestCase /** * Write to invalid path. * - * @expectedException IOException + * @expectedException \IOException */ public function testWriteInvalidArray() { @@ -123,7 +122,7 @@ class ConfigJsonTest extends PHPUnit_Framework_TestCase /** * Write to invalid path. * - * @expectedException IOException + * @expectedException \IOException */ public function testWriteInvalidBlank() { diff --git a/tests/config/ConfigManagerTest.php b/tests/config/ConfigManagerTest.php index 436e3d67..b81be5b6 100644 --- a/tests/config/ConfigManagerTest.php +++ b/tests/config/ConfigManagerTest.php @@ -1,4 +1,5 @@ Date: Sat, 7 Jan 2017 14:28:58 +0100 Subject: Improve autoLocale() detection - Creates arrays_combination function to cover all cases - add the underscore separator in the regex - add `utf8` encoding in addition to `UTF-8` --- tests/UtilsTest.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'tests') diff --git a/tests/UtilsTest.php b/tests/UtilsTest.php index c885f552..b8f608b9 100644 --- a/tests/UtilsTest.php +++ b/tests/UtilsTest.php @@ -282,4 +282,24 @@ class UtilsTest extends PHPUnit_Framework_TestCase $this->assertEquals('', normalize_spaces('')); $this->assertEquals(null, normalize_spaces(null)); } + + /** + * Test arrays_combine + */ + public function testArraysCombination() + { + $arr = [['ab', 'cd'], ['ef', 'gh'], ['ij', 'kl'], ['m']]; + $expected = [ + 'abefijm', + 'cdefijm', + 'abghijm', + 'cdghijm', + 'abefklm', + 'cdefklm', + 'abghklm', + 'cdghklm', + ]; + $this->assertEquals($expected, arrays_combination($arr)); + } + } -- cgit v1.2.3 From 52b503105d389d1796698114573ff618b2ad34a2 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 7 Jan 2017 14:30:42 +0100 Subject: Improve datetime display Use php-intl extension to display datetimes a bit more nicely, depending on the locale. What changes: * the day is no longer displayed * day number and month are ordered according to the locale * the timezone is more readable (UTC+1 instead of CET) --- tests/UtilsTest.php | 46 +++++++++++++++++++++++++++++--------- tests/languages/bootstrap.php | 7 ++++++ tests/languages/de/UtilsDeTest.php | 25 +++++++++++++++++++++ tests/languages/en/UtilsEnTest.php | 25 +++++++++++++++++++++ tests/languages/fr/UtilsFrTest.php | 25 +++++++++++++++++++++ 5 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 tests/languages/bootstrap.php create mode 100644 tests/languages/de/UtilsDeTest.php create mode 100644 tests/languages/en/UtilsEnTest.php create mode 100644 tests/languages/fr/UtilsFrTest.php (limited to 'tests') diff --git a/tests/UtilsTest.php b/tests/UtilsTest.php index b8f608b9..e70cc1ae 100644 --- a/tests/UtilsTest.php +++ b/tests/UtilsTest.php @@ -23,7 +23,12 @@ class UtilsTest extends PHPUnit_Framework_TestCase // Expected log date format protected static $dateFormat = 'Y/m/d H:i:s'; - + + /** + * @var string Save the current timezone. + */ + protected static $defaultTimeZone; + /** * Assign reference data @@ -31,6 +36,17 @@ class UtilsTest extends PHPUnit_Framework_TestCase public static function setUpBeforeClass() { self::$sidHashes = ReferenceSessionIdHashes::getHashes(); + self::$defaultTimeZone = date_default_timezone_get(); + // Timezone without DST for test consistency + date_default_timezone_set('Africa/Nairobi'); + } + + /** + * Reset the timezone + */ + public static function tearDownAfterClass() + { + date_default_timezone_set(self::$defaultTimeZone); } /** @@ -286,20 +302,28 @@ class UtilsTest extends PHPUnit_Framework_TestCase /** * Test arrays_combine */ - public function testArraysCombination() + public function testCartesianProductGenerator() { $arr = [['ab', 'cd'], ['ef', 'gh'], ['ij', 'kl'], ['m']]; $expected = [ - 'abefijm', - 'cdefijm', - 'abghijm', - 'cdghijm', - 'abefklm', - 'cdefklm', - 'abghklm', - 'cdghklm', + ['ab', 'ef', 'ij', 'm'], + ['ab', 'ef', 'kl', 'm'], + ['ab', 'gh', 'ij', 'm'], + ['ab', 'gh', 'kl', 'm'], + ['cd', 'ef', 'ij', 'm'], + ['cd', 'ef', 'kl', 'm'], + ['cd', 'gh', 'ij', 'm'], + ['cd', 'gh', 'kl', 'm'], ]; - $this->assertEquals($expected, arrays_combination($arr)); + $this->assertEquals($expected, iterator_to_array(cartesian_product_generator($arr))); } + /** + * Test date_format() with invalid parameter. + */ + public function testDateFormatInvalid() + { + $this->assertFalse(format_date([])); + $this->assertFalse(format_date(null)); + } } diff --git a/tests/languages/bootstrap.php b/tests/languages/bootstrap.php new file mode 100644 index 00000000..95609210 --- /dev/null +++ b/tests/languages/bootstrap.php @@ -0,0 +1,7 @@ +assertRegExp('/1. Januar 2017 (um )?10:11:12 GMT\+0?3(:00)?/', format_date($date, true)); + } + + /** + * Test date_format() using builtin PHP function strftime. + */ + public function testDateFormatDefault() + { + $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); + $this->assertEquals('So 01 Jan 2017 10:11:12 EAT', format_date($date, false)); + } +} diff --git a/tests/languages/en/UtilsEnTest.php b/tests/languages/en/UtilsEnTest.php new file mode 100644 index 00000000..60bcb653 --- /dev/null +++ b/tests/languages/en/UtilsEnTest.php @@ -0,0 +1,25 @@ +assertRegExp('/January 1, 2017 (at )?10:11:12 AM GMT\+0?3(:00)?/', format_date($date, true)); + } + + /** + * Test date_format() using builtin PHP function strftime. + */ + public function testDateFormatDefault() + { + $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); + $this->assertEquals('Sun 01 Jan 2017 10:11:12 AM EAT', format_date($date, false)); + } +} diff --git a/tests/languages/fr/UtilsFrTest.php b/tests/languages/fr/UtilsFrTest.php new file mode 100644 index 00000000..890308d3 --- /dev/null +++ b/tests/languages/fr/UtilsFrTest.php @@ -0,0 +1,25 @@ +assertRegExp('/1 janvier 2017 (à )?10:11:12 UTC\+0?3(:00)?/', format_date($date)); + } + + /** + * Test date_format() using builtin PHP function strftime. + */ + public function testDateFormatDefault() + { + $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); + $this->assertEquals('dim. 01 janv. 2017 10:11:12 EAT', format_date($date, false)); + } +} -- cgit v1.2.3 From 03b9cb600a85fed79b8afa72ccdad2725da5f3da Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 7 Mar 2017 19:27:17 +0100 Subject: Fix autoLocale error and cover it with unit tests --- tests/languages/de/UtilsDeTest.php | 76 ++++++++++++++++++++++++++++++++++++++ tests/languages/en/UtilsEnTest.php | 76 ++++++++++++++++++++++++++++++++++++++ tests/languages/fr/UtilsFrTest.php | 76 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 228 insertions(+) (limited to 'tests') diff --git a/tests/languages/de/UtilsDeTest.php b/tests/languages/de/UtilsDeTest.php index 8a740389..545fa572 100644 --- a/tests/languages/de/UtilsDeTest.php +++ b/tests/languages/de/UtilsDeTest.php @@ -22,4 +22,80 @@ class UtilsDeTest extends UtilsTest $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); $this->assertEquals('So 01 Jan 2017 10:11:12 EAT', format_date($date, false)); } + + /** + * Test autoLocale with a simple value + */ + public function testAutoLocaleValid() + { + $current = setlocale(LC_ALL, 0); + $header = 'en-us'; + autoLocale($header); + $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with an alternative locale value + */ + public function testAutoLocaleValidAlternative() + { + $current = setlocale(LC_ALL, 0); + $header = 'en_us.UTF8'; + autoLocale($header); + $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with multiples value, the first one is valid + */ + public function testAutoLocaleMultipleFirstValid() + { + $current = setlocale(LC_ALL, 0); + $header = 'en-us,de-de'; + autoLocale($header); + $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with multiples value, the second one is valid + */ + public function testAutoLocaleMultipleSecondValid() + { + $current = setlocale(LC_ALL, 0); + $header = 'pt_BR,fr-fr'; + autoLocale($header); + $this->assertEquals('fr_FR.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale without value: defaults to en_US. + */ + public function testAutoLocaleBlank() + { + $current = setlocale(LC_ALL, 0); + autoLocale(''); + $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with an invalid value: defaults to en_US. + */ + public function testAutoLocaleInvalid() + { + $current = setlocale(LC_ALL, 0); + autoLocale('pt_BR'); + $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } } diff --git a/tests/languages/en/UtilsEnTest.php b/tests/languages/en/UtilsEnTest.php index 60bcb653..7c829ac7 100644 --- a/tests/languages/en/UtilsEnTest.php +++ b/tests/languages/en/UtilsEnTest.php @@ -22,4 +22,80 @@ class UtilsEnTest extends UtilsTest $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); $this->assertEquals('Sun 01 Jan 2017 10:11:12 AM EAT', format_date($date, false)); } + + /** + * Test autoLocale with a simple value + */ + public function testAutoLocaleValid() + { + $current = setlocale(LC_ALL, 0); + $header = 'de-de'; + autoLocale($header); + $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with an alternative locale value + */ + public function testAutoLocaleValidAlternative() + { + $current = setlocale(LC_ALL, 0); + $header = 'de_de.UTF8'; + autoLocale($header); + $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with multiples value, the first one is valid + */ + public function testAutoLocaleMultipleFirstValid() + { + $current = setlocale(LC_ALL, 0); + $header = 'de-de;en-us'; + autoLocale($header); + $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with multiples value, the second one is valid + */ + public function testAutoLocaleMultipleSecondValid() + { + $current = setlocale(LC_ALL, 0); + $header = 'pt_BR,fr-fr'; + autoLocale($header); + $this->assertEquals('fr_FR.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale without value: defaults to en_US. + */ + public function testAutoLocaleBlank() + { + $current = setlocale(LC_ALL, 0); + autoLocale(''); + $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with an invalid value: defaults to en_US. + */ + public function testAutoLocaleInvalid() + { + $current = setlocale(LC_ALL, 0); + autoLocale('pt_BR'); + $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } } diff --git a/tests/languages/fr/UtilsFrTest.php b/tests/languages/fr/UtilsFrTest.php index 890308d3..45996ee2 100644 --- a/tests/languages/fr/UtilsFrTest.php +++ b/tests/languages/fr/UtilsFrTest.php @@ -22,4 +22,80 @@ class UtilsFrTest extends UtilsTest $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); $this->assertEquals('dim. 01 janv. 2017 10:11:12 EAT', format_date($date, false)); } + + /** + * Test autoLocale with a simple value + */ + public function testAutoLocaleValid() + { + $current = setlocale(LC_ALL, 0); + $header = 'de-de'; + autoLocale($header); + $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with an alternative locale value + */ + public function testAutoLocaleValidAlternative() + { + $current = setlocale(LC_ALL, 0); + $header = 'de_de.UTF8'; + autoLocale($header); + $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with multiples value, the first one is valid + */ + public function testAutoLocaleMultipleFirstValid() + { + $current = setlocale(LC_ALL, 0); + $header = 'de-de;en-us'; + autoLocale($header); + $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with multiples value, the second one is valid + */ + public function testAutoLocaleMultipleSecondValid() + { + $current = setlocale(LC_ALL, 0); + $header = 'pt_BR,de-de'; + autoLocale($header); + $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale without value: defaults to en_US. + */ + public function testAutoLocaleBlank() + { + $current = setlocale(LC_ALL, 0); + autoLocale(''); + $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } + + /** + * Test autoLocale with an invalid value: defaults to en_US. + */ + public function testAutoLocaleInvalid() + { + $current = setlocale(LC_ALL, 0); + autoLocale('pt_BR'); + $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0)); + + setlocale(LC_ALL, $current); + } } -- cgit v1.2.3 From e6cd773f5a8bd757c9362524cfeb3f7cb7fa81c9 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 8 Mar 2017 19:59:00 +0100 Subject: Fix blocking namespace issue --- tests/config/ConfigPluginTest.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'tests') diff --git a/tests/config/ConfigPluginTest.php b/tests/config/ConfigPluginTest.php index 22ab927b..deb02c9e 100644 --- a/tests/config/ConfigPluginTest.php +++ b/tests/config/ConfigPluginTest.php @@ -1,9 +1,7 @@ Date: Wed, 8 Mar 2017 20:28:33 +0100 Subject: Move config exception to dedicated classes with proper namespace --- tests/config/ConfigManagerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/config/ConfigManagerTest.php b/tests/config/ConfigManagerTest.php index b81be5b6..1ec447b2 100644 --- a/tests/config/ConfigManagerTest.php +++ b/tests/config/ConfigManagerTest.php @@ -106,7 +106,7 @@ class ConfigManagerTest extends \PHPUnit_Framework_TestCase /** * Try to write the config without mandatory parameter (e.g. 'login'). * - * @expectedException Shaarli\Config\MissingFieldConfigException + * @expectedException Shaarli\Config\Exception\MissingFieldConfigException */ public function testWriteMissingParameter() { -- cgit v1.2.3 From 48417aed1d83f1566c039529faf0354ec3b42e4b Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Thu, 9 Feb 2017 20:54:56 +0100 Subject: Link imports are now logged in `data/` folder, and can be debug using `dev.debug=true` setting related to #741 and #681 --- tests/NetscapeBookmarkUtils/BookmarkImportTest.php | 41 +++++++++++++--------- tests/utils/config/configJson.json.php | 2 +- 2 files changed, 25 insertions(+), 18 deletions(-) (limited to 'tests') diff --git a/tests/NetscapeBookmarkUtils/BookmarkImportTest.php b/tests/NetscapeBookmarkUtils/BookmarkImportTest.php index 0ca07eac..36425d85 100644 --- a/tests/NetscapeBookmarkUtils/BookmarkImportTest.php +++ b/tests/NetscapeBookmarkUtils/BookmarkImportTest.php @@ -42,6 +42,11 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase */ protected $pagecache = 'tests'; + /** + * @var ConfigManager instance. + */ + protected $conf; + /** * @var string Save the current timezone. */ @@ -65,6 +70,8 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase // start with an empty datastore file_put_contents(self::$testDatastore, ''); $this->linkDb = new LinkDB(self::$testDatastore, true, false); + $this->conf = new ConfigManager('tests/utils/config/configJson'); + $this->conf->set('resource.page_cache', $this->pagecache); } public static function tearDownAfterClass() @@ -81,7 +88,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File empty.htm (0 bytes) has an unknown file format.' .' Nothing was imported.', - NetscapeBookmarkUtils::import(NULL, $files, NULL, NULL) + NetscapeBookmarkUtils::import(NULL, $files, NULL, $this->conf) ); $this->assertEquals(0, count($this->linkDb)); } @@ -94,7 +101,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $files = file2array('no_doctype.htm'); $this->assertEquals( 'File no_doctype.htm (350 bytes) has an unknown file format. Nothing was imported.', - NetscapeBookmarkUtils::import(NULL, $files, NULL, NULL) + NetscapeBookmarkUtils::import(NULL, $files, NULL, $this->conf) ); $this->assertEquals(0, count($this->linkDb)); } @@ -108,7 +115,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File internet_explorer_encoding.htm (356 bytes) was successfully processed:' .' 1 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->conf) ); $this->assertEquals(1, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -137,7 +144,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_nested.htm (1337 bytes) was successfully processed:' .' 8 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->conf) ); $this->assertEquals(8, count($this->linkDb)); $this->assertEquals(2, count_private($this->linkDb)); @@ -259,7 +266,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); @@ -304,7 +311,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(1, count_private($this->linkDb)); @@ -348,7 +355,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -372,7 +379,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(2, count_private($this->linkDb)); @@ -398,7 +405,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(2, count_private($this->linkDb)); @@ -418,7 +425,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 2 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -444,7 +451,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -465,7 +472,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 2 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(2, count_private($this->linkDb)); @@ -489,7 +496,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -499,7 +506,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 0 links imported, 0 links overwritten, 2 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -518,7 +525,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -545,7 +552,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -570,7 +577,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File same_date.htm (453 bytes) was successfully processed:' .' 3 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->pagecache) + NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->conf) ); $this->assertEquals(3, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); diff --git a/tests/utils/config/configJson.json.php b/tests/utils/config/configJson.json.php index 13d38c66..9c9288f3 100644 --- a/tests/utils/config/configJson.json.php +++ b/tests/utils/config/configJson.json.php @@ -24,7 +24,7 @@ }, "resource": { "datastore": "tests\/utils\/config\/datastore.php", - "data_dir": "tests\/utils\/config", + "data_dir": "sandbox/", "raintpl_tpl": "tpl/" }, "plugins": { -- cgit v1.2.3 From 87e9631e4aa7c9f535ee9f97ba3db595117350ab Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Fri, 10 Mar 2017 18:49:53 +0100 Subject: Fix namespace issue --- tests/NetscapeBookmarkUtils/BookmarkImportTest.php | 1 + 1 file changed, 1 insertion(+) (limited to 'tests') diff --git a/tests/NetscapeBookmarkUtils/BookmarkImportTest.php b/tests/NetscapeBookmarkUtils/BookmarkImportTest.php index 36425d85..5925a8e1 100644 --- a/tests/NetscapeBookmarkUtils/BookmarkImportTest.php +++ b/tests/NetscapeBookmarkUtils/BookmarkImportTest.php @@ -2,6 +2,7 @@ require_once 'application/NetscapeBookmarkUtils.php'; +use Shaarli\Config\ConfigManager; /** * Utility function to load a file's metadata in a $_FILES-like array -- cgit v1.2.3 From fe83d45c465bad94709ce5aacf7acad47ad75077 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Thu, 9 Mar 2017 20:51:28 +0100 Subject: Fix #773: set Piwik URL protocol --- tests/Updater/UpdaterTest.php | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'tests') diff --git a/tests/Updater/UpdaterTest.php b/tests/Updater/UpdaterTest.php index 448405a3..b522d616 100644 --- a/tests/Updater/UpdaterTest.php +++ b/tests/Updater/UpdaterTest.php @@ -574,4 +574,45 @@ $GLOBALS[\'privateLinkByDefault\'] = true;'; $this->assertTrue($updater->updateMethodEscapeMarkdown()); $this->assertFalse($this->conf->get('security.markdown_escape')); } + + /** + * Test updateMethodPiwikUrl with valid data + */ + public function testUpdatePiwikUrlValid() + { + $sandboxConf = 'sandbox/config'; + copy(self::$configFile . '.json.php', $sandboxConf . '.json.php'); + $this->conf = new ConfigManager($sandboxConf); + $url = 'mypiwik.tld'; + $this->conf->set('plugins.PIWIK_URL', $url); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodPiwikUrl()); + $this->assertEquals('http://'. $url, $this->conf->get('plugins.PIWIK_URL')); + + // reload from file + $this->conf = new ConfigManager($sandboxConf); + $this->assertEquals('http://'. $url, $this->conf->get('plugins.PIWIK_URL')); + } + + /** + * Test updateMethodPiwikUrl without setting + */ + public function testUpdatePiwikUrlEmpty() + { + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodPiwikUrl()); + $this->assertEmpty($this->conf->get('plugins.PIWIK_URL')); + } + + /** + * Test updateMethodPiwikUrl: valid URL, nothing to do + */ + public function testUpdatePiwikUrlNothingToDo() + { + $url = 'https://mypiwik.tld'; + $this->conf->set('plugins.PIWIK_URL', $url); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodPiwikUrl()); + $this->assertEquals($url, $this->conf->get('plugins.PIWIK_URL')); + } } -- cgit v1.2.3 From 2ea89aba4faa5509ca68c7e9b6b9ab71c1929935 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 11 Mar 2017 14:11:06 +0100 Subject: Fixes #304: use atom feed as default RSS feed is still available with the setting set to false --- tests/Updater/UpdaterTest.php | 45 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'tests') diff --git a/tests/Updater/UpdaterTest.php b/tests/Updater/UpdaterTest.php index b522d616..11b6444a 100644 --- a/tests/Updater/UpdaterTest.php +++ b/tests/Updater/UpdaterTest.php @@ -615,4 +615,49 @@ $GLOBALS[\'privateLinkByDefault\'] = true;'; $this->assertTrue($updater->updateMethodPiwikUrl()); $this->assertEquals($url, $this->conf->get('plugins.PIWIK_URL')); } + + /** + * Test updateMethodAtomDefault with show_atom set to false + * => update to true. + */ + public function testUpdateMethodAtomDefault() + { + $sandboxConf = 'sandbox/config'; + copy(self::$configFile . '.json.php', $sandboxConf . '.json.php'); + $this->conf = new ConfigManager($sandboxConf); + $this->conf->set('feed.show_atom', false); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodAtomDefault()); + $this->assertTrue($this->conf->get('feed.show_atom')); + // reload from file + $this->conf = new ConfigManager($sandboxConf); + $this->assertTrue($this->conf->get('feed.show_atom')); + } + /** + * Test updateMethodAtomDefault with show_atom not set. + * => nothing to do + */ + public function testUpdateMethodAtomDefaultNoExist() + { + $sandboxConf = 'sandbox/config'; + copy(self::$configFile . '.json.php', $sandboxConf . '.json.php'); + $this->conf = new ConfigManager($sandboxConf); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodAtomDefault()); + $this->assertTrue($this->conf->get('feed.show_atom')); + } + /** + * Test updateMethodAtomDefault with show_atom set to true. + * => nothing to do + */ + public function testUpdateMethodAtomDefaultAlreadyTrue() + { + $sandboxConf = 'sandbox/config'; + copy(self::$configFile . '.json.php', $sandboxConf . '.json.php'); + $this->conf = new ConfigManager($sandboxConf); + $this->conf->set('feed.show_atom', true); + $updater = new Updater([], [], $this->conf, true); + $this->assertTrue($updater->updateMethodAtomDefault()); + $this->assertTrue($this->conf->get('feed.show_atom')); + } } -- cgit v1.2.3 From b897c81f8cbf117828fb710f0827f124025f9a89 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 12 Mar 2017 15:02:06 +0100 Subject: Use 'dev' version on the master branch Allowed check branches are now `latest` and `stable`. --- tests/ApplicationUtilsTest.php | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'tests') diff --git a/tests/ApplicationUtilsTest.php b/tests/ApplicationUtilsTest.php index ad86e21c..ef4f46a8 100644 --- a/tests/ApplicationUtilsTest.php +++ b/tests/ApplicationUtilsTest.php @@ -332,4 +332,15 @@ class ApplicationUtilsTest extends PHPUnit_Framework_TestCase ApplicationUtils::checkResourcePermissions($conf) ); } + + /** + * Check update with 'dev' as curent version (master branch). + * It should always return false. + */ + public function testCheckUpdateDev() + { + $this->assertFalse( + ApplicationUtils::checkUpdate('dev', self::$testUpdateFile, 100, true, true) + ); + } } -- cgit v1.2.3 From c6a4c2882d89c6bcceeeccd319549611a5d1801b Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 12 Mar 2017 16:09:34 +0100 Subject: Proper error if the conf file is invalid instead of fatal error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Error: An error occurred while parsing configuration JSON file (data/config.json.php): error code #4 ➜ Syntax error Please check your JSON syntax (without PHP comment tags) using a JSON lint tool such as jsonlint.com. --- tests/config/ConfigJsonTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/config/ConfigJsonTest.php b/tests/config/ConfigJsonTest.php index 3527f83d..d237bc80 100644 --- a/tests/config/ConfigJsonTest.php +++ b/tests/config/ConfigJsonTest.php @@ -40,7 +40,7 @@ class ConfigJsonTest extends \PHPUnit_Framework_TestCase * Read a non existent config file -> empty array. * * @expectedException \Exception - * @expectedExceptionMessage An error occurred while parsing JSON file: error code #4 + * @expectedExceptionMessageRegExp /An error occurred while parsing JSON configuration file \([\w\/\.]+\): error code #4/ */ public function testReadInvalidJson() { -- cgit v1.2.3 From b786c8836f0576d4feb1543471950c5d24bc7939 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 21 Mar 2017 20:08:40 +0100 Subject: Set Shaarli's version only in shaarli_version.php file --- tests/ApplicationUtilsTest.php | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) (limited to 'tests') diff --git a/tests/ApplicationUtilsTest.php b/tests/ApplicationUtilsTest.php index ef4f46a8..ebdc365c 100644 --- a/tests/ApplicationUtilsTest.php +++ b/tests/ApplicationUtilsTest.php @@ -17,7 +17,7 @@ class FakeApplicationUtils extends ApplicationUtils /** * Toggle HTTP requests, allow overriding the version code */ - public static function getLatestGitVersionCode($url, $timeout=0) + public static function getVersion($url, $timeout=0) { return self::$VERSION_CODE; } @@ -44,18 +44,28 @@ class ApplicationUtilsTest extends PHPUnit_Framework_TestCase } } + /** + * Remove test version file if it exists + */ + public function tearDown() + { + if (is_file('sandbox/version.php')) { + unlink('sandbox/version.php'); + } + } + /** * Retrieve the latest version code available on Git * * Expected format: Semantic Versioning - major.minor.patch */ - public function testGetLatestGitVersionCode() + public function testGetVersionCode() { $testTimeout = 10; $this->assertEquals( '0.5.4', - ApplicationUtils::getLatestGitVersionCode( + ApplicationUtils::getVersion( 'https://raw.githubusercontent.com/shaarli/Shaarli/' .'v0.5.4/shaarli_version.php', $testTimeout @@ -63,7 +73,7 @@ class ApplicationUtilsTest extends PHPUnit_Framework_TestCase ); $this->assertRegExp( self::$versionPattern, - ApplicationUtils::getLatestGitVersionCode( + ApplicationUtils::getVersion( 'https://raw.githubusercontent.com/shaarli/Shaarli/' .'master/shaarli_version.php', $testTimeout @@ -72,14 +82,26 @@ class ApplicationUtilsTest extends PHPUnit_Framework_TestCase } /** - * Attempt to retrieve the latest version from an invalid URL + * Attempt to retrieve the latest version from an invalid File + */ + public function testGetVersionCodeFromFile() + { + file_put_contents('sandbox/version.php', ''. PHP_EOL); + $this->assertEquals( + '1.2.3', + ApplicationUtils::getVersion('sandbox/version.php', 1) + ); + } + + /** + * Attempt to retrieve the latest version from an invalid File */ - public function testGetLatestGitVersionCodeInvalidUrl() + public function testGetVersionCodeInvalidFile() { $oldlog = ini_get('error_log'); ini_set('error_log', '/dev/null'); $this->assertFalse( - ApplicationUtils::getLatestGitVersionCode('htttp://null.io', 1) + ApplicationUtils::getVersion('idontexist', 1) ); ini_set('error_log', $oldlog); } -- cgit v1.2.3 From b2306b0c783365e3f8110ae25bc93f2630b8b2c8 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 16 Jan 2017 12:30:18 +0100 Subject: Move database read/write to FileUtils class + additional unit tests --- tests/FileUtilsTest.php | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/LinkDBTest.php | 2 +- 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 tests/FileUtilsTest.php (limited to 'tests') diff --git a/tests/FileUtilsTest.php b/tests/FileUtilsTest.php new file mode 100644 index 00000000..d764e495 --- /dev/null +++ b/tests/FileUtilsTest.php @@ -0,0 +1,108 @@ +assertTrue(FileUtils::writeFlatDB(self::$file, $data) > 0); + $this->assertTrue(startsWith(file_get_contents(self::$file), 'assertEquals($data, FileUtils::readFlatDB(self::$file)); + + $data = 0; + $this->assertTrue(FileUtils::writeFlatDB(self::$file, $data) > 0); + $this->assertEquals($data, FileUtils::readFlatDB(self::$file)); + + $data = null; + $this->assertTrue(FileUtils::writeFlatDB(self::$file, $data) > 0); + $this->assertEquals($data, FileUtils::readFlatDB(self::$file)); + + $data = false; + $this->assertTrue(FileUtils::writeFlatDB(self::$file, $data) > 0); + $this->assertEquals($data, FileUtils::readFlatDB(self::$file)); + } + + /** + * File not writable: raise an exception. + * + * @expectedException IOException + * @expectedExceptionMessage Error accessing "sandbox/flat.db" + */ + public function testWriteWithoutPermission() + { + touch(self::$file); + chmod(self::$file, 0440); + FileUtils::writeFlatDB(self::$file, null); + } + + /** + * Folder non existent: raise an exception. + * + * @expectedException IOException + * @expectedExceptionMessage Error accessing "nopefolder" + */ + public function testWriteFolderDoesNotExist() + { + FileUtils::writeFlatDB('nopefolder/file', null); + } + + /** + * Folder non writable: raise an exception. + * + * @expectedException IOException + * @expectedExceptionMessage Error accessing "sandbox" + */ + public function testWriteFolderPermission() + { + chmod(dirname(self::$file), 0555); + try { + FileUtils::writeFlatDB(self::$file, null); + } catch (Exception $e) { + chmod(dirname(self::$file), 0755); + throw $e; + } + } + + /** + * Read non existent file, use default parameter. + */ + public function testReadNotExistentFile() + { + $this->assertEquals(null, FileUtils::readFlatDB(self::$file)); + $this->assertEquals(['test'], FileUtils::readFlatDB(self::$file, ['test'])); + } + + /** + * Read non readable file, use default parameter. + */ + public function testReadNotReadable() + { + touch(self::$file); + chmod(self::$file, 0220); + $this->assertEquals(null, FileUtils::readFlatDB(self::$file)); + $this->assertEquals(['test'], FileUtils::readFlatDB(self::$file, ['test'])); + } +} diff --git a/tests/LinkDBTest.php b/tests/LinkDBTest.php index 1f62a34a..7bf98f92 100644 --- a/tests/LinkDBTest.php +++ b/tests/LinkDBTest.php @@ -101,7 +101,7 @@ class LinkDBTest extends PHPUnit_Framework_TestCase * Attempt to instantiate a LinkDB whereas the datastore is not writable * * @expectedException IOException - * @expectedExceptionMessageRegExp /Error accessing\nnull/ + * @expectedExceptionMessageRegExp /Error accessing "null"/ */ public function testConstructDatastoreNotWriteable() { -- cgit v1.2.3 From 4306b184c4471825f916d895b047ed03fdf58985 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 16 Jan 2017 12:31:08 +0100 Subject: History mechanism Use case: rest API service * saved by default in data/history * same format as datastore.php * traced events: * save/edit/delete link * change settings or plugins settings * rename tag --- tests/HistoryTest.php | 195 +++++++++++++++++++++ tests/NetscapeBookmarkUtils/BookmarkImportTest.php | 81 +++++++-- 2 files changed, 259 insertions(+), 17 deletions(-) create mode 100644 tests/HistoryTest.php (limited to 'tests') diff --git a/tests/HistoryTest.php b/tests/HistoryTest.php new file mode 100644 index 00000000..79322249 --- /dev/null +++ b/tests/HistoryTest.php @@ -0,0 +1,195 @@ +assertFileExists(self::$historyFilePath); + } + + /** + * Not writable history file: raise an exception. + * + * @expectedException Exception + * @expectedExceptionMessage History file isn't readable or writable + */ + public function testConstructNotWritable() + { + touch(self::$historyFilePath); + chmod(self::$historyFilePath, 0440); + new History(self::$historyFilePath); + } + + /** + * Not parsable history file: raise an exception. + * + * @expectedException Exception + * @expectedExceptionMessageRegExp /Could not parse history file/ + */ + public function testConstructNotParsable() + { + file_put_contents(self::$historyFilePath, 'not parsable'); + // gzinflate generates a warning + @new History(self::$historyFilePath); + } + + /** + * Test add link event + */ + public function testAddLink() + { + $history = new History(self::$historyFilePath); + $history->addLink(['id' => 0]); + $actual = $history->getHistory()[0]; + $this->assertEquals(History::CREATED, $actual['event']); + $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertEquals(0, $actual['id']); + + $history = new History(self::$historyFilePath); + $history->addLink(['id' => 1]); + $actual = $history->getHistory()[0]; + $this->assertEquals(History::CREATED, $actual['event']); + $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertEquals(1, $actual['id']); + + $history = new History(self::$historyFilePath); + $history->addLink(['id' => 'str']); + $actual = $history->getHistory()[0]; + $this->assertEquals(History::CREATED, $actual['event']); + $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertEquals('str', $actual['id']); + } + + /** + * Test updated link event + */ + public function testUpdateLink() + { + $history = new History(self::$historyFilePath); + $history->updateLink(['id' => 1]); + $actual = $history->getHistory()[0]; + $this->assertEquals(History::UPDATED, $actual['event']); + $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertEquals(1, $actual['id']); + } + + /** + * Test delete link event + */ + public function testDeleteLink() + { + $history = new History(self::$historyFilePath); + $history->deleteLink(['id' => 1]); + $actual = $history->getHistory()[0]; + $this->assertEquals(History::DELETED, $actual['event']); + $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertEquals(1, $actual['id']); + } + + /** + * Test updated settings event + */ + public function testUpdateSettings() + { + $history = new History(self::$historyFilePath); + $history->updateSettings(); + $actual = $history->getHistory()[0]; + $this->assertEquals(History::SETTINGS, $actual['event']); + $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertEmpty($actual['id']); + } + + /** + * Make sure that new items are stored at the beginning + */ + public function testHistoryOrder() + { + $history = new History(self::$historyFilePath); + $history->updateLink(['id' => 1]); + $actual = $history->getHistory()[0]; + $this->assertEquals(History::UPDATED, $actual['event']); + $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertEquals(1, $actual['id']); + + $history->addLink(['id' => 1]); + $actual = $history->getHistory()[0]; + $this->assertEquals(History::CREATED, $actual['event']); + $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertEquals(1, $actual['id']); + } + + /** + * Re-read history from file after writing an event + */ + public function testHistoryRead() + { + $history = new History(self::$historyFilePath); + $history->updateLink(['id' => 1]); + $history = new History(self::$historyFilePath); + $actual = $history->getHistory()[0]; + $this->assertEquals(History::UPDATED, $actual['event']); + $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertEquals(1, $actual['id']); + } + + /** + * Re-read history from file after writing an event and make sure that the order is correct + */ + public function testHistoryOrderRead() + { + $history = new History(self::$historyFilePath); + $history->updateLink(['id' => 1]); + $history->addLink(['id' => 1]); + + $history = new History(self::$historyFilePath); + $actual = $history->getHistory()[0]; + $this->assertEquals(History::CREATED, $actual['event']); + $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertEquals(1, $actual['id']); + + $actual = $history->getHistory()[1]; + $this->assertEquals(History::UPDATED, $actual['event']); + $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertEquals(1, $actual['id']); + } + + /** + * Test retention time: delete old entries. + */ + public function testHistoryRententionTime() + { + $history = new History(self::$historyFilePath, 5); + $history->updateLink(['id' => 1]); + $this->assertEquals(1, count($history->getHistory())); + $arr = $history->getHistory(); + $arr[0]['datetime'] = (new DateTime('-1 hour'))->format(DateTime::ATOM); + FileUtils::writeFlatDB(self::$historyFilePath, $arr); + + $history = new History(self::$historyFilePath, 60); + $this->assertEquals(1, count($history->getHistory())); + $this->assertEquals(1, $history->getHistory()[0]['id']); + $history->updateLink(['id' => 2]); + $this->assertEquals(1, count($history->getHistory())); + $this->assertEquals(2, $history->getHistory()[0]['id']); + } +} diff --git a/tests/NetscapeBookmarkUtils/BookmarkImportTest.php b/tests/NetscapeBookmarkUtils/BookmarkImportTest.php index 5925a8e1..f838f259 100644 --- a/tests/NetscapeBookmarkUtils/BookmarkImportTest.php +++ b/tests/NetscapeBookmarkUtils/BookmarkImportTest.php @@ -33,6 +33,11 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase */ protected static $testDatastore = 'sandbox/datastore.php'; + /** + * @var string History file path + */ + protected static $historyFilePath = 'sandbox/history.php'; + /** * @var LinkDB private LinkDB instance */ @@ -48,6 +53,11 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase */ protected $conf; + /** + * @var History instance. + */ + protected $history; + /** * @var string Save the current timezone. */ @@ -73,6 +83,15 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->linkDb = new LinkDB(self::$testDatastore, true, false); $this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf->set('resource.page_cache', $this->pagecache); + $this->history = new History(self::$historyFilePath); + } + + /** + * Delete history file. + */ + public function tearDown() + { + @unlink(self::$historyFilePath); } public static function tearDownAfterClass() @@ -89,7 +108,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File empty.htm (0 bytes) has an unknown file format.' .' Nothing was imported.', - NetscapeBookmarkUtils::import(NULL, $files, NULL, $this->conf) + NetscapeBookmarkUtils::import(null, $files, null, $this->conf, $this->history) ); $this->assertEquals(0, count($this->linkDb)); } @@ -102,7 +121,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $files = file2array('no_doctype.htm'); $this->assertEquals( 'File no_doctype.htm (350 bytes) has an unknown file format. Nothing was imported.', - NetscapeBookmarkUtils::import(NULL, $files, NULL, $this->conf) + NetscapeBookmarkUtils::import(null, $files, null, $this->conf, $this->history) ); $this->assertEquals(0, count($this->linkDb)); } @@ -116,7 +135,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File internet_explorer_encoding.htm (356 bytes) was successfully processed:' .' 1 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import([], $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(1, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -145,7 +164,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_nested.htm (1337 bytes) was successfully processed:' .' 8 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import([], $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(8, count($this->linkDb)); $this->assertEquals(2, count_private($this->linkDb)); @@ -267,7 +286,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import([], $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); @@ -312,7 +331,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(1, count_private($this->linkDb)); @@ -356,7 +375,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -380,7 +399,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(2, count_private($this->linkDb)); @@ -406,7 +425,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(2, count_private($this->linkDb)); @@ -426,7 +445,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 2 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -452,7 +471,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -473,7 +492,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 2 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(2, count_private($this->linkDb)); @@ -497,7 +516,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -507,7 +526,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 0 links imported, 0 links overwritten, 2 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -526,7 +545,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -553,7 +572,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File netscape_basic.htm (482 bytes) was successfully processed:' .' 2 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(2, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -578,7 +597,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'File same_date.htm (453 bytes) was successfully processed:' .' 3 links imported, 0 links overwritten, 0 links skipped.', - NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->conf) + NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->conf, $this->history) ); $this->assertEquals(3, count($this->linkDb)); $this->assertEquals(0, count_private($this->linkDb)); @@ -595,4 +614,32 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->linkDb[2]['id'] ); } + + public function testImportCreateUpdateHistory() + { + $post = [ + 'privacy' => 'public', + 'overwrite' => 'true', + ]; + $files = file2array('netscape_basic.htm'); + $nbLinks = 2; + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history); + $history = $this->history->getHistory(); + $this->assertEquals($nbLinks, count($history)); + foreach ($history as $value) { + $this->assertEquals(History::CREATED, $value['event']); + $this->assertTrue(new DateTime('-5 seconds') < DateTime::createFromFormat(DateTime::ATOM, $value['datetime'])); + $this->assertTrue(is_int($value['id'])); + } + + // re-import as private, enable overwriting + NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history); + $history = $this->history->getHistory(); + $this->assertEquals($nbLinks * 2, count($history)); + for ($i = 0 ; $i < $nbLinks ; $i++) { + $this->assertEquals(History::UPDATED, $history[$i]['event']); + $this->assertTrue(new DateTime('-5 seconds') < DateTime::createFromFormat(DateTime::ATOM, $history[$i]['datetime'])); + $this->assertTrue(is_int($history[$i]['id'])); + } + } } -- cgit v1.2.3 From d16ca2e22f3d7325fc9593fccd8523eebe226567 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 16 Jan 2017 12:50:36 +0100 Subject: History: lazy loading for the history file Only read it when it's necessary --- tests/HistoryTest.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'tests') diff --git a/tests/HistoryTest.php b/tests/HistoryTest.php index 79322249..91525845 100644 --- a/tests/HistoryTest.php +++ b/tests/HistoryTest.php @@ -21,9 +21,19 @@ class HistoryTest extends PHPUnit_Framework_TestCase /** * Test that the history file is created if it doesn't exist. */ - public function testConstructFileCreated() + public function testConstructLazyLoading() { new History(self::$historyFilePath); + $this->assertFileNotExists(self::$historyFilePath); + } + + /** + * Test that the history file is created if it doesn't exist. + */ + public function testAddEventCreateFile() + { + $history = new History(self::$historyFilePath); + $history->updateSettings(); $this->assertFileExists(self::$historyFilePath); } @@ -37,7 +47,8 @@ class HistoryTest extends PHPUnit_Framework_TestCase { touch(self::$historyFilePath); chmod(self::$historyFilePath, 0440); - new History(self::$historyFilePath); + $history = new History(self::$historyFilePath); + $history->updateSettings(); } /** @@ -49,8 +60,9 @@ class HistoryTest extends PHPUnit_Framework_TestCase public function testConstructNotParsable() { file_put_contents(self::$historyFilePath, 'not parsable'); + $history = new History(self::$historyFilePath); // gzinflate generates a warning - @new History(self::$historyFilePath); + @$history->updateSettings(); } /** -- cgit v1.2.3 From 5e4a83bb98718a10cda24d1a75645ac0fe3a8dab Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 22 Mar 2017 18:55:09 +0100 Subject: Fix version check branch for UT --- tests/ApplicationUtilsTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/ApplicationUtilsTest.php b/tests/ApplicationUtilsTest.php index ebdc365c..ff4c9e17 100644 --- a/tests/ApplicationUtilsTest.php +++ b/tests/ApplicationUtilsTest.php @@ -75,7 +75,7 @@ class ApplicationUtilsTest extends PHPUnit_Framework_TestCase self::$versionPattern, ApplicationUtils::getVersion( 'https://raw.githubusercontent.com/shaarli/Shaarli/' - .'master/shaarli_version.php', + .'latest/shaarli_version.php', $testTimeout ) ); -- cgit v1.2.3 From 68016e37983b882c51c6ac92da6f6cc1250676e5 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Thu, 5 Jan 2017 15:58:24 +0100 Subject: REST API: implement POST link service --- tests/api/controllers/PostLinkTest.php | 193 +++++++++++++++++++++++++++++++++ tests/utils/ReferenceLinkDB.php | 2 +- 2 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 tests/api/controllers/PostLinkTest.php (limited to 'tests') diff --git a/tests/api/controllers/PostLinkTest.php b/tests/api/controllers/PostLinkTest.php new file mode 100644 index 00000000..3ed7bcb0 --- /dev/null +++ b/tests/api/controllers/PostLinkTest.php @@ -0,0 +1,193 @@ +conf = new ConfigManager('tests/utils/config/configJson.json.php'); + $this->refDB = new \ReferenceLinkDB(); + $this->refDB->write(self::$testDatastore); + + $this->container = new Container(); + $this->container['conf'] = $this->conf; + $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + + $this->controller = new Links($this->container); + + $mock = $this->getMock('\Slim\Router', ['relativePathFor']); + $mock->expects($this->any()) + ->method('relativePathFor') + ->willReturn('api/v1/links/1'); + + // affect @property-read... seems to work + $this->controller->getCi()->router = $mock; + + // Used by index_url(). + $this->controller->getCi()['environment'] = [ + 'SERVER_NAME' => 'domain.tld', + 'SERVER_PORT' => 80, + 'SCRIPT_NAME' => '/', + ]; + } + + /** + * After every test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testDatastore); + } + + /** + * Test link creation without any field: creates a blank note. + */ + public function testPostLinkMinimal() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'POST', + ]); + + $request = Request::createFromEnvironment($env); + + $response = $this->controller->postLink($request, new Response()); + $this->assertEquals(201, $response->getStatusCode()); + $this->assertEquals('api/v1/links/1', $response->getHeader('Location')[0]); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(self::NB_FIELDS_LINK, count($data)); + $this->assertEquals(43, $data['id']); + $this->assertRegExp('/[\w-_]{6}/', $data['shorturl']); + $this->assertEquals('http://domain.tld/?' . $data['shorturl'], $data['url']); + $this->assertEquals('?' . $data['shorturl'], $data['title']); + $this->assertEquals('', $data['description']); + $this->assertEquals([], $data['tags']); + $this->assertEquals(false, $data['private']); + $this->assertTrue(new \DateTime('5 seconds ago') < \DateTime::createFromFormat(\DateTime::ATOM, $data['created'])); + $this->assertEquals('', $data['updated']); + } + + /** + * Test link creation with all available fields. + */ + public function testPostLinkFull() + { + $link = [ + 'url' => 'website.tld/test?foo=bar', + 'title' => 'new entry', + 'description' => 'shaare description', + 'tags' => ['one', 'two'], + 'private' => true, + ]; + $env = Environment::mock([ + 'REQUEST_METHOD' => 'POST', + 'CONTENT_TYPE' => 'application/json' + ]); + + $request = Request::createFromEnvironment($env); + $request = $request->withParsedBody($link); + $response = $this->controller->postLink($request, new Response()); + + $this->assertEquals(201, $response->getStatusCode()); + $this->assertEquals('api/v1/links/1', $response->getHeader('Location')[0]); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(self::NB_FIELDS_LINK, count($data)); + $this->assertEquals(43, $data['id']); + $this->assertRegExp('/[\w-_]{6}/', $data['shorturl']); + $this->assertEquals('http://' . $link['url'], $data['url']); + $this->assertEquals($link['title'], $data['title']); + $this->assertEquals($link['description'], $data['description']); + $this->assertEquals($link['tags'], $data['tags']); + $this->assertEquals(true, $data['private']); + $this->assertTrue(new \DateTime('2 seconds ago') < \DateTime::createFromFormat(\DateTime::ATOM, $data['created'])); + $this->assertEquals('', $data['updated']); + } + + /** + * Test link creation with an existing link (duplicate URL). Should return a 409 HTTP error and the existing link. + */ + public function testPostLinkDuplicate() + { + $link = [ + 'url' => 'mediagoblin.org/', + 'title' => 'new entry', + 'description' => 'shaare description', + 'tags' => ['one', 'two'], + 'private' => true, + ]; + $env = Environment::mock([ + 'REQUEST_METHOD' => 'POST', + 'CONTENT_TYPE' => 'application/json' + ]); + + $request = Request::createFromEnvironment($env); + $request = $request->withParsedBody($link); + $response = $this->controller->postLink($request, new Response()); + + $this->assertEquals(409, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(self::NB_FIELDS_LINK, count($data)); + $this->assertEquals(7, $data['id']); + $this->assertEquals('IuWvgA', $data['shorturl']); + $this->assertEquals('http://mediagoblin.org/', $data['url']); + $this->assertEquals('MediaGoblin', $data['title']); + $this->assertEquals('A free software media publishing platform #hashtagOther', $data['description']); + $this->assertEquals(['gnu', 'media', 'web', '.hidden', 'hashtag'], $data['tags']); + $this->assertEquals(false, $data['private']); + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20130614_184135'), + \DateTime::createFromFormat(\DateTime::ATOM, $data['created']) + ); + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20130615_184230'), + \DateTime::createFromFormat(\DateTime::ATOM, $data['updated']) + ); + } +} diff --git a/tests/utils/ReferenceLinkDB.php b/tests/utils/ReferenceLinkDB.php index 36d58c68..1f4b3063 100644 --- a/tests/utils/ReferenceLinkDB.php +++ b/tests/utils/ReferenceLinkDB.php @@ -56,7 +56,7 @@ class ReferenceLinkDB 0, DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20130614_184135'), 'gnu media web .hidden hashtag', - null, + DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20130615_184230'), 'IuWvgA' ); -- cgit v1.2.3 From 81bd104daa26204b8deffcd2d0723d234c9514a6 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 28 Mar 2017 20:40:14 +0200 Subject: Theme: use format_date function for daily date --- tests/languages/de/UtilsDeTest.php | 22 ++++++++++++++++++++-- tests/languages/en/UtilsEnTest.php | 22 ++++++++++++++++++++-- tests/languages/fr/UtilsFrTest.php | 20 +++++++++++++++++++- 3 files changed, 59 insertions(+), 5 deletions(-) (limited to 'tests') diff --git a/tests/languages/de/UtilsDeTest.php b/tests/languages/de/UtilsDeTest.php index 545fa572..6c9c9adc 100644 --- a/tests/languages/de/UtilsDeTest.php +++ b/tests/languages/de/UtilsDeTest.php @@ -11,7 +11,16 @@ class UtilsDeTest extends UtilsTest public function testDateFormat() { $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); - $this->assertRegExp('/1. Januar 2017 (um )?10:11:12 GMT\+0?3(:00)?/', format_date($date, true)); + $this->assertRegExp('/1\. Januar 2017 (um )?10:11:12 GMT\+0?3(:00)?/', format_date($date, true, true)); + } + + /** + * Test date_format() without time. + */ + public function testDateFormatNoTime() + { + $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); + $this->assertRegExp('/1\. Januar 2017/', format_date($date, false,true)); } /** @@ -20,7 +29,16 @@ class UtilsDeTest extends UtilsTest public function testDateFormatDefault() { $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); - $this->assertEquals('So 01 Jan 2017 10:11:12 EAT', format_date($date, false)); + $this->assertEquals('So 01 Jan 2017 10:11:12 EAT', format_date($date, true, false)); + } + + /** + * Test date_format() using builtin PHP function strftime without time. + */ + public function testDateFormatDefaultNoTime() + { + $date = DateTime::createFromFormat('Ymd_His', '20170201_101112'); + $this->assertEquals('01.02.2017', format_date($date, false, false)); } /** diff --git a/tests/languages/en/UtilsEnTest.php b/tests/languages/en/UtilsEnTest.php index 7c829ac7..d8680b2b 100644 --- a/tests/languages/en/UtilsEnTest.php +++ b/tests/languages/en/UtilsEnTest.php @@ -11,7 +11,16 @@ class UtilsEnTest extends UtilsTest public function testDateFormat() { $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); - $this->assertRegExp('/January 1, 2017 (at )?10:11:12 AM GMT\+0?3(:00)?/', format_date($date, true)); + $this->assertRegExp('/January 1, 2017 (at )?10:11:12 AM GMT\+0?3(:00)?/', format_date($date, true, true)); + } + + /** + * Test date_format() without time. + */ + public function testDateFormatNoTime() + { + $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); + $this->assertRegExp('/January 1, 2017/', format_date($date, false, true)); } /** @@ -20,7 +29,16 @@ class UtilsEnTest extends UtilsTest public function testDateFormatDefault() { $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); - $this->assertEquals('Sun 01 Jan 2017 10:11:12 AM EAT', format_date($date, false)); + $this->assertEquals('Sun 01 Jan 2017 10:11:12 AM EAT', format_date($date, true, false)); + } + + /** + * Test date_format() using builtin PHP function strftime without time. + */ + public function testDateFormatDefaultNoTime() + { + $date = DateTime::createFromFormat('Ymd_His', '20170201_101112'); + $this->assertEquals('02/01/2017', format_date($date, false, false)); } /** diff --git a/tests/languages/fr/UtilsFrTest.php b/tests/languages/fr/UtilsFrTest.php index 45996ee2..0d50a878 100644 --- a/tests/languages/fr/UtilsFrTest.php +++ b/tests/languages/fr/UtilsFrTest.php @@ -14,13 +14,31 @@ class UtilsFrTest extends UtilsTest $this->assertRegExp('/1 janvier 2017 (à )?10:11:12 UTC\+0?3(:00)?/', format_date($date)); } + /** + * Test date_format() without time. + */ + public function testDateFormatNoTime() + { + $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); + $this->assertRegExp('/1 janvier 2017/', format_date($date, false, true)); + } + /** * Test date_format() using builtin PHP function strftime. */ public function testDateFormatDefault() { $date = DateTime::createFromFormat('Ymd_His', '20170101_101112'); - $this->assertEquals('dim. 01 janv. 2017 10:11:12 EAT', format_date($date, false)); + $this->assertEquals('dim. 01 janv. 2017 10:11:12 EAT', format_date($date, true, false)); + } + + /** + * Test date_format() using builtin PHP function strftime without time. + */ + public function testDateFormatDefaultNoTime() + { + $date = DateTime::createFromFormat('Ymd_His', '20170201_101112'); + $this->assertEquals('01/02/2017', format_date($date, false, false)); } /** -- cgit v1.2.3 From 8e33d0e767579f9f9c783973b6cce14ccf4620dd Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 1 Apr 2017 12:26:31 +0200 Subject: Remove readityourself plugin Fixes #818 --- tests/plugins/PluginReadityourselfTest.php | 99 ------------------------------ 1 file changed, 99 deletions(-) delete mode 100644 tests/plugins/PluginReadityourselfTest.php (limited to 'tests') diff --git a/tests/plugins/PluginReadityourselfTest.php b/tests/plugins/PluginReadityourselfTest.php deleted file mode 100644 index bbba9676..00000000 --- a/tests/plugins/PluginReadityourselfTest.php +++ /dev/null @@ -1,99 +0,0 @@ -set('plugins.READITYOUSELF_URL', 'value'); - $errors = readityourself_init($conf); - $this->assertEmpty($errors); - } - - /** - * Test Readityourself init with errors. - */ - public function testReadityourselfInitError() - { - $conf = new ConfigManager(''); - $errors = readityourself_init($conf); - $this->assertNotEmpty($errors); - } - - /** - * Test render_linklist hook. - */ - public function testReadityourselfLinklist() - { - $conf = new ConfigManager(''); - $conf->set('plugins.READITYOUSELF_URL', 'value'); - $str = 'http://randomstr.com/test'; - $data = array( - 'title' => $str, - 'links' => array( - array( - 'url' => $str, - ) - ) - ); - - $data = hook_readityourself_render_linklist($data, $conf); - $link = $data['links'][0]; - // data shouldn't be altered - $this->assertEquals($str, $data['title']); - $this->assertEquals($str, $link['url']); - - // plugin data - $this->assertEquals(1, count($link['link_plugin'])); - $this->assertNotFalse(strpos($link['link_plugin'][0], $str)); - } - - /** - * Test without config: nothing should happened. - */ - public function testReadityourselfLinklistWithoutConfig() - { - $conf = new ConfigManager(''); - $conf->set('plugins.READITYOUSELF_URL', null); - $str = 'http://randomstr.com/test'; - $data = array( - 'title' => $str, - 'links' => array( - array( - 'url' => $str, - ) - ) - ); - - $data = hook_readityourself_render_linklist($data, $conf); - $link = $data['links'][0]; - // data shouldn't be altered - $this->assertEquals($str, $data['title']); - $this->assertEquals($str, $link['url']); - - // plugin data - $this->assertArrayNotHasKey('link_plugin', $link); - } -} -- cgit v1.2.3 From 84315a3bad02652e5ea26586fab003eaaf467e30 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Fri, 10 Mar 2017 20:06:01 +0100 Subject: Fix a warning generated in return_bytes function and refactor it It was multiplying a string containing a letter. Moved function to Utils.php and display a human readable limit size --- tests/UtilsTest.php | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) (limited to 'tests') diff --git a/tests/UtilsTest.php b/tests/UtilsTest.php index e70cc1ae..e95c6248 100644 --- a/tests/UtilsTest.php +++ b/tests/UtilsTest.php @@ -4,6 +4,7 @@ */ require_once 'application/Utils.php'; +require_once 'application/Languages.php'; require_once 'tests/utils/ReferenceSessionIdHashes.php'; // Initialize reference data before PHPUnit starts a session @@ -326,4 +327,83 @@ class UtilsTest extends PHPUnit_Framework_TestCase $this->assertFalse(format_date([])); $this->assertFalse(format_date(null)); } + + /** + * Test is_integer_mixed with valid values + */ + public function testIsIntegerMixedValid() + { + $this->assertTrue(is_integer_mixed(12)); + $this->assertTrue(is_integer_mixed('12')); + $this->assertTrue(is_integer_mixed(-12)); + $this->assertTrue(is_integer_mixed('-12')); + $this->assertTrue(is_integer_mixed(0)); + $this->assertTrue(is_integer_mixed('0')); + $this->assertTrue(is_integer_mixed(0x0a)); + } + + /** + * Test is_integer_mixed with invalid values + */ + public function testIsIntegerMixedInvalid() + { + $this->assertFalse(is_integer_mixed(true)); + $this->assertFalse(is_integer_mixed(false)); + $this->assertFalse(is_integer_mixed([])); + $this->assertFalse(is_integer_mixed(['test'])); + $this->assertFalse(is_integer_mixed([12])); + $this->assertFalse(is_integer_mixed(new DateTime())); + $this->assertFalse(is_integer_mixed('0x0a')); + $this->assertFalse(is_integer_mixed('12k')); + $this->assertFalse(is_integer_mixed('k12')); + $this->assertFalse(is_integer_mixed('')); + } + + /** + * Test return_bytes + */ + public function testReturnBytes() + { + $this->assertEquals(2 * 1024, return_bytes('2k')); + $this->assertEquals(2 * 1024, return_bytes('2K')); + $this->assertEquals(2 * (1024 ** 2), return_bytes('2m')); + $this->assertEquals(2 * (1024 ** 2), return_bytes('2M')); + $this->assertEquals(2 * (1024 ** 3), return_bytes('2g')); + $this->assertEquals(2 * (1024 ** 3), return_bytes('2G')); + $this->assertEquals(374, return_bytes('374')); + $this->assertEquals(374, return_bytes(374)); + $this->assertEquals(0, return_bytes('0')); + $this->assertEquals(0, return_bytes(0)); + $this->assertEquals(-1, return_bytes('-1')); + $this->assertEquals(-1, return_bytes(-1)); + $this->assertEquals('', return_bytes('')); + } + + /** + * Test human_bytes + */ + public function testHumanBytes() + { + $this->assertEquals('2kiB', human_bytes(2 * 1024)); + $this->assertEquals('2kiB', human_bytes(strval(2 * 1024))); + $this->assertEquals('2MiB', human_bytes(2 * (1024 ** 2))); + $this->assertEquals('2MiB', human_bytes(strval(2 * (1024 ** 2)))); + $this->assertEquals('2GiB', human_bytes(2 * (1024 ** 3))); + $this->assertEquals('2GiB', human_bytes(strval(2 * (1024 ** 3)))); + $this->assertEquals('374B', human_bytes(374)); + $this->assertEquals('374B', human_bytes('374')); + $this->assertEquals('Unlimited', human_bytes('0')); + $this->assertEquals('Unlimited', human_bytes(0)); + $this->assertEquals('Setting not set', human_bytes('')); + } + + /** + * Test get_max_upload_size + */ + public function testGetMaxUploadSize() + { + $this->assertEquals('1MiB', get_max_upload_size(2097152, '1024k')); + $this->assertEquals('1MiB', get_max_upload_size('1m', '2m')); + $this->assertEquals('100B', get_max_upload_size(100, 100)); + } } -- cgit v1.2.3 From b68134ac1d6a287e3a5003ccde137dd0c7ecdc52 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 3 Apr 2017 18:53:17 +0200 Subject: UtilsTest: PHP 5.5 compatibility --- tests/UtilsTest.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'tests') diff --git a/tests/UtilsTest.php b/tests/UtilsTest.php index e95c6248..e5ff01e6 100644 --- a/tests/UtilsTest.php +++ b/tests/UtilsTest.php @@ -366,10 +366,10 @@ class UtilsTest extends PHPUnit_Framework_TestCase { $this->assertEquals(2 * 1024, return_bytes('2k')); $this->assertEquals(2 * 1024, return_bytes('2K')); - $this->assertEquals(2 * (1024 ** 2), return_bytes('2m')); - $this->assertEquals(2 * (1024 ** 2), return_bytes('2M')); - $this->assertEquals(2 * (1024 ** 3), return_bytes('2g')); - $this->assertEquals(2 * (1024 ** 3), return_bytes('2G')); + $this->assertEquals(2 * (pow(1024, 2)), return_bytes('2m')); + $this->assertEquals(2 * (pow(1024, 2)), return_bytes('2M')); + $this->assertEquals(2 * (pow(1024, 3)), return_bytes('2g')); + $this->assertEquals(2 * (pow(1024, 3)), return_bytes('2G')); $this->assertEquals(374, return_bytes('374')); $this->assertEquals(374, return_bytes(374)); $this->assertEquals(0, return_bytes('0')); @@ -386,10 +386,10 @@ class UtilsTest extends PHPUnit_Framework_TestCase { $this->assertEquals('2kiB', human_bytes(2 * 1024)); $this->assertEquals('2kiB', human_bytes(strval(2 * 1024))); - $this->assertEquals('2MiB', human_bytes(2 * (1024 ** 2))); - $this->assertEquals('2MiB', human_bytes(strval(2 * (1024 ** 2)))); - $this->assertEquals('2GiB', human_bytes(2 * (1024 ** 3))); - $this->assertEquals('2GiB', human_bytes(strval(2 * (1024 ** 3)))); + $this->assertEquals('2MiB', human_bytes(2 * (pow(1024, 2)))); + $this->assertEquals('2MiB', human_bytes(strval(2 * (pow(1024, 2))))); + $this->assertEquals('2GiB', human_bytes(2 * (pow(1024, 3)))); + $this->assertEquals('2GiB', human_bytes(strval(2 * (pow(1024, 3))))); $this->assertEquals('374B', human_bytes(374)); $this->assertEquals('374B', human_bytes('374')); $this->assertEquals('Unlimited', human_bytes('0')); -- cgit v1.2.3 From ae3aa96898834ce3992790e1622541ce48fd78d3 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 22 Mar 2017 19:16:35 +0100 Subject: Change timezone data structure send to the templates The goal of this is to be able to adapt the timezone form in template without hacking the HTML already rendered. * there are two arrays available: * `continents` which contains only a list of available continents * `cities` which contains a list of available timezone cities, associated with their continent Note: there are two distinct array because RainTPL doesn't support nested loop very well. --- tests/TimeZoneTest.php | 83 +++++++++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 32 deletions(-) (limited to 'tests') diff --git a/tests/TimeZoneTest.php b/tests/TimeZoneTest.php index 2976d116..127fdc19 100644 --- a/tests/TimeZoneTest.php +++ b/tests/TimeZoneTest.php @@ -10,25 +10,46 @@ require_once 'application/TimeZone.php'; */ class TimeZoneTest extends PHPUnit_Framework_TestCase { + /** + * @var array of timezones + */ + protected $installedTimezones; + + public function setUp() + { + $this->installedTimezones = [ + 'Antarctica/Syowa', + 'Europe/London', + 'Europe/Paris', + 'UTC' + ]; + } + /** * Generate a timezone selection form */ public function testGenerateTimeZoneForm() { - $generated = generateTimeZoneForm(); + $expected = [ + 'continents' => [ + 'Antarctica', + 'Europe', + 'UTC', + 'selected' => '', + ], + 'cities' => [ + ['continent' => 'Antarctica', 'city' => 'Syowa'], + ['continent' => 'Europe', 'city' => 'London'], + ['continent' => 'Europe', 'city' => 'Paris'], + ['continent' => 'UTC', 'city' => 'UTC'], + 'selected' => '', + ] + ]; - // HTML form - $this->assertStringStartsWith('Continent:assertContains('selected="selected"', $generated[0]); - $this->assertStringEndsWith('
    ', $generated[0]); + list($continents, $cities) = generateTimeZoneData($this->installedTimezones); - // Javascript handler - $this->assertStringStartsWith('', $generated[1]); + $this->assertEquals($expected['continents'], $continents); + $this->assertEquals($expected['cities'], $cities); } /** @@ -36,28 +57,26 @@ class TimeZoneTest extends PHPUnit_Framework_TestCase */ public function testGenerateTimeZoneFormPreselected() { - $generated = generateTimeZoneForm('Antarctica/Syowa'); - - // HTML form - $this->assertStringStartsWith('Continent:assertContains( - 'value="Antarctica" selected="selected"', - $generated[0] - ); - $this->assertContains( - 'value="Syowa" selected="selected"', - $generated[0] - ); - $this->assertStringEndsWith('
    ', $generated[0]); + $expected = [ + 'continents' => [ + 'Antarctica', + 'Europe', + 'UTC', + 'selected' => 'Antarctica', + ], + 'cities' => [ + ['continent' => 'Antarctica', 'city' => 'Syowa'], + ['continent' => 'Europe', 'city' => 'London'], + ['continent' => 'Europe', 'city' => 'Paris'], + ['continent' => 'UTC', 'city' => 'UTC'], + 'selected' => 'Syowa', + ] + ]; + list($continents, $cities) = generateTimeZoneData($this->installedTimezones, 'Antarctica/Syowa'); - // Javascript handler - $this->assertStringStartsWith('', $generated[1]); + $this->assertEquals($expected['continents'], $continents); + $this->assertEquals($expected['cities'], $cities); } /** -- cgit v1.2.3 From 6a19124a0970dfd5744c4a193b5d907ba85b323e Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 10 Apr 2017 20:01:10 +0200 Subject: Use raw bytes for upload size hidden input --- tests/UtilsTest.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/UtilsTest.php b/tests/UtilsTest.php index e5ff01e6..d6a0aad5 100644 --- a/tests/UtilsTest.php +++ b/tests/UtilsTest.php @@ -392,13 +392,14 @@ class UtilsTest extends PHPUnit_Framework_TestCase $this->assertEquals('2GiB', human_bytes(strval(2 * (pow(1024, 3))))); $this->assertEquals('374B', human_bytes(374)); $this->assertEquals('374B', human_bytes('374')); + $this->assertEquals('232kiB', human_bytes(237481)); $this->assertEquals('Unlimited', human_bytes('0')); $this->assertEquals('Unlimited', human_bytes(0)); $this->assertEquals('Setting not set', human_bytes('')); } /** - * Test get_max_upload_size + * Test get_max_upload_size with formatting */ public function testGetMaxUploadSize() { @@ -406,4 +407,14 @@ class UtilsTest extends PHPUnit_Framework_TestCase $this->assertEquals('1MiB', get_max_upload_size('1m', '2m')); $this->assertEquals('100B', get_max_upload_size(100, 100)); } + + /** + * Test get_max_upload_size without formatting + */ + public function testGetMaxUploadSizeRaw() + { + $this->assertEquals('1048576', get_max_upload_size(2097152, '1024k', false)); + $this->assertEquals('1048576', get_max_upload_size('1m', '2m', false)); + $this->assertEquals('100', get_max_upload_size(100, 100, false)); + } } -- cgit v1.2.3 From cf9181dddf8b6113b1b017e4bcb21fac0a0b1c83 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 1 Apr 2017 11:11:25 +0200 Subject: REST API: implement PUT method * Related to #609 * Documentation: http://shaarli.github.io/api-documentation/#links-link-put --- tests/api/ApiUtilsTest.php | 78 +++++++++++++ tests/api/controllers/PutLinkTest.php | 199 ++++++++++++++++++++++++++++++++++ 2 files changed, 277 insertions(+) create mode 100644 tests/api/controllers/PutLinkTest.php (limited to 'tests') diff --git a/tests/api/ApiUtilsTest.php b/tests/api/ApiUtilsTest.php index b4431d1b..62baf4c5 100644 --- a/tests/api/ApiUtilsTest.php +++ b/tests/api/ApiUtilsTest.php @@ -271,4 +271,82 @@ class ApiUtilsTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expected, ApiUtils::formatLink($link, $indexUrl)); } + + /** + * Test updateLink with valid data, and also unnecessary fields. + */ + public function testUpdateLink() + { + $created = \DateTime::createFromFormat('Ymd_His', '20170107_160102'); + $old = [ + 'id' => 12, + 'url' => '?abc', + 'shorturl' => 'abc', + 'title' => 'Note', + 'description' => '', + 'tags' => '', + 'private' => '', + 'created' => $created, + ]; + + $new = [ + 'id' => 13, + 'shorturl' => 'nope', + 'url' => 'http://somewhere.else', + 'title' => 'Le Cid', + 'description' => 'Percé jusques au fond du cœur [...]', + 'tags' => 'corneille rodrigue', + 'private' => true, + 'created' => 'creation', + 'updated' => 'updation', + ]; + + $result = ApiUtils::updateLink($old, $new); + $this->assertEquals(12, $result['id']); + $this->assertEquals('http://somewhere.else', $result['url']); + $this->assertEquals('abc', $result['shorturl']); + $this->assertEquals('Le Cid', $result['title']); + $this->assertEquals('Percé jusques au fond du cœur [...]', $result['description']); + $this->assertEquals('corneille rodrigue', $result['tags']); + $this->assertEquals(true, $result['private']); + $this->assertEquals($created, $result['created']); + $this->assertTrue(new \DateTime('5 seconds ago') < $result['updated']); + } + + /** + * Test updateLink with minimal data. + */ + public function testUpdateLinkMinimal() + { + $created = \DateTime::createFromFormat('Ymd_His', '20170107_160102'); + $old = [ + 'id' => 12, + 'url' => '?abc', + 'shorturl' => 'abc', + 'title' => 'Note', + 'description' => 'Interesting description!', + 'tags' => 'doggo', + 'private' => true, + 'created' => $created, + ]; + + $new = [ + 'url' => '', + 'title' => '', + 'description' => '', + 'tags' => '', + 'private' => false, + ]; + + $result = ApiUtils::updateLink($old, $new); + $this->assertEquals(12, $result['id']); + $this->assertEquals('?abc', $result['url']); + $this->assertEquals('abc', $result['shorturl']); + $this->assertEquals('?abc', $result['title']); + $this->assertEquals('', $result['description']); + $this->assertEquals('', $result['tags']); + $this->assertEquals(false, $result['private']); + $this->assertEquals($created, $result['created']); + $this->assertTrue(new \DateTime('5 seconds ago') < $result['updated']); + } } diff --git a/tests/api/controllers/PutLinkTest.php b/tests/api/controllers/PutLinkTest.php new file mode 100644 index 00000000..4096c1a7 --- /dev/null +++ b/tests/api/controllers/PutLinkTest.php @@ -0,0 +1,199 @@ +conf = new ConfigManager('tests/utils/config/configJson.json.php'); + $this->refDB = new \ReferenceLinkDB(); + $this->refDB->write(self::$testDatastore); + + $this->container = new Container(); + $this->container['conf'] = $this->conf; + $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + + $this->controller = new Links($this->container); + + // Used by index_url(). + $this->controller->getCi()['environment'] = [ + 'SERVER_NAME' => 'domain.tld', + 'SERVER_PORT' => 80, + 'SCRIPT_NAME' => '/', + ]; + } + + /** + * After every test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testDatastore); + } + + /** + * Test link update without value: reset the link to default values + */ + public function testPutLinkMinimal() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'PUT', + ]); + $id = '41'; + $request = Request::createFromEnvironment($env); + + $response = $this->controller->putLink($request, new Response(), ['id' => $id]); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(self::NB_FIELDS_LINK, count($data)); + $this->assertEquals($id, $data['id']); + $this->assertEquals('WDWyig', $data['shorturl']); + $this->assertEquals('http://domain.tld/?WDWyig', $data['url']); + $this->assertEquals('?WDWyig', $data['title']); + $this->assertEquals('', $data['description']); + $this->assertEquals([], $data['tags']); + $this->assertEquals(false, $data['private']); + $this->assertEquals( + \DateTime::createFromFormat('Ymd_His', '20150310_114651'), + \DateTime::createFromFormat(\DateTime::ATOM, $data['created']) + ); + $this->assertTrue(new \DateTime('5 seconds ago') < \DateTime::createFromFormat(\DateTime::ATOM, $data['updated'])); + } + + /** + * Test link update with new values + */ + public function testPutLinkWithValues() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'PUT', + 'CONTENT_TYPE' => 'application/json' + ]); + $id = 41; + $update = [ + 'url' => 'http://somewhere.else', + 'title' => 'Le Cid', + 'description' => 'Percé jusques au fond du cœur [...]', + 'tags' => ['corneille', 'rodrigue'], + 'private' => true, + ]; + $request = Request::createFromEnvironment($env); + $request = $request->withParsedBody($update); + + $response = $this->controller->putLink($request, new Response(), ['id' => $id]); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(self::NB_FIELDS_LINK, count($data)); + $this->assertEquals($id, $data['id']); + $this->assertEquals('WDWyig', $data['shorturl']); + $this->assertEquals('http://somewhere.else', $data['url']); + $this->assertEquals('Le Cid', $data['title']); + $this->assertEquals('Percé jusques au fond du cœur [...]', $data['description']); + $this->assertEquals(['corneille', 'rodrigue'], $data['tags']); + $this->assertEquals(true, $data['private']); + $this->assertEquals( + \DateTime::createFromFormat('Ymd_His', '20150310_114651'), + \DateTime::createFromFormat(\DateTime::ATOM, $data['created']) + ); + $this->assertTrue(new \DateTime('5 seconds ago') < \DateTime::createFromFormat(\DateTime::ATOM, $data['updated'])); + } + + /** + * Test link update with an existing URL: 409 Conflict with the existing link as body + */ + public function testPutLinkDuplicate() + { + $link = [ + 'url' => 'mediagoblin.org/', + 'title' => 'new entry', + 'description' => 'shaare description', + 'tags' => ['one', 'two'], + 'private' => true, + ]; + $env = Environment::mock([ + 'REQUEST_METHOD' => 'PUT', + 'CONTENT_TYPE' => 'application/json' + ]); + + $request = Request::createFromEnvironment($env); + $request = $request->withParsedBody($link); + $response = $this->controller->putLink($request, new Response(), ['id' => 41]); + + $this->assertEquals(409, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(self::NB_FIELDS_LINK, count($data)); + $this->assertEquals(7, $data['id']); + $this->assertEquals('IuWvgA', $data['shorturl']); + $this->assertEquals('http://mediagoblin.org/', $data['url']); + $this->assertEquals('MediaGoblin', $data['title']); + $this->assertEquals('A free software media publishing platform #hashtagOther', $data['description']); + $this->assertEquals(['gnu', 'media', 'web', '.hidden', 'hashtag'], $data['tags']); + $this->assertEquals(false, $data['private']); + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20130614_184135'), + \DateTime::createFromFormat(\DateTime::ATOM, $data['created']) + ); + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20130615_184230'), + \DateTime::createFromFormat(\DateTime::ATOM, $data['updated']) + ); + } + + /** + * Test link update on non existent link => ApiLinkNotFoundException. + * + * @expectedException Shaarli\Api\Exceptions\ApiLinkNotFoundException + * @expectedExceptionMessage Link not found + */ + public function testGetLink404() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'PUT', + ]); + $request = Request::createFromEnvironment($env); + + $this->controller->putLink($request, new Response(), ['id' => -1]); + } +} -- cgit v1.2.3 From 0843848c1d18e92504c43d181063a2012f8fd5b9 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 6 May 2017 17:32:16 +0200 Subject: API: add DELETE endpoint Based on #840 See http://shaarli.github.io/api-documentation/\#links-link-delete --- tests/api/controllers/DeleteLinkTest.php | 104 +++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 tests/api/controllers/DeleteLinkTest.php (limited to 'tests') diff --git a/tests/api/controllers/DeleteLinkTest.php b/tests/api/controllers/DeleteLinkTest.php new file mode 100644 index 00000000..6894e8a2 --- /dev/null +++ b/tests/api/controllers/DeleteLinkTest.php @@ -0,0 +1,104 @@ +conf = new ConfigManager('tests/utils/config/configJson'); + $this->refDB = new \ReferenceLinkDB(); + $this->refDB->write(self::$testDatastore); + $this->linkDB = new \LinkDB(self::$testDatastore, true, false); + $this->container = new Container(); + $this->container['conf'] = $this->conf; + $this->container['db'] = $this->linkDB; + + $this->controller = new Links($this->container); + } + + /** + * After each test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testDatastore); + } + + /** + * Test DELETE link endpoint: the link should be removed. + */ + public function testDeleteLinkValid() + { + $id = '41'; + $this->assertTrue(isset($this->linkDB[$id])); + $env = Environment::mock([ + 'REQUEST_METHOD' => 'DELETE', + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->deleteLink($request, new Response(), ['id' => $id]); + $this->assertEquals(204, $response->getStatusCode()); + $this->assertEmpty((string) $response->getBody()); + + $this->linkDB = new \LinkDB(self::$testDatastore, true, false); + $this->assertFalse(isset($this->linkDB[$id])); + } + + /** + * Test DELETE link endpoint: reach not existing ID. + * + * @expectedException Shaarli\Api\Exceptions\ApiLinkNotFoundException + */ + public function testDeleteLink404() + { + $id = -1; + $this->assertFalse(isset($this->linkDB[$id])); + $env = Environment::mock([ + 'REQUEST_METHOD' => 'DELETE', + ]); + $request = Request::createFromEnvironment($env); + + $this->controller->deleteLink($request, new Response(), ['id' => $id]); + } +} -- cgit v1.2.3 From 61d406933e7311a3eb3c0379f1dea8b790459722 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 6 May 2017 19:39:39 +0200 Subject: API: Get History endpoint See http://shaarli.github.io/api-documentation/#links-history-get --- tests/api/controllers/HistoryTest.php | 221 ++++++++++++++++++++++++++++++++++ tests/utils/ReferenceHistory.php | 82 +++++++++++++ 2 files changed, 303 insertions(+) create mode 100644 tests/api/controllers/HistoryTest.php create mode 100644 tests/utils/ReferenceHistory.php (limited to 'tests') diff --git a/tests/api/controllers/HistoryTest.php b/tests/api/controllers/HistoryTest.php new file mode 100644 index 00000000..21e9c0ba --- /dev/null +++ b/tests/api/controllers/HistoryTest.php @@ -0,0 +1,221 @@ +conf = new ConfigManager('tests/utils/config/configJson.json.php'); + $this->refHistory = new \ReferenceHistory(); + $this->refHistory->write(self::$testHistory); + $this->conf->set('resource.history', self::$testHistory); + $this->container = new Container(); + $this->container['conf'] = $this->conf; + $this->container['db'] = true; + + $this->controller = new History($this->container); + } + + /** + * After every test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testHistory); + } + + /** + * Test /history service without parameter. + */ + public function testGetHistory() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->getHistory($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + + $this->assertEquals($this->refHistory->count(), count($data)); + + $this->assertEquals(\History::DELETED, $data[0]['event']); + $this->assertEquals( + \DateTime::createFromFormat('Ymd_His', '20170303_121216')->format(\DateTime::ATOM), + $data[0]['datetime'] + ); + $this->assertEquals(124, $data[0]['id']); + + $this->assertEquals(\History::SETTINGS, $data[1]['event']); + $this->assertEquals( + \DateTime::createFromFormat('Ymd_His', '20170302_121215')->format(\DateTime::ATOM), + $data[1]['datetime'] + ); + $this->assertNull($data[1]['id']); + + $this->assertEquals(\History::UPDATED, $data[2]['event']); + $this->assertEquals( + \DateTime::createFromFormat('Ymd_His', '20170301_121214')->format(\DateTime::ATOM), + $data[2]['datetime'] + ); + $this->assertEquals(123, $data[2]['id']); + + $this->assertEquals(\History::CREATED, $data[3]['event']); + $this->assertEquals( + \DateTime::createFromFormat('Ymd_His', '20170201_121214')->format(\DateTime::ATOM), + $data[3]['datetime'] + ); + $this->assertEquals(124, $data[3]['id']); + + $this->assertEquals(\History::CREATED, $data[4]['event']); + $this->assertEquals( + \DateTime::createFromFormat('Ymd_His', '20170101_121212')->format(\DateTime::ATOM), + $data[4]['datetime'] + ); + $this->assertEquals(123, $data[4]['id']); + } + + /** + * Test /history service with limit parameter. + */ + public function testGetHistoryLimit() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'limit=1' + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->getHistory($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + + $this->assertEquals(1, count($data)); + + $this->assertEquals(\History::DELETED, $data[0]['event']); + $this->assertEquals( + \DateTime::createFromFormat('Ymd_His', '20170303_121216')->format(\DateTime::ATOM), + $data[0]['datetime'] + ); + $this->assertEquals(124, $data[0]['id']); + } + + /** + * Test /history service with offset parameter. + */ + public function testGetHistoryOffset() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'offset=4' + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->getHistory($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + + $this->assertEquals(1, count($data)); + + $this->assertEquals(\History::CREATED, $data[0]['event']); + $this->assertEquals( + \DateTime::createFromFormat('Ymd_His', '20170101_121212')->format(\DateTime::ATOM), + $data[0]['datetime'] + ); + $this->assertEquals(123, $data[0]['id']); + } + + /** + * Test /history service with since parameter. + */ + public function testGetHistorySince() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'since=2017-03-03T00:00:00%2B00:00' + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->getHistory($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + + $this->assertEquals(1, count($data)); + + $this->assertEquals(\History::DELETED, $data[0]['event']); + $this->assertEquals( + \DateTime::createFromFormat('Ymd_His', '20170303_121216')->format(\DateTime::ATOM), + $data[0]['datetime'] + ); + $this->assertEquals(124, $data[0]['id']); + } + + /** + * Test /history service with since parameter. + */ + public function testGetHistorySinceOffsetLimit() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'since=2017-02-01T00:00:00%2B00:00&offset=1&limit=1' + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->getHistory($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + + $this->assertEquals(1, count($data)); + + $this->assertEquals(\History::SETTINGS, $data[0]['event']); + $this->assertEquals( + \DateTime::createFromFormat('Ymd_His', '20170302_121215')->format(\DateTime::ATOM), + $data[0]['datetime'] + ); + } +} diff --git a/tests/utils/ReferenceHistory.php b/tests/utils/ReferenceHistory.php new file mode 100644 index 00000000..20284770 --- /dev/null +++ b/tests/utils/ReferenceHistory.php @@ -0,0 +1,82 @@ +addEntry( + History::CREATED, + DateTime::createFromFormat('Ymd_His', '20170101_121212'), + 123 + ); + + $this->addEntry( + History::CREATED, + DateTime::createFromFormat('Ymd_His', '20170201_121214'), + 124 + ); + + $this->addEntry( + History::UPDATED, + DateTime::createFromFormat('Ymd_His', '20170301_121214'), + 123 + ); + + $this->addEntry( + History::SETTINGS, + DateTime::createFromFormat('Ymd_His', '20170302_121215') + ); + + $this->addEntry( + History::DELETED, + DateTime::createFromFormat('Ymd_His', '20170303_121216'), + 124 + ); + } + + /** + * Adds a new history entry + * + * @param string $event Event identifier + * @param DateTime $datetime creation date + * @param int $id optional: related link ID + */ + protected function addEntry($event, $datetime, $id = null) + { + $link = [ + 'event' => $event, + 'datetime' => $datetime, + 'id' => $id, + ]; + $this->history[] = $link; + $this->count++; + } + + /** + * Writes data to the datastore + * + * @param string $filename write history content to. + */ + public function write($filename) + { + FileUtils::writeFlatDB($filename, $this->history); + } + + /** + * Returns the number of links in the reference data + */ + public function count() + { + return $this->count; + } +} -- cgit v1.2.3 From 813849e5216cb87121e0f778a734575be6a36052 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 7 May 2017 16:50:20 +0200 Subject: Add history entries for API endpoint CHANGED: datetime is now store as an object in history store file --- tests/HistoryTest.php | 24 +++++++++++----------- tests/NetscapeBookmarkUtils/BookmarkImportTest.php | 4 ++-- tests/api/controllers/DeleteLinkTest.php | 22 ++++++++++++++++++++ tests/api/controllers/GetLinkIdTest.php | 1 + tests/api/controllers/GetLinksTest.php | 1 + tests/api/controllers/HistoryTest.php | 7 +------ tests/api/controllers/InfoTest.php | 1 + tests/api/controllers/PostLinkTest.php | 23 +++++++++++++++++++++ tests/api/controllers/PutLinkTest.php | 23 +++++++++++++++++++++ 9 files changed, 86 insertions(+), 20 deletions(-) (limited to 'tests') diff --git a/tests/HistoryTest.php b/tests/HistoryTest.php index 91525845..d3bef5a3 100644 --- a/tests/HistoryTest.php +++ b/tests/HistoryTest.php @@ -74,21 +74,21 @@ class HistoryTest extends PHPUnit_Framework_TestCase $history->addLink(['id' => 0]); $actual = $history->getHistory()[0]; $this->assertEquals(History::CREATED, $actual['event']); - $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']); $this->assertEquals(0, $actual['id']); $history = new History(self::$historyFilePath); $history->addLink(['id' => 1]); $actual = $history->getHistory()[0]; $this->assertEquals(History::CREATED, $actual['event']); - $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']); $this->assertEquals(1, $actual['id']); $history = new History(self::$historyFilePath); $history->addLink(['id' => 'str']); $actual = $history->getHistory()[0]; $this->assertEquals(History::CREATED, $actual['event']); - $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']); $this->assertEquals('str', $actual['id']); } @@ -101,7 +101,7 @@ class HistoryTest extends PHPUnit_Framework_TestCase $history->updateLink(['id' => 1]); $actual = $history->getHistory()[0]; $this->assertEquals(History::UPDATED, $actual['event']); - $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']); $this->assertEquals(1, $actual['id']); } @@ -114,7 +114,7 @@ class HistoryTest extends PHPUnit_Framework_TestCase $history->deleteLink(['id' => 1]); $actual = $history->getHistory()[0]; $this->assertEquals(History::DELETED, $actual['event']); - $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']); $this->assertEquals(1, $actual['id']); } @@ -127,7 +127,7 @@ class HistoryTest extends PHPUnit_Framework_TestCase $history->updateSettings(); $actual = $history->getHistory()[0]; $this->assertEquals(History::SETTINGS, $actual['event']); - $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']); $this->assertEmpty($actual['id']); } @@ -140,13 +140,13 @@ class HistoryTest extends PHPUnit_Framework_TestCase $history->updateLink(['id' => 1]); $actual = $history->getHistory()[0]; $this->assertEquals(History::UPDATED, $actual['event']); - $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']); $this->assertEquals(1, $actual['id']); $history->addLink(['id' => 1]); $actual = $history->getHistory()[0]; $this->assertEquals(History::CREATED, $actual['event']); - $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']); $this->assertEquals(1, $actual['id']); } @@ -160,7 +160,7 @@ class HistoryTest extends PHPUnit_Framework_TestCase $history = new History(self::$historyFilePath); $actual = $history->getHistory()[0]; $this->assertEquals(History::UPDATED, $actual['event']); - $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']); $this->assertEquals(1, $actual['id']); } @@ -176,12 +176,12 @@ class HistoryTest extends PHPUnit_Framework_TestCase $history = new History(self::$historyFilePath); $actual = $history->getHistory()[0]; $this->assertEquals(History::CREATED, $actual['event']); - $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']); $this->assertEquals(1, $actual['id']); $actual = $history->getHistory()[1]; $this->assertEquals(History::UPDATED, $actual['event']); - $this->assertTrue(new DateTime('-2 seconds') < DateTime::createFromFormat(DateTime::ATOM, $actual['datetime'])); + $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']); $this->assertEquals(1, $actual['id']); } @@ -194,7 +194,7 @@ class HistoryTest extends PHPUnit_Framework_TestCase $history->updateLink(['id' => 1]); $this->assertEquals(1, count($history->getHistory())); $arr = $history->getHistory(); - $arr[0]['datetime'] = (new DateTime('-1 hour'))->format(DateTime::ATOM); + $arr[0]['datetime'] = new DateTime('-1 hour'); FileUtils::writeFlatDB(self::$historyFilePath, $arr); $history = new History(self::$historyFilePath, 60); diff --git a/tests/NetscapeBookmarkUtils/BookmarkImportTest.php b/tests/NetscapeBookmarkUtils/BookmarkImportTest.php index f838f259..5fc1d1e8 100644 --- a/tests/NetscapeBookmarkUtils/BookmarkImportTest.php +++ b/tests/NetscapeBookmarkUtils/BookmarkImportTest.php @@ -628,7 +628,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals($nbLinks, count($history)); foreach ($history as $value) { $this->assertEquals(History::CREATED, $value['event']); - $this->assertTrue(new DateTime('-5 seconds') < DateTime::createFromFormat(DateTime::ATOM, $value['datetime'])); + $this->assertTrue(new DateTime('-5 seconds') < $value['datetime']); $this->assertTrue(is_int($value['id'])); } @@ -638,7 +638,7 @@ class BookmarkImportTest extends PHPUnit_Framework_TestCase $this->assertEquals($nbLinks * 2, count($history)); for ($i = 0 ; $i < $nbLinks ; $i++) { $this->assertEquals(History::UPDATED, $history[$i]['event']); - $this->assertTrue(new DateTime('-5 seconds') < DateTime::createFromFormat(DateTime::ATOM, $history[$i]['datetime'])); + $this->assertTrue(new DateTime('-5 seconds') < $history[$i]['datetime']); $this->assertTrue(is_int($history[$i]['id'])); } } diff --git a/tests/api/controllers/DeleteLinkTest.php b/tests/api/controllers/DeleteLinkTest.php index 6894e8a2..7d797137 100644 --- a/tests/api/controllers/DeleteLinkTest.php +++ b/tests/api/controllers/DeleteLinkTest.php @@ -16,6 +16,11 @@ class DeleteLinkTest extends \PHPUnit_Framework_TestCase */ protected static $testDatastore = 'sandbox/datastore.php'; + /** + * @var string datastore to test write operations + */ + protected static $testHistory = 'sandbox/history.php'; + /** * @var ConfigManager instance */ @@ -31,6 +36,11 @@ class DeleteLinkTest extends \PHPUnit_Framework_TestCase */ protected $linkDB; + /** + * @var \History instance. + */ + protected $history; + /** * @var Container instance. */ @@ -50,9 +60,13 @@ class DeleteLinkTest extends \PHPUnit_Framework_TestCase $this->refDB = new \ReferenceLinkDB(); $this->refDB->write(self::$testDatastore); $this->linkDB = new \LinkDB(self::$testDatastore, true, false); + $refHistory = new \ReferenceHistory(); + $refHistory->write(self::$testHistory); + $this->history = new \History(self::$testHistory); $this->container = new Container(); $this->container['conf'] = $this->conf; $this->container['db'] = $this->linkDB; + $this->container['history'] = $this->history; $this->controller = new Links($this->container); } @@ -63,6 +77,7 @@ class DeleteLinkTest extends \PHPUnit_Framework_TestCase public function tearDown() { @unlink(self::$testDatastore); + @unlink(self::$testHistory); } /** @@ -83,6 +98,13 @@ class DeleteLinkTest extends \PHPUnit_Framework_TestCase $this->linkDB = new \LinkDB(self::$testDatastore, true, false); $this->assertFalse(isset($this->linkDB[$id])); + + $historyEntry = $this->history->getHistory()[0]; + $this->assertEquals(\History::DELETED, $historyEntry['event']); + $this->assertTrue( + (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime'] + ); + $this->assertEquals($id, $historyEntry['id']); } /** diff --git a/tests/api/controllers/GetLinkIdTest.php b/tests/api/controllers/GetLinkIdTest.php index 45b18e6a..57528d5a 100644 --- a/tests/api/controllers/GetLinkIdTest.php +++ b/tests/api/controllers/GetLinkIdTest.php @@ -62,6 +62,7 @@ class GetLinkIdTest extends \PHPUnit_Framework_TestCase $this->container = new Container(); $this->container['conf'] = $this->conf; $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + $this->container['history'] = null; $this->controller = new Links($this->container); } diff --git a/tests/api/controllers/GetLinksTest.php b/tests/api/controllers/GetLinksTest.php index 10330cd9..84ae7f7a 100644 --- a/tests/api/controllers/GetLinksTest.php +++ b/tests/api/controllers/GetLinksTest.php @@ -61,6 +61,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase $this->container = new Container(); $this->container['conf'] = $this->conf; $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + $this->container['history'] = null; $this->controller = new Links($this->container); } diff --git a/tests/api/controllers/HistoryTest.php b/tests/api/controllers/HistoryTest.php index 21e9c0ba..61046d97 100644 --- a/tests/api/controllers/HistoryTest.php +++ b/tests/api/controllers/HistoryTest.php @@ -29,11 +29,6 @@ class HistoryTest extends \PHPUnit_Framework_TestCase */ protected $refHistory = null; - /** - * @var \History instance. - */ - protected $history; - /** * @var Container instance. */ @@ -52,10 +47,10 @@ class HistoryTest extends \PHPUnit_Framework_TestCase $this->conf = new ConfigManager('tests/utils/config/configJson.json.php'); $this->refHistory = new \ReferenceHistory(); $this->refHistory->write(self::$testHistory); - $this->conf->set('resource.history', self::$testHistory); $this->container = new Container(); $this->container['conf'] = $this->conf; $this->container['db'] = true; + $this->container['history'] = new \History(self::$testHistory); $this->controller = new History($this->container); } diff --git a/tests/api/controllers/InfoTest.php b/tests/api/controllers/InfoTest.php index 4beef3f7..e85eb281 100644 --- a/tests/api/controllers/InfoTest.php +++ b/tests/api/controllers/InfoTest.php @@ -54,6 +54,7 @@ class InfoTest extends \PHPUnit_Framework_TestCase $this->container = new Container(); $this->container['conf'] = $this->conf; $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + $this->container['history'] = null; $this->controller = new Info($this->container); } diff --git a/tests/api/controllers/PostLinkTest.php b/tests/api/controllers/PostLinkTest.php index 3ed7bcb0..31954e39 100644 --- a/tests/api/controllers/PostLinkTest.php +++ b/tests/api/controllers/PostLinkTest.php @@ -23,6 +23,11 @@ class PostLinkTest extends \PHPUnit_Framework_TestCase */ protected static $testDatastore = 'sandbox/datastore.php'; + /** + * @var string datastore to test write operations + */ + protected static $testHistory = 'sandbox/history.php'; + /** * @var ConfigManager instance */ @@ -33,6 +38,11 @@ class PostLinkTest extends \PHPUnit_Framework_TestCase */ protected $refDB = null; + /** + * @var \History instance. + */ + protected $history; + /** * @var Container instance. */ @@ -57,9 +67,14 @@ class PostLinkTest extends \PHPUnit_Framework_TestCase $this->refDB = new \ReferenceLinkDB(); $this->refDB->write(self::$testDatastore); + $refHistory = new \ReferenceHistory(); + $refHistory->write(self::$testHistory); + $this->history = new \History(self::$testHistory); + $this->container = new Container(); $this->container['conf'] = $this->conf; $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + $this->container['history'] = new \History(self::$testHistory); $this->controller = new Links($this->container); @@ -85,6 +100,7 @@ class PostLinkTest extends \PHPUnit_Framework_TestCase public function tearDown() { @unlink(self::$testDatastore); + @unlink(self::$testHistory); } /** @@ -112,6 +128,13 @@ class PostLinkTest extends \PHPUnit_Framework_TestCase $this->assertEquals(false, $data['private']); $this->assertTrue(new \DateTime('5 seconds ago') < \DateTime::createFromFormat(\DateTime::ATOM, $data['created'])); $this->assertEquals('', $data['updated']); + + $historyEntry = $this->history->getHistory()[0]; + $this->assertEquals(\History::CREATED, $historyEntry['event']); + $this->assertTrue( + (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime'] + ); + $this->assertEquals(43, $historyEntry['id']); } /** diff --git a/tests/api/controllers/PutLinkTest.php b/tests/api/controllers/PutLinkTest.php index 4096c1a7..8a562571 100644 --- a/tests/api/controllers/PutLinkTest.php +++ b/tests/api/controllers/PutLinkTest.php @@ -17,6 +17,11 @@ class PutLinkTest extends \PHPUnit_Framework_TestCase */ protected static $testDatastore = 'sandbox/datastore.php'; + /** + * @var string datastore to test write operations + */ + protected static $testHistory = 'sandbox/history.php'; + /** * @var ConfigManager instance */ @@ -27,6 +32,11 @@ class PutLinkTest extends \PHPUnit_Framework_TestCase */ protected $refDB = null; + /** + * @var \History instance. + */ + protected $history; + /** * @var Container instance. */ @@ -51,9 +61,14 @@ class PutLinkTest extends \PHPUnit_Framework_TestCase $this->refDB = new \ReferenceLinkDB(); $this->refDB->write(self::$testDatastore); + $refHistory = new \ReferenceHistory(); + $refHistory->write(self::$testHistory); + $this->history = new \History(self::$testHistory); + $this->container = new Container(); $this->container['conf'] = $this->conf; $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + $this->container['history'] = new \History(self::$testHistory); $this->controller = new Links($this->container); @@ -71,6 +86,7 @@ class PutLinkTest extends \PHPUnit_Framework_TestCase public function tearDown() { @unlink(self::$testDatastore); + @unlink(self::$testHistory); } /** @@ -100,6 +116,13 @@ class PutLinkTest extends \PHPUnit_Framework_TestCase \DateTime::createFromFormat(\DateTime::ATOM, $data['created']) ); $this->assertTrue(new \DateTime('5 seconds ago') < \DateTime::createFromFormat(\DateTime::ATOM, $data['updated'])); + + $historyEntry = $this->history->getHistory()[0]; + $this->assertEquals(\History::UPDATED, $historyEntry['event']); + $this->assertTrue( + (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime'] + ); + $this->assertEquals($id, $historyEntry['id']); } /** -- cgit v1.2.3 From 6bc90f50af611a1674ee1118587feddd4f625d44 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 7 May 2017 16:56:20 +0200 Subject: History: fix entries order --- tests/utils/ReferenceHistory.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'tests') diff --git a/tests/utils/ReferenceHistory.php b/tests/utils/ReferenceHistory.php index 20284770..75cbb326 100644 --- a/tests/utils/ReferenceHistory.php +++ b/tests/utils/ReferenceHistory.php @@ -15,15 +15,14 @@ class ReferenceHistory public function __construct() { $this->addEntry( - History::CREATED, - DateTime::createFromFormat('Ymd_His', '20170101_121212'), - 123 + History::DELETED, + DateTime::createFromFormat('Ymd_His', '20170303_121216'), + 124 ); $this->addEntry( - History::CREATED, - DateTime::createFromFormat('Ymd_His', '20170201_121214'), - 124 + History::SETTINGS, + DateTime::createFromFormat('Ymd_His', '20170302_121215') ); $this->addEntry( @@ -33,14 +32,15 @@ class ReferenceHistory ); $this->addEntry( - History::SETTINGS, - DateTime::createFromFormat('Ymd_His', '20170302_121215') + History::CREATED, + DateTime::createFromFormat('Ymd_His', '20170201_121214'), + 124 ); $this->addEntry( - History::DELETED, - DateTime::createFromFormat('Ymd_His', '20170303_121216'), - 124 + History::CREATED, + DateTime::createFromFormat('Ymd_His', '20170101_121212'), + 123 ); } -- cgit v1.2.3