Skip to content

Commit 7566801

Browse files
authored
Merge pull request #8 from ajilkumar/feat/Tests
Testing
2 parents 4c74f16 + 532ad31 commit 7566801

19 files changed

Lines changed: 1870 additions & 30 deletions

.github/workflows/test.yml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
name: Tests
2+
3+
on:
4+
push:
5+
branches: [main, develop]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
test:
11+
runs-on: ubuntu-latest
12+
13+
services:
14+
postgres:
15+
image: postgres:16-alpine
16+
env:
17+
POSTGRES_USER: devmetrics
18+
POSTGRES_PASSWORD: test_password
19+
POSTGRES_DB: devmetrics_test
20+
options: >-
21+
--health-cmd pg_isready
22+
--health-interval 10s
23+
--health-timeout 5s
24+
--health-retries 5
25+
ports:
26+
- 5433:5432
27+
28+
redis:
29+
image: redis:7-alpine
30+
options: >-
31+
--health-cmd "redis-cli ping"
32+
--health-interval 10s
33+
--health-timeout 5s
34+
--health-retries 5
35+
ports:
36+
- 6380:6379
37+
38+
steps:
39+
- name: Checkout code
40+
uses: actions/checkout@v4
41+
42+
- name: Setup Node.js
43+
uses: actions/setup-node@v4
44+
with:
45+
node-version: '20'
46+
cache: 'npm'
47+
48+
- name: Install dependencies
49+
run: npm ci
50+
51+
- name: Run linter
52+
run: npm run lint
53+
54+
- name: Type check
55+
run: npm run typecheck
56+
57+
- name: Run tests
58+
run: npm run test:ci
59+
env:
60+
TEST_DATABASE_URL: postgresql://devmetrics:test_password@localhost:5433/devmetrics_test
61+
TEST_REDIS_URL: redis://localhost:6380
62+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
63+
API_KEY_SECRET: test-secret-key-for-ci-testing-only
64+
65+
- name: Upload coverage to Codecov
66+
uses: codecov/codecov-action@v3
67+
with:
68+
files: ./coverage/lcov.info
69+
flags: unittests
70+
name: codecov-umbrella

__mocks__/@faker-js/faker.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export const faker = {
2+
string: {
3+
uuid: () => 'mock-uuid',
4+
},
5+
internet: {
6+
email: () => 'test@example.com',
7+
},
8+
person: {
9+
fullName: () => 'John Doe',
10+
},
11+
};

docker-compose.yml

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,48 @@ services:
4040
networks:
4141
- devmetrics-network
4242

43-
# pgAdmin (Optional - for database management UI)
43+
# RedisInsight (Optional - for Redis management UI)
44+
redisinsight:
45+
image: redis/redisinsight:latest
46+
container_name: devmetrics-redisinsight
47+
restart: unless-stopped
48+
ports:
49+
- "5540:5540"
50+
networks:
51+
- devmetrics-network
52+
profiles:
53+
- tools
54+
55+
# Test PostgreSQL
56+
postgres-test:
57+
image: postgres:16-alpine
58+
container_name: devmetrics-postgres-test
59+
restart: unless-stopped
60+
environment:
61+
POSTGRES_USER: devmetrics
62+
POSTGRES_PASSWORD: devmetrics_password
63+
POSTGRES_DB: devmetrics_test
64+
ports:
65+
- "5433:5432"
66+
networks:
67+
- devmetrics-network
68+
profiles:
69+
- test
70+
71+
# Test Redis
72+
redis-test:
73+
image: redis:7-alpine
74+
container_name: devmetrics-redis-test
75+
restart: unless-stopped
76+
ports:
77+
- "6380:6379"
78+
command: redis-server --appendonly no
79+
networks:
80+
- devmetrics-network
81+
profiles:
82+
- test
83+
84+
# pgAdmin (Optional - for database management UI)
4485
# pgadmin:
4586
# image: dpage/pgadmin4:latest
4687
# container_name: devmetrics-pgadmin
@@ -58,18 +99,6 @@ services:
5899
# profiles:
59100
# - tools # Only start with: docker-compose --profile tools up
60101

61-
# RedisInsight (Optional - for Redis management UI)
62-
redisinsight:
63-
image: redis/redisinsight:latest
64-
container_name: devmetrics-redisinsight
65-
restart: unless-stopped
66-
ports:
67-
- "5540:5540"
68-
networks:
69-
- devmetrics-network
70-
profiles:
71-
- tools
72-
73102

74103
volumes:
75104
postgres_data:

jest.integration.config.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
export const preset = 'ts-jest';
2+
export const testEnvironment = 'node';
3+
export const roots = ['<rootDir>/tests'];
4+
export const transformIgnorePatterns = [
5+
'node_modules/(?!(\\@faker-js/faker)/)',
6+
];
7+
export const testMatch = ['**/tests/integration/**/*.test.ts']
8+
export const transform = {
9+
'^.+\\.ts$': 'ts-jest',
10+
};
11+
export const collectCoverageFrom = [
12+
'src/**/*.ts',
13+
'!src/**/*.d.ts',
14+
'!src/server.ts', // Entry point
15+
'!src/types/**',
16+
];
17+
export const coverageDirectory = 'coverage';
18+
export const coverageReporters = ['text', 'lcov', 'html'];
19+
export const coverageThreshold = {
20+
global: {
21+
branches: 70,
22+
functions: 75,
23+
lines: 80,
24+
statements: 80,
25+
},
26+
};
27+
export const moduleNameMapper = {
28+
'^@/(.*)$': '<rootDir>/src/$1',
29+
'^@config/(.*)$': '<rootDir>/src/config/$1',
30+
'^@middleware/(.*)$': '<rootDir>/src/middleware/$1',
31+
'^@routes/(.*)$': '<rootDir>/src/routes/$1',
32+
'^@controllers/(.*)$': '<rootDir>/src/controllers/$1',
33+
'^@services/(.*)$': '<rootDir>/src/services/$1',
34+
'^@models/(.*)$': '<rootDir>/src/models/$1',
35+
'^@utils/(.*)$': '<rootDir>/src/utils/$1',
36+
};
37+
// export const setupFilesAfterEnv = ['<rootDir>/tests/setup.ts'];
38+
export const setupFilesAfterEnv = ['<rootDir>/tests/setup.ts']
39+
export const testTimeout = 30000;
40+
export const verbose = true;
Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,61 @@
1-
module.exports = {
1+
import type { Config } from 'jest';
2+
3+
const config: Config = {
24
preset: 'ts-jest',
5+
6+
globals: {
7+
'ts-jest': {
8+
tsconfig: 'tsconfig.test.json',
9+
},
10+
},
311
testEnvironment: 'node',
12+
413
roots: ['<rootDir>/tests'],
5-
testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'],
14+
15+
testMatch: ['**/tests/unit/**/*.test.ts'],
16+
617
transform: {
718
'^.+\\.ts$': 'ts-jest',
819
},
20+
21+
transformIgnorePatterns: [
22+
'node_modules/(?!(@faker-js)/)',
23+
],
24+
25+
setupFilesAfterEnv: ['<rootDir>/tests/setup.ts'],
26+
27+
moduleNameMapper: {
28+
'^@/(.*)$': '<rootDir>/src/$1',
29+
'^@config/(.*)$': '<rootDir>/src/config/$1',
30+
'^@middleware/(.*)$': '<rootDir>/src/middleware/$1',
31+
'^@routes/(.*)$': '<rootDir>/src/routes/$1',
32+
'^@controllers/(.*)$': '<rootDir>/src/controllers/$1',
33+
'^@services/(.*)$': '<rootDir>/src/services/$1',
34+
'^@models/(.*)$': '<rootDir>/src/models/$1',
35+
'^@utils/(.*)$': '<rootDir>/src/utils/$1',
36+
},
37+
938
collectCoverageFrom: [
1039
'src/**/*.ts',
1140
'!src/**/*.d.ts',
1241
'!src/server.ts',
42+
'!src/types/**',
1343
],
44+
1445
coverageDirectory: 'coverage',
46+
coverageReporters: ['text', 'lcov', 'html'],
47+
1548
coverageThreshold: {
1649
global: {
17-
branches: 80,
18-
functions: 80,
50+
branches: 70,
51+
functions: 75,
1952
lines: 80,
2053
statements: 80,
2154
},
2255
},
23-
moduleNameMapper: {
24-
'^@/(.*)$': '<rootDir>/src/$1',
25-
'^@config/(.*)$': '<rootDir>/src/config/$1',
26-
'^@middleware/(.*)$': '<rootDir>/src/middleware/$1',
27-
'^@routes/(.*)$': '<rootDir>/src/routes/$1',
28-
'^@controllers/(.*)$': '<rootDir>/src/controllers/$1',
29-
'^@services/(.*)$': '<rootDir>/src/services/$1',
30-
'^@models/(.*)$': '<rootDir>/src/models/$1',
31-
'^@utils/(.*)$': '<rootDir>/src/utils/$1',
32-
},
33-
};
56+
57+
testTimeout: 30000,
58+
verbose: true,
59+
};
60+
61+
export default config;

0 commit comments

Comments
 (0)