automock 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +11 -0
  5. data/CODE_OF_CONDUCT.md +49 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/LISENCE.txt +22 -0
  9. data/README.md +110 -0
  10. data/Rakefile +11 -0
  11. data/automock/data/test.json +1 -0
  12. data/automock/data/test2.json +1 -0
  13. data/automock.gemspec +27 -0
  14. data/bin/console +14 -0
  15. data/bin/server +3 -0
  16. data/bin/setup +13 -0
  17. data/lib/automock/response_mock.rb +55 -0
  18. data/lib/automock/rspec.rb +11 -0
  19. data/lib/automock/version.rb +3 -0
  20. data/lib/automock.rb +24 -0
  21. data/lib/tasks/automock.rake +31 -0
  22. data/server/.babelrc +3 -0
  23. data/server/.eslintrc +104 -0
  24. data/server/.flowconfig +11 -0
  25. data/server/.gitignore +4 -0
  26. data/server/app/db/database.json +10 -0
  27. data/server/app/db/sequelize.js +4 -0
  28. data/server/app/index.js +75 -0
  29. data/server/app/models/selected_file.js +11 -0
  30. data/server/app/proxy_server.js +50 -0
  31. data/server/assets/index.html +12 -0
  32. data/server/assets/javascripts/actions/mock_files_actions.js +18 -0
  33. data/server/assets/javascripts/actions/selected_files_actions.js +46 -0
  34. data/server/assets/javascripts/components/file_list.react.js +23 -0
  35. data/server/assets/javascripts/components/select_buttons.react.js +18 -0
  36. data/server/assets/javascripts/components/selectable_lists.react.js +44 -0
  37. data/server/assets/javascripts/containers/app.react.js +56 -0
  38. data/server/assets/javascripts/index.js +23 -0
  39. data/server/assets/javascripts/reducers/index.js +7 -0
  40. data/server/assets/javascripts/reducers/mock_files.js +11 -0
  41. data/server/assets/javascripts/reducers/selected_files.js +15 -0
  42. data/server/assets/stylesheets/application.scss +4 -0
  43. data/server/assets/stylesheets/components/_file_list.scss +9 -0
  44. data/server/assets/stylesheets/components/_select_buttons.scss +6 -0
  45. data/server/assets/stylesheets/components/_selectable_list.scss +3 -0
  46. data/server/bin/server +13 -0
  47. data/server/gulpfile.coffee +35 -0
  48. data/server/migrations/20160101185711-add-selected-files.js +15 -0
  49. data/server/migrations/20160102233558-add-columns-to-selected-files.js +17 -0
  50. data/server/package.json +58 -0
  51. data/server/test/fixtures/mock/api/v1/api_test.json +1 -0
  52. data/server/test/fixtures/mock/test.json +1 -0
  53. data/server/test/request/common_hooks.js +20 -0
  54. data/server/test/request/mock_files_test.js +34 -0
  55. data/server/test/request/selected_files_test.js +63 -0
  56. metadata +182 -0
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ const express = require('express');
4
+ const app = express();
5
+ const recursive = require('recursive-readdir');
6
+ const path = require('path');
7
+ const SelectedFile = require('./models/selected_file');
8
+ const bodyParser = require('body-parser');
9
+ const fs = require('fs');
10
+
11
+ app.use(express.static(__dirname + '/assets'));
12
+ app.use(bodyParser.urlencoded());
13
+ app.use(bodyParser.json());
14
+ let proxyServer;
15
+
16
+ app.get('/mock_files', function(_req, res){
17
+ recursive(process.env.AUTOMOCK_DATA_PATH, (_err, filePaths) => {
18
+ Promise.all(filePaths.map((filePath) =>
19
+ new Promise((resolve) => {
20
+ fs.readFile(filePath, 'utf8', (_err2, text) => {
21
+ const mockData = JSON.parse(text);
22
+ mockData.name = path.relative(process.env.AUTOMOCK_DATA_PATH, filePath);
23
+ resolve(mockData);
24
+ });
25
+ })
26
+ )).then((files) => {
27
+ res.status(200).send(files);
28
+ });
29
+ });
30
+ });
31
+
32
+ app.get('/selected_files', function(req, res){
33
+ SelectedFile.findAll().
34
+ then((files) => {
35
+ const response = files.map((file) => {
36
+ return {
37
+ id: file.id,
38
+ name: file.name
39
+ };
40
+ });
41
+ res.status(200).send(response);
42
+ });
43
+ });
44
+
45
+ app.post('/selected_files', function(req, res){
46
+ SelectedFile.create({
47
+ name: req.body.name,
48
+ uri: req.body.uri,
49
+ method: req.body.method
50
+ }).then((selectedFile) => {
51
+ res.status(201).send(selectedFile);
52
+ if (proxyServer) {
53
+ proxyServer.loadSelectedFiles();
54
+ }
55
+ });
56
+ });
57
+
58
+ app.delete('/selected_files/:id', function(req, res){
59
+ SelectedFile.destroy({ where: { id: req.params.id } }).then(() => {
60
+ res.status(204).send();
61
+ if (proxyServer) {
62
+ proxyServer.loadSelectedFiles();
63
+ }
64
+ });
65
+ });
66
+
67
+ if (!module.parent) {
68
+ app.listen(process.env.AUTOMOCK_PORT || 8000);
69
+ const ProxyServer = require('./proxy_server');
70
+ proxyServer = new ProxyServer();
71
+ proxyServer.start();
72
+ }
73
+
74
+
75
+ module.exports = app;
@@ -0,0 +1,11 @@
1
+ const Sequelize = require('sequelize');
2
+ const sequelize = require('./../db/sequelize');
3
+ const SelectedFile = sequelize.define('selected_files', {
4
+ name: { type: Sequelize.STRING },
5
+ method: { type: Sequelize.STRING },
6
+ uri: { type: Sequelize.STRING }
7
+ }, {
8
+ freezeTableName: true
9
+ });
10
+
11
+ module.exports = SelectedFile;
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ const httpProxy = require('http-proxy');
4
+ const SelectedFile = require('./models/selected_file');
5
+ const _ = require('underscore');
6
+ const fs = require('fs');
7
+
8
+ class ProxyServer {
9
+ constructor() {
10
+ const targetPort = process.env.AUTOMOCK_TARGET_PORT || 3000;
11
+ const proxyPort = process.env.AUTOMOCK_PROXY_PORT || 8001;
12
+ this.server = httpProxy.createProxyServer({
13
+ target:`http://localhost:${targetPort}`
14
+ }).listen(proxyPort);
15
+ this.selectedFiles = [];
16
+ }
17
+
18
+ loadSelectedFiles() {
19
+ SelectedFile.findAll().then((records) => {
20
+ this.selectedFiles = records;
21
+ });
22
+ }
23
+
24
+ start() {
25
+ this.loadSelectedFiles();
26
+ this.server.on('proxyRes', (_proxyRes, req, res) => {
27
+ const lookupedSelectedFile = _.find(this.selectedFiles, (selectedFile) =>
28
+ (selectedFile.uri === req.url) && (selectedFile.method === req.method)
29
+ );
30
+ if (lookupedSelectedFile) {
31
+ const write = res.write, writeHead = res.writeHead, end = res.end, bufs = [];
32
+ res.writeHead = (_status, _headers) => {
33
+ res.write = (body) => {
34
+ bufs.push(body);
35
+ };
36
+ res.end = () => {
37
+ fs.readFile(`${process.env.AUTOMOCK_DATA_PATH}/${lookupedSelectedFile.name}`, 'utf8', function (_err, text) {
38
+ const mockData = JSON.parse(text);
39
+ writeHead.call(res, mockData.status, mockData.response_header);
40
+ write.call(res, mockData.response_body);
41
+ end.call(res);
42
+ });
43
+ };
44
+ };
45
+ }
46
+ });
47
+ }
48
+ }
49
+
50
+ module.exports = ProxyServer;
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>automock</title>
6
+ <link rel="stylesheet" href="stylesheets/application.css" media="screen">
7
+ </head>
8
+ <body>
9
+ <div id="application"></div>
10
+ <script src="bundle.js"></script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,18 @@
1
+ /* flow */
2
+
3
+ import request from 'superagent';
4
+ export const GET_MOCK_FILES = 'GET_MOCK_FILES';
5
+
6
+ export function getMockFiles() {
7
+ return (dispatch) => {
8
+ request.
9
+ get('./mock_files').
10
+ end((_err, res) => {
11
+ dispatch({
12
+ type: GET_MOCK_FILES,
13
+ mockFiles: res.body
14
+ });
15
+ }
16
+ );
17
+ };
18
+ }
@@ -0,0 +1,46 @@
1
+ /* flow */
2
+
3
+ import request from 'superagent';
4
+ export const GET_SELECTED_FILES = 'GET_SELECTED_FILES';
5
+ export const CREATE_SELECTED_FILES = 'CREATE_SELECTED_FILES';
6
+ export const DELETE_SELECTED_FILES = 'DELETE_SELECTED_FILES';
7
+
8
+ export function getSelectedFiles() {
9
+ return (dispatch) => {
10
+ request.
11
+ get('/selected_files').
12
+ end((_err, res) => {
13
+ dispatch({
14
+ type: GET_SELECTED_FILES,
15
+ selectedFiles: res.body
16
+ });
17
+ }
18
+ );
19
+ };
20
+ }
21
+
22
+ export function createSelectedFile(file) {
23
+ return (dispatch) => {
24
+ request.
25
+ post('/selected_files').
26
+ send(file).
27
+ end((_err, res) => {
28
+ dispatch({
29
+ type: CREATE_SELECTED_FILES,
30
+ selectedFile: res.body
31
+ });
32
+ }
33
+ );
34
+ };
35
+ }
36
+
37
+ export function deleteSelectedFile(id) {
38
+ return (dispatch) => {
39
+ request.
40
+ delete(`/selected_files/${id}`).
41
+ end((_err, _res) => {
42
+ dispatch({ type: DELETE_SELECTED_FILES, id });
43
+ }
44
+ );
45
+ };
46
+ }
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+
3
+ export default class FileList extends React.Component {
4
+ handleSelect(e) {
5
+ const selectedFile = this.props.files.filter((file) => file.name === e.target.value).toArray()[0];
6
+ this.props.onChange(selectedFile);
7
+ }
8
+ render() {
9
+ const options = this.props.files.map((file) =>
10
+ <option value={file.name} key={file.name}>{file.name}</option>
11
+ );
12
+ return(
13
+ <div className="file-list col-xs-5">
14
+ <div className="title">{this.props.title}</div>
15
+ <div>
16
+ <select size="10" onChange={this.handleSelect.bind(this)}>
17
+ {options}
18
+ </select>
19
+ </div>
20
+ </div>
21
+ );
22
+ }
23
+ };
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+
3
+ export default class SelectButtons extends React.Component {
4
+ handleClickSelectButton() {
5
+ this.props.onClickSelectButton(this.props.selectedFromNotSelectedFiles);
6
+ }
7
+ handleClickUnselectButton() {
8
+ this.props.onClickUnselectButton(this.props.selectedFromSelectedFiles.id);
9
+ }
10
+ render() {
11
+ return(
12
+ <div className="select-buttons col-xs-1">
13
+ <button className="btn btn-primary" onClick={this.handleClickSelectButton.bind(this)}>→</button>
14
+ <button className="btn" onClick={this.handleClickUnselectButton.bind(this)}>←</button>
15
+ </div>
16
+ );
17
+ }
18
+ };
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+ import FileList from './file_list';
3
+ import SelectButtons from './select_buttons';
4
+
5
+ export default class SelectableLists extends React.Component {
6
+ constructor() {
7
+ super();
8
+ this.state = {
9
+ selectedFromNotSelectedFiles: '',
10
+ selectedFromSelectedFiles: ''
11
+ };
12
+ }
13
+
14
+ handleSelectFromNotSelectedFiles(selectedFile) {
15
+ this.setState({ selectedFromNotSelectedFiles: selectedFile });
16
+ }
17
+
18
+ handleSelectFromSelectedFiles(selectedFile) {
19
+ this.setState({ selectedFromSelectedFiles: selectedFile });
20
+ }
21
+
22
+ render() {
23
+ const { selectedFiles, unselectedFiles } = this.props;
24
+ return(
25
+ <div className="selectable-lists row">
26
+ <FileList
27
+ title={"not selected files"}
28
+ files={unselectedFiles}
29
+ onChange={this.handleSelectFromNotSelectedFiles.bind(this)}
30
+ />
31
+ <SelectButtons
32
+ onClickSelectButton={this.props.onCreateSelectedFile}
33
+ onClickUnselectButton={this.props.onDeleteSelectedFile}
34
+ {...this.state}
35
+ />
36
+ <FileList
37
+ title={"selected files"}
38
+ files={selectedFiles}
39
+ onChange={this.handleSelectFromSelectedFiles.bind(this)}
40
+ />
41
+ </div>
42
+ );
43
+ }
44
+ };
@@ -0,0 +1,56 @@
1
+ import React from 'react';
2
+ import { bindActionCreators } from 'redux';
3
+ import { connect } from 'react-redux';
4
+ import * as SelectedFilesActions from '../actions/selected_files_actions';
5
+ import * as MockFilesActions from '../actions/mock_files_actions';
6
+ import SelectableLists from './../components/selectable_lists';
7
+ import assign from 'object-assign';
8
+ import _ from 'underscore';
9
+
10
+ class AppContainer extends React.Component {
11
+ componentDidMount() {
12
+ const { getSelectedFiles, getMockFiles } = this.props;
13
+ getSelectedFiles();
14
+ getMockFiles();
15
+ }
16
+
17
+ handleCreateSelectedFile(file) {
18
+ const { createSelectedFile } = this.props;
19
+ createSelectedFile(file);
20
+ }
21
+
22
+ handleDeleteSelectedFile(id) {
23
+ const { deleteSelectedFile } = this.props;
24
+ deleteSelectedFile(id);
25
+ }
26
+
27
+ render() {
28
+ const { selectedFiles, mockFiles } = this.props;
29
+ const selectedFileNames = selectedFiles.map((file) => file.name).toArray();
30
+ const unselectedFiles = mockFiles.filter((file) => !_.includes(selectedFileNames, file.name));
31
+ return (
32
+ <div className="container">
33
+ <SelectableLists
34
+ selectedFiles={selectedFiles}
35
+ unselectedFiles={unselectedFiles}
36
+ onCreateSelectedFile={this.handleCreateSelectedFile.bind(this)}
37
+ onDeleteSelectedFile={this.handleDeleteSelectedFile.bind(this)}
38
+ />
39
+ </div>
40
+ );
41
+ }
42
+ }
43
+
44
+ function mapStateToProps(state) {
45
+ return {
46
+ selectedFiles: state.selectedFiles,
47
+ mockFiles: state.mockFiles
48
+ };
49
+ }
50
+
51
+ function mapDispatchToProps(dispatch) {
52
+ const actions = assign({}, SelectedFilesActions, MockFilesActions);
53
+ return bindActionCreators(actions, dispatch);
54
+ }
55
+
56
+ export default connect(mapStateToProps, mapDispatchToProps)(AppContainer);
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import { render } from 'react-dom';
3
+ import { createStore, applyMiddleware } from 'redux';
4
+ import { Provider } from 'react-redux';
5
+ import App from './containers/app';
6
+ import reducers from './reducers';
7
+ import thunk from 'redux-thunk';
8
+ import logger from 'redux-logger';
9
+
10
+ const middleware = process.env.NODE_ENV === 'production' ?
11
+ [ thunk ] :
12
+ [ thunk, logger() ];
13
+
14
+ const createStoreWithMiddleware = applyMiddleware(...middleware)(createStore);
15
+ const store = createStoreWithMiddleware(reducers);
16
+
17
+ const rootElement = document.getElementById('application');
18
+ render(
19
+ <Provider store={store}>
20
+ <App />
21
+ </Provider>,
22
+ rootElement
23
+ );
@@ -0,0 +1,7 @@
1
+ import { combineReducers } from 'redux';
2
+ import selectedFiles from './selected_files';
3
+ import mockFiles from './mock_files';
4
+
5
+ const rootReducer = combineReducers({ selectedFiles, mockFiles });
6
+
7
+ export default rootReducer;
@@ -0,0 +1,11 @@
1
+ import { List } from 'immutable';
2
+ import { GET_MOCK_FILES } from '../actions/mock_files_actions';
3
+
4
+ export default function mockFiles(state = List(), action) {
5
+ switch (action.type) {
6
+ case GET_MOCK_FILES:
7
+ return List(action.mockFiles);
8
+ default:
9
+ return state;
10
+ }
11
+ }
@@ -0,0 +1,15 @@
1
+ import { List } from 'immutable';
2
+ import { GET_SELECTED_FILES, CREATE_SELECTED_FILES, DELETE_SELECTED_FILES } from '../actions/selected_files_actions';
3
+
4
+ export default function selectedFiles(state = List(), action) {
5
+ switch (action.type) {
6
+ case GET_SELECTED_FILES:
7
+ return List(action.selectedFiles);
8
+ case CREATE_SELECTED_FILES:
9
+ return state.push(action.selectedFile);
10
+ case DELETE_SELECTED_FILES:
11
+ return state.filter((file) => file.id !== action.id);
12
+ default:
13
+ return state;
14
+ }
15
+ }
@@ -0,0 +1,4 @@
1
+ @import 'bootstrap/scss/bootstrap';
2
+ @import './components/selectable_list';
3
+ @import './components/file_list';
4
+ @import './components/select_buttons';
@@ -0,0 +1,9 @@
1
+ .file-list {
2
+ select { width: 100%; }
3
+ .title {
4
+ background-color: gray;
5
+ color: white;
6
+ padding: 6px;
7
+ text-align: center;
8
+ }
9
+ }
@@ -0,0 +1,6 @@
1
+ .select-buttons {
2
+ button {
3
+ display: block;
4
+ margin: 50px 0;
5
+ }
6
+ }
@@ -0,0 +1,3 @@
1
+ .selectable-lists {
2
+ margin-top: 50px;
3
+ }
data/server/bin/server ADDED
@@ -0,0 +1,13 @@
1
+ # starting server from rake task
2
+
3
+ if [ $# -ne 4 ]; then
4
+ echo "empty args!" 1>&2
5
+ exit 1
6
+ fi
7
+
8
+ export AUTOMOCK_DATA_PATH=$1
9
+ export AUTOMOCK_PORT=$2
10
+ export AUTOMOCK_TARGET_PORT=$3
11
+ export AUTOMOCK_PROXY_PORT=$4
12
+
13
+ node app/index.js
@@ -0,0 +1,35 @@
1
+ gulp = require 'gulp'
2
+ babelify = require 'babelify'
3
+ browserify = require 'browserify'
4
+ source = require 'vinyl-source-stream'
5
+ sass = require 'gulp-sass'
6
+ seq = require 'run-sequence'
7
+
8
+ gulp.path =
9
+ src: 'assets'
10
+ dist: 'app/assets'
11
+
12
+ gulp.task 'build', ->
13
+ seq ['build:html', 'build:browserify', 'build:scss']
14
+
15
+ gulp.task 'build:html', ->
16
+ gulp.src "#{@path.src}/**/*.html"
17
+ .pipe gulp.dest(@path.dist)
18
+
19
+ gulp.task 'build:browserify', ->
20
+ browserify(
21
+ entries: ["#{@path.src}/javascripts/index.js"]
22
+ extensions: ['.js', '.react.js']
23
+ ).transform(babelify)
24
+ .bundle()
25
+ .pipe source 'bundle.js'
26
+ .pipe gulp.dest(@path.dist)
27
+
28
+ gulp.task 'build:scss', ->
29
+ gulp.src "#{@path.src}/**/*.scss"
30
+ .pipe sass({ includePaths: [ 'node_modules' ] }).on('error', sass.logError)
31
+ .pipe gulp.dest(@path.dist)
32
+
33
+ gulp.task 'watch', ['build'], ->
34
+ gulp.watch("#{@path.src}/**/*.js", ['build:browserify'])
35
+ gulp.watch("#{@path.src}/**/*.scss", ['build:scss'])
@@ -0,0 +1,15 @@
1
+ var dbm = global.dbm || require('db-migrate');
2
+ var type = dbm.dataType;
3
+
4
+ exports.up = function(db, callback) {
5
+ db.createTable('selected_files', {
6
+ id: { type: 'int', primaryKey: true, autoIncrement: true },
7
+ name: { type: 'string', unique: true, notNull: 'true' },
8
+ createdAt: { type: 'datetime' },
9
+ updatedAt: { type: 'datetime' }
10
+ }, callback);
11
+ };
12
+
13
+ exports.down = function(db, callback) {
14
+ callback();
15
+ };
@@ -0,0 +1,17 @@
1
+ var dbm = global.dbm || require('db-migrate');
2
+ var type = dbm.dataType;
3
+ var async = require('async');
4
+
5
+ exports.up = function(db, callback) {
6
+ async.series([
7
+ db.addColumn.bind(db, 'selected_files', 'method', { type: 'string', notNull: true, defaultValue: 'dummy' }),
8
+ db.addColumn.bind(db, 'selected_files', 'uri', { type: 'string', notNull: true, defaultValue: 'dummy' })
9
+ ], callback);
10
+ };
11
+
12
+ exports.down = function(db, callback) {
13
+ async.series([
14
+ db.removeColumn.bind(db, 'selected_files', 'method'),
15
+ db.removeColumn.bind(db, 'selected_files', 'uri')
16
+ ], callback);
17
+ };
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "automock",
3
+ "devDependencies": {
4
+ "async": "^1.5.1",
5
+ "babel": "^6.1.18",
6
+ "babel-cli": "^6.2.0",
7
+ "babel-core": "^6.3.26",
8
+ "babel-preset-es2015": "^6.1.18",
9
+ "babel-preset-react": "^6.3.13",
10
+ "babelify": "^7.2.0",
11
+ "browserify": "^12.0.1",
12
+ "coffee-script": "^1.10.0",
13
+ "db-migrate": "^0.9.23",
14
+ "gulp": "^3.9.0",
15
+ "gulp-sass": "^2.1.1",
16
+ "http-proxy": "^1.12.0",
17
+ "mocha": "^2.3.4",
18
+ "power-assert": "^1.2.0",
19
+ "redux-devtools": "^3.0.1",
20
+ "run-sequence": "^1.1.5",
21
+ "supertest": "^1.1.0",
22
+ "vinyl-source-stream": "^1.1.0"
23
+ },
24
+ "dependencies": {
25
+ "body-parser": "^1.14.2",
26
+ "bootstrap": "^4.0.0-alpha.2",
27
+ "express": "^4.13.3",
28
+ "immutable": "^3.7.6",
29
+ "object-assign": "^4.0.1",
30
+ "react": "^0.14.3",
31
+ "react-dom": "^0.14.3",
32
+ "react-redux": "^4.0.5",
33
+ "recursive-readdir": "^1.3.0",
34
+ "redux": "^3.0.5",
35
+ "redux-logger": "^2.3.1",
36
+ "redux-thunk": "^1.0.2",
37
+ "sequelize": "^3.15.1",
38
+ "sqlite3": "^3.1.1",
39
+ "superagent": "^1.6.1",
40
+ "underscore": "^1.8.3"
41
+ },
42
+ "scripts": {
43
+ "test": "mocha --require babel-core/register --recursive test",
44
+ "build": "gulp build",
45
+ "watch": "gulp watch"
46
+ },
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/joe-re/automock.git"
50
+ },
51
+ "keywords": [],
52
+ "author": "",
53
+ "license": "MIT",
54
+ "bugs": {
55
+ "url": "https://github.com/joe-re/automock/issues"
56
+ },
57
+ "homepage": "https://github.com/joe-re/automock#readme"
58
+ }
@@ -0,0 +1 @@
1
+ {"description":"description","method":"GET","uri":"/api/v1/users","status": "200","response_body":"{\"users\":[{\"username\":\"sample\",\"email\":\"sample@ggg.com\"}]}"}
@@ -0,0 +1 @@
1
+ {"description":"api description","method":"POST","uri":"/api/v1/users","status": "201","response_body":"{\"users\":[{\"username\":\"sample\",\"email\":\"sample@ggg.com\"}]}"}
@@ -0,0 +1,20 @@
1
+ process.env.AUTOMOCK_DATA_PATH=__dirname + '/../fixtures/mock';
2
+ process.env.NODE_ENV='test';
3
+
4
+ const sequelize = require('../../app/db/sequelize');
5
+ const SelectedFile = require('../../app/models/selected_file');
6
+
7
+ before(function() {
8
+ const execSync = require('child_process').execSync;
9
+ execSync('node ./node_modules/db-migrate/bin/db-migrate up --config app/db/database.json -e test');
10
+ });
11
+
12
+ beforeEach(function () {
13
+ SelectedFile.truncate();
14
+ });
15
+
16
+ after(function() {
17
+ sequelize.
18
+ getQueryInterface().
19
+ dropAllTables();
20
+ });
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ require('./common_hooks');
4
+ const request = require('supertest');
5
+
6
+ let server;
7
+ describe('GET /mock_files', function () {
8
+ beforeEach(function () {
9
+ server = require('./../../app/index');
10
+ });
11
+ it('receives mock_files and 200', function testSlash(done) {
12
+ request(server).
13
+ get('/mock_files').
14
+ expect(200, [
15
+ {
16
+ description: 'api description',
17
+ method: 'POST',
18
+ name: 'test.json',
19
+ status: '201',
20
+ response_body: '{\"users\":[{\"username\":\"sample\",\"email\":\"sample@ggg.com\"}]}',
21
+ uri: '/api/v1/users'
22
+ },
23
+ {
24
+ description: 'description',
25
+ method: 'GET',
26
+ name: 'api/v1/api_test.json',
27
+ status: '200',
28
+ response_body: '{\"users\":[{\"username\":\"sample\",\"email\":\"sample@ggg.com\"}]}',
29
+ uri: '/api/v1/users'
30
+ }
31
+ ], done);
32
+ });
33
+ });
34
+