Skip to content

Commit

Permalink
Migrate browser-tests to DI
Browse files Browse the repository at this point in the history
  • Loading branch information
KevinGrandon authored and fusion-bot[bot] committed Feb 5, 2018
1 parent a56765c commit 560a110
Show file tree
Hide file tree
Showing 7 changed files with 1,651 additions and 1,386 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ config/secrets/secrets.json
selenium-debug.log
yarn-error.log
node_modules
npm-debug.log
reports
53 changes: 27 additions & 26 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,25 @@
},
"dependencies": {
"fast-async": "^6.3.0",
"fusion-cli": "^0.2.5",
"fusion-core": "^0.2.7",
"fusion-plugin-browser-performance-emitter": "^0.1.11",
"fusion-plugin-csrf-protection-react": "^0.2.1",
"fusion-plugin-error-handling": "0.1.13",
"fusion-plugin-font-loader-react": "0.2.1",
"fusion-plugin-i18n-react": "^0.1.10",
"fusion-plugin-jwt": "^0.2.2",
"fusion-plugin-node-performance-emitter": "^0.2.0",
"fusion-plugin-react-redux": "^0.1.13",
"fusion-plugin-react-router": "^0.2.3",
"fusion-plugin-rpc-redux-react": "^0.2.4",
"fusion-plugin-styletron-react": "^0.2.2",
"fusion-plugin-universal-events-react": "^0.1.12",
"fusion-plugin-universal-logger": "^0.2.0",
"fusion-react": "^0.1.10",
"fusion-react-async": "^0.1.4",
"fusion-redux-action-emitter-enhancer": "^0.1.5",
"fusion-cli": "^0.3.2",
"fusion-core": "0.3.5",
"fusion-plugin-browser-performance-emitter": "^0.2.2",
"fusion-plugin-csrf-protection-react": "^0.3.6",
"fusion-plugin-error-handling": "^0.2.3",
"fusion-plugin-font-loader-react": "^0.3.3",
"fusion-plugin-i18n-react": "^0.3.5",
"fusion-plugin-jwt": "^0.3.5",
"fusion-plugin-node-performance-emitter": "^0.3.4",
"fusion-plugin-react-redux": "^0.2.3",
"fusion-plugin-react-router": "^0.4.3",
"fusion-plugin-redux-action-emitter-enhancer": "^0.2.2",
"fusion-plugin-rpc-redux-react": "^0.3.2",
"fusion-plugin-styletron-react": "^0.4.2",
"fusion-plugin-universal-events-react": "^0.3.4",
"fusion-plugin-universal-logger": "^0.4.2",
"fusion-react": "^0.4.3",
"fusion-react-async": "^0.2.0",
"fusion-tokens": "^0.0.6",
"react": "^16.2.0",
"react-dom": "^16.2.0",
"react-redux": "^5.0.6",
Expand All @@ -48,20 +49,20 @@
"winston": "^2.4.0"
},
"devDependencies": {
"babel-eslint": "^8.1.2",
"babel-eslint": "^8.2.1",
"enzyme": "^3.3.0",
"eslint": "^4.15.0",
"eslint": "^4.17.0",
"eslint-config-fusion": "^0.2.1",
"eslint-plugin-cup": "^1.0.0",
"eslint-plugin-flowtype": "^2.41.0",
"eslint-plugin-flowtype": "^2.42.0",
"eslint-plugin-import": "^2.8.0",
"eslint-plugin-prettier": "^2.4.0",
"eslint-plugin-react": "^7.5.1",
"flow-bin": "^0.63.1",
"eslint-plugin-prettier": "^2.6.0",
"eslint-plugin-react": "^7.6.1",
"flow-bin": "^0.64.0",
"nightmare": "^2.10.0",
"nightwatch": "^0.9.19",
"node-fetch": "^1.7.3",
"prettier": "1.9.2",
"node-fetch": "^2.0.0",
"prettier": "1.10.2",
"react-addons-test-utils": "^15.6.2",
"react-hot-loader": "^3.1.3",
"react-test-renderer": "^16.2.0",
Expand Down
134 changes: 71 additions & 63 deletions src/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,41 @@
*/

import App from 'fusion-react';
import JWTSession from 'fusion-plugin-jwt';
import CsrfProtection from 'fusion-plugin-csrf-protection-react';
import JWTSession, {
SessionCookieNameToken,
SessionSecretToken,
} from 'fusion-plugin-jwt';
import CsrfProtection, {
FetchForCsrfToken,
} from 'fusion-plugin-csrf-protection-react';
import Router from 'fusion-plugin-react-router';
import I18n from 'fusion-plugin-i18n-react';
import UniversalEvents from 'fusion-plugin-universal-events-react';
import I18n, {I18nToken, I18nLoaderToken} from 'fusion-plugin-i18n-react';
import UniversalEvents, {
UniversalEventsToken,
} from 'fusion-plugin-universal-events-react';
import UniversalLogger from 'fusion-plugin-universal-logger';
import Styletron from 'fusion-plugin-styletron-react';
import {FontPlugin} from 'fusion-plugin-font-loader-react';
import RPC from 'fusion-plugin-rpc-redux-react';
import Redux from 'fusion-plugin-react-redux';
import ErrorHandling from 'fusion-plugin-error-handling';
import NodePerformanceEmitter from 'fusion-plugin-node-performance-emitter';
import FontLoaderReactPlugin, {
FontLoaderReactConfigToken,
} from 'fusion-plugin-font-loader-react';
import RPC, {RPCToken, RPCHandlersToken} from 'fusion-plugin-rpc-redux-react';
import Redux, {
ReduxToken,
ReducerToken,
EnhancerToken,
InitialStateToken,
} from 'fusion-plugin-react-redux';
import ErrorHandling, {ErrorHandlerToken} from 'fusion-plugin-error-handling';
import NodePerformanceEmitterPlugin, {
NodePerformanceEmitterToken,
EventLoopLagIntervalToken,
MemoryIntervalToken,
SocketIntervalToken,
} from 'fusion-plugin-node-performance-emitter';
import BrowserPerformanceEmitter from 'fusion-plugin-browser-performance-emitter';
import actionEmitter from 'fusion-redux-action-emitter-enhancer';
import ReduxActionEmitterEnhancer from 'fusion-plugin-redux-action-emitter-enhancer';
import unfetch from 'unfetch';
import {Plugin} from 'fusion-core';

import loggerConfig from './config/logger';
import {LoggerToken, FetchToken, SessionToken} from 'fusion-tokens';

import root from './components/root';
import rpcExample from './rpc/rpc-example';
Expand All @@ -31,65 +48,56 @@ import reducer from './reducers/root';

import {preloadDepth, fonts} from './font-config.js';

const MemoryTranslationsLoader = new Plugin({
Service: class MemoryTranslations {
constructor() {
if (__NODE__) {
this.locale = 'en-US';
this.translations = require('../translations/en-US.json');
}
}
},
});
import translations from '../translations/en-US.json';

export default function start() {
const app = new App(root);

const Session = app.plugin(JWTSession, {secret: __NODE__ ? 'abcdefg' : ''});
const {fetch, ignore} = app
.plugin(CsrfProtection, {
Session,
fetch: unfetch,
})
.of();
const EventEmitter = app.plugin(UniversalEvents, {fetch});

app.plugin(Router, {EventEmitter});
app.plugin(Styletron);
app.plugin(FontPlugin, {preloadDepth, fonts});
app.plugin(
I18n,
__BROWSER__ ? {fetch} : {TranslationsLoader: MemoryTranslationsLoader}
);
app.plugin(Redux, {reducer, enhancer: actionEmitter(EventEmitter)});
app.plugin(RPC, {handlers: __NODE__ && rpcExample(), fetch});

if (__NODE__) {
const nodePerfConfig = {
eventLoopLagInterval: 1000 * 10,
memoryInterval: 1000 * 10,
socketInterval: 1000 * 10,
const MemoryTranslationsLoader = {
from: () => ({
locale: 'en-US',
translations,
}),
};
app.plugin(NodePerformanceEmitter, {
config: nodePerfConfig,
EventEmitter,
});
}
app.plugin(BrowserPerformanceEmitter, {EventEmitter});
const Logger = app.plugin(UniversalLogger, {
UniversalEvents: EventEmitter,
config: loggerConfig,
});
if (__NODE__) {
Logger.of().info('Hello from server!');
app.register(I18nLoaderToken, MemoryTranslationsLoader);
app.register(SessionToken, JWTSession);
app.register(SessionSecretToken, 'abcdefg');
app.register(SessionCookieNameToken, 'temp');
app.register(RPCHandlersToken, rpcExample());
app.register(RPCToken, RPC);
} else if (__BROWSER__) {
app.register(FetchForCsrfToken, unfetch);
app.register(RPCToken, RPC);
}
app.register(FetchToken, CsrfProtection);
app.register(UniversalEventsToken, UniversalEvents);
app.register(Router);
app.register(Styletron);

app.register(FontLoaderReactConfigToken, {preloadDepth, fonts});
app.register(FontLoaderReactPlugin);
app.register(I18nToken, I18n);

app.plugin(ErrorHandling, {
onError: e => Logger.of().error(e),
CsrfProtection: {ignore},
});
app.register(ReduxToken, Redux);
app.register(ReducerToken, reducer);
app.register(EnhancerToken, ReduxActionEmitterEnhancer);

app.plugin(CsrfProtectionExample);
if (__NODE__) {
app.register(InitialStateToken, async () => {
return {};
});
app.register(NodePerformanceEmitterToken, NodePerformanceEmitterPlugin);
app.register(EventLoopLagIntervalToken, 1000 * 10);
app.register(MemoryIntervalToken, 1000 * 10);
app.register(SocketIntervalToken, 1000 * 10);
// eslint-disable-next-line no-console
app.register(ErrorHandlerToken, e => console.log('error!', e));
}
app.register(ErrorHandling);
app.register(BrowserPerformanceEmitter);
app.register(LoggerToken, UniversalLogger);
__NODE__ && app.register(CsrfProtectionExample);

return app;
}
14 changes: 8 additions & 6 deletions src/reducers/root.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ import rpcCount from './rpc-count';
import loading from './loading';
import error from './error';

export default (state = {}, action) => ({
count: count(state.count, action),
rpcCount: rpcCount(state.rpcCount, action),
loading: loading(state.loading, action),
error: error(state.error, action),
});
export default (state, action) => {
return {
count: count(state.count, action),
rpcCount: rpcCount(state.rpcCount, action),
loading: loading(state.loading, action),
error: error(state.error, action),
};
};
18 changes: 12 additions & 6 deletions src/rpc/csrf-protection-example.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,15 @@
* LICENSE file in the root directory of this source tree.
*/

export default () => (ctx, next) => {
if (ctx.path === ctx.prefix + '/test-fetch' && ctx.method === 'POST') {
ctx.body = 'hello world';
}
return next();
};
import {createPlugin} from 'fusion-core';

export default createPlugin({
middleware: () => {
return (ctx, next) => {
if (ctx.path === ctx.prefix + '/test-fetch' && ctx.method === 'POST') {
ctx.body = 'hello world';
}
return next();
};
},
});
38 changes: 18 additions & 20 deletions src/rpc/rpc-example.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,22 @@
*/

export default (/* some provisioned db/micro-service */) => {
if (__NODE__) {
let rpcCount = 0; // we're storing things in memory for this example
return {
echo(arg) {
return arg;
},
getCount() {
return {rpcCount}; // normally we'd call some data store or microservice API here
},
increment() {
if (rpcCount > 5) throw new Error('Test error');
rpcCount++;
return {rpcCount};
},
decrement() {
rpcCount--;
return {rpcCount};
},
};
}
let rpcCount = 0; // we're storing things in memory for this example
return {
echo(arg) {
return arg;
},
getCount() {
return {rpcCount}; // normally we'd call some data store or microservice API here
},
increment() {
if (rpcCount > 5) throw new Error('Test error');
rpcCount++;
return {rpcCount};
},
decrement() {
rpcCount--;
return {rpcCount};
},
};
};
Loading

0 comments on commit 560a110

Please sign in to comment.