From c88ecebb7b91e2058d8d6fbfb593fe45cd1af894 Mon Sep 17 00:00:00 2001 From: Shish Date: Wed, 15 Jul 2009 02:42:18 +0100 Subject: [PATCH] A ton of tests, figured out how to test uploads \o/ --- contrib/home/test.php | 8 +-- contrib/image_hash_ban/test.php | 2 +- contrib/ipban/test.php | 14 ++-- contrib/rss_comments/test.php | 4 +- contrib/rss_images/test.php | 21 ++++-- contrib/simpletest/data/bedroom_workshop.jpg | Bin 0 -> 33101 bytes contrib/simpletest/data/pbx_screenshot.jpg | Bin 0 -> 19774 bytes contrib/simpletest/main.php | 62 ++++++++++++++++ contrib/simpletest/theme.php | 9 ++- contrib/word_filter/test.php | 2 +- ext/admin/test.php | 22 +++--- ext/alias_editor/test.php | 29 ++------ ext/bbcode/test.php | 2 +- ext/comment/test.php | 6 +- ext/ext_manager/test.php | 22 +++--- ext/handle_404/test.php | 4 +- ext/handle_pixel/main.php | 1 + ext/image/main.php | 22 ++++-- ext/index/test.php | 72 +++++++++++++------ ext/setup/test.php | 22 +++--- ext/tag_list/test.php | 10 +-- ext/upload/main.php | 3 +- ext/upload/test.php | 21 ++++++ ext/user/test.php | 26 +++---- ext/view/test.php | 19 +++-- 25 files changed, 250 insertions(+), 153 deletions(-) create mode 100644 contrib/simpletest/data/bedroom_workshop.jpg create mode 100644 contrib/simpletest/data/pbx_screenshot.jpg create mode 100644 ext/upload/test.php 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 0000000000000000000000000000000000000000..f86209293aa9f4c4f0e185a62763adcb8f990b9f GIT binary patch literal 33101 zcmbTdWmp}}x-B}9;O-8=oyo-Ag3AoNWf=ho z00009fDQ!>K!c!fkca`naFDbZ60x9Q08o(hZy11W=fAq57|S{woCmfqeWx zZhjCi1v`lUUpoK~kpAT#Rv3^g$@(`YfMB}Nf3EoaZ_Tmr09Z%@1c87svH!55fY`wP z8*@T1RNOx{P!OiD@ksyF49SO&|6j}z{*C_@iTEEFko)iQ*?~Z)+<)x+4}*gKr%g5?`OyEyzX|`A`~UCpx5c*=KrjFS4h|mf9RfT&JR%|j5(*9~3NkVZ zAr>||4k-~i87UD72?aGP9R(#b6$uGF4+Arhos*N3oQ_Y37bM8a!3lywL_|bEMj=2& zB>=rAc@O$O4sSmIm)-|3I-GEtq&?6(%|nPqw?>-{C9vj59~WQcmzZw zWDEc_6buYBEX=!iu#hf?^8J@%VZOt9&n^ast!xZW>4*agjLSoy60hySRhc@c<}h*k zf{28NPe4dSLrX``z{ttP&BM#bFY!TAN?Jx%PE}1^LsLsz$JET+!t#@qwX=(>o4bdn zS5WZRZy}*!;qeKHNy#axY3ca|g+;|BrDf%H^$m?p%`L5My+8Z<2L^|RN2X_H=jIm{ zmzKA-cXs#o4}KpWU0hyW-`w8aKRiM~I`+T9KZO2+4<>{UG%PF(Ec{2!jdx z?maskmY6cUu_HDmC=dZhJT9-c2a$?H~hyWVI9m?{4P7a_hlGa!^UB9seBGt|h1+ zL4yh=@?wK)m@(GTapTuXutnAzfTQSwEOnhu5v)IBKmUn>Y9jmt`^|$GRKO-m=D9~T zyz)$?OV|cD8F|>gDh!)G&8O<+;_`r0=vc`ijQlq~t-O_mZX?D}75CZ^NLt}~@>pAB znd7+k_PLiTu7{b@00-UhqS{q+X>d(xv~`BQtxitSR%@1628_O3Rh`33l<4p@ngfj8 zsZknyW=v}Mil;5vK}<$#R0Or`O(ynS_87NhZqLn*azKqPNgEn(QQN2S=frLRKe9>g z09UTE2*1SeFd`Y49Qh+{Q~*0Ldjvq9XI|2q1gPD%VtT82?xpZWjE+i z<29~eeCrK>r6tB0zPtKfzzYRaosW(f6X&7Y#Sp7XgB;IrRo1C2D>Ag(vxPimzI6>* zsjh8Q%tLa!fPau#!qf;m@}P@p=2^L@xMo}ao?E9Sl8V2>Vc&P`M)fyuCD#mUoI;bpE3$~WW+}o5{7OLV93Af z%sjJi(`QU_aKy!%#Y=Qfeiss%Y*b{l#!SgDm(!b;)@eH$8X&F^v@Fl|&r&{rt-RBT z8l)DL0G0lR`z#`t-!`){Vmybzc?1a4CidnjmbPxsx8atX)*W@YrGGuw{+#Rl%W?7z zpcC4qSymvMrJ2rcPZthukX{R@d{MewUybp_OyG%s-qLf0 z*;rU^j>Kt88<8a@>MBltR9x-pp?;8!xw@(0?`UB^WJz=_x`{T-pCLbwN$IsdhfO&_4Qt zJGImtv{wK+A?e5W)T(cQEz3^Fg>RkIB|Znku_g(zu;WA)J=Hri+v z@0{72(^(b|!jOfP>IafIawP6pL)%oIZ-m^e=vr;ZNN82d48`Y!e?nM`K;z}65tV#_U^1GA7jXZ0NGPV0-x^}Ot?LjH8KT~L;ff+TL zY~Dll8HO6bE1YPR&YiEV5a*lCn}=}9Gx~-9LO(HmB1xc7H`^chJf?Tfepma;v}V&< zvaDN$#H@L_2mbw##@V~+DhYW?O$K+WUgZbxr3aMf%6HDmjptrAu+U}rQ@?ff1(?0tgjjG(9;$|a^FD^l%dt#Hyc!33PlxKC@@z@-gHsKrFW z9;JIS{Mcm!^*;TUpm3wrO#g`JP?jnv)1EF5?pwlY>1c}SY=^SB!>w~^VLo!H)Q5_@ zkmj=ENbd!B#|i_FTy9a7MJd&kQr@NJq4y8GEPWuks?~=he z&V(1ZI~1(_WV_W!^DFX_$L3)5Hp83|kqe=(Vsqq=$nzU-@D`9YZflR%78{ic>?k%8 z@{Sp;a`uWYK69!~aj0)WD+ME2*Hx{$LlbU!4DUFXDL>9?N(%q_KBV4fH|x*n{#yj} zoN@{Z2(dNIXA@I@K0u9?@;wS_`EnRXOz)+ZZG4*fI86kin)eZNKwtVLv1jSF08?WS zOfq*j@4!ZZ>}KxCF|e8+c&OKzwGh@QdBuFX^94JT7n$f{Vc+z{#!@1Ql`48gSztfb z{+qktAS*BI8^GoIaRK&y=Fzr2|o19!`-_j;o zS5g-`+Lo2Pw$Rw|g42{Ocr)=+Lz-zah>+Ht;uTlA-)&iE(vI4(A1C`WHofkyCNDU|HIrXI4do1} z(IoaKAz#C!&o@usJaAsPlC}>uU7U*TnJ-CGkeI?GEG$IMa|bzF7Fx#{4qNV5Y746j zeI!HU*Vx+_P_#C~uyRXI#&A>9KaISaRG3$>I=Z9ekx#O9S;w0{ai|K$kN8dkH#G6{ z_s^E+C|9>^v?+>MeaV7FJ*l7fP9uH+nSTCR9_w*swtc9&L|ao~Kgvt_BWD>P@s>4nm}>vx(rfK53?q~_1; z-R4B1z8qsCgs%p=y9_w%emw1NBJ0;C=KB6&X@H_I9?1Cak737}%zDSfEXB zTO>(Q1^Gjp?9+bPy7Y7t^!0oL9Q)xMzX9OSpiI*D+ydm&0uL9EBX91iz^BAfThBwI z*<$N*%}vu{I2)&(!LRQg0*^ z;$rtQf8t+cl-Sx@Q@kN^`3Cr+R#;_U44A3xP=tEYcJ%+$&8r&3>6_{ueUn#UgNT>o zTKtoBG10i-NblQL*kmz3`c}1^o%<8x_WC{w@}lm(-g!Zu>T!Cjqa(Ipvqmj5vadDiS!w|QMdUDjp|F^_(nPu>7K}uZsQX4y%1}VIaY5}*5p8`acmudUGyP(*H_cwNue8J#T^n>T5g@Xt4eBKJjEihi*^Nt;vtEewNBDts|ho zA!RN#M*(S0KA%0&u1r&>p|-Z!%E$`KJ_?5+(ccLjy2W)m*;ipzd$_!hOpK{Fgi7RK zf$KMNxdQa)o}MC!KfQQP=ipu2XEgLZy_gsuu&*T!Q_+Ll)EKfn6ZtxpNO0uA)r<9v z86mzGw60)+JW6Q5bGC~#-SHKg?~iKV%J<%#7c#I#=VI`2t2zF?-}f)npQA^q!++eo zcTAr@zjhjb&2ifBN&4#L3x2pO%LtEJYQVPdLG9I99r^b8&u)D8+8}t6i>vB*(4!r< zaJWa3kXm&a6|~Z~Y-*qr5lS~^`&8T5Zb>T5HGkB_Jk`N~`E6o^tpPK>HXzS`-M;&) zlWJ)u-nT{u9fb>Wyycgaz7$au=BR!2!Squf#I1IJ9IKU*Y*)N{4Vf>y(VnY=FgMlM zhO>KfT!^f+m?5k(nAd>Jo%3<`9JofA)0@_lA|u$tOUtL9Z-7~=;TuLKd7Nj{&A>c^ zhTC<^#Z13L%UGCLIHxsqogHdV%t+fF)u0B~XU9WBFl1WUbU_=%^>yTY0|Y#(Q(quv&y42CsUbmX8UJ4EFE`~9WWU#19LP#?a{w^y)>}Y?JR~pJS^_|c;4HPs%!B#%oUfY5tYtzSBjt2Z@7+!S z)GU4wTY=vriOY+=VO?fTh3edX)g%xB?Ew65$MF8V9!Bmqo! z78K;ZK#=(e@O1SRH~A9vz$8{=xddUr_po1zJ)A-LvxZa44qkF)Fkh7-op#4GtKhM= z+(C%MNXs>4{Vl*teerb13`%4k^Vx8^Tv5_M>Q@Pat(R0%)sjuz>u#w1kB3~-g*C9_ z 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 literal 0 HcmV?d00001 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 = "
". $this->getPassCount() . " passes, " . $this->getFailCount() . " failures" . - "
Passed modules: " . $this->clear_modules . + "
Passed modules: " . implode(", ", $this->clear_modules) . "
"; $this->page->add_block(new Block("Results", $html, "main", 40)); } @@ -47,7 +46,7 @@ class SCoreReporter extends HtmlReporter { } parent::paintGroupEnd($name); if($this->current_html == "") { - $this->clear_modules .= "$name, "; + $this->clear_modules[] = $name; } else { $this->current_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(); } } ?>