*/
private array $posts = [];
protected function setUp(): void
{
parent::setUp();
Functions\stubEscapeFunctions();
Functions\stubTranslationFunctions();
Functions\when('post_type_exists')->alias(static fn (string $type): bool => in_array($type, ['page', 'post', 'attachment'], true));
Functions\when('get_post_type_object')->alias(static fn (string $type): object => (object) [
'labels' => (object) ['singular_name' => ['page' => 'Seite', 'post' => 'Beitrag'][$type] ?? $type],
]);
Functions\when('get_post')->alias(fn ($id) => $this->posts[(int) $id] ?? null);
Functions\when('get_edit_post_link')->alias(
static fn ($id, $context = 'display'): string => 'https://kunde.de/wp-admin/post.php?post=' . $id . '&action=edit'
);
Functions\when('admin_url')->alias(static fn (string $path = ''): string => 'https://kunde.de/wp-admin/' . $path);
Functions\when('current_user_can')->justReturn(true);
Functions\when('get_registered_nav_menus')->justReturn(['primary-menu' => 'Hauptmenü']);
}
public function testAPageShowsItsTypeLabelAndLinkedTitle(): void
{
$this->posts[834] = new WP_Post(['ID' => 834, 'post_type' => 'page', 'post_status' => 'publish', 'post_title' => '[Test] Kontakt']);
$object = (new LogObjects())->describe('page', '834');
self::assertSame(
'Seite: [Test] <b>Kontakt</b>',
$object['html']
);
self::assertSame('https://kunde.de/wp-admin/post.php?post=834&action=edit', $object['url']);
}
public function testAnUntitledPostSaysSo(): void
{
$this->posts[5] = new WP_Post(['ID' => 5, 'post_type' => 'post', 'post_status' => 'draft', 'post_title' => '']);
self::assertStringContainsString('>(kein Titel)', (new LogObjects())->describe('post', '5')['html']);
}
public function testNoLinkWhenTheUserMayNotEditThePost(): void
{
Functions\when('get_edit_post_link')->justReturn(null);
$this->posts[834] = new WP_Post(['ID' => 834, 'post_type' => 'page', 'post_status' => 'publish', 'post_title' => 'Kontakt']);
self::assertSame(['html' => 'Seite: Kontakt', 'url' => ''], (new LogObjects())->describe('page', '834'));
}
public function testATrashedPostIsNamedButNotLinked(): void
{
$this->posts[783] = new WP_Post(['ID' => 783, 'post_type' => 'page', 'post_status' => 'trash', 'post_title' => 'LIT Smoke Seite']);
self::assertSame(
['html' => 'Seite: LIT Smoke Seite (im Papierkorb)', 'url' => ''],
(new LogObjects())->describe('page', '783')
);
}
public function testADeletedPostShowsItsIdAsDeleted(): void
{
self::assertSame(['html' => 'Seite: #834 (gelöscht)', 'url' => ''], (new LogObjects())->describe('page', '834'));
}
public function testAnAttachmentIsAMediumLinkedToTheMediaEditScreen(): void
{
$this->posts[830] = new WP_Post(['ID' => 830, 'post_type' => 'attachment', 'post_status' => 'inherit', 'post_title' => 'Massivholzmoebel']);
$object = (new LogObjects())->describe('attachment', '830');
self::assertSame(
'Medium: Massivholzmoebel',
$object['html']
);
self::assertSame('Medium: #799 (gelöscht)', (new LogObjects())->describe('attachment', '799')['html']);
}
public function testANavMenuIsLinkedToTheMenusScreen(): void
{
Functions\when('get_terms')->justReturn([new WP_Term(['term_id' => 21, 'name' => 'Haupt', 'taxonomy' => 'nav_menu'])]);
$objects = new LogObjects();
$objects->prime([['object_type' => 'nav_menu', 'object_id' => '21'], ['object_type' => 'nav_menu', 'object_id' => '22']]);
self::assertSame(
[
'html' => 'Menü: Haupt<menü>',
'url' => 'https://kunde.de/wp-admin/nav-menus.php?action=edit&menu=21',
],
$objects->describe('nav_menu', '21')
);
self::assertSame(['html' => 'Menü: #22 (gelöscht)', 'url' => ''], $objects->describe('nav_menu', '22'));
}
public function testANavMenuIsNotLinkedWithoutTheMenuCapability(): void
{
Functions\when('current_user_can')->justReturn(false);
Functions\when('get_terms')->justReturn([new WP_Term(['term_id' => 21, 'name' => 'Hauptmenü', 'taxonomy' => 'nav_menu'])]);
$objects = new LogObjects();
$objects->prime([['object_type' => 'nav_menu', 'object_id' => '21']]);
self::assertSame(['html' => 'Menü: Hauptmenü', 'url' => ''], $objects->describe('nav_menu', '21'));
}
public function testAMenuLocationShowsItsRegisteredLabel(): void
{
self::assertSame(['html' => 'Menüposition: Hauptmenü', 'url' => ''], (new LogObjects())->describe('menu_location', 'primary-menu'));
self::assertSame(
['html' => 'Menüposition: footer<x>', 'url' => ''],
(new LogObjects())->describe('menu_location', 'footer')
);
}
public function testOptionsShowHumanLabelsAndUnknownKeysAsCode(): void
{
self::assertSame(
['html' => 'Einstellungen: Titel der Website, Untertitel', 'url' => ''],
(new LogObjects())->describe('option', 'blogname,blogdescription')
);
self::assertSame(
['html' => 'Einstellung: foo<b>', 'url' => ''],
(new LogObjects())->describe('option', 'foo')
);
}
public function testAnUnknownObjectTypeIsShownAsCode(): void
{
self::assertSame(['html' => 'shop_thing 42', 'url' => ''], (new LogObjects())->describe('shop_thing', '42'));
self::assertSame(['html' => '–', 'url' => ''], (new LogObjects())->describe('', ''));
}
public function testPrimeLoadsAllPostsAndMenusOfThePageInOneGoEach(): void
{
Functions\expect('_prime_post_caches')->once()->with([834, 830], false, false);
Functions\expect('get_terms')->once()->with(['taxonomy' => 'nav_menu', 'include' => [21], 'hide_empty' => false])->andReturn([]);
(new LogObjects())->prime([
['object_type' => 'page', 'object_id' => '834'],
['object_type' => 'attachment', 'object_id' => '830'],
['object_type' => 'page', 'object_id' => '834'],
['object_type' => 'nav_menu', 'object_id' => '21'],
['object_type' => 'option', 'object_id' => 'blogname'],
['object_type' => 'page', 'object_id' => 'x'],
]);
}
public function testPrimeQueriesNothingWithoutPostsOrMenus(): void
{
Functions\expect('_prime_post_caches')->never();
Functions\expect('get_terms')->never();
(new LogObjects())->prime([['object_type' => 'option', 'object_id' => 'blogname']]);
}
}