Skip to content

Commit

Permalink
fix(user registration): resolve registration bug
Browse files Browse the repository at this point in the history
- ensure that a user provide neccessary inputs
- restructure user entity
- refactor other codes depending on user registration logic

[Fixes #39]
  • Loading branch information
aimedivin committed May 3, 2024
1 parent b775d65 commit d9dbd1b
Show file tree
Hide file tree
Showing 18 changed files with 240 additions and 206 deletions.
13 changes: 10 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
PORT= ********************************
APP_ENV= ********************************
PDN_DB_NAME= *****************************

TEST_DB_HOST= ********************************
TEST_DB_PORT= ********************************
TEST_DB_USER= ********************************
TEST_DB_PASS= ********************************
TEST_DB_NAME= ********************************

DEV_DB_HOST= ********************************
DEV_DB_PORT= ********************************
DEV_DB_USER= ********************************
DEV_DB_PASS= *****************************
DEV_DB_TYPE= *******************************
DEV_DB_NAME= *******************************

PDN_DB_HOST= ********************************
PDN_DB_PORT= ********************************
PDN_DB_USER= ********************************
PDN_DB_PASS= ********************************
PDN_DB_PASS= ********************************
PDN_DB_NAME= *****************************
15 changes: 9 additions & 6 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@ module.exports = {
root: true,
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended'
],
extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-unused-vars': [
Expand All @@ -28,8 +25,14 @@ module.exports = {
'space-before-function-paren': ['warn', 'always'],
'func-style': ['warn', 'declaration', { allowArrowFunctions: true }],
'camelcase': 'warn',
'@typescript-eslint/explicit-function-return-type': ['warn', { allowExpressions: true }],
'@typescript-eslint/explicit-member-accessibility': ['off', { accessibility: 'explicit' }],
'@typescript-eslint/explicit-function-return-type': [
'warn',
{ allowExpressions: true },
],
'@typescript-eslint/explicit-member-accessibility': [
'off',
{ accessibility: 'explicit' },
],
'no-unused-vars': 'warn',
'no-extra-semi': 'warn',
},
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ name: knights-ecomm-be CI
on: [push, pull_request]

env:
DEV_DB_HOST: ${{secrets.DEV_DB_HOST}}
DEV_DB_PORT: ${{secrets.DEV_DB_PORT}}
DEV_DB_USER: ${{secrets.DEV_DB_USER}}
DEV_DB_PASS: ${{secrets.DEV_DB_PASS}}
DEV_DB_NAME: ${{secrets.DEV_DB_NAME}}
TEST_DB_HOST: ${{secrets.TEST_DB_HOST}}
TEST_DB_PORT: ${{secrets.TEST_DB_PORT}}
TEST_DB_USER: ${{secrets.TEST_DB_USER}}
TEST_DB_PASS: ${{secrets.TEST_DB_PASS}}
TEST_DB_NAME: ${{secrets.TEST_DB_NAME}}

jobs:
build-lint-test-coverage:
Expand Down
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# E-commerse Backend API
[![knights-ecomm-be CI](https://github.com/atlp-rwanda/knights-ecomm-be/actions/workflows/ci.yml/badge.svg)](https://github.com/atlp-rwanda/knights-ecomm-be/actions/workflows/ci.yml)    [![Coverage Status](https://coveralls.io/repos/github/atlp-rwanda/knights-ecomm-be/badge.svg?branch=ch-ci-setup)](https://coveralls.io/github/atlp-rwanda/knights-ecomm-be?branch=ch-ci-setup)    [![Version](https://img.shields.io/badge/version-1.0.0-blue)](https://github.com/your-username/your-repo-name/releases/tag/v1.0.0)

[![knights-ecomm-be CI](https://github.com/atlp-rwanda/knights-ecomm-be/actions/workflows/ci.yml/badge.svg)](https://github.com/atlp-rwanda/knights-ecomm-be/actions/workflows/ci.yml)
  
[![Coverage Status](https://coveralls.io/repos/github/atlp-rwanda/knights-ecomm-be/badge.svg?branch=ch-ci-setup)](https://coveralls.io/github/atlp-rwanda/knights-ecomm-be?branch=ch-ci-setup)
  
[![Version](https://img.shields.io/badge/version-1.0.0-blue)](https://github.com/your-username/your-repo-name/releases/tag/v1.0.0)

## Description

Expand Down
18 changes: 8 additions & 10 deletions migrations/1714595134552-UserMigration.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { MigrationInterface, QueryRunner } from "typeorm";
import { MigrationInterface, QueryRunner } from 'typeorm';

export class CreateUserMigration1614495123940 implements MigrationInterface {

public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
public async up (queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
CREATE TABLE "user" (
"id" uuid NOT NULL DEFAULT uuid_generate_v4(),
"firstName" character varying NOT NULL,
Expand All @@ -22,10 +21,9 @@ export class CreateUserMigration1614495123940 implements MigrationInterface {
CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id")
)
`);
}

public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP TABLE "user"`);
}
}

}
public async down (queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP TABLE "user"`);
}
}
63 changes: 39 additions & 24 deletions ormconfig.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,39 @@
module.exports = {
"type": "postgres",
"host": `${process.env.DEV_DB_HOST}`,
"port": `${process.env.DEV_DB_PORT}`,
"username": `${process.env.DEV_DB_USER}`,
"password": `${process.env.DEV_DB_PASS}`,
"database": `${process.env.DEV_DB_NAME}`,
"synchronize": true,
"logging": false,
"entities": [
"src/entities/**/*.ts"
],
"migrations": [
"src/migrations/**/*.ts"
],
"subscribers": [
"src/subscribers/**/*.ts"
],
"cli": {
"entitiesDir": "src/entities",
"migrationsDir": "src/migrations",
"subscribersDir": "src/subscribers"
}
};
const devConfig = {
type: 'postgres',
host: process.env.DEV_DB_HOST,
port: process.env.DEV_DB_PORT,
username: process.env.DEV_DB_USER,
password: process.env.DEV_DB_PASS,
database: process.env.DEV_DB_NAME,
synchronize: true,
logging: false,
entities: ['src/entities/**/*.ts'],
migrations: ['src/migrations/**/*.ts'],
subscribers: ['src/subscribers/**/*.ts'],
cli: {
entitiesDir: 'src/entities',
migrationsDir: 'src/migrations',
subscribersDir: 'src/subscribers',
},
};

const testConfig = {
type: 'postgres',
host: process.env.TEST_DB_HOST,
port: process.env.TEST_DB_PORT,
username: process.env.TEST_DB_USER,
password: process.env.TEST_DB_PASS,
database: process.env.TEST_DB_NAME,
synchronize: true,
logging: false,
entities: ['src/entities/**/*.ts'],
migrations: ['src/migrations/**/*.ts'],
subscribers: ['src/subscribers/**/*.ts'],
cli: {
entitiesDir: 'src/entities',
migrationsDir: 'src/migrations',
subscribersDir: 'src/subscribers',
},
};

module.exports = process.env.NODE_ENV === 'test' ? testConfig : devConfig;
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
"description": "E-commerce backend",
"main": "index.js",
"scripts": {
"test": "jest --coverage --detectOpenHandles --verbose --runInBand",
"dev": "nodemon src/index.ts",
"test": "cross-env APP_ENV=test jest --coverage --detectOpenHandles --verbose --runInBand ",
"dev": "cross-env APP_ENV=dev nodemon src/index.ts",
"build": "tsc -p .",
"start": "node dist/index.js",
"lint": "eslint .",
Expand All @@ -24,6 +24,7 @@
"bcrypt": "^5.1.1",
"class-validator": "^0.14.1",
"cors": "^2.8.5",
"cross-env": "^7.0.3",
"dotenv": "^16.4.5",
"express": "^4.19.2",
"express-winston": "^4.2.0",
Expand Down Expand Up @@ -75,4 +76,4 @@
"typescript": "^5.4.5",
"typescript-eslint": "^7.7.1"
}
}
}
58 changes: 31 additions & 27 deletions src/__test__/route.test.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,48 @@
import request from 'supertest';
import { app, server } from '../index'; // update this with the path to your app file
import { app, server } from '../index';
import { createConnection, getConnection, getConnectionOptions } from 'typeorm';
import { User } from '../entities/User';
import { getRepository, Repository } from 'typeorm';

beforeAll(async () => {
// Connect to the test database
const connectionOptions = await getConnectionOptions();

await createConnection({ ...connectionOptions, name: 'testConnection' });
});

afterAll(async () => {
await getConnection('testConnection').close();
server.close();
});
const connection = getConnection('testConnection');
const userRepository = connection.getRepository(User);

// Delete all records from the User
await userRepository.clear();

// Close the connection to the test database
await connection.close();

server.close();
});

describe('GET /', () => {
it('This is a testing route that returns', done => {
request(app)
.get('/api/v1/status')
.expect(200)
.expect('Content-Type', /json/)
.expect({
status: 'success',
data: {
code: 202,
message: 'This is a testing route that returns: 202'
}
}, done);
.expect(
{
status: 'success',
data: {
code: 200,
message: 'This is a testing route.',
},
},
done
);
});
});
describe('POST /user/register', () => {
it('should register a new user and then delete it', async () => {
it('should register a new user', async () => {
// Arrange
const newUser = {
firstName: 'John',
Expand All @@ -43,25 +52,20 @@ describe('POST /user/register', () => {
gender: 'Male',
phoneNumber: '1234567890',
userType: 'Buyer',
status: 'active',
verified: true,
photoUrl: 'https://example.com/photo.jpg',
};

// Act
const res = await request(app)
.post('/user/register')
.send(newUser);
const res = await request(app).post('/user/register').send(newUser);

// Assert
expect(res.status).toBe(201);
expect(res.body).toEqual({ message: 'User registered successfully' });

// Clean up: delete the test user
const userRepository = getRepository(User);
const user = await userRepository.findOne({ where: { email: newUser.email } });
if (user) {
await userRepository.remove(user);
}
expect(res.body).toEqual({
status: 'success',
data: {
code: 201,
message: 'User registered successfully',
},
});
});
});
});
Loading

0 comments on commit d9dbd1b

Please sign in to comment.