$this->resourceloader = $resourceloader;
}
+ /**
+ * Get the message blob for a module
+ *
+ * @since 1.27
+ * @param ResourceLoaderModule $module
+ * @param string $lang Language code
+ * @return string JSON
+ */
+ public function getBlob( ResourceLoaderModule $module, $lang ) {
+ $blobs = $this->getBlobs( array( $module->getName() => $module ), $lang );
+ return $blobs[$module->getName()];
+ }
+
/**
* Get the message blobs for a set of modules
*
+ * @since 1.27
* @param ResourceLoader $resourceLoader
* @param array $modules Array of module objects keyed by module name
* @param string $lang Language code
* @return array An array mapping module names to message blobs
*/
- public function get( ResourceLoader $resourceLoader, $modules, $lang ) {
+ public function getBlobs( $modules, $lang ) {
if ( !count( $modules ) ) {
return array();
}
return $blobs;
}
+ /**
+ * Get the message blobs for a set of modules
+ *
+ * @deprecated since 1.27 Use getBlobs() instead
+ * @return array
+ */
+ public function get( ResourceLoader $resourceLoader, $modules, $lang ) {
+ return $this->getBlobs( $modules, $lang );
+ }
+
/**
* Generate and insert a new message blob. If the blob was already
* present, it is not regenerated; instead, the preexisting blob
* @param string $lang Language code
* @return string
*/
- private function fetchMessage( $key, $lang ) {
+ protected function fetchMessage( $key, $lang ) {
$message = wfMessage( $key )->inLanguage( $lang );
if ( !$message->exists() ) {
wfDebugLog( 'resourceloader', __METHOD__ . " failed to find: '$key' ($lang)" );
--- /dev/null
+<?php
+
+/**
+ * @group Database
+ * @group Cache
+ * @covers MessageBlobStore
+ */
+class MessageBlobStoreTest extends ResourceLoaderTestCase {
+ protected $tablesUsed = array( 'msg_resource' );
+
+ protected function makeBlobStore( $methods = null, $rl = null ) {
+ $blobStore = $this->getMockBuilder( 'MessageBlobStore' )
+ ->setConstructorArgs( array( $rl ) )
+ ->setMethods( $methods )
+ ->getMock();
+
+ return $blobStore;
+ }
+
+ protected function makeModule( array $messages ) {
+ $module = new ResourceLoaderTestModule( array( 'messages' => $messages ) );
+ $module->setName( 'test.blobstore' );
+ return $module;
+ }
+
+ public function testGetBlob() {
+ $module = $this->makeModule( array( 'foo' ) );
+ $rl = new ResourceLoader();
+ $rl->register( $module->getName(), $module );
+
+ $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+ $blobStore->expects( $this->once() )
+ ->method( 'fetchMessage' )
+ ->will( $this->returnValue( 'Example' ) );
+
+ $blob = $blobStore->getBlob( $module, 'en' );
+
+ $this->assertEquals( '{"foo":"Example"}', $blob, 'Generated blob' );
+ }
+
+ public function testGetBlobCached() {
+ $module = $this->makeModule( array( 'example' ) );
+ $rl = new ResourceLoader();
+ $rl->register( $module->getName(), $module );
+
+ $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+ $blobStore->expects( $this->once() )
+ ->method( 'fetchMessage' )
+ ->will( $this->returnValue( 'First' ) );
+
+ $module = $this->makeModule( array( 'example' ) );
+ $blob = $blobStore->getBlob( $module, 'en' );
+ $this->assertEquals( '{"example":"First"}', $blob, 'Generated blob' );
+
+ $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+ $blobStore->expects( $this->never() )
+ ->method( 'fetchMessage' )
+ ->will( $this->returnValue( 'Second' ) );
+
+ $module = $this->makeModule( array( 'example' ) );
+ $blob = $blobStore->getBlob( $module, 'en' );
+ $this->assertEquals( '{"example":"First"}', $blob, 'Cache hit' );
+ }
+
+ public function testUpdateMessage() {
+ $module = $this->makeModule( array( 'example' ) );
+ $rl = new ResourceLoader();
+ $rl->register( $module->getName(), $module );
+ $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+ $blobStore->expects( $this->exactly( 2 ) )
+ ->method( 'fetchMessage' )
+ ->will( $this->onConsecutiveCalls( 'First', 'Second' ) );
+
+ $blob = $blobStore->getBlob( $module, 'en' );
+ $this->assertEquals( '{"example":"First"}', $blob, 'Generated blob' );
+
+ $blobStore->updateMessage( 'example' );
+
+ $module = $this->makeModule( array( 'example' ) );
+ $rl = new ResourceLoader();
+ $rl->register( $module->getName(), $module );
+ $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+ $blobStore->expects( $this->never() )
+ ->method( 'fetchMessage' )
+ ->will( $this->returnValue( 'Wrong' ) );
+
+ $blob = $blobStore->getBlob( $module, 'en' );
+ $this->assertEquals( '{"example":"Second"}', $blob, 'Updated blob' );
+ }
+
+ public function testValidation() {
+ $module = $this->makeModule( array( 'foo' ) );
+ $rl = new ResourceLoader();
+ $rl->register( $module->getName(), $module );
+
+ $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+ $blobStore->expects( $this->once() )
+ ->method( 'fetchMessage' )
+ ->will( $this->returnValueMap( array(
+ array( 'foo', 'en', 'Hello' ),
+ ) ) );
+
+ $blob = $blobStore->getBlob( $module, 'en' );
+ $this->assertEquals( '{"foo":"Hello"}', $blob, 'Generated blob' );
+
+ // Now, imagine a change to the module is deployed. The module now contains
+ // message 'foo' and 'bar'. While updateMessage() was not called (since no
+ // message values were changed) it should detect the change in list of
+ // message keys.
+ $module = $this->makeModule( array( 'foo', 'bar' ) );
+ $rl = new ResourceLoader();
+ $rl->register( $module->getName(), $module );
+
+ $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+ $blobStore->expects( $this->exactly( 2 ) )
+ ->method( 'fetchMessage' )
+ ->will( $this->returnValueMap( array(
+ array( 'foo', 'en', 'Hello' ),
+ array( 'bar', 'en', 'World' ),
+ ) ) );
+
+ $blob = $blobStore->getBlob( $module, 'en' );
+ $this->assertEquals( '{"foo":"Hello","bar":"World"}', $blob, 'Updated blob' );
+ }
+}