Copy missing helpers from Karma to Jest
Copy missing helpers from Karma to Jest
This commit is contained in:
parent
a85fd76f52
commit
2e7486681a
11 changed files with 235 additions and 0 deletions
9
spec/frontend/helpers/class_spec_helper.js
Normal file
9
spec/frontend/helpers/class_spec_helper.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
export default class ClassSpecHelper {
|
||||
static itShouldBeAStaticMethod(base, method) {
|
||||
return it('should be a static method', () => {
|
||||
expect(Object.prototype.hasOwnProperty.call(base, method)).toBeTruthy();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
window.ClassSpecHelper = ClassSpecHelper;
|
11
spec/frontend/helpers/locale_helper.js
Normal file
11
spec/frontend/helpers/locale_helper.js
Normal file
|
@ -0,0 +1,11 @@
|
|||
/* eslint-disable import/prefer-default-export */
|
||||
|
||||
export const setLanguage = languageCode => {
|
||||
const htmlElement = document.querySelector('html');
|
||||
|
||||
if (languageCode) {
|
||||
htmlElement.setAttribute('lang', languageCode);
|
||||
} else {
|
||||
htmlElement.removeAttribute('lang');
|
||||
}
|
||||
};
|
28
spec/frontend/helpers/scroll_into_view_promise.js
Normal file
28
spec/frontend/helpers/scroll_into_view_promise.js
Normal file
|
@ -0,0 +1,28 @@
|
|||
export default function scrollIntoViewPromise(intersectionTarget, timeout = 100, maxTries = 5) {
|
||||
return new Promise((resolve, reject) => {
|
||||
let intersectionObserver;
|
||||
let retry = 0;
|
||||
|
||||
const intervalId = setInterval(() => {
|
||||
if (retry >= maxTries) {
|
||||
intersectionObserver.disconnect();
|
||||
clearInterval(intervalId);
|
||||
reject(new Error(`Could not scroll target into viewPort within ${timeout * maxTries} ms`));
|
||||
}
|
||||
retry += 1;
|
||||
intersectionTarget.scrollIntoView();
|
||||
}, timeout);
|
||||
|
||||
intersectionObserver = new IntersectionObserver(entries => {
|
||||
if (entries[0].isIntersecting) {
|
||||
intersectionObserver.disconnect();
|
||||
clearInterval(intervalId);
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
|
||||
intersectionObserver.observe(intersectionTarget);
|
||||
|
||||
intersectionTarget.scrollIntoView();
|
||||
});
|
||||
}
|
4
spec/frontend/helpers/set_timeout_promise_helper.js
Normal file
4
spec/frontend/helpers/set_timeout_promise_helper.js
Normal file
|
@ -0,0 +1,4 @@
|
|||
export default (time = 0) =>
|
||||
new Promise(resolve => {
|
||||
setTimeout(resolve, time);
|
||||
});
|
14
spec/frontend/helpers/user_mock_data_helper.js
Normal file
14
spec/frontend/helpers/user_mock_data_helper.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
export default {
|
||||
createNumberRandomUsers(numberUsers) {
|
||||
const users = [];
|
||||
for (let i = 0; i < numberUsers; i += 1) {
|
||||
users.push({
|
||||
avatar: 'https://gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
|
||||
id: i + 1,
|
||||
name: `GitLab User ${i}`,
|
||||
username: `gitlab${i}`,
|
||||
});
|
||||
}
|
||||
return users;
|
||||
},
|
||||
};
|
18
spec/frontend/helpers/vue_component_helper.js
Normal file
18
spec/frontend/helpers/vue_component_helper.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
/**
|
||||
* Replaces line break with an empty space
|
||||
* @param {*} data
|
||||
*/
|
||||
export const removeBreakLine = data => data.replace(/\r?\n|\r/g, ' ');
|
||||
|
||||
/**
|
||||
* Removes line breaks, spaces and trims the given text
|
||||
* @param {String} str
|
||||
* @returns {String}
|
||||
*/
|
||||
export const trimText = str =>
|
||||
str
|
||||
.replace(/\r?\n|\r/g, '')
|
||||
.replace(/\s\s+/g, ' ')
|
||||
.trim();
|
||||
|
||||
export const removeWhitespace = str => str.replace(/\s\s+/g, ' ');
|
11
spec/frontend/helpers/vue_resource_helper.js
Normal file
11
spec/frontend/helpers/vue_resource_helper.js
Normal file
|
@ -0,0 +1,11 @@
|
|||
// eslint-disable-next-line import/prefer-default-export
|
||||
export const headersInterceptor = (request, next) => {
|
||||
next(response => {
|
||||
const headers = {};
|
||||
response.headers.forEach((value, key) => {
|
||||
headers[key] = value;
|
||||
});
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
response.headers = headers;
|
||||
});
|
||||
};
|
19
spec/frontend/helpers/vue_test_utils_helper.js
Normal file
19
spec/frontend/helpers/vue_test_utils_helper.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
/* eslint-disable import/prefer-default-export */
|
||||
|
||||
const vNodeContainsText = (vnode, text) =>
|
||||
(vnode.text && vnode.text.includes(text)) ||
|
||||
(vnode.children && vnode.children.filter(child => vNodeContainsText(child, text)).length);
|
||||
|
||||
/**
|
||||
* Determines whether a `shallowMount` Wrapper contains text
|
||||
* within one of it's slots. This will also work on Wrappers
|
||||
* acquired with `find()`, but only if it's parent Wrapper
|
||||
* was shallowMounted.
|
||||
* NOTE: Prefer checking the rendered output of a component
|
||||
* wherever possible using something like `text()` instead.
|
||||
* @param {Wrapper} shallowWrapper - Vue test utils wrapper (shallowMounted)
|
||||
* @param {String} slotName
|
||||
* @param {String} text
|
||||
*/
|
||||
export const shallowWrapperContainsSlotText = (shallowWrapper, slotName, text) =>
|
||||
!!shallowWrapper.vm.$slots[slotName].filter(vnode => vNodeContainsText(vnode, text)).length;
|
104
spec/frontend/helpers/vuex_action_helper.js
Normal file
104
spec/frontend/helpers/vuex_action_helper.js
Normal file
|
@ -0,0 +1,104 @@
|
|||
const noop = () => {};
|
||||
|
||||
/**
|
||||
* Helper for testing action with expected mutations inspired in
|
||||
* https://vuex.vuejs.org/en/testing.html
|
||||
*
|
||||
* @param {Function} action to be tested
|
||||
* @param {Object} payload will be provided to the action
|
||||
* @param {Object} state will be provided to the action
|
||||
* @param {Array} [expectedMutations=[]] mutations expected to be committed
|
||||
* @param {Array} [expectedActions=[]] actions expected to be dispatched
|
||||
* @param {Function} [done=noop] to be executed after the tests
|
||||
* @return {Promise}
|
||||
*
|
||||
* @example
|
||||
* testAction(
|
||||
* actions.actionName, // action
|
||||
* { }, // mocked payload
|
||||
* state, //state
|
||||
* // expected mutations
|
||||
* [
|
||||
* { type: types.MUTATION}
|
||||
* { type: types.MUTATION_1, payload: jasmine.any(Number)}
|
||||
* ],
|
||||
* // expected actions
|
||||
* [
|
||||
* { type: 'actionName', payload: {param: 'foobar'}},
|
||||
* { type: 'actionName1'}
|
||||
* ]
|
||||
* done,
|
||||
* );
|
||||
*
|
||||
* @example
|
||||
* testAction(
|
||||
* actions.actionName, // action
|
||||
* { }, // mocked payload
|
||||
* state, //state
|
||||
* [ { type: types.MUTATION} ], // expected mutations
|
||||
* [], // expected actions
|
||||
* ).then(done)
|
||||
* .catch(done.fail);
|
||||
*/
|
||||
export default (
|
||||
action,
|
||||
payload,
|
||||
state,
|
||||
expectedMutations = [],
|
||||
expectedActions = [],
|
||||
done = noop,
|
||||
) => {
|
||||
const mutations = [];
|
||||
const actions = [];
|
||||
|
||||
// mock commit
|
||||
const commit = (type, mutationPayload) => {
|
||||
const mutation = { type };
|
||||
|
||||
if (typeof mutationPayload !== 'undefined') {
|
||||
mutation.payload = mutationPayload;
|
||||
}
|
||||
|
||||
mutations.push(mutation);
|
||||
};
|
||||
|
||||
// mock dispatch
|
||||
const dispatch = (type, actionPayload) => {
|
||||
const dispatchedAction = { type };
|
||||
|
||||
if (typeof actionPayload !== 'undefined') {
|
||||
dispatchedAction.payload = actionPayload;
|
||||
}
|
||||
|
||||
actions.push(dispatchedAction);
|
||||
};
|
||||
|
||||
const validateResults = () => {
|
||||
expect({
|
||||
mutations,
|
||||
actions,
|
||||
}).toEqual({
|
||||
mutations: expectedMutations,
|
||||
actions: expectedActions,
|
||||
});
|
||||
done();
|
||||
};
|
||||
|
||||
const result = action(
|
||||
{ commit, state, dispatch, rootState: state, rootGetters: state, getters: state },
|
||||
payload,
|
||||
);
|
||||
|
||||
return new Promise(resolve => {
|
||||
setImmediate(resolve);
|
||||
})
|
||||
.then(() => result)
|
||||
.catch(error => {
|
||||
validateResults();
|
||||
throw error;
|
||||
})
|
||||
.then(data => {
|
||||
validateResults();
|
||||
return data;
|
||||
});
|
||||
};
|
16
spec/frontend/helpers/wait_for_attribute_change.js
Normal file
16
spec/frontend/helpers/wait_for_attribute_change.js
Normal file
|
@ -0,0 +1,16 @@
|
|||
export default (domElement, attributes, timeout = 1500) =>
|
||||
new Promise((resolve, reject) => {
|
||||
let observer;
|
||||
const timeoutId = setTimeout(() => {
|
||||
observer.disconnect();
|
||||
reject(new Error(`Could not see an attribute update within ${timeout} ms`));
|
||||
}, timeout);
|
||||
|
||||
observer = new MutationObserver(() => {
|
||||
clearTimeout(timeoutId);
|
||||
observer.disconnect();
|
||||
resolve();
|
||||
});
|
||||
|
||||
observer.observe(domElement, { attributes: true, attributeFilter: attributes });
|
||||
});
|
1
spec/frontend/helpers/wait_for_promises.js
Normal file
1
spec/frontend/helpers/wait_for_promises.js
Normal file
|
@ -0,0 +1 @@
|
|||
export default () => new Promise(resolve => requestAnimationFrame(resolve));
|
Loading…
Reference in a new issue