summaryrefslogtreecommitdiff
path: root/_test
diff options
context:
space:
mode:
Diffstat (limited to '_test')
-rw-r--r--_test/bootstrap.php10
-rw-r--r--_test/tests/inc/auth_loadacl.test.php130
-rw-r--r--_test/tests/inc/auth_nameencode.test.php28
-rw-r--r--_test/tests/inc/common_basicinfo.test.php10
-rw-r--r--_test/tests/inc/common_mediainfo.test.php10
-rw-r--r--_test/tests/inc/common_pageinfo.test.php66
-rw-r--r--_test/tests/inc/fulltext_backlinks.test.php10
-rw-r--r--_test/tests/inc/fulltext_mediause.test.php7
-rw-r--r--_test/tests/inc/httpclient_http_proxy.test.php4
-rw-r--r--_test/tests/inc/indexer_indexing.test.php62
-rw-r--r--_test/tests/inc/mailer.test.php83
-rw-r--r--_test/tests/inc/pageutils_clean_id.test.php3
-rw-r--r--_test/tests/inc/parser/parser_table.test.php77
-rw-r--r--_test/tests/inc/parserutils_set_metadata_during_rendering.test.php2
-rw-r--r--_test/tests/inc/subscription.test.php2
-rw-r--r--_test/tests/lib/exe/css_at_import_less.test.php78
-rw-r--r--_test/tests/lib/exe/css_css_compress.test.php40
-rw-r--r--_test/tests/lib/exe/css_css_loadfile.test.php42
-rw-r--r--_test/tests/test/basic.test.php12
19 files changed, 615 insertions, 61 deletions
diff --git a/_test/bootstrap.php b/_test/bootstrap.php
index 732fef9ed..4f0d5efaa 100644
--- a/_test/bootstrap.php
+++ b/_test/bootstrap.php
@@ -15,7 +15,8 @@ require_once DOKU_UNITTEST.'core/TestUtils.php';
define('SIMPLE_TEST', true);
// basic behaviours
-error_reporting(E_ALL);
+define('DOKU_E_LEVEL',E_ALL ^ E_NOTICE);
+error_reporting(DOKU_E_LEVEL);
set_time_limit(0);
ini_set('memory_limit','2048M');
@@ -68,6 +69,13 @@ $default_server_vars = array(
'REQUEST_TIME' => time(),
);
+// fixup for $_SERVER when run from CLI,
+// some values should be mocked for use by inc/init.php which is called here
+// [ $_SERVER is also mocked in TestRequest::execute() ]
+if (php_sapi_name() == 'cli') {
+ $_SERVER = array_merge($default_server_vars, $_SERVER);
+}
+
// create temp directories
mkdir(TMP_DIR);
diff --git a/_test/tests/inc/auth_loadacl.test.php b/_test/tests/inc/auth_loadacl.test.php
new file mode 100644
index 000000000..e8d9f6696
--- /dev/null
+++ b/_test/tests/inc/auth_loadacl.test.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * auth_loadACL carries out the user & group substitutions
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ */
+
+class auth_loadacl_test extends DokuWikiTest {
+
+ function setUp() {
+ global $USERINFO;
+ parent::setUp();
+ $_SERVER['REMOTE_USER'] = 'testuser';
+ $USERINFO['grps'] = array('foo','bar');
+ }
+
+ function tearDown() {
+ parent::tearDown();
+ }
+
+ function auth_loadACL_testwrapper($acls) {
+ global $config_cascade;
+ $acl_file = $config_cascade['acl']['default'];
+
+ $config_cascade['acl']['default'] .= '.test';
+ file_put_contents($config_cascade['acl']['default'],$acls);
+
+ $result = auth_loadACL();
+
+ unlink($config_cascade['acl']['default']);
+ $config_cascade['acl']['default'] = $acl_file;
+
+ return $result;
+ }
+
+ function test_simple() {
+ $acls = <<<ACL
+* @ALL 2
+ACL;
+ $expect = array("*\t@ALL 2");
+ $this->assertEquals($expect, $this->auth_loadACL_testwrapper($acls));
+ }
+
+ function test_user_substitution() {
+ $acls = <<<ACL
+%USER% %USER% 2
+ACL;
+ $expect = array(
+ "testuser\ttestuser 2",
+ );
+ $this->assertEquals($expect, $this->auth_loadACL_testwrapper($acls));
+ }
+
+ function test_group_substitution() {
+ $acls = <<<ACL
+%GROUP% %GROUP% 2
+ACL;
+ $expect = array(
+ "foo\t@foo 2",
+ "bar\t@bar 2",
+ );
+ $this->assertEquals($expect, $this->auth_loadACL_testwrapper($acls));
+ }
+
+ function test_both_substitution() {
+ $acls = <<<ACL
+%GROUP%:%USER% %USER% 2
+%GROUP%:%USER% %GROUP% 2
+ACL;
+ $expect = array(
+ "foo:testuser\ttestuser 2",
+ "bar:testuser\ttestuser 2",
+ "foo:testuser\t@foo 2",
+ "bar:testuser\t@bar 2",
+ );
+ $this->assertEquals($expect, $this->auth_loadACL_testwrapper($acls));
+ }
+
+ // put it all together - read the standard acl provided with the test suite
+ function test_standardtestacls(){
+ $expect = array(
+ "*\t@ALL 8",
+ "private:*\t@ALL 0",
+ "users:*\t@ALL 1",
+ "users:testuser:*\ttestuser 16",
+ "groups:*\t@ALL 1",
+ "groups:foo:*\t@foo 16",
+ "groups:bar:*\t@bar 16",
+ );
+ $this->assertEquals($expect, auth_loadACL());
+ }
+
+ // FS#2867, '\s' in php regular expressions may match non-space characters utf8 strings
+ // this is due to locale setting on the server, which may match bytes '\xA0' and '\x85'
+ // these two bytes are present in valid multi-byte UTF-8 characters.
+ // this test will use one, 'ठ' (DEVANAGARI LETTER TTHA, e0 a4 a0). There are many others.
+ function test_FS2867() {
+ global $USERINFO;
+
+ $old_locale = setlocale(LC_ALL, '0');
+ setlocale(LC_ALL, "English_United States.1252"); // should only succeed on windows systems
+ setlocale(LC_ALL, "en_US.UTF-8"); // should succeed on other systems
+
+ // no point continuing with this test if \s doesn't match A0
+ if (!preg_match('/\s/',"\xa0")) {
+ setlocale(LC_ALL, $old_locale);
+ $this->markTestSkipped('Unable to change locale.');
+ }
+
+ $_SERVER['REMOTE_USER'] = 'utfठ8';
+ $USERINFO['grps'] = array('utfठ16','utfठa');
+
+ $acls = <<<ACL
+%GROUP%:%USER% %USER% 2
+%GROUP%:* %GROUP% 4
+devangariठttha @ALL 2
+ACL;
+ $expect = array(
+ "utfठ16:utfठ8\tutfठ8 2",
+ "utfठa:utfठ8\tutfठ8 2",
+ "utfठ16:*\t@utfठ16 4",
+ "utfठa:*\t@utfठa 4",
+ "devangariठttha\t@ALL 2",
+ );
+ $this->assertEquals($expect, $this->auth_loadACL_testwrapper($acls));
+ setlocale(LC_ALL, $old_locale);
+ }
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/auth_nameencode.test.php b/_test/tests/inc/auth_nameencode.test.php
index da9f31f90..86db843d6 100644
--- a/_test/tests/inc/auth_nameencode.test.php
+++ b/_test/tests/inc/auth_nameencode.test.php
@@ -19,6 +19,18 @@ class auth_nameencode_test extends DokuWikiTest {
$this->assertEquals(auth_nameencode($in),$out);
}
+ function test_apostrophe(){
+ $in = 'hey\'you';
+ $out = 'hey%27you';
+ $this->assertEquals(auth_nameencode($in),$out);
+ }
+
+ function test_backslash(){
+ $in = 'hey\\you';
+ $out = 'hey%5cyou';
+ $this->assertEquals(auth_nameencode($in),$out);
+ }
+
function test_complex(){
$in = 'hey $ you !$%! foo ';
$out = 'hey%20%24%20you%20%21%24%25%21%20foo%20';
@@ -42,6 +54,22 @@ class auth_nameencode_test extends DokuWikiTest {
$out = '%40hey%24you';
$this->assertEquals(auth_nameencode($in),$out);
}
+
+ // include a two byte utf8 character which shouldn't be encoded
+ function test_hebrew(){
+ $in = 'nun-נ8';
+ $expect = 'nun%2dנ8';
+
+ $this->assertEquals($expect, auth_nameencode($in));
+ }
+
+ // include a three byte utf8 character which shouldn't be encoded
+ function test_devanagiri(){
+ $in = 'ut-fठ8';
+ $expect = 'ut%2dfठ8';
+
+ $this->assertEquals($expect, auth_nameencode($in));
+ }
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/common_basicinfo.test.php b/_test/tests/inc/common_basicinfo.test.php
index 0369474c9..8359c0877 100644
--- a/_test/tests/inc/common_basicinfo.test.php
+++ b/_test/tests/inc/common_basicinfo.test.php
@@ -18,12 +18,12 @@ class common_infofunctions_test extends DokuWikiTest {
function _get_info() {
global $USERINFO;
- $info = array (
- 'isadmin' => true,
+ $info = array (
+ 'isadmin' => true,
'ismanager' => true,
- 'userinfo' => $USERINFO,
- 'perm' => 255,
- 'namespace' => false,
+ 'userinfo' => $USERINFO,
+ 'perm' => 255,
+ 'namespace' => false,
'ismobile' => false,
'client' => 'testuser',
);
diff --git a/_test/tests/inc/common_mediainfo.test.php b/_test/tests/inc/common_mediainfo.test.php
index 0e67fbcd9..cc5b17ec7 100644
--- a/_test/tests/inc/common_mediainfo.test.php
+++ b/_test/tests/inc/common_mediainfo.test.php
@@ -18,12 +18,12 @@ class common_basicinfo_test extends DokuWikiTest {
function _get_info() {
global $USERINFO;
- $info = array (
- 'isadmin' => true,
+ $info = array (
+ 'isadmin' => true,
'ismanager' => true,
- 'userinfo' => $USERINFO,
- 'perm' => 255,
- 'namespace' => false,
+ 'userinfo' => $USERINFO,
+ 'perm' => 255,
+ 'namespace' => false,
'ismobile' => false,
'client' => 'testuser',
);
diff --git a/_test/tests/inc/common_pageinfo.test.php b/_test/tests/inc/common_pageinfo.test.php
index c54fbce26..0a1ea0a8f 100644
--- a/_test/tests/inc/common_pageinfo.test.php
+++ b/_test/tests/inc/common_pageinfo.test.php
@@ -31,18 +31,18 @@ class common_pageinfo_test extends DokuWikiTest {
'ismobile' => false,
'client' => 'testuser',
);
- $info['rev'] = null;
- $info['subscribed'] = false;
- $info['locked'] = false;
- $info['exists'] = false;
- $info['writable'] = true;
- $info['editable'] = true;
- $info['lastmod'] = false;
- $info['meta'] = array();
- $info['ip'] = null;
- $info['user'] = null;
- $info['sum'] = null;
- $info['editor'] = null;
+ $info['rev'] = null;
+ $info['subscribed'] = false;
+ $info['locked'] = false;
+ $info['exists'] = false;
+ $info['writable'] = true;
+ $info['editable'] = true;
+ $info['lastmod'] = false;
+ $info['meta'] = array();
+ $info['ip'] = null;
+ $info['user'] = null;
+ $info['sum'] = null;
+ $info['editor'] = null;
return $info;
}
@@ -72,15 +72,15 @@ class common_pageinfo_test extends DokuWikiTest {
$rev = filemtime($filename);
$info = $this->_get_expected_pageinfo();
- $info['id'] = 'wiki:syntax';
+ $info['id'] = 'wiki:syntax';
$info['namespace'] = 'wiki';
$info['filepath'] = $filename;
- $info['exists'] = true;
- $info['lastmod'] = $rev;
- $info['meta'] = p_get_metadata($ID);
+ $info['exists'] = true;
+ $info['lastmod'] = $rev;
+ $info['meta'] = p_get_metadata($ID);
$this->assertEquals($info, pageinfo());
- }
+ }
/**
* check info keys and values for anonymous user
@@ -88,8 +88,8 @@ class common_pageinfo_test extends DokuWikiTest {
function test_anonymoususer(){
global $ID,$conf,$REV;
- unset($_SERVER['REMOTE_USER']);
- global $USERINFO; $USERINFO = array();
+ unset($_SERVER['REMOTE_USER']);
+ global $USERINFO; $USERINFO = array();
$ID = 'wiki:syntax';
$filename = $conf['datadir'].'/wiki/syntax.txt';
@@ -104,15 +104,15 @@ class common_pageinfo_test extends DokuWikiTest {
$info['meta'] = p_get_metadata($ID);
$info['rev'] = '';
- $info = array_merge($info, array(
- 'isadmin' => false,
- 'ismanager' => false,
- 'perm' => 8,
- 'client' => '1.2.3.4',
+ $info = array_merge($info, array(
+ 'isadmin' => false,
+ 'ismanager' => false,
+ 'perm' => 8,
+ 'client' => '1.2.3.4',
));
unset($info['userinfo']);
$this->assertEquals($info, pageinfo());
- }
+ }
/**
* check info keys and values with $REV
@@ -135,7 +135,7 @@ class common_pageinfo_test extends DokuWikiTest {
$this->assertEquals($info, pageinfo());
$this->assertEquals($rev-100, $REV);
- }
+ }
/**
* check info keys and values with $RANGE
@@ -146,7 +146,7 @@ class common_pageinfo_test extends DokuWikiTest {
$ID = 'wiki:syntax';
$filename = $conf['datadir'].'/wiki/syntax.txt';
$rev = filemtime($filename);
- $range = '1000-2000';
+ $range = '1000-2000';
$info = $this->_get_expected_pageinfo();
$info['id'] = 'wiki:syntax';
@@ -160,18 +160,18 @@ class common_pageinfo_test extends DokuWikiTest {
// expected result $RANGE unchanged
$RANGE = $range;
- $this->assertEquals($info, pageinfo());
+ $this->assertEquals($info, pageinfo());
$this->assertFalse(isset($REV));
- $this->assertEquals($range,$RANGE);
+ $this->assertEquals($range,$RANGE);
// check $RANGE with $REV = current
// expected result: $RANGE unchanged, $REV cleared
$REV = $rev;
- $info['rev'] = '';
+ $info['rev'] = '';
- $this->assertEquals($info, pageinfo());
+ $this->assertEquals($info, pageinfo());
$this->assertEquals('',$REV);
- $this->assertEquals($range,$RANGE);
+ $this->assertEquals($range,$RANGE);
// check with a real $REV
// expected result: $REV and $RANGE are cleared
@@ -218,7 +218,7 @@ class common_pageinfo_test extends DokuWikiTest {
p_set_metadata($ID,array('last_change' => false));
$this->assertEquals($info, pageinfo());
- $this->assertEquals($info['meta']['last_change'], p_get_metadata($ID,'last_change'));
+ $this->assertEquals($info['meta']['last_change'], p_get_metadata($ID,'last_change'));
// fake an external edit, pageinfo should clear the last change from meta data
// and not return any editor data
diff --git a/_test/tests/inc/fulltext_backlinks.test.php b/_test/tests/inc/fulltext_backlinks.test.php
index 058e13498..b20a16ee1 100644
--- a/_test/tests/inc/fulltext_backlinks.test.php
+++ b/_test/tests/inc/fulltext_backlinks.test.php
@@ -8,7 +8,7 @@ if (!defined('DOKU_INC')) die();
*
* @author Michael Hamann <michael@content-space.de>
*/
-class fultext_backlinks_test extends DokuWikiTest {
+class fulltext_backlinks_test extends DokuWikiTest {
public function test_internallink() {
saveWikiText('test:internallinks', '[[internälLink]] [[..:internal link]]', 'Test initialization');
@@ -74,4 +74,12 @@ class fultext_backlinks_test extends DokuWikiTest {
$this->assertEquals(array(), ft_backlinks('test:internallink'));
$this->assertEquals(array(), ft_backlinks('internal_link'));
}
+
+ function test_parameters() {
+ saveWikiText('test:links', '[[wiki:syntax?do=export_raw]] [[:web:scripts:add_vhost.sh?do=export_raw]]', 'Init tests');
+ idx_addPage('test:links');
+
+ $this->assertEquals(array('test:links'), ft_backlinks('wiki:syntax'));
+ $this->assertEquals(array('test:links'), ft_backlinks('web:scripts:add_vhost.sh'));
+ }
}
diff --git a/_test/tests/inc/fulltext_mediause.test.php b/_test/tests/inc/fulltext_mediause.test.php
index 9d5b2dc84..503b8bc84 100644
--- a/_test/tests/inc/fulltext_mediause.test.php
+++ b/_test/tests/inc/fulltext_mediause.test.php
@@ -26,6 +26,13 @@ class fultext_mediause_test extends DokuWikiTest {
$this->assertEquals(array('test:medialinks'), ft_mediause('test:example.png'));
}
+ public function test_media_in_local_links() {
+ saveWikiText('test:locallinks', '[[#test|{{wiki:logolocal.png}}]]', 'Test init');
+ idx_addPage('test:locallinks');
+
+ $this->assertEquals(array('test:locallinks'), ft_mediause('wiki:logolocal.png'));
+ }
+
public function test_media_in_footnotes() {
saveWikiText('test:media_footnotes', '(({{footnote.png?20x50}} [[foonote|{{:footlink.png}}]]))', 'Test initialization');
idx_addPage('test:media_footnotes');
diff --git a/_test/tests/inc/httpclient_http_proxy.test.php b/_test/tests/inc/httpclient_http_proxy.test.php
index faa7a4280..4aa039fcc 100644
--- a/_test/tests/inc/httpclient_http_proxy.test.php
+++ b/_test/tests/inc/httpclient_http_proxy.test.php
@@ -1,7 +1,7 @@
<?php
class httpclient_http_proxy_test extends DokuWikiTest {
- protected $url = 'http://www.dokuwiki.org/README';
+ protected $url = 'http://test.dokuwiki.org/README';
/**
* @group internet
@@ -13,7 +13,7 @@ class httpclient_http_proxy_test extends DokuWikiTest {
$http->proxy_port = 8080;
$data = $http->get($this->url);
- $this->assertFalse($data === false, 'HTTP response');
+ $this->assertFalse($data === false, 'HTTP response '.$http->error);
$this->assertTrue(strpos($data,'DokuWiki') !== false, 'response content');
}
diff --git a/_test/tests/inc/indexer_indexing.test.php b/_test/tests/inc/indexer_indexing.test.php
new file mode 100644
index 000000000..3d8278d6c
--- /dev/null
+++ b/_test/tests/inc/indexer_indexing.test.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Tests the indexing functionality of the indexer
+ *
+ * @author Michael Hamann <michael@content-space.de>
+ */
+class indexer_indexing_test extends DokuWikiTest {
+ public function setUp() {
+ parent::setUp();
+ saveWikiText('testpage', 'Foo bar baz.', 'Test initialization');
+ saveWikiText('notfound', 'Foon barn bazn.', 'Test initialization');
+ idx_addPage('testpage');
+ idx_addPage('notfound');
+ }
+
+ public function test_words() {
+ $indexer = idx_get_indexer();
+ $query = array('baz', 'foo');
+ $this->assertEquals(array('baz' => array('testpage' => 1), 'foo' => array('testpage' => 1)), $indexer->lookup($query));
+ }
+
+ public function test_numerically_identical_words() {
+ $indexer = idx_get_indexer();
+ $indexer->addPageWords('testpage', '0x1 002');
+ $indexer->addPageWords('notfound', '0x2');
+ $query = array('001', '002');
+ $this->assertEquals(array('001' => array(), '002' => array('testpage' => 1)), $indexer->lookup($query));
+ }
+
+ public function test_meta() {
+ $indexer = idx_get_indexer();
+ $indexer->addMetaKeys('testpage', 'testkey', 'testvalue');
+ $indexer->addMetaKeys('notfound', 'testkey', 'notvalue');
+ $query = 'testvalue';
+ $this->assertEquals(array('testpage'), $indexer->lookupKey('testkey', $query));
+ }
+
+ public function test_numerically_identical_meta_values() {
+ $indexer = idx_get_indexer();
+ $indexer->addMetaKeys('testpage', 'numkey', array('0001', '01'));
+ $indexer->addMetaKeys('notfound', 'numkey', array('00001', '000001'));
+ $query = array('001', '01');
+ $this->assertEquals(array('001' => array(), '01' => array('testpage')), $indexer->lookupKey('numkey', $query));
+ }
+
+ public function test_numeric_twice() {
+ $indexer = idx_get_indexer();
+ $indexer->addPageWords('testpage', '| 1010 | Dallas |');
+ $query = array('1010');
+ $this->assertEquals(array('1010' => array('testpage' => 1)), $indexer->lookup($query));
+ $indexer->addPageWords('notfound', '| 1010 | Dallas |');
+ $this->assertEquals(array('1010' => array('testpage' => 1, 'notfound' => 1)), $indexer->lookup($query));
+ }
+
+ public function test_numeric_twice_meta() {
+ $indexer = idx_get_indexer();
+ $indexer->addMetaKeys('testpage', 'onezero', array('1010'));
+ $indexer->addMetaKeys('notfound', 'onezero', array('1010'));
+ $query = '1010';
+ $this->assertEquals(array('notfound', 'testpage'), $indexer->lookupKey('onezero', $query));
+ }
+} \ No newline at end of file
diff --git a/_test/tests/inc/mailer.test.php b/_test/tests/inc/mailer.test.php
index ef78692b3..4541d9906 100644
--- a/_test/tests/inc/mailer.test.php
+++ b/_test/tests/inc/mailer.test.php
@@ -50,8 +50,8 @@ class mailer_test extends DokuWikiTest {
// set a bunch of test headers
$mail->setHeader('test-header','bla');
$mail->setHeader('to','A valid ASCII name <test@example.com>');
- $mail->setHeader('from',"Thös ne\needs\x00serious cleaning$§%.");
- $mail->setHeader('bad',"Thös ne\needs\x00serious cleaning$§%.",false);
+ $mail->setHeader('from',"Thös ne\needs\x00serious cleaning\$§%.");
+ $mail->setHeader('bad',"Thös ne\needs\x00serious cleaning\$§%.",false);
$mail->setHeader("weird\n*+\x00foo.-_@bar?",'now clean');
// are they set?
@@ -63,7 +63,7 @@ class mailer_test extends DokuWikiTest {
$this->assertArrayHasKey('From',$headers);
$this->assertEquals('Ths neeedsserious cleaning.',$headers['From']);
$this->assertArrayHasKey('Bad',$headers);
- $this->assertEquals("Thös ne\needs\x00serious cleaning$§%.",$headers['Bad']);
+ $this->assertEquals("Thös ne\needs\x00serious cleaning\$§%.",$headers['Bad']);
$this->assertArrayHasKey('Weird+foo.-_@bar',$headers);
// unset a header again
@@ -154,7 +154,82 @@ class mailer_test extends DokuWikiTest {
$headers['Cc'] = '';
$header = $mail->prepareHeaders();
$this->assertEquals(0, preg_match('/(^|\n)Bcc: (\n|$)/', $header), 'Bcc found in headers.');
- $this->assertEquals(0, preg_match('/(^|\n)Cc: (\n|$)/', $header), 'Bcc found in headers.');
+ $this->assertEquals(0, preg_match('/(^|\n)Cc: (\n|$)/', $header), 'Cc found in headers.');
+ }
+
+ function test_nullTOorCCorBCC() {
+ $mail = new TestMailer();
+ $headers = &$mail->propRef('headers');
+ $headers['Bcc'] = NULL;
+ $headers['Cc'] = NULL;
+ $headers['To'] = NULL;
+ $header = $mail->prepareHeaders();
+ $this->assertEquals(0, preg_match('/(^|\n)Bcc: (\n|$)/', $header), 'Bcc found in headers.');
+ $this->assertEquals(0, preg_match('/(^|\n)Cc: (\n|$)/', $header), 'Cc found in headers.');
+ $this->assertEquals(0, preg_match('/(^|\n)To: (\n|$)/', $header), 'To found in headers.');
+ }
+
+ /**
+ * @group internet
+ */
+ function test_lint(){
+ // prepare a simple multipart message
+ $mail = new TestMailer();
+ $mail->to(array('Möp <moep@example.com> ',' foo <foo@example.com>'));
+ $mail->from('Me <test@example.com>');
+ $mail->subject('This is a töst');
+ $mail->setBody('Hello Wörld,
+
+ please don\'t burn, okay?
+ ');
+ $mail->attachContent('some test data', 'text/plain', 'a text.txt');
+ $msg = $mail->dump();
+ $msglines = explode("\n", $msg);
+
+ //echo $msg;
+
+ // ask message lint if it is okay
+ $html = new HTTPClient();
+ $results = $html->post('http://tools.ietf.org/tools/msglint/msglint', array('msg'=>$msg));
+ $this->assertTrue($results !== false);
+
+ // parse the result lines
+ $lines = explode("\n", $results);
+ $rows = count($lines);
+ $i=0;
+ while(trim($lines[$i]) != '-----------' && $i<$rows) $i++; //skip preamble
+ for($i=$i+1; $i<$rows; $i++){
+ $line = trim($lines[$i]);
+ if($line == '-----------') break; //skip appendix
+
+ // get possible continuation of the line
+ while($lines[$i+1][0] == ' '){
+ $line .= ' '.trim($lines[$i+1]);
+ $i++;
+ }
+
+ // check the line for errors
+ if(substr($line,0,5) == 'ERROR' || substr($line,0,7) == 'WARNING'){
+ // ignore some errors
+ if(strpos($line, "missing mandatory header 'return-path'")) continue; #set by MDA
+ if(strpos($line, "bare newline in text body decoded")) continue; #seems to be false positive
+
+ // get the context in which the error occured
+ $errorin = '';
+ if(preg_match('/line (\d+)$/', $line, $m)){
+ $errorin .= "\n".$msglines[$m[1] - 1];
+ }
+ if(preg_match('/lines (\d+)-(\d+)$/', $line, $m)){
+ for($x=$m[1]-1; $x<$m[2]; $x++){
+ $errorin .= "\n".$msglines[$x];
+ }
+ }
+
+ // raise the error
+ throw new Exception($line.$errorin);
+ }
+ }
+
}
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/pageutils_clean_id.test.php b/_test/tests/inc/pageutils_clean_id.test.php
index 478fd2bc4..f67109ba3 100644
--- a/_test/tests/inc/pageutils_clean_id.test.php
+++ b/_test/tests/inc/pageutils_clean_id.test.php
@@ -43,6 +43,9 @@ class init_clean_id_test extends DokuWikiTest {
$tests[] = array('ns._#!ns:page','false','ns._ns:page');
$tests[] = array('ns_:page',false,'ns:page');
$tests[] = array('page...page','false','page...page');
+ $tests[] = array('page---page','false','page---page');
+ $tests[] = array('page___page','false','page_page');
+ $tests[] = array('page_-.page','false','page_-.page');
$tests[] = array(':page',false,'page');
$tests[] = array(':ns:page',false,'ns:page');
$tests[] = array('page:',false,'page');
diff --git a/_test/tests/inc/parser/parser_table.test.php b/_test/tests/inc/parser/parser_table.test.php
index 96789c38c..bc19ebff9 100644
--- a/_test/tests/inc/parser/parser_table.test.php
+++ b/_test/tests/inc/parser/parser_table.test.php
@@ -270,6 +270,64 @@ def');
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
+
+ function testCellRowSpanFirstRow() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse('
+abc
+|::: ^ d:::^:::| ::: |
+| b ^ e | | ::: |
+|c ^ ::: | |:::|
+def');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(4, 3, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array('')),
+ array('tablecell_close',array()),
+ array('tableheader_open',array(1,'right',1)),
+ array('cdata',array(' d:::')),
+ array('tableheader_close',array()),
+ array('tableheader_open',array(1,NULL,1)),
+ array('cdata',array('')),
+ array('tableheader_close',array()),
+ array('tablecell_open',array(1,NULL,3)),
+ array('cdata',array('')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array(' b ')),
+ array('tablecell_close',array()),
+ array('tableheader_open',array(1,'left',2)),
+ array('cdata',array(' e ')),
+ array('tableheader_close',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array(' ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array('c ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array(' ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+
+ array('table_close',array(69)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
function testCellAlignmentFormatting() {
$this->P->addMode('table',new Doku_Parser_Mode_Table());
@@ -568,5 +626,24 @@ def');
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
+
+ function testTable_FS1833() {
+ $syntax = " \n| Row 0 Col 1 |\n";
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse($syntax);
+ $calls = array (
+ array('document_start',array()),
+ array('table_open',array(1, 1, 2)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(strlen($syntax))),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
}
diff --git a/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php b/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php
index f08785ca2..18660553d 100644
--- a/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php
+++ b/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php
@@ -80,7 +80,7 @@ class parserutils_set_metadata_during_rendering_test extends DokuWikiTest {
}
// wrapper function for the fake plugin controller, return $this for the fake syntax of this test
- function &load($type,$name,$new=false,$disabled=false){
+ function load($type,$name,$new=false,$disabled=false){
if ($name == 'parserutils_test') {
return $this;
} else {
diff --git a/_test/tests/inc/subscription.test.php b/_test/tests/inc/subscription.test.php
index 333400576..34a7b9e4b 100644
--- a/_test/tests/inc/subscription.test.php
+++ b/_test/tests/inc/subscription.test.php
@@ -237,7 +237,7 @@ class MockupSubscription extends Subscription {
return parent::buildregex($user, $style, $data);
}
- protected function send($subscriber_mail, $subject, $id, $template, $trep, $hrep = null) {
+ protected function send($subscriber_mail, $subject, $id, $template, $trep, $hrep = null, $headers = array()) {
$this->mails[] = $subscriber_mail;
return true;
}
diff --git a/_test/tests/lib/exe/css_at_import_less.test.php b/_test/tests/lib/exe/css_at_import_less.test.php
new file mode 100644
index 000000000..4a6efcf44
--- /dev/null
+++ b/_test/tests/lib/exe/css_at_import_less.test.php
@@ -0,0 +1,78 @@
+<?php
+
+require_once DOKU_INC.'lib/exe/css.php';
+
+class css_at_import_less_test extends DokuWikiTest {
+
+ protected $file = '';
+ protected $import = '';
+
+ public function setUpFiles($subdir = '') {
+
+ $dir = TMP_DIR . $subdir;
+ if (!is_dir($dir)) {
+ mkdir($dir, 0777, true);
+ }
+ if (!is_dir($dir)) {
+ $this->markTestSkipped('Could not create directory.');
+ }
+
+ $this->file = tempnam($dir, 'css');
+
+ $import = '';
+ do {
+ if ($import) unlink($import);
+ $import = tempnam($dir, 'less');
+ $ok = rename($import, $import.'.less');
+ } while (!$ok);
+
+ $this->import = $import.'.less';
+ }
+
+ private function csstest($input, $expected_css, $expected_less) {
+ $location = "http://test.com/";
+ io_saveFile($this->file, $input);
+ $css = css_loadfile($this->file, $location);
+ $less = css_parseless($css);
+ $this->assertEquals($expected_css, $css);
+ $this->assertEquals($expected_less, $less);
+ }
+
+ public function test_basic() {
+ $this->setUpFiles();
+
+ $import = preg_replace('#(^.*[/])#','',$this->import);
+ $in_css = '@import "'.$import.'";';
+ $in_less = '@foo: "bar";
+content: @foo;';
+
+ $expected_css = '@import "/'.$import.'";';
+ $expected_less = 'content: "bar";';
+
+ io_saveFile($this->import, $in_less);
+ $this->csstest($in_css, $expected_css, $expected_less);
+ }
+
+ public function test_subdirectory() {
+ $this->setUpFiles('/foo/bar');
+
+ $import = preg_replace('#(^.*[/])#','',$this->import);
+ $in_css = '@import "'.$import.'";';
+ $in_less = '@foo: "bar";
+content: @foo;';
+
+ $expected_css = '@import "/foo/bar/'.$import.'";';
+ $expected_less = 'content: "bar";';
+
+ io_saveFile($this->import, $in_less);
+ $this->csstest($in_css, $expected_css, $expected_less);
+ }
+
+ public function tearDown() {
+ unlink($this->file);
+ unlink($this->import);
+ unset($this->file, $this->import);
+ }
+}
+
+//Setup VIM: ex: et ts=4 sw=4 :
diff --git a/_test/tests/lib/exe/css_css_compress.test.php b/_test/tests/lib/exe/css_css_compress.test.php
index a7c87b6a7..a614ea2fd 100644
--- a/_test/tests/lib/exe/css_css_compress.test.php
+++ b/_test/tests/lib/exe/css_css_compress.test.php
@@ -62,6 +62,46 @@ class css_css_compress_test extends DokuWikiTest {
$this->assertEquals(css_compress($text), 'a{left:20px;top:20px}');
}
+ function test_shortening() {
+ $input = array(
+ 'margin:0em 0em 0em 0em ul.test margin:0em :0em div#FFFFFF {',
+ 'margin: 1px 1px 1px 1px;',
+ 'padding: 1px 2px 1px 2px;',
+ 'margin: 1px 2px 3px 1px;',
+ 'padding: 1px 2px 3px 4px;',
+ 'margin: 00.00em 0em 01.00px 0em;',
+ 'padding: 0010em 0010.00em 00.00em 00.00100em;',
+ 'padding: 0010% 0010.00% 00.00% 00.00100xxx;',
+ 'padding: 0.0em .0em 0.em 00.00em;',
+ 'padding: 01.0em;',
+ 'color: #FFFFFF;',
+ 'color: #777777;',
+ 'color: #123456;',
+ 'border: 01.0em solid #ffffff;',
+ );
+
+ $expected = array(
+ 'margin:0em 0em 0em 0em ul.test margin:0em :0em div#FFFFFF{',
+ 'margin:1px;',
+ 'padding:1px 2px;',
+ 'margin:1px 2px 3px 1px;',
+ 'padding:1px 2px 3px 4px;',
+ 'margin:0 0 1px 0;',
+ 'padding:10em 10em 0 .001em;',
+ 'padding:10% 10% 0 00.00100xxx;',
+ 'padding:0;',
+ 'padding:1em;',
+ 'color:#FFF;',
+ 'color:#777;',
+ 'color:#123456;',
+ 'border:1em solid #fff;',
+ );
+
+ $input = array_map('css_compress', $input);
+
+ $this->assertEquals($expected, $input);
+ }
+
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/lib/exe/css_css_loadfile.test.php b/_test/tests/lib/exe/css_css_loadfile.test.php
index c89b69b2c..624becd29 100644
--- a/_test/tests/lib/exe/css_css_loadfile.test.php
+++ b/_test/tests/lib/exe/css_css_loadfile.test.php
@@ -3,13 +3,16 @@
require_once DOKU_INC.'lib/exe/css.php';
class css_css_loadfile_test extends DokuWikiTest {
+
+ protected $file = '';
+
public function setUp() {
- $this->file = tempnam('/tmp', 'css');
+ $this->file = tempnam(TMP_DIR, 'css');
}
private function csstest($input, $output = null, $location = 'http://www.example.com/') {
io_saveFile($this->file, $input);
- $this->assertEquals(css_loadfile($this->file, $location), (is_null($output) ? $input : $output));
+ $this->assertEquals((is_null($output) ? $input : $output), css_loadfile($this->file, $location));
}
public function test_url_relative() {
@@ -32,11 +35,15 @@ class css_css_loadfile_test extends DokuWikiTest {
public function test_import_relative() {
$this->csstest('@import "test/test.png";', '@import "http://www.example.com/test/test.png";');
$this->csstest('@import \'test/test.png\';', '@import \'http://www.example.com/test/test.png\';');
+ $this->csstest('@import url(test/test.png);', '@import url(http://www.example.com/test/test.png);');
+ $this->csstest('@import url("test/test.png");', '@import url("http://www.example.com/test/test.png");');
}
public function test_import_absolute() {
$this->csstest('@import "/test/test.png";');
$this->csstest('@import \'/test/test.png\';');
+ $this->csstest('@import url(/test/test.png);');
+ $this->csstest('@import url("/test/test.png");');
}
public function test_import_with_protocol() {
@@ -44,6 +51,37 @@ class css_css_loadfile_test extends DokuWikiTest {
$this->csstest('@import "https://www.test.com/test/test.png";');
$this->csstest('@import \'http://www.test.com/test/test.png\';');
$this->csstest('@import \'https://www.test.com/test/test.png\';');
+ $this->csstest('@import url(http://www.test.com/test/test.png);');
+ $this->csstest('@import url("http://www.test.com/test/test.png");');
+ }
+
+ public function test_less_basic() {
+ $this->csstest('@import "test.less"', '@import "/test.less"');
+ $this->csstest('@import "/test.less"', '@import "/test.less"');
+ $this->csstest('@import "foo/test.less"', '@import "/foo/test.less"');
+ $this->csstest('@import url(http://test.less)');
+ }
+
+ // more expected use, where less @import(ed) from e.g. lib/plugins/plugin_name
+ public function test_less_subdirectories() {
+
+ unlink($this->file);
+
+ $dir = TMP_DIR.'/foo/bar';
+ if (!is_dir($dir)) {
+ mkdir($dir, 0777, true);
+ }
+ if (!is_dir($dir)) {
+ $this->markTestSkipped('Could not create directory.');
+ }
+
+ $this->file = tempnam($dir, 'css');
+
+ $this->csstest('@import "test.less"', '@import "/foo/bar/test.less"');
+ $this->csstest('@import \'test.less\'', '@import \'/foo/bar/test.less\'');
+ $this->csstest('@import url(test.less)', '@import url(/foo/bar/test.less)');
+
+ $this->csstest('@import "abc/test.less"', '@import "/foo/bar/abc/test.less"');
}
public function tearDown() {
diff --git a/_test/tests/test/basic.test.php b/_test/tests/test/basic.test.php
index 05778ccf9..86acef935 100644
--- a/_test/tests/test/basic.test.php
+++ b/_test/tests/test/basic.test.php
@@ -123,11 +123,11 @@ class InttestsBasicTest extends DokuWikiTest {
$request = new TestRequest();
// doku
- $response = $request->get();
- $this->assertEquals('doku.php',$request->getScript());
+ $response = $request->get();
+ $this->assertEquals('doku.php',$request->getScript());
- $response = $request->get(array(),'/doku.php?id=wiki:dokuwiki&test=foo');
- $this->assertEquals('doku.php',$request->getScript());
+ $response = $request->get(array(),'/doku.php?id=wiki:dokuwiki&test=foo');
+ $this->assertEquals('doku.php',$request->getScript());
// fetch
$response = $request->get(array(),'/lib/exe/fetch.php?media=wiki:dokuwiki-128.png');
@@ -149,8 +149,8 @@ class InttestsBasicTest extends DokuWikiTest {
$request = new TestRequest();
$response = $request->get(array(),'/lib/exe/fetch.php?media=wiki:dokuwiki-128.png');
- $headers = $response->getHeaders();
- $this->assertTrue(!empty($headers));
+ $headers = $response->getHeaders();
+ $this->assertTrue(!empty($headers));
}
function testGetHeader(){