-
Notifications
You must be signed in to change notification settings - Fork 5
/
jest.setup.js
101 lines (95 loc) · 2.26 KB
/
jest.setup.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* global jest:false */
'use strict';
const { config } = require( '@vue/test-utils' );
/**
* Mock for the calls to MW core's i18n plugin which returns
* a mw.Message object.
*
* @param {string} key The text key to parse
* @param {...*} args Arbitrary number of arguments to be parsed
* @return {mw.growthTests.MwMessageInterface}
*/
function $i18nMock( key, ...args ) {
function serializeArgs() {
return args.length ? `${ key }:[${ args.join( ',' ) }]` : key;
}
/**
* mw.Message-like object with .text() and .parse() method
*
* @typedef {Object} mw.growthTests.MwMessageInterface
*
* @property {Function} text parses the given banana message
* @property {Function} parse parses the given banana message (without html support)
*/
return {
text: () => serializeArgs(),
parse: () => serializeArgs()
};
}
// Mock Vue plugins in test suites
config.global.provide = {
i18n: $i18nMock
};
config.global.mocks = {
$i18n: $i18nMock
};
config.global.directives = {
'i18n-html': ( el, binding ) => {
el.innerHTML = `${ binding.arg } (${ binding.value })`;
}
};
function RestMock() {}
RestMock.prototype.get = jest.fn();
function TitleMock() {}
TitleMock.prototype.getMainText = jest.fn();
TitleMock.prototype.getNameText = jest.fn();
TitleMock.prototype.getUrl = jest.fn();
// Mock MW object
const mw = {
log: {
error: jest.fn(),
warn: jest.fn()
},
config: {
get: jest.fn(),
set: jest.fn()
},
message: jest.fn( ( key ) => ( {
text: jest.fn( () => key ),
parse: jest.fn()
} ) ),
user: {
getId: jest.fn(),
getName: jest.fn(),
isAnon: jest.fn().mockReturnValue( true ),
options: {
get: jest.fn()
}
},
language: {
convertNumber: jest.fn( ( x ) => x ),
getFallbackLanguageChain: function () {
return [ 'en' ];
}
},
Title: TitleMock,
util: {
getUrl: jest.fn()
},
Rest: RestMock
// other mw properties as needed...
};
// Make calls to OO.EventEmitter.call( this ) provide a this.emit() method
function EventEmitterMock() {
this.emit = jest.fn();
}
function OOMock() {}
OOMock.mixinClass = jest.fn();
OOMock.EventEmitter = EventEmitterMock;
OOMock.ui = {
isMobile: jest.fn()
};
// Assign things to "global" here if you want them to be globally available during tests
global.$ = require( 'jquery' );
global.mw = mw;
global.OO = OOMock;