mediawiki-extensions-Echo/tests/phpunit/Model/NotificationTest.php
Daimona Eaytoy f7b0638ff0 Mock DB services in NotificationTest::testNewFromRowWithException
The test doesn't need the database, but it's currently trying to use it.
Mock all services used by EchoDbFactory to avoid that (the Factory
cannot be mocked directly because it's created with a static method and
not injected).

Change-Id: I359489ed3f8de6e868a590d5c7c02f81f0a2049d
2023-08-06 22:48:58 +02:00

103 lines
2.9 KiB
PHP

<?php
use MediaWiki\Extension\Notifications\Model\Event;
use MediaWiki\Extension\Notifications\Model\Notification;
use MediaWiki\Extension\Notifications\Model\TargetPage;
use Wikimedia\Rdbms\ILoadBalancer;
use Wikimedia\Rdbms\LBFactory;
/**
* @covers \MediaWiki\Extension\Notifications\Model\Notification
*/
class NotificationTest extends MediaWikiIntegrationTestCase {
public function testNewFromRow() {
$row = $this->mockNotificationRow() + $this->mockEventRow();
$notif = Notification::newFromRow( (object)$row );
$this->assertInstanceOf( Notification::class, $notif );
// getReadTimestamp() should return null
$this->assertNull( $notif->getReadTimestamp() );
$this->assertEquals(
$notif->getTimestamp(),
wfTimestamp( TS_MW, $row['notification_timestamp'] )
);
$this->assertInstanceOf( Event::class, $notif->getEvent() );
$this->assertNull( $notif->getTargetPages() );
// Provide a read timestamp
$row['notification_read_timestamp'] = time() + 1000;
$notif = Notification::newFromRow( (object)$row );
// getReadTimestamp() should return the timestamp in MW format
$this->assertEquals(
$notif->getReadTimestamp(),
wfTimestamp( TS_MW, $row['notification_read_timestamp'] )
);
$notif = Notification::newFromRow( (object)$row, [
TargetPage::newFromRow( (object)$this->mockTargetPageRow() )
] );
$this->assertNotEmpty( $notif->getTargetPages() );
foreach ( $notif->getTargetPages() as $targetPage ) {
$this->assertInstanceOf( TargetPage::class, $targetPage );
}
}
public function testNewFromRowWithException() {
$lb = $this->createMock( ILoadBalancer::class );
$lb->method( 'getConnection' )->willReturn( $this->createMock( IDatabase::class ) );
$lbFactory = $this->createMock( LBFactory::class );
$lbFactory->method( 'getExternalLB' )->willReturn( $lb );
$this->setService( 'DBLoadBalancer', $lb );
$this->setService( 'DBLoadBalancerFactory', $lbFactory );
$row = $this->mockNotificationRow();
// Provide an invalid event id
$row['notification_event'] = -1;
$this->expectException( InvalidArgumentException::class );
Notification::newFromRow( (object)$row );
}
/**
* Mock a notification row from database
* @return array
*/
protected function mockNotificationRow() {
return [
'notification_user' => 1,
'notification_event' => 1,
'notification_timestamp' => time(),
'notification_read_timestamp' => null,
'notification_bundle_hash' => 'testhash',
];
}
/**
* Mock an event row from database
* @return array
*/
protected function mockEventRow() {
return [
'event_id' => 1,
'event_type' => 'test_event',
'event_variant' => '',
'event_extra' => '',
'event_page_id' => '',
'event_agent_id' => '',
'event_agent_ip' => '',
'event_deleted' => 0,
];
}
/**
* Mock a target page row
* @return array
*/
protected function mockTargetPageRow() {
return [
'etp_page' => 2,
'etp_event' => 1
];
}
}