userList = [ Helper::makeUser('news.' . randomString(10), 'news'), Helper::makeUser('news.' . randomString(10), 'news'), ]; $this->forum = new Manager\Forum()->findById(ANNOUNCEMENT_FORUM_ID); } public function tearDown(): void { if (isset($this->news)) { new Manager\News()->remove($this->news); } foreach ($this->userList as $user) { // note: removing a user removes their forum threads $user->remove(); } } public function testNewsCreate(): void { $manager = new Manager\News(); $threadMan = new Manager\ForumThread(); $body = 'phpunit news body'; $title = 'phpunit news ' . randomString(10); $initial = $manager->headlines(); $this->news = $manager->create( $title, $body, 'phpunit discuss me', $this->userList[0], $this->forum, ); $thread = $threadMan->findById($this->forum->lastThreadId()); $this->assertInstanceOf(ForumThread::class, $thread, 'news-announcement-thread'); $this->assertEquals($this->userList[0]->id, $thread->authorId(), 'news-thread-author-id'); $this->assertEquals($body, $thread->body(), 'news-thread-body'); $this->assertEquals($title, $thread->title(), 'news-thread-title'); $this->assertEquals(1 + count($initial), count($manager->headlines()), 'news-headlines'); $this->assertEquals($this->news, $manager->latestId(), 'news-id-latest'); $this->assertLessThan(2, time() - $manager->latestEpoch(), 'news-created-epoch'); $this->assertEquals(1, $manager->remove($this->news), 'news-remove'); unset($this->news); } public function testNewsModify(): void { $manager = new Manager\News(); $this->news = $manager->create( 'phpunit news modify', 'phpunit news modify body', 'phpunit news modify discuss', $this->userList[0], $this->forum, ); $this->assertEquals( 1, $manager->modify( $this->news, 'phpunit new title', 'phpunit new body', ), 'news-modify', ); $this->assertEquals('phpunit new title', $manager->latest()['title'], 'news-thread-title'); } public function testJsonNews(): void { $manager = new Manager\News(); $title = 'phpunit news json ' . randomString(6); $this->news = $manager->create( $title, 'phpunit news json body', 'phpunit news json', $this->userList[0], $this->forum, ); $payload = new Json\News(1, 0)->payload(); $this->assertCount(1, $payload['items'], 'json-news-total'); $this->assertEquals( $title, $payload['items'][0][1], 'json-news-title', ); } public function testNewsWitness(): void { $manager = new Manager\News(); $this->news = $manager->create( 'phpunit news witness', 'phpunit news witness body', 'phpunit news discuss', $this->userList[0], $this->forum, ); $witness = new WitnessTable\UserReadNews(); $this->assertNull($witness->lastRead($this->userList[1]), 'news-user-not-read'); $this->assertTrue($witness->witness($this->userList[1])); $this->assertEquals($this->news, $witness->lastRead($this->userList[1]), 'news-user-read'); } public function testNewsNotification(): void { $manager = new Manager\News(); $title = 'phpunit news notif'; $this->news = $manager->create( $title, 'phpunit news notif body', 'phpunit notif discuss', $this->userList[0], $this->forum, ); $notifier = new User\Notification($this->userList[1]); // if this fails, the CI database has drifted (or another UT has clobbered the expected value here) $this->assertTrue($notifier->isActive('News'), 'activity-notified-news'); $alertList = $notifier->setDocument('index.php', '')->alertList(); $this->assertArrayHasKey('News', $alertList, 'alert-has-news'); $alertNews = $alertList['News']; $this->assertInstanceOf(User\Notification\News::class, $alertNews, 'alert-news-instance'); $this->assertEquals('News', $alertNews->type(), 'alert-news-type'); $this->assertEquals("Announcement: $title", $alertNews->title(), 'alert-news-title'); $this->assertEquals($this->news, $alertNews->context(), 'alert-news-context-is-news'); } }