Gergő Tisza has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/126912

Change subject: [WIP] Use sinon.js mocks to test the thumbnail fetching
......................................................................

[WIP] Use sinon.js mocks to test the thumbnail fetching

Change-Id: Ida6143e29e54d90f26e7888aced1d207b3bfa702
---
M tests/qunit/mmv/mmv.test.js
1 file changed, 37 insertions(+), 97 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MultimediaViewer 
refs/changes/12/126912/1

diff --git a/tests/qunit/mmv/mmv.test.js b/tests/qunit/mmv/mmv.test.js
index bbcbfde..650af47 100644
--- a/tests/qunit/mmv/mmv.test.js
+++ b/tests/qunit/mmv/mmv.test.js
@@ -379,6 +379,7 @@
 
        QUnit.test( 'fetchThumbnail()', 14, function ( assert ) {
                var viewer = new mw.mmv.MultimediaViewer(),
+                       mock = this.sandbox.mock( viewer ),
                        oldUseThumbnailGuessing = mw.config.get( 
'wgMultimediaViewer' ).useThumbnailGuessing,
                        file = new mw.Title( 'File:Copyleft.svg' ),
                        sampleURL = 
'http://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Copyleft.svg/300px-Copyleft.svg.png',
@@ -386,117 +387,56 @@
                        originalWidth = 1000,
                        originalHeight = 1000,
                        apiURL = 'foo',
-                       guessedURL = 'bar';
+                       guessedURL = 'bar',
+                       image = {};
 
                mw.config.get( 'wgMultimediaViewer' ).useThumbnailGuessing = 
true;
 
-               viewer.guessedThumbnailInfoProvider = {
-                       get: function() {
-                               assert.ok( false, 'Guessed thumbnail provider 
should not be called, because we lack sample URL and original dimensions' );
-                       }
-               };
-
-               viewer.thumbnailInfoProvider = {
-                       get: function() {
-                               assert.ok( true, 'Classic thumbnail info 
provider should be called, because we lack sample URL and original dimensions' 
);
-                               return $.Deferred().reject();
-                       }
-               };
-
+               // the asserts are only there for progress logging as the 
message thrown sinon cannot be customized
+               assert.ok( true, 'When we lack sample URL and original 
dimensions, the classic provider should be used' );
+               mock.expects( 'guessedThumbnailInfoProvider' ).never();
+               mock.expects( 'thumbnailInfoProvider' ).once().returns( 
$.Deferred().resolve( apiURL ) );
+               mock.expects( 'imageProvider' ).once().withExactArgs( apiURL 
).returns( $.Deferred().resolve( image ) );
                viewer.fetchThumbnail( file, width );
+               mock.verify();
 
-               viewer.guessedThumbnailInfoProvider = {
-                       get: function() {
-                               assert.ok( true, 'Guessed thumbnail provider 
should be called' );
-                               return $.Deferred().reject();
-                       }
-               };
-
-               viewer.thumbnailInfoProvider = {
-                       get: function() {
-                               assert.ok( true, 'API thumbnail info provider 
should be called as a fallback, since we could not guess the URL' );
-                               return $.Deferred().reject();
-                       }
-               };
-
+               assert.ok( true, 'When the guesser bails out, the classic 
provider should be used' );
+               mock.expects( 'guessedThumbnailInfoProvider' ).once().returns( 
$.Deferred().reject() );
+               mock.expects( 'thumbnailInfoProvider' ).once().returns( 
$.Deferred().resolve( apiURL ) );
+               mock.expects( 'imageProvider' ).once().withExactArgs( apiURL 
).returns( $.Deferred().resolve( image ) );
                viewer.fetchThumbnail( file, width, sampleURL, originalWidth, 
originalHeight );
+               mock.verify();
 
-               viewer.thumbnailInfoProvider = {
-                       get: function() {
-                               assert.ok( true, 'API thumbnail info provider 
should be called as a fallback, since we could not guess the URL' );
-                               return $.Deferred().resolve( { url : apiURL } );
-                       }
-               };
-
-               viewer.imageProvider = {
-                       get: function( url ) {
-                               assert.strictEqual( url, apiURL, 'Image 
provider is called based on data provided by the API provider' );
-                               return $.Deferred().resolve();
-                       }
-               };
-
+               assert.ok( true, 'When the guesser returns an URL, that should 
be used' );
+               mock.expects( 'guessedThumbnailInfoProvider' ).once().returns( 
$.Deferred().resolve( { url : guessedURL } ) );
+               mock.expects( 'thumbnailInfoProvider' ).never();
+               mock.expects( 'imageProvider' ).once().withExactArgs( 
guessedURL ).returns( $.Deferred().resolve( image ) );
                viewer.fetchThumbnail( file, width, sampleURL, originalWidth, 
originalHeight );
+               mock.verify();
 
-               viewer.guessedThumbnailInfoProvider = {
-                       get: function() {
-                               assert.ok( true, 'Guessed thumbnail provider 
should be called' );
-                               return $.Deferred().resolve( { url : guessedURL 
} );
-                       }
-               };
-
-               viewer.imageProvider = {
-                       get: function( url ) {
-                               assert.strictEqual( url, guessedURL, 'Image 
provider is called based on data provided by the guessed provider' );
-                               return $.Deferred().reject();
-                       }
-               };
-
-               viewer.thumbnailInfoProvider = {
-                       get: function() {
-                               assert.ok( true, 'API thumbnail info provider 
should be called as a fallback, since the URL we hit did not exist' );
-                               return $.Deferred().reject();
-                       }
-               };
-
+               assert.ok( true, 'When the guesser returns an URL, but that 
returns 404, image loading should be retried with the classic provider' );
+               mock.expects( 'guessedThumbnailInfoProvider' ).once().returns( 
$.Deferred().resolve( { url : guessedURL } ) );
+               mock.expects( 'thumbnailInfoProvider' ).once().returns( 
$.Deferred().resolve( apiURL ) );
+               mock.expects( 'imageProvider' ).twice()
+                       .onFirstCall().withExactArgs( guessedURL ).returns( 
$.Deferred().reject() )
+                       .onSecondCall().withExactArgs( apiURL ).returns( 
$.Deferred().resolve( image ) );
                viewer.fetchThumbnail( file, width, sampleURL, originalWidth, 
originalHeight );
+               mock.verify();
 
-               viewer.imageProvider = {
-                       get: function( url ) {
-                               assert.strictEqual( url, guessedURL, 'Image 
provider is called based on data provided by the guessed provider' );
-                               return $.Deferred().resolve();
-                       }
-               };
-
-               viewer.thumbnailInfoProvider = {
-                       get: function() {
-                               assert.ok( false, 'API thumbnail info provider 
should not be called as a fallback' );
-                               return $.Deferred().reject();
-                       }
-               };
-
-               QUnit.stop();
-
-               viewer.fetchThumbnail( file, width, sampleURL, originalWidth, 
originalHeight ).then( function() {
-                       assert.ok( true, 'Guessed URL is all that was needed to 
load the thumb' );
-                       QUnit.start();
-               } );
+//             QUnit.stop();
+//             viewer.fetchThumbnail( file, width, sampleURL, originalWidth, 
originalHeight ).then( function() {
+//                     assert.ok( true, 'Guessed URL is all that was needed to 
load the thumb' );
+//                     QUnit.start();
+//             } );
 
                mw.config.get( 'wgMultimediaViewer' ).useThumbnailGuessing = 
false;
 
-               viewer.guessedThumbnailInfoProvider = {
-                       get: function() {
-                               assert.ok( false, 'Guessed thumbnail provider 
should not be called, since it was disabled in extension configuration' );
-                       }
-               };
-
-               viewer.thumbnailInfoProvider = {
-                       get: function() {
-                               assert.ok( true, 'Classic thumbnail info 
provider should be called, since guesser was disabled in extension 
configuration' );
-                               return $.Deferred().reject();
-                       }
-               };
-
-               viewer.fetchThumbnail( file, width );
+               assert.ok( true, 'When the guesser returns an URL, that should 
be used' );
+               mock.expects( 'guessedThumbnailInfoProvider' ).never();
+               mock.expects( 'thumbnailInfoProvider' ).once().returns( 
$.Deferred().resolve( apiURL ) );
+               mock.expects( 'imageProvider' ).once().withExactArgs( 
guessedURL ).returns( $.Deferred().resolve( image ) );
+               viewer.fetchThumbnail( file, width, sampleURL, originalWidth, 
originalHeight );
+               mock.verify();
 
                mw.config.get( 'wgMultimediaViewer' ).useThumbnailGuessing = 
oldUseThumbnailGuessing;
        } );

-- 
To view, visit https://gerrit.wikimedia.org/r/126912
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ida6143e29e54d90f26e7888aced1d207b3bfa702
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/MultimediaViewer
Gerrit-Branch: master
Gerrit-Owner: Gergő Tisza <gti...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to