mirror of
https://gerrit.wikimedia.org/r/mediawiki/skins/Vector.git
synced 2024-12-12 07:55:21 +00:00
5693594bd1
This allows the URL to the other wiki's rest.php to be configured exactly, rather than assuming that it has the same wgScriptPath as the current wiki. This is necessary to make this feature work on PatchDemo, where wgScriptPath looks like '/123abc456/w'. $wgVectorSearchHost is removed, since nothing uses it except PatchDemo (where it's broken) and development setups. Bug: T319494 Change-Id: Ife042f4f683d366a31a642723746d4aa80774c03
131 lines
3.5 KiB
JavaScript
131 lines
3.5 KiB
JavaScript
/* global fetchMock */
|
|
const restSearchClient = require( '../../resources/skins.vector.search/restSearchClient.js' );
|
|
const jestFetchMock = require( 'jest-fetch-mock' );
|
|
|
|
const mockedRequests = !process.env.TEST_LIVE_REQUESTS;
|
|
const configMock = {
|
|
get: jest.fn().mockImplementation( ( key, fallback = null ) => {
|
|
if ( key === 'wgScriptPath' ) {
|
|
return '/w';
|
|
}
|
|
if ( key === 'wgScript' ) {
|
|
return '/w/index.php';
|
|
}
|
|
return fallback;
|
|
} ),
|
|
set: jest.fn()
|
|
};
|
|
|
|
describe( 'restApiSearchClient', () => {
|
|
beforeAll( () => {
|
|
jestFetchMock.enableFetchMocks();
|
|
} );
|
|
|
|
afterAll( () => {
|
|
jestFetchMock.disableFetchMocks();
|
|
} );
|
|
|
|
beforeEach( () => {
|
|
fetchMock.resetMocks();
|
|
if ( !mockedRequests ) {
|
|
fetchMock.disableMocks();
|
|
}
|
|
} );
|
|
|
|
test( '2 results', async () => {
|
|
const thumbUrl = '//upload.wikimedia.org/wikipedia/commons/0/01/MediaWiki-smaller-logo.png';
|
|
const restResponse = {
|
|
pages: [
|
|
{
|
|
id: 37298,
|
|
key: 'Media',
|
|
label: 'Media',
|
|
title: 'Media',
|
|
description: 'Wikimedia disambiguation page',
|
|
thumbnail: null,
|
|
url: '/w/index.php?title=Special%3ASearch&search=Media',
|
|
value: 37298
|
|
},
|
|
{
|
|
id: 323710,
|
|
key: 'MediaWiki',
|
|
label: 'MediaWiki',
|
|
title: 'MediaWiki',
|
|
description: 'wiki software',
|
|
thumbnail: {
|
|
width: 200,
|
|
height: 189,
|
|
url: thumbUrl
|
|
},
|
|
url: '/w/index.php?title=Special%3ASearch&search=MediaWiki',
|
|
value: 323710
|
|
}
|
|
]
|
|
};
|
|
fetchMock.mockOnce( JSON.stringify( restResponse ) );
|
|
|
|
const searchResult = await restSearchClient( configMock ).fetchByTitle(
|
|
'media',
|
|
'https://en.wikipedia.org/w/rest.php',
|
|
2
|
|
).fetch;
|
|
|
|
/* eslint-disable-next-line compat/compat */
|
|
const controller = new AbortController();
|
|
|
|
expect( searchResult.query ).toStrictEqual( 'media' );
|
|
expect( searchResult.results ).toBeTruthy();
|
|
expect( searchResult.results.length ).toBe( 2 );
|
|
|
|
expect( searchResult.results[ 0 ] ).toStrictEqual(
|
|
Object.assign( {}, restResponse.pages[ 0 ], {
|
|
// thumbnail: null -> thumbnail: undefined
|
|
thumbnail: undefined
|
|
} ) );
|
|
expect( searchResult.results[ 1 ] ).toStrictEqual( restResponse.pages[ 1 ] );
|
|
|
|
if ( mockedRequests ) {
|
|
expect( fetchMock ).toHaveBeenCalledTimes( 1 );
|
|
expect( fetchMock ).toHaveBeenCalledWith(
|
|
'https://en.wikipedia.org/w/rest.php/v1/search/title?q=media&limit=2',
|
|
{ headers: { accept: 'application/json' }, signal: controller.signal }
|
|
);
|
|
}
|
|
} );
|
|
|
|
test( '0 results', async () => {
|
|
const restResponse = { pages: [] };
|
|
fetchMock.mockOnce( JSON.stringify( restResponse ) );
|
|
|
|
const searchResult = await restSearchClient( configMock ).fetchByTitle(
|
|
'thereIsNothingLikeThis',
|
|
'https://en.wikipedia.org/w/rest.php'
|
|
).fetch;
|
|
|
|
/* eslint-disable-next-line compat/compat */
|
|
const controller = new AbortController();
|
|
expect( searchResult.query ).toStrictEqual( 'thereIsNothingLikeThis' );
|
|
expect( searchResult.results ).toBeTruthy();
|
|
expect( searchResult.results.length ).toBe( 0 );
|
|
|
|
if ( mockedRequests ) {
|
|
expect( fetchMock ).toHaveBeenCalledTimes( 1 );
|
|
expect( fetchMock ).toHaveBeenCalledWith(
|
|
'https://en.wikipedia.org/w/rest.php/v1/search/title?q=thereIsNothingLikeThis&limit=10',
|
|
{ headers: { accept: 'application/json' }, signal: controller.signal }
|
|
);
|
|
}
|
|
} );
|
|
|
|
if ( mockedRequests ) {
|
|
test( 'network error', async () => {
|
|
fetchMock.mockRejectOnce( new Error( 'failed' ) );
|
|
|
|
await expect( restSearchClient( configMock ).fetchByTitle(
|
|
'anything',
|
|
'https://en.wikipedia.org/w/rest.php'
|
|
).fetch ).rejects.toThrow( 'failed' );
|
|
} );
|
|
}
|
|
} );
|