mockEvent( 'edit-user-talk', array( 'section-title' => $sectionTitle, ) ); $event->expects( $this->any() ) ->method( 'getTitle' ) ->will( $this->returnValue( Title::newMainPage() ) ); $formatted = $this->format( $event, 'email' ); $this->assertRegExp( $pattern, $formatted['body'] ); } public static function provider_editUserTalk() { return array( array( '/[[User talk:[^#]+#moar_cowbell|talk page]]/', 'moar_cowbell', 'text' ), array( '/#moar_cowbell/', 'moar_cowbell', 'html' ), array( '/#moar_cowbell/', 'moar_cowbell', 'flyout' ), ); } /** * @dataProvider provider_editUserTalk */ public function testEditUserTalkFlyoutSectionLinkFragment( $pattern, $sectionTitle, $format ) { // Required hack so parser doesnt turn the links into redlinks which contain no fragment LinkCache::singleton()->addGoodLinkObj( 42, Title::newFromText( '127.0.0.1', NS_USER_TALK ) ); $event = $this->mockEvent( 'edit-user-talk', array( 'section-title' => $sectionTitle, ) ); $this->assertRegExp( $pattern, $this->format( $event, $format ) ); } public function provider_formatterDoesntFail() { // Remove events from this array once they have specific tests for their formatting $untested = array( 'welcome' => array(), 'reverted' => array( 'revid' => 42, 'reverted-user-id' => 77, 'reverted-revision-id' => 13, 'method' => 'undo', ), 'page-linked' => array( 'link-from-page-id' => 42, ), 'mention' => array( 'content' => 'lorem ipsum dolar sit amet', 'section-title' => 'Zombies', 'revid' => 42, 'mentionedusers' => array( 101 => 101 ), ), 'user-rights' => array( 'user' => 187, 'add' => array( 'aaa', 'bbb' ), 'remove' => array( 'other' ), ), ); $formats = array( 'html', 'flyout', 'email', 'text' ); $tests = array(); foreach ( $untested as $type => $extra ) { foreach ( $formats as $format ) { // Run tests with blank extra data and with the provided extra data $tests[] = array( $format, $type, $extra ); $tests[] = array( $format, $type, array() ); } } return $tests; } public static function provider_revisionSummary() { $comment = '(dummy comment)'; $suppressed = wfMessage( 'rev-deleted-comment' )->text(); // Test the 4 different events that reference the summary, although they should follow mostly // the same code they may use different classes extended from the EchoNotificationFormatter $tests = array(); $events = array( 'edit-user-talk', 'reverted', 'page-linked', 'mention' ); foreach ( $events as $eventType ) { $tests[] = array( $eventType, $comment, $comment, 0); $tests[] = array( $eventType, $suppressed, $comment, Revision::DELETED_COMMENT ); } return $tests; } /** * @dataProvider provider_revisionSummary */ public function testRevisionSummarySuppression( $eventType, $expect, $comment, $deleted ) { // Revision needs a comment to attempt to format $event = $this->mockEvent( $eventType, array(), new Revision( compact( 'comment', 'deleted' ) ) ); $this->assertContains( $expect, $this->format( $event, 'html' ) ); } public static function provider_revisionAgent() { $userText = '10.2.3.4'; $suppressed = wfMessage( 'rev-deleted-user' )->text(); $tests = array(); $events = array( 'edit-user-talk', 'reverted', 'mention' ); foreach ( $events as $eventType ) { $tests[] = array( $eventType, $userText, $userText, 0 ); $tests[] = array( $eventType, $suppressed, $userText, Revision::DELETED_USER ); } return $tests; } /** * @dataProvider provider_revisionAgent */ public function testAgentSuppression( $eventType, $expect, $user_text, $deleted ) { $event = $this->mockEvent( $eventType, array(), new Revision( compact( 'user_text', 'deleted' ) ) ); $user = new User; $user->setName( $user_text ); $event->expects( $this->any() ) ->method( 'getAgent' ) ->will( $this->returnValue( $user ) ); $this->assertContains( $expect, $this->format( $event, 'html' ) ); } public static function provider_sectionTitle() { $message = "some_section_title"; // underscores simplifies the test, since it will transform ' ' to '_' $suppressed = wfMessage( 'echo-rev-deleted-text-view')->text(); $tests = array(); $events = array( 'mention' ); // currently only mention uses sectionTitle, but likely edit-user-talk will soon as well foreach ( $events as $eventType ) { $tests[] = array( $eventType, $message, $message, 0); $tests[] = array( $eventType, $suppressed, $message, Revision::DELETED_TEXT ); } return $tests; } /** * @dataProvider provider_formatterDoesntFail */ public function testFormatterDoesntFail( $format, $type, array $extra ) { $result = $this->format( $this->mockEvent( $type, $extra ), $format ); // generic assertion, could do better if ( $format === 'email' ) { $this->assertInternalType( 'array', $result ); $this->assertCount( 3, $result ); } else { $this->assertInternalType( 'string', $result ); $this->assertGreaterThan( 0, strlen( $result ) ); } } /** * @dataProvider provider_sectionTitle */ public function testMentionSubjectSectionTitleSuppression( $eventType, $expect, $sectionTitle, $deleted ) { $event = $this->mockEvent( $eventType, array( 'section-title' => $sectionTitle ), new Revision( compact( 'deleted' ) ) ); $this->assertContains( $expect, $this->format( $event, 'html' ) ); } protected function format( EchoEvent $event, $format, $type = 'web', array $params = array() ) { global $wgEchoNotifications; $params += $wgEchoNotifications[ $event->getType() ]; $formatter = EchoNotificationFormatter::factory( $params ); $formatter->setOutputFormat( $format ); return $formatter->format( $event, new User, $type ); } protected function mockEvent( $type, array $extra = array(), Revision $rev = null ) { $methods = get_class_methods( 'EchoEvent' ); unset( $methods[array_search( 'userCan', $methods)] ); $event = $this->getMockBuilder( 'EchoEvent' ) ->disableOriginalConstructor() ->setMethods( $methods ) ->getMock(); $event->expects( $this->any() ) ->method( 'getType' ) ->will( $this->returnValue( $type ) ); $event->expects( $this->any() ) ->method( 'getExtra' ) ->will( $this->returnValue( $extra ) ); if ( $rev !== null ) { $event->expects( $this->any() ) ->method( 'getRevision' ) ->will( $this->returnValue( $rev ) ); } return $event; } }