mirror of
https://github.com/OPSnet/Gazelle.git
synced 2026-08-05 13:20:23 -04:00
283 lines
12 KiB
PHP
283 lines
12 KiB
PHP
<?php
|
|
|
|
namespace Gazelle;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use PHPUnit\Framework\Attributes\DataProvider;
|
|
|
|
class WikiTest extends TestCase {
|
|
protected array $userList;
|
|
protected array $articleList;
|
|
|
|
public function setUp(): void {
|
|
$this->userList = [
|
|
'admin' => \GazelleUnitTest\Helper::makeUser('wiki.' . randomString(6), 'wiki'),
|
|
'user' => \GazelleUnitTest\Helper::makeUser('wiki.' . randomString(6), 'wiki'),
|
|
];
|
|
$this->userList['admin']->setField('PermissionID', SYSOP)->modify();
|
|
}
|
|
|
|
public function tearDown(): void {
|
|
if (isset($this->articleList)) {
|
|
foreach ($this->articleList as $article) {
|
|
$article->remove();
|
|
}
|
|
}
|
|
foreach ($this->userList as $user) {
|
|
$user->remove();
|
|
}
|
|
}
|
|
|
|
public static function providerAlias(): array {
|
|
return [
|
|
['alias', 'alias ', 'wiki-clean-alias-trim'],
|
|
['alias', 'a.l=i+a-s', 'wiki-clean-alias-regexp'],
|
|
['alias', 'ALIAS', 'wiki-clean-alias-case'],
|
|
['alias', ' A,LIaS. ', 'wiki-clean-alias-all'],
|
|
];
|
|
}
|
|
|
|
#[DataProvider('providerAlias')]
|
|
public function testNormalizeAlias(string $expected, string $input, string $message): void {
|
|
$this->assertEquals($expected, Wiki::normalizeAlias($input), $message);
|
|
}
|
|
|
|
public function testWikiCreate(): void {
|
|
$manager = new Manager\Wiki();
|
|
$title = 'phpunit title ' . randomString(6);
|
|
$alias = Wiki::normalizeAlias($title);
|
|
$article = $manager->create(
|
|
$title,
|
|
'wiki body',
|
|
$this->userList['user']->privilege()->effectiveClassLevel(),
|
|
$this->userList['user']->privilege()->effectiveClassLevel(),
|
|
$this->userList['admin']
|
|
);
|
|
$this->assertInstanceOf(Wiki::class, $article, 'wiki-create-open');
|
|
|
|
$this->assertEquals($article->id(), $manager->findById($article->id())->id(), 'wiki-find-by-id');
|
|
$this->assertEquals($article->id(), $manager->findByTitle($article->title())->id(), 'wiki-find-by-title');
|
|
|
|
$this->assertInstanceOf(Wiki::class, $article->flush(), 'wiki-flush');
|
|
$this->assertEquals("<a href=\"{$article->url()}\">{$article->title()}</a>", $article->link(), 'wiki-link');
|
|
$this->assertEquals("wiki.php?action=article&id={$article->id()}", $article->location(), 'wiki-location');
|
|
$this->assertEquals($alias, array_keys($article->alias())[0], 'wiki-alias');
|
|
$this->assertEquals('wiki body', $article->body(), 'wiki-body');
|
|
$this->assertStringStartsWith(date('Y-m-d H'), $article->date(), 'wiki-date');
|
|
$this->assertEquals($title, $article->title(), 'wiki-title');
|
|
$this->assertEquals($title, $article->shortName($title), 'wiki-short-name');
|
|
$this->assertEquals($this->userList['admin']->id(), $article->authorId(), 'wiki-author-id');
|
|
$this->assertEquals($this->userList['user']->privilege()->effectiveClassLevel(), $article->minClassRead(), 'wiki-min-read');
|
|
$this->assertEquals($this->userList['user']->privilege()->effectiveClassLevel(), $article->minClassEdit(), 'wiki-min-edit');
|
|
|
|
$this->assertTrue($article->editable($this->userList['user']), 'wiki-edit-user');
|
|
$this->assertTrue($article->editable($this->userList['admin']), 'wiki-edit-sysop');
|
|
$this->assertStringStartsWith('<ol', $article->ToC(), 'wiki-toc');
|
|
|
|
$this->assertEquals(1, $article->remove(), 'wiki-remove-open');
|
|
}
|
|
|
|
public function testWikiAlias(): void {
|
|
$manager = new Manager\Wiki();
|
|
$title = 'phpunit title ' . randomString(6);
|
|
$alias = Wiki::normalizeAlias($title);
|
|
$article = $manager->create(
|
|
$title,
|
|
'wiki body',
|
|
$this->userList['user']->privilege()->effectiveClassLevel(),
|
|
$this->userList['user']->privilege()->effectiveClassLevel(),
|
|
$this->userList['admin']
|
|
);
|
|
$this->articleList[] = $article;
|
|
|
|
$newAlias = Wiki::normalizeAlias('alias' . randomString(20));
|
|
$this->assertEquals(0, $article->removeAlias($newAlias), 'wiki-remove-missing-alias');
|
|
$this->assertEquals(1, $article->addAlias($newAlias, $this->userList['admin']), 'wiki-add-alias');
|
|
$this->assertCount(2, $article->alias(), 'wiki-alias-list');
|
|
$this->assertEquals($article->id(), $manager->findByAlias($newAlias)->id(), 'wiki-find-by-alias');
|
|
$this->assertEquals(1, $article->removeAlias($newAlias), 'wiki-remove-alias');
|
|
}
|
|
|
|
public function testWikiException(): void {
|
|
$manager = new Manager\Wiki();
|
|
$title = 'phpunit title ' . randomString(6);
|
|
$alias = Wiki::normalizeAlias($title);
|
|
$article = $manager->create(
|
|
$title,
|
|
'wiki body',
|
|
$this->userList['user']->privilege()->effectiveClassLevel(),
|
|
$this->userList['user']->privilege()->effectiveClassLevel(),
|
|
$this->userList['admin']
|
|
);
|
|
$this->articleList[] = $article;
|
|
|
|
$newAlias = Wiki::normalizeAlias('alias' . randomString(20));
|
|
$this->assertEquals(1, $article->addAlias($newAlias, $this->userList['admin']), 'wiki-add-ok-alias');
|
|
|
|
$this->expectException(DB\MysqlDuplicateKeyException::class);
|
|
$article->addAlias($newAlias, $this->userList['admin']);
|
|
}
|
|
|
|
public function testWikiList(): void {
|
|
$classList = (new Manager\User())->classList();
|
|
$level = [
|
|
USER => $classList[USER]['Level'],
|
|
SYSOP => $classList[SYSOP]['Level'],
|
|
];
|
|
$manager = new Manager\Wiki();
|
|
$initial = [
|
|
USER => count($manager->articles($level[USER])),
|
|
SYSOP => count($manager->articles($level[SYSOP])),
|
|
];
|
|
$this->articleList[] = $manager->create('z phpunit ' . randomString(6), 'wiki body', $level[USER], $level[USER], $this->userList['admin']);
|
|
$this->articleList[] = $manager->create('x phpunit ' . randomString(6), 'wiki body', $level[USER], $level[USER], $this->userList['admin']);
|
|
$this->articleList[] = $manager->create('x phpunit sysop ' . randomString(6), 'wiki body', $level[SYSOP], $level[SYSOP], $this->userList['admin']);
|
|
|
|
$this->assertFalse($this->articleList[2]->editable($this->userList['user']), 'wiki-no-edit-user');
|
|
$this->assertCount(2 + $initial[USER], $manager->articles($level[USER]), 'wiki-list-user-all');
|
|
$this->assertCount(2 + $initial[USER], $manager->articles($level[USER], '1'), 'wiki-list-user-1');
|
|
$this->assertCount(3 + $initial[SYSOP], $manager->articles($level[SYSOP]), 'wiki-list-sysop-all');
|
|
// This will fail locally if any existing articles begin with 'x'
|
|
$this->assertCount(1, $manager->articles($level[USER], 'x'), 'wiki-list-user-x');
|
|
$this->assertCount(2, $manager->articles($level[SYSOP], 'x'), 'wiki-list-sysop-x');
|
|
}
|
|
|
|
public function testEditReadable(): void {
|
|
$admin = $this->userList['admin'];
|
|
$user = $this->userList['user'];
|
|
$manager = new Manager\Wiki();
|
|
$article = $manager->create(
|
|
title: 'wiki edit readable ' . randomString(10),
|
|
body: 'wiki body phpunit',
|
|
minRead: $user->privilege()->effectiveClassLevel(),
|
|
minEdit: $admin->privilege()->effectiveClassLevel(),
|
|
user: $admin,
|
|
);
|
|
$this->assertFalse($article->editable($user), 'readable article cannot be edited');
|
|
$user->toggleAttr('wiki-edit-readable', true);
|
|
$this->assertTrue($article->editable($user), 'readable article can be edited');
|
|
$user->toggleAttr('wiki-edit-readable', false);
|
|
$this->assertFalse($article->editable($user), 'readable article can no longer be edited');
|
|
}
|
|
|
|
public function testWikiRevision(): void {
|
|
$manager = new Manager\Wiki();
|
|
$title = 'phpunit title ' . randomString(6);
|
|
$alias = Wiki::normalizeAlias($title);
|
|
$article = $manager->create(
|
|
$title,
|
|
'wiki body',
|
|
$this->userList['user']->privilege()->effectiveClassLevel(),
|
|
$this->userList['user']->privilege()->effectiveClassLevel(),
|
|
$this->userList['admin']
|
|
);
|
|
$this->articleList[] = $article;
|
|
|
|
$this->assertCount(0, $article->revisionList(), 'wiki-no-revision');
|
|
$this->assertTrue($article->setField('Body', 'wiki body edit')->modify(), 'wiki-edit-body');
|
|
$this->assertCount(1, $article->revisionList(), 'wiki-revision');
|
|
|
|
$clone = $manager->findById($article->id());
|
|
$this->assertEquals(2, $clone->revision(), 'wiki-n-revision');
|
|
$this->assertEquals('wiki body', $clone->revisionBody(1), 'wiki-body-revision');
|
|
}
|
|
|
|
public function testConfigureAccess(): void {
|
|
$manager = new Manager\Wiki();
|
|
$admin = $this->userList['admin'];
|
|
$user = $this->userList['user'];
|
|
$access = $manager->configureAccess(
|
|
user: $user,
|
|
minRead: $user->privilege()->effectiveClassLevel(),
|
|
minEdit: $admin->privilege()->effectiveClassLevel(),
|
|
);
|
|
$this->assertEquals(
|
|
[
|
|
$user->privilege()->effectiveClassLevel(),
|
|
$user->privilege()->effectiveClassLevel(),
|
|
null,
|
|
],
|
|
$access,
|
|
'wiki-access-user'
|
|
);
|
|
|
|
$user->addCustomPrivilege('admin_manage_wiki');
|
|
$user->modify();
|
|
|
|
$access = $manager->configureAccess(
|
|
user: $user,
|
|
minRead: 0,
|
|
minEdit: $user->privilege()->effectiveClassLevel(),
|
|
);
|
|
$this->assertEquals(
|
|
[
|
|
null,
|
|
null,
|
|
'read permission not set',
|
|
],
|
|
$access,
|
|
'wiki-access-no-read'
|
|
);
|
|
|
|
$access = $manager->configureAccess(
|
|
user: $user,
|
|
minRead: $user->privilege()->effectiveClassLevel(),
|
|
minEdit: 0,
|
|
);
|
|
$this->assertEquals(
|
|
[
|
|
null,
|
|
null,
|
|
'edit permission not set',
|
|
],
|
|
$access,
|
|
'wiki-access-no-read'
|
|
);
|
|
|
|
$access = $manager->configureAccess(
|
|
user: $user,
|
|
minRead: $admin->privilege()->effectiveClassLevel(),
|
|
minEdit: $user->privilege()->effectiveClassLevel(),
|
|
);
|
|
$this->assertEquals(
|
|
[
|
|
null,
|
|
null,
|
|
'You cannot restrict views above your own level',
|
|
],
|
|
$access,
|
|
'wiki-access-read-above'
|
|
);
|
|
|
|
$access = $manager->configureAccess(
|
|
user: $user,
|
|
minRead: $user->privilege()->effectiveClassLevel(),
|
|
minEdit: $admin->privilege()->effectiveClassLevel(),
|
|
);
|
|
$this->assertEquals(
|
|
[
|
|
null,
|
|
null,
|
|
'You cannot restrict edits above your own level',
|
|
],
|
|
$access,
|
|
'wiki-access-edit-above'
|
|
);
|
|
|
|
$access = $manager->configureAccess(
|
|
user: $admin,
|
|
minRead: $user->privilege()->effectiveClassLevel(),
|
|
minEdit: $admin->privilege()->effectiveClassLevel(),
|
|
);
|
|
$this->assertEquals(
|
|
[
|
|
$user->privilege()->effectiveClassLevel(),
|
|
$admin->privilege()->effectiveClassLevel(),
|
|
null,
|
|
],
|
|
$access,
|
|
'wiki-access-edit-above'
|
|
);
|
|
}
|
|
}
|