Skip to content

Commit

Permalink
Merge branch 'dev' of https://github.com/atlp-rwanda/eagles-ec-be int…
Browse files Browse the repository at this point in the history
…o ft-user-signup-#187431242
  • Loading branch information
yvanddniyo committed Apr 18, 2024
2 parents 9f792ba + a44a22c commit 87cfeb7
Show file tree
Hide file tree
Showing 20 changed files with 299 additions and 127 deletions.
52 changes: 52 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Eagle e-commerce CI/CD

on:
push:
branches:
- main
- dev

pull_request:
branches:
- main
- dev

workflow_dispatch:

jobs:
build:
name: Building code
runs-on: ubuntu-latest

steps:
- name: Checkout the code
uses: actions/checkout@v3

- name: Setup node
uses: actions/setup-node@v3
with:
node-version: "20"

- name: Install dependencies
run: npm install

- name: Running test
env:
DB_CONNECTION: ${{ secrets.DB_CONNECTION }}
TEST_DB: ${{ secrets.TEST_DB }}
run: npm run test

- name: Build application
run: npm run build

- name: Upload coverage reports to Codecov
uses: codecov/[email protected]
with:
token: ${{ secrets.CODECOV_TOKEN }}
slug: soleil00/eagles-ec-be

- name: Trigger Render Deployment
env:
RENDER_DEPLOYMENT_HOOK_URL: ${{ secrets.RENDER_DEPLOYMENT_HOOK_URL }}
run: |
curl -X POST $RENDER_DEPLOYMENT_HOOK_URL
20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,21 @@
# eagles-ec-be

<div style="display: flex; justify-content: center;" align="center">
<img src="https://codecov.io/gh/soleil00/eagles-ec-be/branch/dev/graph/badge.svg?token=9c1e8e93-1062-4e49-a58d-b2777a75fb70" alt="Codecov" >
<img alt="GitHub Actions Workflow Status" src="https://img.shields.io/github/actions/workflow/status/soleil00/eagles-ec-be/test.yml" >
<a href="https://codeclimate.com/github/atlp-rwanda/eagles-ec-be/maintainability"><img src="https://api.codeclimate.com/v1/badges/dfe8454356fb9da65407/maintainability" /></a>

</div>

### Technology used

![Node.js](https://img.shields.io/badge/-Node.js-000000?style=flat&logo=node.js)
[![Passport.js](https://img.shields.io/badge/auth%20library-Passport.js-green)](http://www.passportjs.org/)
[![PostgreSQL](https://img.shields.io/badge/database-PostgreSQL-blue)](https://www.postgresql.org/)
[![Sequelize](https://img.shields.io/badge/ORM-Sequelize-orange)](https://sequelize.org/)
[![Jest](https://img.shields.io/badge/testing-Jest-red)](https://jestjs.io/)
[![ESLint](https://img.shields.io/badge/code%20style-ESLint-blueviolet)](https://eslint.org/)

### Deployed link

[Eagles EC](https://eagles-ec-be-development.onrender.com/)
6 changes: 3 additions & 3 deletions __test__/home.test.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import request from "supertest";
import { beforeAll, afterAll, jest, test } from "@jest/globals";
import app from "../src/utils/server";
import { testDbConnection, testSequelize } from "../src/config/testDbConfig";
import sequelize, { connect } from "../src/config/dbConnection";

describe("Testing Home route", () => {
beforeAll(async () => {
try {
await testDbConnection();
await connect();
} catch (error) {
testSequelize.close();
sequelize.close();
}
}, 20000);

Expand Down
121 changes: 52 additions & 69 deletions __test__/user.route.test.ts
Original file line number Diff line number Diff line change
@@ -1,76 +1,59 @@
import request from 'supertest';
import { beforeAll, afterAll, beforeEach, afterEach, test } from '@jest/globals';
import app from '../src/utils/server';
import { testDbConnection, testSequelize } from '../src/config/testDbConfig';
import UserTest from '../src/sequelize/models/usersTests';
import request from 'supertest';
import { beforeAll, afterAll, beforeEach, afterEach, test } from '@jest/globals';
import app from '../src/utils/server';
import User from '../src/sequelize/models/users';
import sequelize, { connect } from '../src/config/dbConnection';

describe('Testing User route', () => {
beforeAll(async () => {
try {
await testDbConnection();
} catch (error) {
testSequelize.close();
}
}, 20000);

afterAll(async () => {
await testSequelize.close();
});
describe('Testing User route', () => {
beforeAll(async () => {
try { await
connect();
}
catch (error) { sequelize.close(); } }, 20000);

beforeEach(async () => {
await UserTest.destroy({ truncate: true });
});
afterAll(async () => {
await sequelize.close(); });
beforeEach(async () => {
await User.destroy({ truncate: true });
});

test('should return 201 when registering with an new user', async () => {
const userData = {
name: 'John Doe',
username: 'johndoe',
email: '[email protected]',
password: 'password123',
};

const response = await request(app)
.post('/api/v1/users/register')
.send(userData);

expect(response.status).toBe(201);
}, 20000);
test('should return 201 and create a new user when registering successfully', async () => {
const userData = {
name: 'yvanna',
username: 'testuser',
email: '[email protected]',
password: 'test1234',
};
const response = await request(app)
.post('/api/v1/users')
.send(userData);
expect(response.status).toBe(201); }, 20000);

test('should return 400 when registering with an existing email', async () => {
await UserTest.create({
name: "testing",
username: "yvan",
email : "[email protected]",
password : "1234567"
});

const userData = {
name: "testing",
username: "yvan",
email : "[email protected]",
password : "1234567"
};

const response = await request(app)
.post('/api/v1/users/register')
.send(userData);

expect(response.status).toBe(400);
}, 20000);
test('should return 409 when registering with an existing email', async () => { await User.create({
name: 'yvanna',
username: 'testuser',
email: '[email protected]',
password: 'test1234',
});


const userData = {
name: 'yvanna',
username: 'testuser',
email: '[email protected]',
password: 'test1234',
};

const response = await request(app)
.post('/api/v1/users')
.send(userData);
expect(response.status).toBe(409); }, 20000);

test('should return 500 when registering with an invalid credential', async () => {
const userData = {
email: '[email protected]',
name: '',
username: 'existinguser',
};

const response = await request(app)
.post('/api/v1/users/register')
.send(userData);

expect(response.status).toBe(500);
}, 20000);
});
test('should return 500 when registering with an invalid credential', async () => {
const userData = {
email: '[email protected]', name: "", username: 'existinguser', };
const response = await request(app)
.post('/api/v1/users')
.send(userData);

expect(response.status).toBe(500); }, 20000); });
7 changes: 3 additions & 4 deletions __test__/user.test.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import request from "supertest";
import { beforeAll, afterAll, jest, test } from "@jest/globals";
import app from "../src/utils/server";
import { testDbConnection, testSequelize } from "../src/config/testDbConfig";
import User from "../src/sequelize/models/users";
import * as userServices from "../src/services/user.service";
import sequelize, { connect } from "../src/config/dbConnection";

describe("Testing user Routes", () => {
beforeAll(async () => {
try {
await testDbConnection();
await connect();
} catch (error) {
testSequelize.close();
sequelize.close();
}
}, 20000);

Expand All @@ -20,6 +20,5 @@ describe("Testing user Routes", () => {
const response = await request(app).get("/api/v1/users");
expect(spy).toHaveBeenCalled();
expect(spy2).toHaveBeenCalled();
expect(response.statusCode).toBe(200);
}, 20000);
});
2 changes: 1 addition & 1 deletion index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ app.listen(env.port, async () => {
await sequelize
.sync()
.then(() => {
console.log(" db synced and server is running");
console.log(` db synced and server is running on port ${env.port}`);
})
.catch((error: any) => {
console.log(error.message);
Expand Down
18 changes: 9 additions & 9 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
preset: "ts-jest",
testEnvironment: "node",
testMatch: ["**/**/*.test.ts"],
verbose: true,
forceExit: true,
clearMocks: true,
resetMocks: true,
restoreMocks: true,
};
preset: "ts-jest",
testEnvironment: "node",
testMatch: ["**/**/*.test.ts"],
verbose: true,
forceExit: true,
clearMocks: true,
resetMocks: true,
restoreMocks: true,
};
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"@types/jest": "^29.5.12",
"@types/node": "^20.12.7",
"@types/supertest": "^6.0.2",
"@types/swagger-ui-express": "^4.1.6",
"@typescript-eslint/eslint-plugin": "^7.6.0",
"@typescript-eslint/parser": "^7.6.0",
"eslint": "^8.57.0",
Expand All @@ -44,11 +45,13 @@
"dependencies": {
"bcryptjs": "^2.4.3",
"cors": "^2.8.5",
"cross-env": "^7.0.3",
"dotenv": "^16.4.5",
"express": "^4.19.2",
"path": "^0.12.7",
"pg": "^8.11.5",
"pg-hstore": "^2.3.4",
"sequelize": "^6.37.2"
"sequelize": "^6.37.2",
"swagger-ui-express": "^5.0.0"
}
}
7 changes: 6 additions & 1 deletion src/config/dbConnection.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import { Sequelize } from "sequelize";
import { env } from "../utils/env";

const sequelize = new Sequelize(env.db_url);
const envT = process.env.NODE_ENV;

const sequelize = new Sequelize(envT === "test" ? env.test_db_url : env.db_url,{
dialect: 'postgres',
})


export const connect = async () => {
try {
Expand Down
11 changes: 0 additions & 11 deletions src/config/testDbConfig.ts

This file was deleted.

16 changes: 9 additions & 7 deletions src/controllers/userControllers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,21 @@ export const fetchAllUsers = async (req: Request, res: Response) => {

export const createUserController = async (req: Request, res: Response) => {
try {
const {name, email, username, password } = req.body;
const { name, email, username, password } = req.body;
const user = await createUserService(name, email, username, password);
if (!user) {
return res.status(400).json({
status: 400,
message: 'User already exists' });
return res.status(409).json({
status: 409,
message: 'User already exists' });
}
res.status(201).json({
status: 201,
message: "User successfully created." });
} catch (err:any) {
message: "User successfully created."
});

} catch (err: any) {
if (err.name === 'UnauthorizedError' && err.message === 'User already exists') {
return res.status(400).json({ error: 'User already exists' });
return res.status(409).json({ error: 'User already exists' });
}
res.status(500).json({ error: err });
}
Expand Down
Loading

0 comments on commit 87cfeb7

Please sign in to comment.