Skip to content

Commit 40c5227

Browse files
Add tests for Mediawiki capabilities, improve checkApiAvailability() method
1 parent e075a8b commit 40c5227

File tree

5 files changed

+98
-3
lines changed

5 files changed

+98
-3
lines changed

src/util/const.ts

+5
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,8 @@ export const WEBP_HANDLER_URL = 'https://gist.githubusercontent.com/rgaudin/60bb
2121
export const MAX_FILE_DOWNLOAD_RETRIES = 5
2222
export const BLACKLISTED_NS = ['Story'] // 'Story' Wikipedia namespace is content, but not indgestable by Parsoid https://github.com/openzim/mwoffliner/issues/1853
2323
export const RENDERERS_LIST = ['WikimediaDesktop', 'VisualEditor', 'WikimediaMobile', 'MediawikiRestApi']
24+
/*
25+
Handle redirection pages for 3rd party wikis that have 200 response code
26+
Check this link: https://pokemon.fandom.com/w/api.php?action=visualeditor&mobileformat=html&format=json&paction=parse&formatversion=2&page=MediaWiki%3ASidebar
27+
*/
28+
export const REDIRECT_PAGE_SIGNATURE = 'Moved to'

src/util/mw-api.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import Timer from './Timer.js'
66
import axios from 'axios'
77
import RedisStore from '../RedisStore.js'
88
import MediaWiki from '../MediaWiki.js'
9+
import { REDIRECT_PAGE_SIGNATURE } from './const.js'
910

1011
export async function getArticlesByIds(articleIds: string[], downloader: Downloader, log = true): Promise<void> {
1112
let from = 0
@@ -260,7 +261,11 @@ export function mwRetToArticleDetail(obj: QueryMwRet): KVS<ArticleDetail> {
260261
export async function checkApiAvailability(url: string, loginCookie = ''): Promise<boolean> {
261262
try {
262263
const resp = await axios.get(decodeURI(url), { maxRedirects: 0, headers: { cookie: loginCookie } })
263-
return resp.status === 200 && !resp.headers['mediawiki-api-error']
264+
265+
const isRedirectPage = typeof resp.data === 'string' && resp.data.startsWith(REDIRECT_PAGE_SIGNATURE)
266+
const isSuccess = resp.status === 200 && !resp.headers['mediawiki-api-error']
267+
268+
return !isRedirectPage && isSuccess
264269
} catch (err) {
265270
return false
266271
}

test/e2e/openstreetmap.e2e.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,5 @@ await testRenders(
5353
})
5454
})
5555
},
56-
['MediawikiRestApi'],
56+
['MediawikiRestApi', 'VisualEditor'],
5757
)

test/e2e/wikisource.e2e.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,5 @@ await testRenders(
6363
}
6464
})
6565
},
66-
['WikimediaDesktop', 'VisualEditor'],
66+
['WikimediaDesktop', 'VisualEditor', 'MediawikiRestApi'],
6767
)

test/unit/mwApiCapabilities.test.ts

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import MediaWiki from '../../src/MediaWiki.js'
2+
3+
describe('Checking Mediawiki capabilities', () => {
4+
beforeEach(() => {
5+
MediaWiki.reset()
6+
})
7+
8+
afterEach(() => {
9+
MediaWiki.reset()
10+
})
11+
12+
test('test capabilities of en.wikipedia.org', async () => {
13+
MediaWiki.base = 'https://en.wikipedia.org'
14+
expect(await MediaWiki.hasWikimediaDesktopApi()).toBe(true)
15+
expect(await MediaWiki.hasWikimediaMobileApi()).toBe(true)
16+
expect(await MediaWiki.hasMediawikiRestApi()).toBe(true)
17+
expect(await MediaWiki.hasVisualEditorApi()).toBe(true)
18+
})
19+
20+
test('test capabilities of wiki.openstreetmap.org', async () => {
21+
MediaWiki.base = 'https://wiki.openstreetmap.org'
22+
23+
expect(await MediaWiki.hasWikimediaDesktopApi()).toBe(false)
24+
expect(await MediaWiki.hasWikimediaMobileApi()).toBe(false)
25+
expect(await MediaWiki.hasMediawikiRestApi()).toBe(true)
26+
expect(await MediaWiki.hasVisualEditorApi()).toBe(true)
27+
})
28+
29+
test('test capabilities of fo.wikisource.org', async () => {
30+
MediaWiki.base = 'https://fo.wikisource.org'
31+
32+
expect(await MediaWiki.hasWikimediaDesktopApi()).toBe(true)
33+
expect(await MediaWiki.hasWikimediaMobileApi()).toBe(false)
34+
expect(await MediaWiki.hasMediawikiRestApi()).toBe(true)
35+
expect(await MediaWiki.hasVisualEditorApi()).toBe(true)
36+
})
37+
38+
test('test capabilities of minecraft.wiki with correct VisualEditor receipt', async () => {
39+
MediaWiki.base = 'https://minecraft.wiki'
40+
MediaWiki.wikiPath = '/'
41+
MediaWiki.actionApiPath = 'api.php'
42+
43+
expect(await MediaWiki.hasWikimediaDesktopApi()).toBe(false)
44+
expect(await MediaWiki.hasWikimediaMobileApi()).toBe(false)
45+
expect(await MediaWiki.hasMediawikiRestApi()).toBe(false)
46+
expect(await MediaWiki.hasVisualEditorApi()).toBe(true)
47+
})
48+
49+
test('test capabilities of pokemon.fandom.com with correct VisualEditor receipt', async () => {
50+
MediaWiki.base = 'https://pokemon.fandom.com/'
51+
MediaWiki.wikiPath = '/'
52+
MediaWiki.actionApiPath = 'api.php'
53+
54+
expect(await MediaWiki.hasWikimediaDesktopApi()).toBe(false)
55+
expect(await MediaWiki.hasWikimediaMobileApi()).toBe(false)
56+
expect(await MediaWiki.hasMediawikiRestApi()).toBe(false)
57+
expect(await MediaWiki.hasVisualEditorApi()).toBe(true)
58+
})
59+
60+
test('test capabilities of pokemon.fandom.com with default receipt', async () => {
61+
MediaWiki.base = 'https://pokemon.fandom.com/'
62+
63+
expect(await MediaWiki.hasWikimediaDesktopApi()).toBe(false)
64+
expect(await MediaWiki.hasWikimediaMobileApi()).toBe(false)
65+
expect(await MediaWiki.hasMediawikiRestApi()).toBe(false)
66+
expect(await MediaWiki.hasVisualEditorApi()).toBe(false)
67+
})
68+
69+
test('test capabilities of pokemon.fandom.com with MediawikiRestApi receipt', async () => {
70+
MediaWiki.base = 'https://pokemon.fandom.com/'
71+
MediaWiki.wikiPath = '/'
72+
MediaWiki.mediawikiRestApiPath = 'rest.php/v1/page/'
73+
74+
expect(await MediaWiki.hasWikimediaDesktopApi()).toBe(false)
75+
expect(await MediaWiki.hasWikimediaMobileApi()).toBe(false)
76+
expect(await MediaWiki.hasVisualEditorApi()).toBe(false)
77+
78+
/* TODO:
79+
Title MediaWiki:Sidebar does not exist for Mediawiki Rest Api in pokemon.fandom.com for some reason. This will lead to incorrect capability check
80+
See: https://pokemon.fandom.com/rest.php/v1/page/MediaWiki%3ASidebar/html
81+
*/
82+
MediaWiki.apiCheckArticleId = 'Volcarona'
83+
expect(await MediaWiki.hasMediawikiRestApi()).toBe(true)
84+
})
85+
})

0 commit comments

Comments
 (0)