diff options
Diffstat (limited to 'MLEB/Translate/tests/phpunit/unit/Statistics/TranslatorActivityTest.php')
-rw-r--r-- | MLEB/Translate/tests/phpunit/unit/Statistics/TranslatorActivityTest.php | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/MLEB/Translate/tests/phpunit/unit/Statistics/TranslatorActivityTest.php b/MLEB/Translate/tests/phpunit/unit/Statistics/TranslatorActivityTest.php new file mode 100644 index 00000000..3c00fe15 --- /dev/null +++ b/MLEB/Translate/tests/phpunit/unit/Statistics/TranslatorActivityTest.php @@ -0,0 +1,147 @@ +<?php +/** + * @file + * @author Niklas Laxström + * @license GPL-2.0-or-later + */ + +namespace MediaWiki\Extensions\Translate\Statistics; + +use EmptyBagOStuff; +use HashBagOStuff; +use InvalidArgumentException; +use JobQueueGroup; +use MediaWikiUnitTestCase; +use Wikimedia\Timestamp\ConvertibleTimestamp; + +/** + * @covers \MediaWiki\Extensions\Translate\Statistics\TranslatorActivity + */ +class TranslatorActivityTest extends MediaWikiUnitTestCase { + public function testInvalidLanguage() { + $cache = $this->createMock( EmptyBagOStuff::class ); + $query = $this->createMock( TranslatorActivityQuery::class ); + $jobQueue = $this->createMock( JobQueueGroup::class ); + $languageValidator = function ( string $language ): bool { + return false; + }; + $service = new TranslatorActivity( $cache, $query, $jobQueue, $languageValidator ); + + $this->expectException( InvalidArgumentException::class ); + $service->inLanguage( 'not-a-valid-language-code' ); + } + + public function testInLanguage() { + $language = 'en'; + $translators = $this->getExampleData(); + $cacheKey = 'cache:en'; + $fakeTime1 = 1; + $expected = [ + 'users' => $translators, + 'asOfTime' => $fakeTime1, + ]; + + $cache = $this->createMock( HashBagOStuff::class ); + $cache->method( 'makeKey' )->willReturn( $cacheKey ); + $cache->expects( $this->once() )->method( 'set' )->with( $cacheKey, $expected ); + $query = $this->createMock( TranslatorActivityQuery::class ); + $query + ->method( 'inLanguage' ) + ->willReturn( $translators ) + ->with( $this->equalTo( $language ) ); + $jobQueue = $this->createMock( JobQueueGroup::class ); + $jobQueue->expects( $this->never() )->method( 'push' ); + $languageValidator = function ( string $language ): bool { + return true; + }; + $service = new TranslatorActivity( $cache, $query, $jobQueue, $languageValidator ); + + ConvertibleTimestamp::setFakeTime( $fakeTime1 ); + $actual = $service->inLanguage( $language ); + + $this->assertEquals( $expected, $actual, 'Correct value is returned' ); + } + + public function testInLanguageStale() { + $language = 'en'; + $translators = $this->getExampleData(); + $fakeTime1 = 1; + $fakeTime2 = $fakeTime1 + TranslatorActivity::CACHE_STALE; + $expected = [ + 'users' => $translators, + 'asOfTime' => $fakeTime1, + ]; + + $cache = new HashBagOStuff(); + $query = $this->createMock( TranslatorActivityQuery::class ); + $query + ->method( 'inLanguage' ) + ->willReturn( $translators ) + ->with( $this->equalTo( $language ) ); + $jobQueue = $this->createMock( JobQueueGroup::class ); + $jobQueue->expects( $this->once() )->method( 'push' ); + $languageValidator = function ( string $language ): bool { + return true; + }; + $service = new TranslatorActivity( $cache, $query, $jobQueue, $languageValidator ); + + ConvertibleTimestamp::setFakeTime( $fakeTime1 ); + $cache->setMockTime( $fakeTime1 ); + $service->inLanguage( $language ); + + ConvertibleTimestamp::setFakeTime( $fakeTime2 ); + $cache->setMockTime( $fakeTime2 ); + $actual = $service->inLanguage( $language ); + + $this->assertEquals( $expected, $actual, 'Correct value is returned' ); + } + + public function testInLanguageExpired() { + $language = 'en'; + $translators = $this->getExampleData(); + $fakeTime1 = 1; + $fakeTime2 = $fakeTime1 + TranslatorActivity::CACHE_TIME; + $expected = [ + 'users' => $translators, + 'asOfTime' => $fakeTime2, + ]; + + $cache = new HashBagOStuff(); + $query = $this->createMock( TranslatorActivityQuery::class ); + $query + ->method( 'inLanguage' ) + ->willReturn( $translators ) + ->with( $this->equalTo( $language ) ); + $jobQueue = $this->createMock( JobQueueGroup::class ); + $jobQueue->expects( $this->never() )->method( 'push' ); + $languageValidator = function ( string $language ): bool { + return true; + }; + $service = new TranslatorActivity( $cache, $query, $jobQueue, $languageValidator ); + + ConvertibleTimestamp::setFakeTime( $fakeTime1 ); + $cache->setMockTime( $fakeTime1 ); + $service->inLanguage( $language ); + + ConvertibleTimestamp::setFakeTime( $fakeTime2 ); + $cache->setMockTime( $fakeTime2 ); + $actual = $service->inLanguage( $language ); + + $this->assertEquals( $expected, $actual, 'Correct value is returned' ); + } + + private function getExampleData(): array { + $translators = [ + 'Hunter' => [ + TranslatorActivityQuery::USER_TRANSLATIONS => 1234, + TranslatorActivityQuery::USER_LAST_ACTIVITY => 10, + ], + 'Farmer' => [ + TranslatorActivityQuery::USER_TRANSLATIONS => 2, + TranslatorActivityQuery::USER_LAST_ACTIVITY => 20, + ], + ]; + + return $translators; + } +} |