Skip to content

Commit 974c282

Browse files
committed
add initial codebase
1 parent 7599e4c commit 974c282

File tree

4 files changed

+268
-0
lines changed

4 files changed

+268
-0
lines changed

Diff for: index.js

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
'use strict';
2+
3+
var express = require('express');
4+
var cors = require('cors');
5+
var app = express();
6+
var bodyParser = require('body-parser');
7+
var validate = require('express-jsonschema').validate;
8+
app.use(bodyParser.json());
9+
app.use(cors());
10+
11+
var betsSchema = {
12+
type: 'object',
13+
properties: {
14+
bet_id: {
15+
type: 'number',
16+
required: true
17+
},
18+
stake: {
19+
type: 'number',
20+
required: true
21+
},
22+
23+
odds: {
24+
type: 'object',
25+
required: true
26+
}
27+
}
28+
}
29+
30+
// Listen on this port
31+
var PORT = 3000;
32+
var VERSION = 1;
33+
34+
var error_code={"statusCode":404,"error":"Not Found"};
35+
36+
var markets = [ {"bet_id":1,"event":"Next World Cup","name":"England","odds":{"numerator":10,"denominator":1}},
37+
{"bet_id":2,"event":"Next World Cup","name":"Brazil","odds":{"numerator":2,"denominator":1}},
38+
{"bet_id":3,"event":"Next World Cup","name":"Spain","odds":{"numerator":3,"denominator":1}},
39+
{"bet_id":4,"event":"Next World Cup","name":"Germany","odds":{"numerator":1,"denominator":1}},
40+
{"bet_id":5,"event":"Ryder Cup","name":"Europe","odds":{"numerator":7,"denominator":4}},
41+
{"bet_id":6,"event":"Ryder Cup","name":"USA","odds":{"numerator":9,"denominator":2}} ];
42+
var init_transaction_id=1000;
43+
var bets = [];
44+
45+
46+
47+
48+
// Version
49+
app.get('/', function (req, res) {
50+
res.send('Version:' + VERSION);
51+
});
52+
53+
// Betting Market
54+
app.get('/markets', function (req,res) {
55+
res.send(markets);
56+
})
57+
58+
// Current bets
59+
app.get('/bets', function (req, res) {
60+
console.log('asking for bets aray:', bets)
61+
res.send(bets);
62+
})
63+
64+
// Place Bet
65+
app.post('/bets', validate({body: betsSchema}), function (req, res) {
66+
bets.push(req.body);
67+
console.log('got bet: ', req.body)
68+
console.log('bet name: ', markets[req.body.bet_id].event)
69+
70+
init_transaction_id=init_transaction_id+1
71+
res.status(201).send({"bet_id":req.body.bet_id,"event":markets[req.body.bet_id-1].event,"name":markets[req.body.bet_id-1].name,"odds":markets[req.body.bet_id-1].odds,"stake":req.body.stake,"transaction_id":init_transaction_id});
72+
});
73+
74+
// Delete bet
75+
app.delete('/bets/:index',function (req, res) {
76+
if(bets.length <= req.params.index){
77+
res.status(404).send();
78+
}
79+
bets.splice(req.params.index, 1);
80+
res.status(204).send();
81+
});
82+
83+
app.use(function(err, req, res, next) {
84+
var responseData;
85+
if (err.name === 'JsonSchemaValidation') {
86+
res.status(400).send();
87+
}
88+
next();
89+
});
90+
91+
app.get('*', function(req, res){
92+
res.status(404).send(error_code);
93+
});
94+
95+
app.post('*', function(req,res){
96+
res.status(404).send(error_code);
97+
});
98+
99+
100+
if(!module.parent) {
101+
app.listen(PORT, function () {
102+
console.log('Null gaming server listening on port 3000!');
103+
});
104+
}
105+
106+

Diff for: json_notes.txt

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
json_notes.txt
2+
3+
//bets post notes on json format
4+
5+
//request_payload
6+
7+
{"bet_id":3,"odds":{"numerator":3,"denominator":1},"stake":1000}
8+
9+
// request response
10+
11+
{"bet_id":3,"event":"Next World Cup","name":"Spain","odds":{"numerator":3,"denominator":1},"stake":1000,"transaction_id":3914}

Diff for: package.json

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"name": "backend",
3+
"version": "1.0.0",
4+
"description": "Null Gaming Server",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "mocha",
8+
"dev": "node index"
9+
},
10+
"author": "hoofman",
11+
"dependencies": {
12+
"body-parser": "^1.15.2",
13+
"cors": "^2.8.5",
14+
"express": "^4.14.0",
15+
"express-jsonschema": "^1.1.0"
16+
},
17+
"devDependencies": {
18+
"mocha": "2.3.3",
19+
"supertest": "1.1.0",
20+
"chai": "3.3.0"
21+
},
22+
"directories": {
23+
"test": "test"
24+
},
25+
"repository": {
26+
"type": "git",
27+
"url": "git+https://github.com/hoofman/nullGamingServer.git"
28+
},
29+
"keywords": [],
30+
"license": "ISC",
31+
"bugs": {
32+
"url": "https://github.com/hoofman/nullGamingServer/issues"
33+
},
34+
"homepage": "https://github.com/hoofman/nullGamingServer#readme"
35+
}

Diff for: test/tests.js

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
'use strict';
2+
3+
var server = require('../index.js');
4+
var expect = require('chai').expect;
5+
var request = require('supertest')('http://localhost:3000');
6+
7+
// allow 500ms for each test to complete, todo - make this better with a callback.
8+
beforeEach(function (done) {
9+
setTimeout(function(){
10+
done();
11+
}, 500);
12+
});
13+
14+
describe('Bets array challenge', function() {
15+
it('should get empty bets array', function(done) {
16+
request.
17+
get('/bets').
18+
expect(200, [], done);
19+
});
20+
21+
it('should add a bet', function(done) {
22+
request.
23+
post('/bets').
24+
send({"bet_id":3,"odds":{"numerator":3,"denominator":1},"stake":1000}).
25+
expect(201, done);
26+
});
27+
28+
it('should verify only one bet exists', function(done) {
29+
request.
30+
get('/bets').
31+
expect(200).
32+
end(function(err, response) {
33+
if (err) {
34+
throw err;
35+
}
36+
37+
expect(response.body).to.be.instanceof(Array);
38+
expect(response.body).to.have.length(1);
39+
expect(response.body[0].bet_id).to.be.an('number');
40+
expect(response.body[0].stake).to.be.an('number');
41+
done();
42+
});
43+
});
44+
45+
it('should add a second bet', function(done) {
46+
request.
47+
post('/bets').
48+
send({"bet_id":4,"odds":{"numerator":4,"denominator":1},"stake":500}).
49+
expect(201, done);
50+
});
51+
52+
it('should verify two bets exist', function(done) {
53+
request.
54+
get('/bets').
55+
expect(200).
56+
end(function(err, response) {
57+
if (err) {
58+
throw err;
59+
}
60+
61+
expect(response.body).to.be.instanceof(Array);
62+
expect(response.body).to.have.length(2);
63+
64+
expect(response.body[0].bet_id).to.be.an('number');
65+
expect(response.body[0].stake).to.be.an('number');
66+
67+
expect(response.body[1].bet_id).to.be.an('number');
68+
expect(response.body[1].stake).to.be.an('number');
69+
70+
done();
71+
});
72+
});
73+
74+
75+
76+
it('should delete the second bet', function(done) {
77+
request.
78+
delete('/bets/1').
79+
expect(204, done);
80+
});
81+
82+
it('should verify that delete is working correctly', function(done) {
83+
request.
84+
get('/bets').
85+
expect(200).
86+
end(function(err, response) {
87+
if (err) {
88+
throw err;
89+
}
90+
91+
expect(response.body).to.be.instanceof(Array);
92+
expect(response.body).to.have.length(1);
93+
94+
expect(response.body[0].bet_id).to.be.an('number');
95+
expect(response.body[0].stake).to.be.an('number');
96+
97+
done();
98+
});
99+
});
100+
101+
it('should get err 400 when trying to add bet using bad params', function(done) {
102+
request.
103+
post('/bets').
104+
send({
105+
foo: 'bar',
106+
baz: 'bop'
107+
}).
108+
expect(400, done);
109+
});
110+
111+
it('should fail deleting a non-exitent bet', function(done) {
112+
request.
113+
delete('/bets/20').
114+
expect(404, done);
115+
});
116+
});

0 commit comments

Comments
 (0)