set_string("thumb_engine", "static"); # GD has less overhead per-call send_event(new DatabaseUpgradeEvent()); send_event(new InitExtEvent()); abstract class ShimmiePHPUnitTestCase extends \PHPUnit\Framework\TestCase { protected $anon_name = "anonymous"; protected $admin_name = "demo"; protected $user_name = "test"; public function setUp(): void { global $_tracer, $tracer_enabled; $tracer_enabled = true; $_tracer->begin("setUp"); $class = str_replace("Test", "", get_class($this)); if (!ExtensionInfo::get_for_extension_class($class)->is_supported()) { $this->markTestSkipped("$class not supported with this database"); } $this->create_user($this->admin_name); $this->create_user($this->user_name); // things to do after bootstrap and before request // log in as anon $this->log_out(); $_tracer->end(); $_tracer->begin($this->getName()); } public function tearDown(): void { global $_tracer; $_tracer->end(); $_tracer->begin("tearDown"); global $database, $_tracer; foreach ($database->get_col("SELECT id FROM images") as $image_id) { send_event(new ImageDeletionEvent(Image::by_id($image_id))); } $_tracer->end(); $_tracer->clear(); $_tracer->flush("tests/trace.json"); } protected function create_user(string $name) { if (is_null(User::by_name($name))) { $userPage = new UserPage(); $userPage->onUserCreation(new UserCreationEvent($name, $name, "")); assert(!is_null(User::by_name($name)), "Creation of user $name failed"); } } protected function get_page($page_name, $args=null) { // use a fresh page global $page; if (!$args) { $args = []; } $_GET = $args; $_POST = []; $page = new Page(); send_event(new PageRequestEvent($page_name)); if ($page->mode == PageMode::REDIRECT) { $page->code = 302; } return $page; } protected function post_page($page_name, $args=null) { // use a fresh page global $page; if (!$args) { $args = []; } foreach ($args as $k=>$v) { $args[$k] = (string)$v; } $_GET = []; $_POST = $args; $page = new Page(); send_event(new PageRequestEvent($page_name)); if ($page->mode == PageMode::REDIRECT) { $page->code = 302; } } // page things protected function assert_title(string $title) { global $page; $this->assertStringContainsString($title, $page->title); } protected function assert_title_matches($title) { global $page; $this->assertStringMatchesFormat($title, $page->title); } protected function assert_no_title(string $title) { global $page; $this->assertStringNotContainsString($title, $page->title); } protected function assert_response(int $code) { global $page; $this->assertEquals($code, $page->code); } protected function page_to_text(string $section=null) { global $page; if($page->mode == PageMode::PAGE) { $text = $page->title . "\n"; foreach ($page->blocks as $block) { if (is_null($section) || $section == $block->section) { $text .= $block->header . "\n"; $text .= $block->body . "\n\n"; } } return $text; } elseif($page->mode == PageMode::DATA) { return $page->data; } else { $this->assertTrue(false, "Page mode is not PAGE or DATA"); } } protected function assert_text(string $text, string $section=null) { $this->assertStringContainsString($text, $this->page_to_text($section)); } protected function assert_no_text(string $text, string $section=null) { $this->assertStringNotContainsString($text, $this->page_to_text($section)); } protected function assert_content(string $content) { global $page; $this->assertStringContainsString($content, $page->data); } protected function assert_no_content(string $content) { global $page; $this->assertStringNotContainsString($content, $page->data); } // user things protected function log_in_as_admin() { send_event(new UserLoginEvent(User::by_name($this->admin_name))); } protected function log_in_as_user() { send_event(new UserLoginEvent(User::by_name($this->user_name))); } protected function log_out() { global $config; $user = User::by_id($config->get_int("anon_id", 0)); $this->assertNotNull($user); send_event(new UserLoginEvent($user)); } // post things protected function post_image(string $filename, string $tags): int { $dae = new DataUploadEvent($filename, [ "filename" => $filename, "extension" => pathinfo($filename, PATHINFO_EXTENSION), "tags" => Tag::explode($tags), "source" => null, ]); send_event($dae); return $dae->image_id; } protected function delete_image(int $image_id) { $img = Image::by_id($image_id); if ($img) { $ide = new ImageDeletionEvent($img, true); send_event($ide); } } }