diff --git a/contrib/home/test.php b/contrib/home/test.php index f0b89f49..e62d34d7 100644 --- a/contrib/home/test.php +++ b/contrib/home/test.php @@ -1,9 +1,9 @@ get(TEST_BASE.'/home'); - $this->assertTitle('Shimmie Testbed'); - $this->assertText('Shimmie Testbed'); + $this->get_page('home'); + $this->assertTitle('Shimmie'); + $this->assertText('Shimmie'); } } ?> diff --git a/contrib/image_hash_ban/test.php b/contrib/image_hash_ban/test.php index 1d786f2e..58e781ab 100644 --- a/contrib/image_hash_ban/test.php +++ b/contrib/image_hash_ban/test.php @@ -1,5 +1,5 @@ get(TEST_BASE.'/ip_ban/list'); + $this->get_page('ip_ban/list'); $this->assertResponse(403); $this->assertTitle("Permission Denied"); - $this->get(TEST_BASE.'/user'); - $this->assertText("Login"); - $this->setField('user', ADMIN_NAME); - $this->setField('pass', ADMIN_PASS); - $this->click("Log In"); + $this->log_in_as_admin(); - $this->get(TEST_BASE.'/ip_ban/list'); + $this->get_page('ip_ban/list'); $this->assertNoText("42.42.42.42"); $this->setField('ip', '42.42.42.42'); $this->setField('reason', 'unit testing'); @@ -22,7 +18,7 @@ class IPBanTest extends WebTestCase { $this->click("Remove"); // FIXME: remove which ban? :S $this->assertNoText("42.42.42.42"); - $this->click('Log Out'); + $this->log_out(); } } ?> diff --git a/contrib/rss_comments/test.php b/contrib/rss_comments/test.php index 4cba4e67..4b3364ed 100644 --- a/contrib/rss_comments/test.php +++ b/contrib/rss_comments/test.php @@ -1,7 +1,7 @@ get(TEST_BASE.'/rss/comments'); + $this->get_page('rss/comments'); $this->assertMime("application/rss+xml"); $this->assertNoText("Exception"); } diff --git a/contrib/rss_images/test.php b/contrib/rss_images/test.php index ad9b1bac..fb27131b 100644 --- a/contrib/rss_images/test.php +++ b/contrib/rss_images/test.php @@ -1,21 +1,32 @@ get(TEST_BASE.'/rss/images'); + $this->log_in_as_user(); + $image_id = $this->post_image("ext/simpletest/data/pbx_screenshot.jpg", "pbx computer screenshot"); + $this->log_out(); + + $this->assertTitle("Upload Status"); + $this->assertText("already has hash"); + + $this->get_page('rss/images'); $this->assertMime("application/rss+xml"); $this->assertNoText("Exception"); - $this->get(TEST_BASE.'/rss/images/1'); + $this->get_page('rss/images/1'); $this->assertMime("application/rss+xml"); $this->assertNoText("Exception"); - $this->get(TEST_BASE.'/rss/images/tagme/1'); + $this->get_page('rss/images/tagme/1'); $this->assertMime("application/rss+xml"); $this->assertNoText("Exception"); - $this->get(TEST_BASE.'/rss/images/tagme/2'); + $this->get_page('rss/images/tagme/2'); $this->assertMime("application/rss+xml"); $this->assertNoText("Exception"); + + $this->log_in_as_admin(); + $this->delete_image($image_id); + $this->log_out(); } } ?> diff --git a/contrib/simpletest/data/bedroom_workshop.jpg b/contrib/simpletest/data/bedroom_workshop.jpg new file mode 100644 index 00000000..f8620929 Binary files /dev/null and b/contrib/simpletest/data/bedroom_workshop.jpg differ diff --git a/contrib/simpletest/data/pbx_screenshot.jpg b/contrib/simpletest/data/pbx_screenshot.jpg new file mode 100644 index 00000000..5251d889 Binary files /dev/null and b/contrib/simpletest/data/pbx_screenshot.jpg differ diff --git a/contrib/simpletest/main.php b/contrib/simpletest/main.php index 1a5916db..f226b5d9 100644 --- a/contrib/simpletest/main.php +++ b/contrib/simpletest/main.php @@ -10,6 +10,68 @@ require_once('simpletest/web_tester.php'); require_once('simpletest/unit_tester.php'); require_once('simpletest/reporter.php'); +define('TEST_BASE', "http://shimmie.shishnet.org/branch_2.3/index.php?q="); +define('USER_NAME', "test"); +define('USER_PASS', "test"); +define('ADMIN_NAME', "demo"); +define('ADMIN_PASS', "demo"); + +class ShimmieWebTestCase extends WebTestCase { + protected function get_page($page) { + $this->get(TEST_BASE.'/'.$page); + } + protected function log_in_as_user() { + $this->get_page('post/list'); + $this->assertText("Login"); + $this->setField('user', USER_NAME); + $this->setField('pass', USER_PASS); + $this->click("Log In"); + } + + protected function log_in_as_admin() { + $this->get_page('post/list'); + $this->assertText("Login"); + $this->setField('user', ADMIN_NAME); + $this->setField('pass', ADMIN_PASS); + $this->click("Log In"); + } + + protected function log_out() { + $this->get_page('post/list'); + $this->click('Log Out'); + } + + protected function post_image($filename, $tags) { + $image_id = -1; + $this->setMaximumRedirects(0); + + $this->get_page('post/list'); + $this->assertText("Upload"); + $this->setField("data0", $filename); + $this->setField("tags", $tags); + $this->click("Post"); + + $raw_headers = $this->getBrowser()->getHeaders(); + $headers = explode("\n", $raw_headers); + foreach($headers as $header) { + $parts = explode(":", $header); + if(trim($parts[0]) == "X-Shimmie-Image-ID") { + $image_id = int_escape(trim($parts[1])); + } + } + + $this->setMaximumRedirects(5); + return $image_id; + } + + protected function delete_image($image_id) { + if($image_id > 0) { + $this->get_page('post/view/'.$image_id); + $this->click("Delete"); + } + } +} + class TestFinder extends TestSuite { function TestFinder($hint) { $dir = "*"; diff --git a/contrib/simpletest/theme.php b/contrib/simpletest/theme.php index 868621ef..7d74c2b3 100644 --- a/contrib/simpletest/theme.php +++ b/contrib/simpletest/theme.php @@ -4,7 +4,7 @@ class SimpleSCoreTestTheme extends Themelet { class SCoreReporter extends HtmlReporter { var $current_html = ""; - var $clear_modules = ""; + var $clear_modules = array(); var $page; public function SCoreReporter(Page $page) { @@ -19,8 +19,7 @@ class SCoreReporter extends HtmlReporter { function paintFooter($test_name) { //parent::paintFooter($test_name); - $fail = $this->getFailCount() > 0; - if($fail) { + if($this->getFailCount() > 0) { $style = "background: red;"; } else { @@ -29,7 +28,7 @@ class SCoreReporter extends HtmlReporter { $html = "
$link"; diff --git a/contrib/word_filter/test.php b/contrib/word_filter/test.php index 4dbed6be..e82fa0ad 100644 --- a/contrib/word_filter/test.php +++ b/contrib/word_filter/test.php @@ -1,5 +1,5 @@ get(TEST_BASE.'/admin'); + $this->get_page('admin'); $this->assertResponse(403); $this->assertTitle("Permission Denied"); - $this->assertText("Login"); - $this->setField('user', USER_NAME); - $this->setField('pass', USER_PASS); - $this->click("Log In"); - $this->get(TEST_BASE.'/admin'); + $this->log_in_as_user(); + $this->get_page('admin'); $this->assertResponse(403); $this->assertTitle("Permission Denied"); - $this->click('Log Out'); + $this->log_out(); - $this->assertText("Login"); - $this->setField('user', ADMIN_NAME); - $this->setField('pass', ADMIN_PASS); - $this->click("Log In"); - $this->get(TEST_BASE.'/admin'); + $this->log_in_as_admin(); + $this->get_page('admin'); $this->assertTitle("Admin Tools"); - $this->click('Log Out'); + $this->log_out(); } } ?> diff --git a/ext/alias_editor/test.php b/ext/alias_editor/test.php index c314b863..5eeb6c80 100644 --- a/ext/alias_editor/test.php +++ b/ext/alias_editor/test.php @@ -1,28 +1,13 @@ get(TEST_BASE.'/admin'); - $this->assertResponse(403); - $this->assertTitle("Permission Denied"); + $this->get_page('alias/list'); + $this->assertTitle("Alias List"); - $this->assertText("Login"); - $this->setField('user', USER_NAME); - $this->setField('pass', USER_PASS); - $this->click("Log In"); - $this->get(TEST_BASE.'/admin'); - $this->assertResponse(403); - $this->assertTitle("Permission Denied"); - $this->click('Log Out'); - - $this->assertText("Login"); - $this->setField('user', ADMIN_NAME); - $this->setField('pass', ADMIN_PASS); - $this->click("Log In"); - $this->get(TEST_BASE.'/admin'); - $this->assertTitle("Admin Tools"); - $this->click('Log Out'); - */ + $this->log_in_as_admin(); + $this->get_page('alias/list'); + $this->assertTitle("Alias List"); + $this->log_out(); } } ?> diff --git a/ext/bbcode/test.php b/ext/bbcode/test.php index e8136732..92a6da01 100644 --- a/ext/bbcode/test.php +++ b/ext/bbcode/test.php @@ -1,5 +1,5 @@ get(TEST_BASE.'/comment/list'); + $this->get_page('comment/list'); $this->assertTitle('Comments'); - $this->get(TEST_BASE.'/comment/list/2'); + $this->get_page('comment/list/2'); $this->assertTitle('Comments'); } } diff --git a/ext/ext_manager/test.php b/ext/ext_manager/test.php index a28b1e5f..1b89ccae 100644 --- a/ext/ext_manager/test.php +++ b/ext/ext_manager/test.php @@ -1,27 +1,21 @@ get(TEST_BASE.'/ext_manager'); + $this->get_page('ext_manager'); $this->assertResponse(403); $this->assertTitle("Permission Denied"); - $this->assertText("Login"); - $this->setField('user', USER_NAME); - $this->setField('pass', USER_PASS); - $this->click("Log In"); - $this->get(TEST_BASE.'/ext_manager'); + $this->log_in_as_user(); + $this->get_page('ext_manager'); $this->assertResponse(403); $this->assertTitle("Permission Denied"); - $this->click('Log Out'); + $this->log_out(); - $this->assertText("Login"); - $this->setField('user', ADMIN_NAME); - $this->setField('pass', ADMIN_PASS); - $this->click("Log In"); - $this->get(TEST_BASE.'/ext_manager'); + $this->log_in_as_admin(); + $this->get_page('ext_manager'); $this->assertTitle("Extensions"); $this->assertText("SimpleTest integration"); - $this->click('Log Out'); + $this->log_out(); } } ?> diff --git a/ext/handle_404/test.php b/ext/handle_404/test.php index 264b3158..60e614dd 100644 --- a/ext/handle_404/test.php +++ b/ext/handle_404/test.php @@ -1,7 +1,7 @@ get(TEST_BASE.'/not/a/page'); + $this->get_page('not/a/page'); $this->assertResponse(404); $this->assertTitle('404'); $this->assertText("No handler could be found for the page 'not/a/page'"); diff --git a/ext/handle_pixel/main.php b/ext/handle_pixel/main.php index ab6b45a1..37f662b0 100644 --- a/ext/handle_pixel/main.php +++ b/ext/handle_pixel/main.php @@ -24,6 +24,7 @@ class PixelFileHandler implements Extension { $iae = new ImageAdditionEvent($event->user, $image); send_event($iae); // this might raise an exception, but all we'd do is re-throw it... + $event->image_id = $iae->image->id; } if(($event instanceof ThumbnailGenerationEvent) && $this->supported_ext($event->type)) { diff --git a/ext/image/main.php b/ext/image/main.php index d5b72512..a2477c24 100644 --- a/ext/image/main.php +++ b/ext/image/main.php @@ -15,6 +15,13 @@ class ImageAdditionEvent extends Event { } } +class ImageAdditionException extends SCoreException { + var $error; + + public function __construct($error) { + $this->error = $error; + } +} /* * ImageDeletionEvent: @@ -104,8 +111,12 @@ class ImageIO extends SimpleExtension { } public function onImageAddition($event) { - $error = $this->add_image($event->image); - if(!empty($error)) throw new UploadException($error); + try { + $this->add_image($event->image); + } + catch(ImageAdditionException $e) { + throw new UploadException($e->error); + } } public function onImageDeletion($event) { @@ -158,8 +169,7 @@ class ImageIO extends SimpleExtension { } if(!empty($image->source)) { if(!preg_match("#^(https?|ftp)://#", $image->source)) { - $error = "Image's source isn't a valid URL"; - return $error; + throw new ImageAdditionException("Image's source isn't a valid URL"); } } @@ -177,7 +187,7 @@ class ImageIO extends SimpleExtension { else { $error = "Image {$existing->id} ". "already has hash {$image->hash}:
".Themelet::build_thumb_html($existing); - return $error; + throw new ImageAdditionException($error); } } @@ -194,8 +204,6 @@ class ImageIO extends SimpleExtension { log_info("image", "Uploaded Image #{$image->id} ({$image->hash})"); send_event(new TagSetEvent($image, $image->get_tag_array())); - - return null; } // }}} // fetch image {{{ diff --git a/ext/index/test.php b/ext/index/test.php index 75db7f6f..0d507504 100644 --- a/ext/index/test.php +++ b/ext/index/test.php @@ -1,42 +1,70 @@ get(TEST_BASE.'/post/list'); - $this->assertTitle("Shimmie Testbed"); + $this->log_in_as_user(); + $image_id = $this->post_image("ext/simpletest/data/pbx_screenshot.jpg", "pbx computer screenshot"); + $this->log_out(); + + $this->get_page('post/list'); + $this->assertTitle("Shimmie"); $this->assertText("Prev | Index | Next"); - $this->get(TEST_BASE.'/post/list/-1'); - $this->assertTitle("Shimmie Testbed"); + $this->get_page('post/list/-1'); + $this->assertTitle("Shimmie"); - $this->get(TEST_BASE.'/post/list/0'); - $this->assertTitle("Shimmie Testbed"); + $this->get_page('post/list/0'); + $this->assertTitle("Shimmie"); - $this->get(TEST_BASE.'/post/list/1'); - $this->assertTitle("Shimmie Testbed"); + $this->get_page('post/list/1'); + $this->assertTitle("Shimmie"); - $this->get(TEST_BASE.'/post/list/99999'); - $this->assertTitle("Shimmie Testbed"); + $this->get_page('post/list/99999'); + $this->assertTitle("Shimmie"); + + $this->log_in_as_admin(); + $this->delete_image($image_id); + $this->log_out(); } function testSearches() { - $this->get(TEST_BASE.'/post/list/maumaumau/1'); + $this->log_in_as_user(); + $image_id_1 = $this->post_image("ext/simpletest/data/pbx_screenshot.jpg", "pbx computer screenshot"); + $image_id_2 = $this->post_image("ext/simpletest/data/bedroom_workshop.jpg", "computer bedroom workshop"); + $this->log_out(); + + # make sure both uploads were ok + $this->assertTrue($image_id_1 > 0); + $this->assertTrue($image_id_2 > 0); + + # regular tag, no results + $this->get_page('post/list/maumaumau/1'); $this->assertTitle("maumaumau"); $this->assertText("No Images Found"); - $this->get(TEST_BASE.'/post/list/screenshot/1'); - $this->assertTitle("screenshot"); + # regular tag, many results + $this->get_page('post/list/computer/1'); + $this->assertTitle("computer"); - $this->get(TEST_BASE.'/post/list/size=1024x768/1'); - $this->assertTitle("size=1024x768"); + # meta tag, many results + $this->get_page('post/list/size=640x480/1'); + $this->assertTitle("size=640x480"); - $this->get(TEST_BASE.'/post/list/screenshot%20size=1024x768/1'); - $this->assertTitle("screenshot size=1024x768"); + # multiple tags, many results + $this->get_page('post/list/computer%20size=640x480/1'); + $this->assertTitle("computer size=640x480"); - $this->get(TEST_BASE.'/post/list/screenshot%20computer/1'); - $this->assertTitle("screenshot computer"); + # multiple tags, single result; search with one result = direct to image + $this->get_page('post/list/screenshot%20computer/1'); + $this->assertTitle(new PatternExpectation("/^Image $image_id_1: /")); - $this->get(TEST_BASE.'/post/list/screenshot%20computer%20-pbx/1'); - $this->assertTitle("screenshot computer -pbx"); + # negative tag, should have one result + $this->get_page('post/list/computer%20-pbx/1'); + $this->assertTitle(new PatternExpectation("/^Image $image_id_2: /")); + + $this->log_in_as_admin(); + $this->delete_image($image_id_1); + $this->delete_image($image_id_2); + $this->log_out(); } } ?> diff --git a/ext/setup/test.php b/ext/setup/test.php index 6038bf32..af168db7 100644 --- a/ext/setup/test.php +++ b/ext/setup/test.php @@ -1,27 +1,21 @@ get(TEST_BASE.'/setup'); + $this->get_page('setup'); $this->assertResponse(403); $this->assertTitle("Permission Denied"); - $this->assertText("Login"); - $this->setField('user', USER_NAME); - $this->setField('pass', USER_PASS); - $this->click("Log In"); - $this->get(TEST_BASE.'/setup'); + $this->log_in_as_user(); + $this->get_page('setup'); $this->assertResponse(403); $this->assertTitle("Permission Denied"); - $this->click('Log Out'); + $this->log_out(); - $this->assertText("Login"); - $this->setField('user', ADMIN_NAME); - $this->setField('pass', ADMIN_PASS); - $this->click("Log In"); - $this->get(TEST_BASE.'/setup'); + $this->log_in_as_admin(); + $this->get_page('setup'); $this->assertTitle("Shimmie Setup"); $this->assertText("General"); - $this->click('Log Out'); + $this->log_out(); } } ?> diff --git a/ext/tag_list/test.php b/ext/tag_list/test.php index 241e3282..6e69f6f4 100644 --- a/ext/tag_list/test.php +++ b/ext/tag_list/test.php @@ -1,16 +1,16 @@ get(TEST_BASE.'/tags/map'); + $this->get_page('tags/map'); $this->assertTitle('Tag List'); - $this->get(TEST_BASE.'/tags/alphabetic'); + $this->get_page('tags/alphabetic'); $this->assertTitle('Tag List'); - $this->get(TEST_BASE.'/tags/popularity'); + $this->get_page('tags/popularity'); $this->assertTitle('Tag List'); - $this->get(TEST_BASE.'/tags/categories'); + $this->get_page('tags/categories'); $this->assertTitle('Tag List'); } } diff --git a/ext/upload/main.php b/ext/upload/main.php index 9b48328c..b389a61c 100644 --- a/ext/upload/main.php +++ b/ext/upload/main.php @@ -8,7 +8,7 @@ * Some data is being uploaded. Should be caught by a file handler. */ class DataUploadEvent extends Event { - var $user, $tmpname, $metadata, $hash, $type; + var $user, $tmpname, $metadata, $hash, $type, $image_id = -1; public function DataUploadEvent($user, $tmpname, $metadata) { $this->user = $user; @@ -150,6 +150,7 @@ class Upload implements Extension { $event = new DataUploadEvent($user, $file['tmp_name'], $metadata); try { send_event($event); + header("X-Shimmie-Image-ID: ".int_escape($event->image_id)); } catch(UploadException $ex) { $this->theme->display_upload_error($page, "Error with ".html_escape($file['name']), diff --git a/ext/upload/test.php b/ext/upload/test.php new file mode 100644 index 00000000..1ebf096f --- /dev/null +++ b/ext/upload/test.php @@ -0,0 +1,21 @@ +log_in_as_user(); + + $image_id_1 = $this->post_image("ext/simpletest/data/pbx_screenshot.jpg", "pbx computer screenshot"); + $this->assertResponse(302); + + $image_id_2 = $this->post_image("ext/simpletest/data/pbx_screenshot.jpg", "pbx computer screenshot"); + $this->assertTitle("Upload Status"); + $this->assertText("already has hash"); + + $this->log_out(); + + $this->log_in_as_admin(); + $this->delete_image($image_id_1); + $this->delete_image($image_id_2); + $this->log_out(); + } +} +?> diff --git a/ext/user/test.php b/ext/user/test.php index cfddd982..bc6be2b2 100644 --- a/ext/user/test.php +++ b/ext/user/test.php @@ -1,36 +1,30 @@ get(TEST_BASE.'/user'); + $this->get_page('user'); $this->assertTitle("Anonymous's Page"); $this->assertNoText("Options"); $this->assertNoText("More Options"); - $this->get(TEST_BASE.'/user/Shish'); - $this->assertTitle("Shish's Page"); + $this->get_page('user/demo'); + $this->assertTitle("demo's Page"); - $this->get(TEST_BASE.'/user/MauMau'); + $this->get_page('user/MauMau'); $this->assertTitle("No Such User"); - $this->assertText("Login"); - $this->setField('user', USER_NAME); - $this->setField('pass', USER_PASS); - $this->click("Log In"); + $this->log_in_as_user(); // should be on the user page - $this->assertTitle("test's Page"); + $this->assertTitle(USER_NAME+"'s Page"); $this->assertText("Options"); $this->assertNoText("More Options"); - $this->click('Log Out'); + $this->log_out(); - $this->assertText("Login"); - $this->setField('user', ADMIN_NAME); - $this->setField('pass', ADMIN_PASS); - $this->click("Log In"); + $this->log_in_as_admin(); // should be on the user page $this->assertTitle(ADMIN_NAME+"'s Page"); $this->assertText("Options"); $this->assertText("More Options"); - $this->click('Log Out'); + $this->log_out(); } } ?> diff --git a/ext/view/test.php b/ext/view/test.php index 874fe321..bcbf12c8 100644 --- a/ext/view/test.php +++ b/ext/view/test.php @@ -1,14 +1,23 @@ get(TEST_BASE.'/post/view/1914'); - $this->assertTitle('Image 1914: test'); + $this->log_in_as_user(); + $image_id = $this->post_image("ext/simpletest/data/pbx_screenshot.jpg", "test"); + $idp1 = $image_id + 1; + $this->log_out(); - $this->get(TEST_BASE.'/post/view/1'); + $this->get_page("post/view/$image_id"); + $this->assertTitle("Image $image_id: test"); + + $this->get_page("post/view/$idp1"); $this->assertTitle('Image not found'); - $this->get(TEST_BASE.'/post/view/-1'); + $this->get_page('post/view/-1'); $this->assertTitle('Image not found'); + + $this->log_in_as_admin(); + $this->delete_image($image_id); + $this->log_out(); } } ?>