Skip to content

Commit

Permalink
[update] upgrade jest and finish relate bug on unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
toxic-johann committed Jan 2, 2018
1 parent f4c5e09 commit e0f722c
Show file tree
Hide file tree
Showing 4 changed files with 129 additions and 30 deletions.
136 changes: 109 additions & 27 deletions __tests__/dispatcher/dom.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,26 @@
import Dom from 'dispatcher/dom';
import { Log } from 'chimee-helper';
import { Log, bind } from 'chimee-helper';
describe('dispatcher/dom', () => {
let originCreateElement;
let originScrollTo;

beforeAll(() => {
originCreateElement = global.document.createElement;
global.document.createElement = function(tag) {
const element = bind(originCreateElement, document)(tag);
if (tag === 'video') {
element.play = function() {};
}
return element;
};
originScrollTo = global.window.scrollTo;
global.window.scrollTo = function() {};
});

afterAll(() => {
global.document.createElement = originCreateElement;
global.window.scrollTo = originScrollTo;
});
test('dom needs wrapper and dispatcher if you pass in illegal desipatcher, it should throw error', () => {
expect(() => new Dom()).toThrow('Wrapper can only be string or HTMLElement, but not undefined');
expect(() => new Dom('hello')).toThrow('Can not get dom node accroding wrapper. Please check your wrapper');
Expand Down Expand Up @@ -104,12 +124,41 @@ describe('dispatcher/dom', () => {
});

describe('_getEventHanlder', () => {
const node = document.createElement('div');
const triggerSync = jest.fn();
const dom = new Dom(node, {
bus: {
triggerSync,
},
let dom;
let originCreateElement;
let originScrollTo;
let triggerSync;
beforeAll(() => {
originCreateElement = global.document.createElement;
global.document.createElement = function(tag) {
const element = bind(originCreateElement, document)(tag);
if (tag === 'video') {
element.play = function() {};
}
return element;
};
originScrollTo = global.window.scrollTo;
global.window.scrollTo = function() {};
});

afterAll(() => {
global.document.createElement = originCreateElement;
global.window.scrollTo = originScrollTo;
});

beforeEach(() => {
const node = document.createElement('div');
triggerSync = jest.fn();
dom = new Dom(node, {
bus: {
triggerSync,
},
});
});

afterEach(() => {
triggerSync = null;
dom.destroy();
});
test('normal click event', () => {
const fn1 = dom._getEventHandler('click', {});
Expand All @@ -120,22 +169,32 @@ describe('_getEventHanlder', () => {
test('normal mouseenter event', () => {
const fn2 = dom._getEventHandler('mouseenter', {});
fn2();
expect(triggerSync).toHaveBeenCalledTimes(2);
expect(triggerSync).toHaveBeenCalledTimes(1);
expect(triggerSync).lastCalledWith('mouseenter');
});
describe('mouseenter and insidevideo judge', () => {
const insideVideoNode = document.createElement('div');
const insideVideoChildNode = document.createElement('div');
insideVideoNode.appendChild((insideVideoChildNode));
dom.__videoExtendedNodes.push(insideVideoNode);
dom.__videoExtendedNodes.push(document.createElement('div'));
const fn3 = dom._getEventHandler('mouseenter', { penetrate: true });
let fn3;
let insideVideoNode;
let insideVideoChildNode;
beforeEach(() => {
insideVideoNode = document.createElement('div');
insideVideoChildNode = document.createElement('div');
insideVideoNode.appendChild((insideVideoChildNode));
dom.__videoExtendedNodes.push(insideVideoNode);
dom.__videoExtendedNodes.push(document.createElement('div'));
fn3 = dom._getEventHandler('mouseenter', { penetrate: true });
});
afterEach(() => {
insideVideoNode = null;
insideVideoChildNode = null;
fn3 = null;
});
test('mouseenter event, but not enter video area, should trigger nothing', () => {
fn3({
type: 'mouseenter',
currentTarget: null,
});
expect(triggerSync).toHaveBeenCalledTimes(2);
expect(triggerSync).toHaveBeenCalledTimes(0);
});
test('mouseener and enter video area on insideVideoNode, should trigger mouseenter', () => {
const event1 = {
Expand All @@ -144,56 +203,70 @@ describe('_getEventHanlder', () => {
};
fn3(event1);
expect(triggerSync).lastCalledWith('mouseenter', event1);
expect(triggerSync).toHaveBeenCalledTimes(3);
expect(triggerSync).toHaveBeenCalledTimes(1);
});
test('mouseleave, from inside video node to video itself, should trigger nothing', () => {
fn3({
type: 'mouseleave',
currentTarget: insideVideoNode,
toElement: dom.videoElement,
});
expect(triggerSync).toHaveBeenCalledTimes(3);
expect(triggerSync).toHaveBeenCalledTimes(0);
});
test('mouseenter video, should trigger nothing', () => {
test('mouseenter video from insideVideoNode, should trigger nothing', () => {
const event1 = {
type: 'mouseenter',
currentTarget: insideVideoNode,
};
fn3(event1);
expect(triggerSync).lastCalledWith('mouseenter', event1);
expect(triggerSync).toHaveBeenCalledTimes(1);
fn3({
type: 'mouseenter',
currentTarget: dom.videoElement,
});
expect(triggerSync).toHaveBeenCalledTimes(3);
expect(triggerSync).toHaveBeenCalledTimes(1);
});
test('mouseleave from video to outside, should trigger mouseleave', () => {
fn3({
type: 'mouseenter',
currentTarget: dom.videoElement,
});
expect(triggerSync).toHaveBeenCalledTimes(1);
const event2 = {
type: 'mouseleave',
currentTarget: dom.videoElement,
relatedTarget: null,
};
fn3(event2);
expect(triggerSync).toHaveBeenCalledTimes(4);
expect(triggerSync).toHaveBeenCalledTimes(2);
expect(triggerSync).lastCalledWith('mouseleave', event2);
});
test('mouseenter to inside video node child element', () => {
test('mouseenter to inside video node child element, should trigger', () => {
const event3 = {
type: 'mouseenter',
currentTarget: insideVideoChildNode,
};
fn3(event3);
expect(triggerSync).toHaveBeenCalledTimes(5);
expect(triggerSync).toHaveBeenCalledTimes(1);
expect(triggerSync).lastCalledWith('mouseenter', event3);
});
afterAll(() => {
dom.destroy();
});
});
test('_focusToVideo should work', () => {
const node = document.createElement('div');
const dom = new Dom(node, {});
dom._focusToVideo();
dom.destroy();
});
test('fullscreen should work', () => {
const node = document.createElement('div');
document.body.appendChild(node);
const dom = new Dom(node, { videoConfigReady: true });
const dom = new Dom(node, {
videoConfigReady: true,
bus: {
triggerSync,
},
});
dom.container.mozRequestFullscreen = () => {};
dom.fullscreen(true);
document.mozCancelFullscreen = () => {};
Expand All @@ -206,7 +279,12 @@ describe('_getEventHanlder', () => {

test('focus', () => {
const node = document.createElement('div');
const dom = new Dom(node, { videoConfigReady: true });
const dom = new Dom(node, {
videoConfigReady: true,
bus: {
triggerSync,
},
});
expect(document.activeElement).toBe(document.body);
dom.focus();
expect(document.activeElement).toBe(dom.videoElement);
Expand All @@ -215,6 +293,10 @@ describe('_getEventHanlder', () => {
test('setStyle', () => {
const node = document.createElement('div');
const dom = new Dom(node, {
videoConfigReady: true,
bus: {
triggerSync,
},
throwError(error) {
throw error;
},
Expand Down
18 changes: 17 additions & 1 deletion __tests__/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Chimee from 'index';
import { Log, getAttr, setAttr } from 'chimee-helper';
import { Log, getAttr, setAttr, bind } from 'chimee-helper';
import { videoReadOnlyProperties } from 'helper/const';
// import chimeeKernelFlv from 'chimee-kernel-flv';

Expand All @@ -19,6 +19,22 @@ describe('Chimee', () => {

let player;
let originURLrevoke;
let originCreateElement;

beforeAll(() => {
originCreateElement = global.document.createElement;
global.document.createElement = function(tag) {
const element = bind(originCreateElement, document)(tag);
if (tag === 'video') {
element.play = function() {};
}
return element;
};
});

afterAll(() => {
global.document.createElement = originCreateElement;
});

beforeEach(() => {
Log.data.warn = [];
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
},
"devDependencies": {
"babel-eslint": "^8.0.2",
"babel-jest": "^21.2.0",
"babel-jest": "^22.0.4",
"babel-plugin-external-helpers": "^6.22.0",
"babel-plugin-transform-decorators-legacy": "^1.3.4",
"babel-plugin-transform-runtime": "^6.23.0",
Expand All @@ -72,7 +72,7 @@
"eslint-plugin-jest": "^21.5.0",
"flow-bin": "^0.62.0",
"husky": "^0.14.3",
"jest": "^21.2.1",
"jest": "^22.0.4",
"npm-check-updates": "^2.13.0",
"pkg-ok": "^1.1.0",
"rollup": "^0.53.2",
Expand Down
1 change: 1 addition & 0 deletions src/dispatcher/dom.js
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ export default class Dom {
}

_autoFocusToVideo(element: Element, remove: boolean = false): void {
if (!isElement(element)) return;
(remove ? removeEvent : addEvent)(element, 'mouseup', this._focusToVideo, false, true);
(remove ? removeEvent : addEvent)(element, 'touchend', this._focusToVideo, false, true);
}
Expand Down

0 comments on commit e0f722c

Please sign in to comment.