Skip to content

Commit 94b2283

Browse files
committed
#4 - continue main
1 parent a9c5707 commit 94b2283

File tree

6 files changed

+161
-58
lines changed

6 files changed

+161
-58
lines changed

__mocks__/simple-git/promise.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
const simpleGit = require('simple-git/promise');
2+
const {readdirSync} = require('fs');
3+
4+
let sg;
5+
const listeners = [];
6+
7+
module.exports = (localFolder) => {
8+
if (localFolder) {
9+
listeners.forEach(listener => {
10+
listener(localFolder);
11+
});
12+
sg = simpleGit(localFolder);
13+
}
14+
return {
15+
clone: async () => {
16+
await sg.init();
17+
},
18+
add: () => {
19+
// console.log('mock add!!!');
20+
},
21+
addConfig: () => {
22+
// console.log('mock addConfig!');
23+
},
24+
status: () => {
25+
return sg.status();
26+
},
27+
commit: async () => {
28+
// console.log('mock commit', readdirSync(localFolder));
29+
},
30+
push: () => {
31+
// console.log('mock push');
32+
},
33+
_dispose: () => {
34+
sg = null;
35+
}
36+
}
37+
}

__tests__/server.spec.ts

Lines changed: 72 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,90 @@
1-
import {get, Server} from 'http';
1+
// tslint:disable-next-line:no-implicit-dependencies
2+
import axios from 'axios';
3+
// tslint:disable-next-line:no-submodule-imports
4+
import * as simpleGit from 'simple-git/promise';
25
import {startServer} from '../src/server';
36

7+
jest.mock('simple-git/promise');
8+
49
describe('main', () => {
5-
const port = 15523;
6-
const baseUrl = `http://localhost:${port}`;
7-
let server: Server;
10+
let port;
11+
let baseUrl;
12+
let server;
13+
let sg;
814

9-
beforeEach(() => {
15+
beforeEach(async () => {
1016
try {
11-
server = startServer(port);
17+
// tslint:disable
18+
port = 3000 + Math.ceil(Math.random() * 1000);
19+
// tslint:enable
20+
process.env.PORT = port;
21+
baseUrl = `http://localhost:${port}`;
22+
server = await startServer();
23+
sg = simpleGit();
24+
25+
return server;
1226
} catch (error) {
1327
console.log(error, `can't start the server`);
1428
}
1529
});
1630

17-
afterEach(() => {
18-
server.close(() => {
19-
console.log('server closed');
20-
});
31+
afterEach(async () => {
32+
server.close();
33+
sg._dispose();
2134
})
2235

23-
it('GET /', done => {
24-
get(baseUrl, res => {
25-
expect(res.statusCode).toBe(200);
36+
// tslint:disable:mocha-unneeded-done
37+
it('GET /', async (done) => {
38+
const res = await axios(baseUrl);
39+
expect(res.status).toBe(200);
40+
expect(res.data).toBe('Hello World!');
41+
done();
42+
});
43+
44+
describe('POST /commit', () => {
45+
// tslint:disable-next-line:mocha-unneeded-done
46+
it('complete payload', async (done) => {
47+
const res = await axios({
48+
url: `http://localhost:${port}/commit`,
49+
method: 'POST',
50+
data: payload
51+
});
52+
expect(res.status).toBe(200);
53+
expect(res.data).toBe('done');
54+
const gitStatus = await sg.status();
55+
expect(
56+
gitStatus.files.map(file => file.path)
57+
).toEqual(
58+
payload.files.map(file => file.path)
59+
);
2660
done();
2761
});
2862
});
2963

30-
// it('POST /commit', done => {
31-
// // try {
32-
33-
// const req = request({host: 'localhost', port: port, method: 'POST', path: '/commit'}, res => {
34-
// console.log('res!!', res);
35-
// res.on('data', chunk => {
36-
// console.log('chunk', chunk);
37-
// expect(chunk).toBe('done');
38-
// done();
39-
// });
40-
// });
41-
42-
// // console.log('req', req);
43-
44-
// req.write(JSON.stringify({
45-
// "remoteRepo": "moshfeu/commit-bot-test",
46-
// "token": "7cb950575b914d7c36a8de37d9db056671e92788",
47-
// "commitMessage": "yet another commit",
48-
// "files": [
49-
// {
50-
// "path": "folder1/folder2/file3.js",
51-
// "content": "alert('blabla123')"
52-
// },
53-
// {
54-
// "path": "folder1/folder3/file4.ts",
55-
// "content": "import * as path from 'path';"
56-
// }
57-
// ]
58-
// }));
64+
it('not complete payload', async (done) => {
65+
const res = await axios({
66+
url: `http://localhost:${port}/commit`,
67+
method: 'POST',
68+
validateStatus: () => true
69+
});
5970

60-
// // console.log('req done');
61-
// // } catch (error) {
62-
// // console.log('error', error);
63-
// // }
71+
expect(res.status).toBe(500);
72+
done();
73+
});
74+
});
6475

65-
// // expect(1).toBe(1);
66-
// // done();
67-
// });
68-
});
76+
const payload = {
77+
"remoteRepo": "moshfeu/commit-bot-test",
78+
"token": "7cb950575b914d7c36a8de37d9db056671e92788",
79+
"commitMessage": "yet another commit",
80+
"files": [
81+
{
82+
"path": "folder1/folder2/file3.js",
83+
"content": "alert('blabla123')"
84+
},
85+
{
86+
"path": "folder1/folder3/file4.ts",
87+
"content": "import * as path from 'path';"
88+
}
89+
]
90+
};

jest.config.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ module.exports = {
1212
testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(js)x?$',
1313
coverageDirectory: 'coverage',
1414
collectCoverageFrom: [
15-
'src/**/*.{js,jsx}',
15+
'dist/src/**/*.{js,jsx}',
1616
'!src/**/*.d.ts',
1717
],
18+
moduleNameMapper: {
19+
"simple-git/promise": "<rootDir>/__mocks__/simple-git/promise.js"
20+
}
1821
};

package-lock.json

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
"tslint": "~5.11.0",
2020
"tslint-config-prettier": "1.15.0",
2121
"tslint-microsoft-contrib": "~5.2.1",
22-
"tsutils": "~3.0.0"
22+
"tsutils": "~3.0.0",
23+
"axios": "^0.18.0"
2324
},
2425
"scripts": {
2526
"debug": "tsc | nodemon dist/src/main.js --nolazy --debug-brk=5858",

src/server.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import * as bodyParser from 'body-parser';
22
import * as express from 'express';
3-
import { readdirSync } from 'fs';
43
import {Server} from 'http';
54
import {join} from 'path';
65
// tslint:disable-next-line:no-submodule-imports
76
import * as simpleGit from 'simple-git/promise';
8-
import{directory} from 'tempy';
7+
import {directory} from 'tempy';
98
import {writeFileDeepSync} from './utils';
109

11-
export function startServer(port = process.env.PORT || 3000): Server {
10+
export function startServer(port = process.env.PORT || 3000): Promise<Server> {
1211
const app = express();
1312

1413
app.use(bodyParser.json());
@@ -18,10 +17,16 @@ export function startServer(port = process.env.PORT || 3000): Server {
1817
app.post('/commit', async (req, res) => {
1918
const { remoteRepo, token, files, commitMessage } = req.body as {[key: string]: string | IFile[]};
2019

21-
const tempFolder = directory();
20+
if (!remoteRepo || !token || !files || !commitMessage) {
21+
res.status(500).send(`Payload isn't complete`);
22+
23+
return;
24+
}
2225

26+
const tempFolder = directory();
2327
const sg = simpleGit(tempFolder);
2428
await sg.clone(`https://${token}@github.com/${remoteRepo}.git`, tempFolder);
29+
2530
(<IFile[]>files).forEach((file: IFile) => {
2631
writeFileDeepSync(join(tempFolder, file.path), file.content);
2732
});
@@ -30,13 +35,18 @@ export function startServer(port = process.env.PORT || 3000): Server {
3035
await sg.addConfig('user.email', '[email protected]');
3136
await sg.addConfig('user.name', 'committer-bot');
3237

33-
await sg.commit(<string>commitMessage || 'unknow commit');
38+
await sg.commit(<string>commitMessage);
3439
await sg.push();
3540

3641
res.send('done');
3742
});
3843

39-
return app.listen(port, () => console.log(`Example app listening on port ${port}!`))
44+
return new Promise((resolve) => {
45+
const server = app.listen(port, () => {
46+
console.log(`Example app listening on port ${port}!`);
47+
resolve(server);
48+
});
49+
})
4050
}
4151

4252
interface IFile {

0 commit comments

Comments
 (0)