Skip to content

Commit 70f9e7a

Browse files
author
Matheus Ishiyama
authored
Feature: finish socket workflow (#9)
2 parents 9f79b2b + 00d8758 commit 70f9e7a

File tree

9 files changed

+82
-232
lines changed

9 files changed

+82
-232
lines changed

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,13 @@
1-
# chat-app-backend
1+
# Chat App (backend)
2+
3+
![JavaScript](https://img.shields.io/badge/-JavaScript-F7DF1E?style=flat-square&logo=javascript&logoColor=black)
4+
![Nodejs](https://img.shields.io/badge/-Nodejs-339933?style=flat-square&logo=Node.js&logoColor=white)
5+
![MongoDB](https://img.shields.io/badge/-MongoDB-47A248?style=flat-square&logo=mongodb&logoColor=white)
6+
7+
This a real time chat app, here is the backend.
8+
9+
You can see the screens and how it works in [chat-app-frontend](https://github.com/MatheusIshiyama/chat-app-frontend)
10+
11+
---
12+
13+
**Developed by Matheus Ishiyama**

src/app.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,5 @@ app.use(express.urlencoded({ extended: true }));
1010
//* routes
1111
app.use("/user", require("./routes/user"));
1212
app.use("/auth", require("./routes/auth"));
13-
app.use("/friend", require("./routes/friends"));
1413

1514
module.exports = app;

src/controllers/user.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,13 @@ const UserController = {
107107
//* remove friendId from pending status
108108
await User.findOneAndUpdate(
109109
{ _id: user._id },
110-
{ $pull: { pending: { id: friend._id } } }
110+
{ $pull: { requests: { id: friend._id } } }
111111
);
112112

113113
//* remove userId from request status in friendUser
114114
await User.findOneAndUpdate(
115115
{ _id: friend._id },
116-
{ $pull: { requests: { id: user._id } } }
116+
{ $pull: { pending: { id: user._id } } }
117117
);
118118

119119
socket.emit("alert", `${friend.username}'s request declined`);

src/index.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ const server = http.Server(app);
55
const socket = socketIo(server, { cors: { origin: "*" } });
66
const socketAuth = require("./services/socketAuth");
77
const userController = require("./controllers/user");
8-
const chatController = require("./controllers/chat");
98
const User = require("./models/user");
109
const Chat = require("./models/chat");
1110
require("dotenv").config();
@@ -29,10 +28,18 @@ socket.on("connection", async (socket) => {
2928
let findId = chat.users.filter((users) => {
3029
return users != user._id.toString();
3130
})[0];
31+
let getLastMessage
32+
33+
if(chat.messages.length) {
34+
getLastMessage = chat.messages.slice(-1)[0].message
35+
} else {
36+
getLastMessage = "No messages yet"
37+
}
38+
3239
if (findId) {
3340
const chatInfo = {
3441
id: findId,
35-
lastMessage: chat.messages.slice(-1)[0].message,
42+
lastMessage: getLastMessage,
3643
};
3744
chatLastMessages.push(chatInfo);
3845
}

src/middlewares/validateFriend.js

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/routes/friends.js

Lines changed: 0 additions & 28 deletions
This file was deleted.

src/tests/integration/userController.test.js

Lines changed: 54 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,15 @@ const mockResponse = () => {
1515
return res;
1616
};
1717

18+
const mockSocket = () => {
19+
const socket = {};
20+
socket.emit = jest.fn().mockReturnValue(socket);
21+
return socket;
22+
};
23+
1824
const newUser = async (title, verifyCode) => {
1925
let code, verified;
20-
if (!code) {
26+
if (!verifyCode) {
2127
code = "verified";
2228
verified = true;
2329
} else {
@@ -78,7 +84,7 @@ describe("Test user controller", () => {
7884
const res = mockResponse();
7985

8086
await userController.register(req, res);
81-
expect(res.status).toHaveBeenCalledWith(201);
87+
expect(res.status).toHaveBeenCalledWith(202);
8288
expect(res.json).toHaveBeenCalledWith(expect.any(Object));
8389
});
8490

@@ -87,13 +93,29 @@ describe("Test user controller", () => {
8793

8894
await newUser("confirmTest", code);
8995

90-
const req = mockRequest({ body: { code } });
96+
const req = mockRequest({ body: { username: "confirmTest", code } });
9197
const res = mockResponse();
9298

9399
await userController.confirm(req, res);
100+
101+
const user = await User.findOne({ username: "confirmTest" });
102+
94103
expect(res.status).toHaveBeenCalledWith(200);
95104
expect(res.json).toHaveBeenCalledWith({
96105
message: "User confirmed",
106+
user,
107+
});
108+
109+
const request = mockRequest({
110+
body: "invalidConfirm",
111+
code: "undefined",
112+
});
113+
const response = mockResponse();
114+
115+
await userController.confirm(request, response);
116+
expect(response.status).toHaveBeenCalledWith(404);
117+
expect(response.json).toHaveBeenCalledWith({
118+
error: "User not found",
97119
});
98120
});
99121

@@ -104,62 +126,50 @@ describe("Test user controller", () => {
104126
var user1 = await findUser("addPending1");
105127
var user2 = await findUser("addPending2");
106128

107-
const req = mockRequest({
108-
userId: user1._id,
109-
body: { friendId: user2._id },
110-
});
111-
const res = mockResponse();
129+
const socket = mockSocket();
112130

113-
await userController.addPending(req, res);
131+
await userController.addPending(user1, user2, socket);
114132

115133
user1 = await findUser("addPending1");
116134
user2 = await findUser("addPending2");
117135

118-
expect(user1.pending[0].toString("base64")).toBe(
136+
expect(user1.pending[0].id.toString("base64")).toBe(
119137
user2._id.toString("base64")
120138
);
121-
expect(user2.requests[0].toString("base64")).toBe(
139+
expect(user1.pending[0].username).toBe(user2.username);
140+
expect(user2.requests[0].id.toString("base64")).toBe(
122141
user1._id.toString("base64")
123142
);
124-
expect(res.status).toHaveBeenCalledWith(200);
125-
expect(res.json).toHaveBeenCalledWith({
126-
error: "Pending added",
127-
});
143+
expect(user2.requests[0].username).toBe(user1.username);
144+
expect(socket.emit).toHaveBeenCalledTimes(1);
128145
});
129146

130147
test("Test removePending function", async () => {
131148
await newUser("removePending1");
132149
await newUser("removePending2");
133150

134-
var user1 = await findUser("removePending1");
135-
var user2 = await findUser("removePending2");
151+
let user1 = await findUser("removePending1");
152+
let user2 = await findUser("removePending2");
136153

137154
await User.findOneAndUpdate(
138-
{ _id: user1._id },
139-
{ $push: { pending: user2._id } }
155+
{ _id: user2._id },
156+
{ $push: { pending: { id: user1._id, username: user1.username } } }
140157
);
141158
await User.findOneAndUpdate(
142-
{ _id: user2._id },
143-
{ $push: { requests: user1._id } }
159+
{ _id: user1._id },
160+
{ $push: { requests: { id: user2._id, username: user2.username } } }
144161
);
145162

146-
const req = mockRequest({
147-
userId: user1._id,
148-
body: { friendId: user2._id },
149-
});
150-
const res = mockResponse();
163+
const socket = mockSocket();
151164

152-
await userController.removePending(req, res);
165+
await userController.removePending(user1, user2, socket);
153166

154-
var user1 = await findUser("removePending1");
155-
var user2 = await findUser("removePending2");
167+
user1 = await findUser("removePending1");
168+
user2 = await findUser("removePending2");
156169

157-
expect(user1.pending).toHaveLength(0);
158-
expect(user2.requests).toHaveLength(0);
159-
expect(res.status).toHaveBeenCalledWith(200);
160-
expect(res.json).toHaveBeenCalledWith({
161-
error: "Pending removed",
162-
});
170+
expect(user1.requests).toHaveLength(0);
171+
expect(user2.pending).toHaveLength(0);
172+
expect(socket.emit).toHaveBeenCalledTimes(1);
163173
});
164174

165175
test("Test addFriend function", async () => {
@@ -178,27 +188,24 @@ describe("Test user controller", () => {
178188
{ $push: { requests: user1._id } }
179189
);
180190

181-
const req = mockRequest({
182-
userId: user1._id,
183-
body: { friendId: user2._id },
184-
});
185-
const res = mockResponse();
191+
const socket = mockSocket();
186192

187-
await userController.addFriend(req, res);
193+
await userController.addFriend(user1, user2, socket);
188194

189195
user1 = await findUser("addFriend1");
190196
user2 = await findUser("addFriend2");
191197

192-
expect(user1.friendList[0].toString("base64")).toBe(
198+
expect(user1.friendList[0].id.toString("base64")).toBe(
193199
user2._id.toString("base64")
194200
);
195-
expect(user2.friendList[0].toString("base64")).toBe(
201+
expect(user1.friendList[0].name).toBe(user2.name);
202+
expect(user1.friendList[0].username).toBe(user2.username);
203+
expect(user2.friendList[0].id.toString("base64")).toBe(
196204
user1._id.toString("base64")
197205
);
198-
expect(res.status).toHaveBeenCalledWith(200);
199-
expect(res.json).toHaveBeenCalledWith({
200-
error: "Friend added",
201-
});
206+
expect(user2.friendList[0].name).toBe(user1.name);
207+
expect(user2.friendList[0].username).toBe(user1.username);
208+
expect(socket.emit).toHaveBeenCalledTimes(1);
202209
});
203210

204211
test("add friend", async () => {

src/tests/units/authenticate.test.js

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ beforeAll(async () => {
2424
});
2525

2626
afterAll(async () => {
27-
await User.findOneAndDelete({ username: "authenticateTest1" });
28-
await User.findOneAndDelete({ username: "authenticateTest2" });
29-
await User.findOneAndDelete({ username: "authenticateTest3" });
30-
await User.findOneAndDelete({ username: "authenticateTest4" });
27+
await User.findOneAndDelete({ username: "authenticatetest1" });
28+
await User.findOneAndDelete({ username: "authenticatetest2" });
29+
await User.findOneAndDelete({ username: "authenticatetest3" });
30+
await User.findOneAndDelete({ username: "authenticatetest4" });
3131
await mongoose.disconnect();
3232
console.log("[DEV_DATABASE] Disconnected");
3333
});
@@ -93,26 +93,6 @@ describe("Test authenticate service", () => {
9393
});
9494
});
9595

96-
test("Valid username and password but not verified", async () => {
97-
const res = mockResponse();
98-
const pwd = password.hash("testing");
99-
await new User({
100-
username: "authenticatetest3",
101-
name: "test_test",
102-
103-
verifyCode: "testtest",
104-
verified: false,
105-
password: pwd,
106-
createdAt: Date.now(),
107-
}).save();
108-
109-
await authenticate("authenticateTest3", "testing", res);
110-
expect(res.status).toHaveBeenCalledWith(401);
111-
expect(res.json).toHaveBeenCalledWith({
112-
error: "User unverified",
113-
});
114-
});
115-
11696
test("Valid username and password and verified", async () => {
11797
const res = mockResponse();
11898
const pwd = await password.hash("testing");

0 commit comments

Comments
 (0)