Skip to content

Commit 7409ecd

Browse files
authored
trade route deprecation and new available route (#2299)
1 parent ce6872b commit 7409ecd

File tree

3 files changed

+125
-3
lines changed

3 files changed

+125
-3
lines changed

controllers/trading.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ const trade = async (req, res) => {
1919
if (!canUserTrade) {
2020
return res.boom.forbidden(errorMessage);
2121
}
22-
23-
return res.json({ userBalance });
22+
return res.json({ message: "Congrats, Stock Trade done successfully!! 🎉🎉🎉🎊🎊🎊", userBalance });
2423
} catch (err) {
2524
logger.error(`Error during trading: ${err}`);
2625
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);

routes/trading.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ const router = express.Router();
33
import authenticate from "../middlewares/authenticate";
44
import { newTrade } from "../middlewares/validators/trading";
55
import { trade } from "../controllers/trading";
6+
import { devFlagMiddleware } from "../middlewares/devFlag";
7+
import { userAuthorization } from "../middlewares/userAuthorization";
68

7-
router.post("/stock/new/self", authenticate, newTrade, trade);
9+
router.post("/stock/new/self", authenticate, newTrade, trade); // this route is being deprecated, please use new available route `/stock/new/:userId`
10+
router.post("/stock/new/:userId", devFlagMiddleware, authenticate, userAuthorization, newTrade, trade);
811

912
module.exports = router;

test/integration/trading.test.ts

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import chai from "chai";
2+
import chaiHttp from "chai-http";
3+
import app from "../../server";
4+
import authService from "../../services/authService";
5+
import addUser from "../utils/addUser";
6+
import cleanDb from "../utils/cleanDb";
7+
import stocks from "../../models/stocks";
8+
import wallet from "../../models/wallets";
9+
import sinon from "sinon";
10+
import config from "config";
11+
import currencies from "../fixtures/currencies/currencies";
12+
import tradeService from "../../services/tradingService";
13+
14+
const cookieName: string = config.get("userToken.cookieName");
15+
chai.use(chaiHttp);
16+
const { expect } = chai;
17+
18+
describe("POST /trade/stock/new/:userId", function () {
19+
let jwt: string;
20+
let userId: string;
21+
let userStock;
22+
const newStockData = { name: "DINERO", quantity: 20000, price: 2 };
23+
let id;
24+
let stockData;
25+
26+
beforeEach(async function () {
27+
userId = await addUser();
28+
jwt = authService.generateAuthToken({ userId });
29+
({ id, stockData } = await stocks.addStock(newStockData));
30+
await wallet.createWallet(userId, currencies.default);
31+
userStock = {
32+
stockId: id,
33+
stockName: stockData.name,
34+
tradeType: "BUY",
35+
quantity: 1,
36+
listedPrice: stockData.price,
37+
totalPrice: 1 * stockData.price,
38+
};
39+
});
40+
41+
afterEach(async function () {
42+
await cleanDb();
43+
sinon.restore();
44+
});
45+
46+
it("Should return success when trade is completed", function (done) {
47+
chai
48+
.request(app)
49+
.post(`/trade/stock/new/${userId}?dev=true`)
50+
.set("cookie", `${cookieName}=${jwt}`)
51+
.send(userStock)
52+
.end((err, res) => {
53+
if (err) return done(err);
54+
55+
expect(res).to.have.status(200);
56+
expect(res.body).to.be.an("object");
57+
expect(res.body.message).to.equal("Congrats, Stock Trade done successfully!! 🎉🎉🎉🎊🎊🎊");
58+
expect(res.body.userBalance).to.be.a("number");
59+
return done();
60+
});
61+
});
62+
63+
it("Should return trade unsuccessful due to insufficient funds", function (done) {
64+
userStock.tradeType = "BUY";
65+
userStock.quantity = 2000;
66+
userStock.totalPrice = 2000 * stockData.price;
67+
68+
chai
69+
.request(app)
70+
.post(`/trade/stock/new/${userId}?dev=true`)
71+
.set("cookie", `${cookieName}=${jwt}`)
72+
.send(userStock)
73+
.end((err, res) => {
74+
if (err) return done(err);
75+
76+
expect(res).to.have.status(403);
77+
expect(res.body).to.be.an("object");
78+
expect(res.body.message).to.equal("Trade was not successful due to insufficient funds");
79+
return done();
80+
});
81+
});
82+
83+
it("Should return trade unsuccessful due to insufficient stock quantity", function (done) {
84+
userStock.tradeType = "SELL";
85+
userStock.quantity = 20001;
86+
userStock.totalPrice = 20001 * stockData.price;
87+
88+
chai
89+
.request(app)
90+
.post(`/trade/stock/new/${userId}?dev=true`)
91+
.set("cookie", `${cookieName}=${jwt}`)
92+
.send(userStock)
93+
.end((err, res) => {
94+
if (err) return done(err);
95+
96+
expect(res).to.have.status(403);
97+
expect(res.body).to.be.an("object");
98+
expect(res.body.message).to.equal("Trade was not successful because you do not have enough quantity");
99+
return done();
100+
});
101+
});
102+
103+
it("Should return 500 when an internal server error occurs", function (done) {
104+
sinon.stub(tradeService, "trade").throws(new Error("Database error"));
105+
106+
chai
107+
.request(app)
108+
.post(`/trade/stock/new/${userId}?dev=true`)
109+
.set("cookie", `${cookieName}=${jwt}`)
110+
.send(userStock)
111+
.end((err, res) => {
112+
if (err) return done(err);
113+
114+
expect(res).to.have.status(500);
115+
expect(res.body).to.be.an("object");
116+
expect(res.body.message).to.equal("An internal server error occurred");
117+
return done();
118+
});
119+
});
120+
});

0 commit comments

Comments
 (0)