Merge pull request #80 from netlify/jest

Switched to Jest testing framework.
This commit is contained in:
Andrey Okonetchnikov 2016-09-22 10:23:45 +02:00 committed by GitHub
commit 3a15913014
9 changed files with 112 additions and 70 deletions

View File

@ -5,7 +5,7 @@
"main": "index.js",
"scripts": {
"start": "webpack-dev-server --config webpack.dev.js",
"test": "NODE_ENV=test mocha --recursive --compilers js:babel-register --require ./test/setup.js",
"test": "NODE_ENV=test jest",
"test:watch": "npm test -- --watch",
"build": "webpack --config webpack.config.js",
"storybook": "start-storybook -p 9001",
@ -39,7 +39,6 @@
"babel-plugin-transform-object-rest-spread": "^6.5.0",
"babel-preset-es2015": "^6.5.0",
"babel-preset-react": "^6.5.0",
"babel-register": "^6.5.2",
"babel-runtime": "^6.5.0",
"css-loader": "^0.23.1",
"eslint": "^3.5.0",
@ -49,9 +48,9 @@
"file-loader": "^0.8.5",
"immutable": "^3.7.6",
"imports-loader": "^0.6.5",
"jest-cli": "^15.1.1",
"js-yaml": "^3.5.3",
"lint-staged": "^3.0.2",
"mocha": "^2.4.5",
"moment": "^2.11.2",
"node-sass": "^3.10.0",
"normalizr": "^2.0.0",

View File

@ -24,8 +24,9 @@ export const ENTRY_PERSIST_FAILURE = 'ENTRY_PERSIST_FAILURE';
/*
* Simple Action Creators (Internal)
* We still need to export them for tests
*/
function entryLoading(collection, slug) {
export function entryLoading(collection, slug) {
return {
type: ENTRY_REQUEST,
payload: {
@ -35,7 +36,7 @@ function entryLoading(collection, slug) {
};
}
function entryLoaded(collection, entry) {
export function entryLoaded(collection, entry) {
return {
type: ENTRY_SUCCESS,
payload: {
@ -45,7 +46,7 @@ function entryLoaded(collection, entry) {
};
}
function entriesLoading(collection) {
export function entriesLoading(collection) {
return {
type: ENTRIES_REQUEST,
payload: {
@ -54,7 +55,7 @@ function entriesLoading(collection) {
};
}
function entriesLoaded(collection, entries, pagination) {
export function entriesLoaded(collection, entries, pagination) {
return {
type: ENTRIES_SUCCESS,
payload: {
@ -65,7 +66,7 @@ function entriesLoaded(collection, entries, pagination) {
};
}
function entriesFailed(collection, error) {
export function entriesFailed(collection, error) {
return {
type: ENTRIES_FAILURE,
error: 'Failed to load entries',
@ -74,7 +75,7 @@ function entriesFailed(collection, error) {
};
}
function entryPersisting(collection, entry) {
export function entryPersisting(collection, entry) {
return {
type: ENTRY_PERSIST_REQUEST,
payload: {
@ -84,7 +85,7 @@ function entryPersisting(collection, entry) {
};
}
function entryPersisted(collection, entry) {
export function entryPersisted(collection, entry) {
return {
type: ENTRY_PERSIST_SUCCESS,
payload: {
@ -94,7 +95,7 @@ function entryPersisted(collection, entry) {
};
}
function entryPersistFail(collection, entry, error) {
export function entryPersistFail(collection, entry, error) {
return {
type: ENTRIES_FAILURE,
error: 'Failed to persist entry',
@ -102,7 +103,7 @@ function entryPersistFail(collection, entry, error) {
};
}
function emmptyDraftCreated(entry) {
export function emmptyDraftCreated(entry) {
return {
type: DRAFT_CREATE_EMPTY,
payload: entry

View File

@ -1,7 +1,7 @@
import expect from 'expect';
import Immutable from 'immutable';
import { authenticating, authenticate, authError } from '../../src/actions/auth';
import { auth } from '../../src/reducers/auth';
import { authenticating, authenticate, authError } from '../../actions/auth';
import auth from '../auth';
describe('auth', () => {
it('should handle an empty state', () => {

View File

@ -0,0 +1,26 @@
import expect from 'expect';
import { OrderedMap, fromJS } from 'immutable';
import { configLoaded } from '../../actions/config';
import collections from '../collections';
describe('collections', () => {
it('should handle an empty state', () => {
expect(
collections(undefined, {})
).toEqual(
null
);
});
it('should load the collections from the config', () => {
expect(
collections(undefined, configLoaded({ collections: [
{ name: 'posts', folder: '_posts', fields: [{ name: 'title', widget: 'string' }] }
] }))
).toEqual(
OrderedMap({
posts: fromJS({ name: 'posts', folder: '_posts', fields: [{ name: 'title', widget: 'string' }] })
})
);
});
});

View File

@ -1,7 +1,7 @@
import expect from 'expect';
import Immutable from 'immutable';
import { configLoaded, configLoading, configFailed } from '../../src/actions/config';
import { config } from '../../src/reducers/config';
import { configLoaded, configLoading, configFailed } from '../../actions/config';
import config from '../config';
describe('config', () => {
it('should handle an empty state', () => {

View File

@ -0,0 +1,47 @@
import expect from 'expect';
import { Map, OrderedMap, fromJS } from 'immutable';
import { entriesLoading, entriesLoaded } from '../../actions/entries';
import reducer from '../entries';
describe('entries', () => {
it('should mark entries as fetching', () => {
const state = OrderedMap({
'posts': Map({ name: 'posts' })
});
expect(
reducer(state, entriesLoading(Map({ name: 'posts' })))
).toEqual(
OrderedMap(fromJS({
'posts': { name: 'posts' },
'pages': {
'posts': { isFetching: true }
}
}))
);
});
it('should handle loaded entries', () => {
const state = OrderedMap({
'posts': Map({ name: 'posts' })
});
const entries = [{ slug: 'a', path: '' }, { slug: 'b', title: 'B' }];
expect(
reducer(state, entriesLoaded(Map({ name: 'posts' }), entries))
).toEqual(
OrderedMap(fromJS(
{
posts: { name: 'posts' },
entities: {
'posts.a': { slug: 'a', path: '', isFetching: false },
'posts.b': { slug: 'b', title: 'B', isFetching: false },
},
pages: {
posts: {
ids: ['a', 'b']
}
}
}
))
);
});
});

View File

@ -1,54 +0,0 @@
import expect from 'expect';
import { Map, OrderedMap, fromJS } from 'immutable';
import { configLoaded } from '../../src/actions/config';
import { entriesLoading, entriesLoaded } from '../../src/actions/entries';
import { collections } from '../../src/reducers/collections';
describe('collections', () => {
it('should handle an empty state', () => {
expect(
collections(undefined, {})
).toEqual(
null
);
});
it('should load the collections from the config', () => {
expect(
collections(undefined, configLoaded({ collections: [
{ name: 'posts', folder: '_posts', fields: [{ name: 'title', widget: 'string' }] }
] }))
).toEqual(
OrderedMap({
posts: fromJS({ name: 'posts', folder: '_posts', fields: [{ name: 'title', widget: 'string' }] })
})
);
});
it('should mark entries as loading', () => {
const state = OrderedMap({
'posts': Map({ name: 'posts' })
});
expect(
collections(state, entriesLoading(Map({ name: 'posts' })))
).toEqual(
OrderedMap({
'posts': Map({ name: 'posts', isFetching: true })
})
);
});
it('should handle loaded entries', () => {
const state = OrderedMap({
'posts': Map({ name: 'posts' })
});
const entries = [{ slug: 'a', path: '' }, { slug: 'b', title: 'B' }];
expect(
collections(state, entriesLoaded(Map({ name: 'posts' }), entries))
).toEqual(
OrderedMap({
'posts': fromJS({ name: 'posts', entries: entries })
})
);
});
});

View File

23
wallaby.config.js Normal file
View File

@ -0,0 +1,23 @@
process.env.BABEL_ENV = 'test';
module.exports = wallaby => ({
files: [
{ pattern: 'src/**/*.js' },
{ pattern: 'src/**/*.spec.js', ignore: true }
],
tests: [
{ pattern: 'src/**/*.spec.js' }
],
compilers: {
'src/**/*.js': wallaby.compilers.babel()
},
env: {
type: 'node',
runner: 'node'
},
testFramework: 'jest'
});