Skip to content

Commit e53b99f

Browse files
authored
Merge pull request #32 from codegasms/feat/testing
Feature: server testing
2 parents 9bfa433 + c467b13 commit e53b99f

File tree

18 files changed

+9769
-2524
lines changed

18 files changed

+9769
-2524
lines changed

.github/workflows/server-tests.yml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: Server Tests
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
paths:
8+
- "server/**"
9+
- ".github/workflows/server-tests.yml"
10+
pull_request:
11+
branches:
12+
- main
13+
paths:
14+
- "server/**"
15+
- ".github/workflows/server-tests.yml"
16+
17+
jobs:
18+
test-server:
19+
runs-on: ubuntu-latest
20+
container:
21+
image: node:18 # Specify the Node.js container image
22+
23+
steps:
24+
- name: Checkout code
25+
uses: actions/checkout@v4
26+
27+
- name: Install dependencies in server directory
28+
run: npm ci
29+
working-directory: ./server
30+
31+
- name: Run tests in server directory
32+
run: npm test
33+
working-directory: ./server

server/babel.config.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module.exports = {
2+
presets: [
3+
[
4+
"@babel/preset-env",
5+
{
6+
targets: {
7+
node: "current",
8+
},
9+
},
10+
],
11+
],
12+
};

server/config/db.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,15 @@ const connectDB = async () => {
77
const conn = await mongoose.connect(`${dbURI}${dbName}`);
88
console.log(`MongoDB Connected: ${conn.connection.host}`);
99
} catch (error) {
10-
console.error(`Error: ${error.message}`);
11-
process.exit(1);
10+
console.error(`Error connecting to MongoDB: ${error.message}`);
11+
// Exit process only if not in test environment
12+
if (process.env.NODE_ENV !== "test") {
13+
process.exit(1);
14+
}
15+
// Optional: If in test, maybe throw the error so tests can catch it if needed
16+
// else {
17+
// throw error;
18+
// }
1219
}
1320
};
1421

server/config/redis.js

Lines changed: 74 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,43 @@ let redisClient;
1010
let redisEnabled = false;
1111

1212
try {
13+
// *** ADD CHECK FOR TEST ENVIRONMENT ***
14+
if (process.env.NODE_ENV === "test") {
15+
console.log("Skipping Redis initialization in test environment.");
16+
redisEnabled = false;
17+
redisReadyPromise = Promise.resolve(false);
18+
// Create dummy client immediately
19+
redisClient = {
20+
get: () => Promise.resolve(null),
21+
set: () => Promise.resolve("OK"),
22+
setex: () => Promise.resolve("OK"),
23+
del: () => Promise.resolve(0),
24+
exists: () => Promise.resolve(0),
25+
expire: () => Promise.resolve(1),
26+
flushall: () => Promise.resolve("OK"),
27+
info: () => Promise.resolve(""),
28+
dbsize: () => Promise.resolve(0),
29+
pipeline: () => ({ del: () => ({}), exec: () => Promise.resolve([]) }),
30+
connect: () => Promise.resolve(),
31+
quit: () => Promise.resolve(),
32+
scanStream: () => {
33+
// Create a dummy event emitter that emits no data and ends immediately
34+
const emitter = new EventEmitter();
35+
setTimeout(() => {
36+
emitter.emit("data", []);
37+
emitter.emit("end");
38+
}, 0);
39+
return emitter;
40+
},
41+
on: () => {}, // Add dummy 'on' to prevent errors if called
42+
removeAllListeners: () => {}, // Add dummy removeAllListeners
43+
};
44+
// Throw a dummy error to bypass the rest of the try block cleanly
45+
// (This is a simple way to exit the try block early)
46+
throw new Error("TEST_ENV_SKIP");
47+
}
48+
// *** END CHECK ***
49+
1350
console.log("Initializing Redis client...");
1451

1552
// Determine connection options
@@ -68,36 +105,43 @@ try {
68105
}
69106
}, 5000);
70107
} catch (error) {
71-
console.error("Failed to initialize Redis client:", error);
72-
// Create a promise that resolves to false
73-
redisReadyPromise = Promise.resolve(false);
74-
// Create a dummy client to prevent app crashes if Redis is unavailable
75-
redisClient = {
76-
get: () => Promise.resolve(null),
77-
set: () => Promise.resolve("OK"),
78-
setex: () => Promise.resolve("OK"),
79-
del: () => Promise.resolve(0),
80-
exists: () => Promise.resolve(0),
81-
expire: () => Promise.resolve(1),
82-
flushall: () => Promise.resolve("OK"),
83-
info: () => Promise.resolve(""),
84-
dbsize: () => Promise.resolve(0),
85-
pipeline: () => ({
86-
del: () => ({}),
87-
exec: () => Promise.resolve([]),
88-
}),
89-
connect: () => Promise.resolve(),
90-
quit: () => Promise.resolve(),
91-
scanStream: () => {
92-
// Create a dummy event emitter that emits no data and ends immediately
93-
const emitter = new EventEmitter();
94-
setTimeout(() => {
95-
emitter.emit("data", []);
96-
emitter.emit("end");
97-
}, 0);
98-
return emitter;
99-
},
100-
};
108+
// Catch the dummy error specifically, otherwise handle real errors
109+
if (error.message !== "TEST_ENV_SKIP") {
110+
console.error("Failed to initialize Redis client:", error);
111+
// Ensure dummy client is created on real errors too
112+
if (!redisClient) {
113+
redisReadyPromise = Promise.resolve(false);
114+
redisClient = {
115+
get: () => Promise.resolve(null),
116+
set: () => Promise.resolve("OK"),
117+
setex: () => Promise.resolve("OK"),
118+
del: () => Promise.resolve(0),
119+
exists: () => Promise.resolve(0),
120+
expire: () => Promise.resolve(1),
121+
flushall: () => Promise.resolve("OK"),
122+
info: () => Promise.resolve(""),
123+
dbsize: () => Promise.resolve(0),
124+
pipeline: () => ({
125+
del: () => ({}),
126+
exec: () => Promise.resolve([]),
127+
}),
128+
connect: () => Promise.resolve(),
129+
quit: () => Promise.resolve(),
130+
scanStream: () => {
131+
// Create a dummy event emitter that emits no data and ends immediately
132+
const emitter = new EventEmitter();
133+
setTimeout(() => {
134+
emitter.emit("data", []);
135+
emitter.emit("end");
136+
}, 0);
137+
return emitter;
138+
},
139+
on: () => {}, // Add dummy 'on' to prevent errors if called
140+
removeAllListeners: () => {}, // Add dummy removeAllListeners
141+
};
142+
}
143+
}
144+
// If it was the TEST_ENV_SKIP error, we've already set up the dummy client.
101145
}
102146

103147
// Wait for Redis connection before continuing

0 commit comments

Comments
 (0)