Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add sauce labs testing info to karma #298

Merged
merged 2 commits into from
Jan 7, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 0 additions & 3 deletions .travis.yml
@@ -1,9 +1,6 @@
language: node_js
node_js:
- "7"
- "6"
- "5"
- "4"
before_script:
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
Expand Down
2 changes: 2 additions & 0 deletions README.md
Expand Up @@ -5,6 +5,8 @@ Accessible modal dialog component for React.JS
[![Code Climate](https://codeclimate.com/github/reactjs/react-modal/badges/gpa.svg)](https://codeclimate.com/github/reactjs/react-modal)
[![Coverage Status](https://coveralls.io/repos/github/reactjs/react-modal/badge.svg?branch=master)](https://coveralls.io/github/reactjs/react-modal?branch=master)

[![Build Status](https://saucelabs.com/browser-matrix/cd-reactmodal.svg)](https://saucelabs.com/beta/builds/ad582339a83145e1a4d3e8b8a1809b6c)

## Active Development
The modal is currently undergoing significant development for a v2 release. The `master` branch contains that development work.
If you'd like to see the latest stable version please use the release tags (https://github.com/reactjs/react-modal/releases)
Expand Down
93 changes: 85 additions & 8 deletions karma.conf.js
@@ -1,4 +1,66 @@
module.exports = function(config) {
const webpackTestConfig = require('./webpack.test.config');

module.exports = function karmaConfig (config) {
let browsers = [];
const customLaunchers = {};

function createCustomLauncher (browser, version, platform) {
return {
base: 'SauceLabs',
browserName: browser,
version,
platform
};
}

if (process.env.SAUCE_USERNAME || process.env.SAUCE_ACCESS_KEY) {
const OPTIONS = [
'SAUCE_CHROME',
'SAUCE_FIREFOX',
'SAUCE_SAFARI',
'SAUCE_IE',
'SAUCE_EDGE',
];

let runAll = true;

OPTIONS.forEach((opt) => {
if (process.env[opt]) {
runAll = false;
}
});

// Chrome
if (runAll || process.env.SAUCE_CHROME) {
customLaunchers.SL_Chrome = createCustomLauncher('chrome');
}

// Firefox
if (runAll || process.env.SAUCE_FIREFOX) {
customLaunchers.SL_Firefox = createCustomLauncher('firefox');
}

// Safari
if (runAll || process.env.SAUCE_SAFARI) {
customLaunchers.SL_Safari10 = createCustomLauncher('safari', 10);
customLaunchers.SL_Safari9 = createCustomLauncher('safari', 9);
}

// IE
if (runAll || process.env.SAUCE_IE) {
customLaunchers.SL_IE11 = createCustomLauncher('internet explorer', 11, 'Windows 10');
}

// Edge
if (runAll || process.env.SAUCE_EDGE) {
customLaunchers.SL_Edge = createCustomLauncher('microsoftedge', null, 'Windows 10');
}

browsers = Object.keys(customLaunchers);
} else {
browsers = [(process.env.CONTINUOUS_INTEGRATION) ? 'Firefox' : 'Chrome'];
}

config.set({

basePath: '',
Expand All @@ -10,10 +72,10 @@ module.exports = function(config) {
],

preprocessors: {
'specs/spec_index.js': [ 'webpack', 'sourcemap' ]
'specs/spec_index.js': ['webpack', 'sourcemap']
},

webpack: require('./webpack.test.config'),
webpack: webpackTestConfig,

webpackMiddleware: {
stats: 'errors-only'
Expand All @@ -39,10 +101,25 @@ module.exports = function(config) {

autoWatch: true,

browsers: [ (process.env.CONTINUOUS_INTEGRATION) ? 'Firefox' : 'Chrome' ],

captureTimeout: 60000,

singleRun: (process.env.CONTINUOUS_INTEGRATION)
browsers,
customLaunchers,

// Increase timeouts to prevent the issue with disconnected tests (https://goo.gl/nstA69)
captureTimeout: 4 * 60 * 1000,
browserDisconnectTimeout: 10000,
browserDisconnectTolerance: 1,
browserNoActivityTimeout: 4 * 60 * 1000,

singleRun: (process.env.CONTINUOUS_INTEGRATION),

// SauceLabs config
sauceLabs: {
recordScreenshots: false,
connectOptions: {
port: 5757,
logfile: 'sauce_connect.log'
},
public: 'public'
}
});
};
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -55,6 +55,7 @@
"karma-firefox-launcher": "1.0.0",
"karma-mocha": "^1.3.0",
"karma-mocha-reporter": "^2.2.1",
"karma-sauce-launcher": "^1.1.0",
"karma-sourcemap-loader": "^0.3.7",
"karma-webpack": "^1.8.1",
"mocha": "3.2.0",
Expand Down
63 changes: 40 additions & 23 deletions specs/Modal.spec.js
Expand Up @@ -270,6 +270,30 @@ describe('Modal', () => {
unmountModal();
});

it('should close on Esc key event', () => {
const requestCloseCallback = sinon.spy();
const modal = renderModal({
isOpen: true,
shouldCloseOnOverlayClick: true,
onRequestClose: requestCloseCallback
});
expect(modal.props.isOpen).toEqual(true);
expect(() => {
Simulate.keyDown(modal.portal.content, {
// The keyCode is all that matters, so this works
key: 'FakeKeyToTestLater',
keyCode: 27,
which: 27
});
}).toNotThrow();
expect(requestCloseCallback.called).toBeTruthy();
// Check if event is passed to onRequestClose callback.
const event = requestCloseCallback.getCall(0).args[0];
expect(event).toBeTruthy();
expect(event.constructor).toBeTruthy();
expect(event.key).toEqual('FakeKeyToTestLater');
});

describe('should close on overlay click', () => {
afterEach('Unmount modal', () => {
unmountModal();
Expand Down Expand Up @@ -365,7 +389,15 @@ describe('Modal', () => {
});
const overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay');
window.addEventListener('click', () => { hasPropagated = true; });
overlay[0].dispatchEvent(new MouseEvent('click', { bubbles: true }));
// Work around for running the spec in IE 11
let mouseEvent = null;
try {
mouseEvent = new MouseEvent('click', { bubbles: true });
} catch (err) {
mouseEvent = document.createEvent('MouseEvent');
mouseEvent.initEvent('click', true, false);
}
overlay[0].dispatchEvent(mouseEvent);
expect(hasPropagated).toBeTruthy();
});
});
Expand All @@ -380,34 +412,19 @@ describe('Modal', () => {
expect(modal.props.isOpen).toEqual(true);
const overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay');
expect(overlay.length).toEqual(1);
Simulate.mouseDown(overlay[0]); // click the overlay
Simulate.mouseUp(overlay[0]);
// click the overlay
Simulate.mouseDown(overlay[0]);
Simulate.mouseUp(overlay[0], {
// Used to test that this was the event received
fakeData: 'ABC'
});
expect(requestCloseCallback.called).toBeTruthy();
// Check if event is passed to onRequestClose callback.
const event = requestCloseCallback.getCall(0).args[0];
expect(event).toBeTruthy();
expect(event.constructor).toBeTruthy();
expect(event.constructor.name).toEqual('SyntheticEvent');
});
});

it('should close on Esc key event', () => {
const requestCloseCallback = sinon.spy();
const modal = renderModal({
isOpen: true,
shouldCloseOnOverlayClick: true,
onRequestClose: requestCloseCallback
expect(event.fakeData).toEqual('ABC');
});
expect(modal.props.isOpen).toEqual(true);
expect(() => {
Simulate.keyDown(modal.portal.content, { key: 'Esc', keyCode: 27, which: 27 });
}).toNotThrow();
expect(requestCloseCallback.called).toBeTruthy();
// Check if event is passed to onRequestClose callback.
const event = requestCloseCallback.getCall(0).args[0];
expect(event).toBeTruthy();
expect(event.constructor).toBeTruthy();
expect(event.constructor.name).toEqual('SyntheticEvent');
});

// it('adds --before-close for animations', function() {
Expand Down