Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
3 changes: 3 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
PORT=3000
APP_SECRET='bennu_secret1215412asas41A'
listValidTokenPath=./validTokens.json
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
12 changes: 12 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
FROM node:alpine

WORKDIR /usr/app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]
98 changes: 98 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,101 @@ Contrua uma API em NodeJS, que consultará o arquivo _news.json_ e disponibiliza
- **Escolhas técnicas**

Boa sorte e divirta-se!!!

## Instruções Para execução do projeto

<br>

### Rodar os tests unitários e testes de integração
<hr>
<br>

* Instale as dependências
<br>

`npm install` ou `yarn install`

* Rode os testes
<br>

`npm run test` ou `yarn test`

<br>
<br>

### Rodar Aplicação com container Docker
<hr>
<br>
Para rodar a aplicação no docker, caso você tenha instalado o <a href="https://docs.docker.com/compose/">docker-compose</a>. Basta rodar o comando:
<br>
<br>

`docker-compose up`.

<br>
Caso não queira usar o orquestrador <a href="https://docs.docker.com/compose/">docker-compose</a>, você pode subir a imagem manualmente executando os comandos abaixo em sequência:

<br>
<br>

Montar imagem do container:

`docker build -t glauber/desafiobennubr .`

<br>

Rodar a imagem criada:

`docker run -p 3000:3000 -d glauber/desafiobennubr`

<br>

### Rodar Aplicação diretamente na máquina
<hr>

<br>

* Instale as dependências
<br>

`npm install` ou `yarn install`

<br>

* Rode a aplicação para produção
<br>

`npm start` ou `yarn start`

<br>

* Rode a aplicação para desenvolvimento
<br>

`npm run dev` ou `yarn dev`

<br>

### Documentação da API do desafio
<hr>

<br>

<a href="https://documenter.getpostman.com/view/7815838/TVYKbwpc">Documentação API - BENNU DESAFIO</a>

<br>

### Collection para POSTMAN
<hr>

<br>

<a href="https://www.getpostman.com/collections/cf255307af96396963f7">Collection para POSTMAN</a>

<br>

Obrigado pela oportunidade de participar desse processo, espero atender aos requisitos e poder somar junto a vocês.




88 changes: 88 additions & 0 deletions __tests__/integration/auth.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
const request = require('supertest');
const app = require('../../src/app');
const UsersModel = require('../../src/app/models/UsersModel');
const { AuthUtils } = require('../../src/app/controllers/Authentication/AuthUtils');

describe('Auth', () => {

beforeEach(async () => {

})

//------LOGIN TESTS-------//

it('should return status 401 error case use wrong credentials', async () => {

const response = await request(app).post('/api/v1/auth/login').send({
email: 'error@bennu.com',
password: '123123'
});

expect(response.status).toBe(401);
});

it('should return status 200 case use correct credentials', async () => {

const response = await request(app).post('/api/v1/auth/login').send({
email: 'glauber@bennu.com',
password: '123321'
});

expect(response.status).toBe(200);
});

it('should return token in body response', async () => {

const response = await request(app).post('/api/v1/auth/login').send({
email: 'glauber@bennu.com',
password: '123321'
});

expect(response.body).toHaveProperty('token');
});

//------LOGOUT TESTS-------//

it('should return status 401 case dont have auth token', async () => {

const response = await request(app).get('/api/v1/auth/logout');

expect(response.status).toBe(401);
});

it('should return status 401 case token is invalid ', async () => {

const response = await request(app).get('/api/v1/auth/logout')
.set('Authorization', 'Bearer 123123');

expect(response.status).toBe(401);
});

it('should return status 200 case token is valid', async () => {

let user = await UsersModel.getUserByEmail('glauber@bennu.com');
let token = await AuthUtils.geenerateToken(user.dataUser.email);


const response = await request(app).get('/api/v1/auth/logout')
.set('Authorization', `Bearer ${token}`);

expect(response.status).toBe(200);
});

it('should return status 401 case logout ', async () => {

let user = await UsersModel.getUserByEmail('glauber@bennu.com');
let token = await AuthUtils.geenerateToken(user.dataUser.userID);


const response = await request(app).get('/api/v1/auth/logout')
.set('Authorization', `Bearer ${token}`);

const response2 = await request(app).get('/api/v1/auth/logout')
.set('Authorization', `Bearer ${token}`);

expect(response2.status).toBe(401);
});

});
103 changes: 103 additions & 0 deletions __tests__/integration/news.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
const request = require('supertest');
const app = require('../../src/app');
const UserModel = require('../../src/app/models/UsersModel');
const { AuthUtils } = require('../../src/app/controllers/Authentication/AuthUtils');

describe('NEWS - TESTS IMPLEMENTATION NEWS API', () => {

//------NEWS TESTS-------//

it('should return status 401 case access without token header /api/v1/news/get-all', async () => {

const response = await request(app).get('/api/v1/news/get-all');

expect(response.status).toBe(401);
});

it('should return status 401 case access without token header /api/v1/news/get-news', async () => {

const response = await request(app).get('/api/v1/news/get-news');

expect(response.status).toBe(401);
});

it('should return status 401 case access with invalid token header /api/v1/news/get-all', async () => {

const response = await request(app).get('/api/v1/news/get-all')
.set('Authorization', `Bearer 123456`);

expect(response.status).toBe(401);
});

it('should return status 401 case access with invalid token header /api/v1/news/get-news', async () => {

const response = await request(app).get('/api/v1/news/get-news')
.set('Authorization', `Bearer 123456`);

expect(response.status).toBe(401);
});

it('should return status 200 case access with valid token header /api/v1/news/get-all', async () => {

let user = await UserModel.getUserByEmail('glauber@bennu.com');
let token = await AuthUtils.geenerateToken(user.dataUser.userID);

const response = await request(app).get('/api/v1/news/get-all')
.set('Authorization', `Bearer ${token}`);

expect(response.status).toBe(200);
});

it('should return status 200 case access with valid token header /api/v1/news/get-news', async () => {

let user = await UserModel.getUserByEmail('glauber@bennu.com');
let token = await AuthUtils.geenerateToken(user.dataUser.userID);

const response = await request(app).get('/api/v1/news/get-news?id=782973')
.set('Authorization', `Bearer ${token}`);

expect(response.status).toBe(200);
});

it('should return status allNews property in body request /api/v1/news/get-all', async () => {

let user = await UserModel.getUserByEmail('glauber@bennu.com');
let token = await AuthUtils.geenerateToken(user.dataUser.userID);

const response = await request(app).get('/api/v1/news/get-all')
.set('Authorization', `Bearer ${token}`);

expect(response.body).toHaveProperty('allNews');
});

it('should return status allNews property in body request /api/v1/news/get-news', async () => {

let user = await UserModel.getUserByEmail('glauber@bennu.com');
let token = await AuthUtils.geenerateToken(user.dataUser.userID);

const response = await request(app).get('/api/v1/news/get-news?id=782973')
.set('Authorization', `Bearer ${token}`);

expect(response.body).toHaveProperty('news');
});

it('should not allow access private urls after logout with token', async () => {

const response = await request(app).post('/api/v1/auth/login')
.send({
email: 'glauber@bennu.com',
password: '123321'
})

let token = response.body.token;

await request(app).get('/api/v1/auth/logout')
.set('Authorization', `Bearer ${token}`);


const response3 = await request(app).get('/api/v1/news/get-news?id=782973')
.set('Authorization', `Bearer ${token}`);

expect(response3.status).toBe(401);
});
})
55 changes: 55 additions & 0 deletions __tests__/unit/auth.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
const AuthUtils = require('../../src/app/controllers/Authentication/AuthUtils').AuthUtils;

describe('AuthUtils - Complementary functions of AuthenticationController', () => {

it('should return error=true case invalid email', async () => {

let result = AuthUtils.emailIsValid('gllaslkkaslk.com');

expect(result.error).toBe(true);
});

it('should return error=true case password.length < 6', async () => {

let result = AuthUtils.passwordIsValid('asdf');

expect(result.error).toBe(true);
});

it('should return error=false case email is valid', async () => {

let result = AuthUtils.emailIsValid('glauber@gma.com');

expect(result.error).toBe(false);
});

it('should return error=false case password.length >= 6', async () => {

let result = AuthUtils.passwordIsValid('1234565');

expect(result.error).toBe(false);
});


it('should return error=true case email are incorrect', async () => {

let result = await AuthUtils.checkCredentials('glauber@bennu.com.br', '123321');

expect(result.error).toBe(true);
});

it('should return error=true case password are incorrect', async () => {

let result = await AuthUtils.checkCredentials('glauber@bennu.com', '123322');

expect(result.error).toBe(true);
});

it('should return error=false case email and password are corrects', async () => {

let result = await AuthUtils.checkCredentials('glauber@bennu.com', '123321');

expect(result.error).toBe(false);
});

});
10 changes: 10 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
version: "3"

services:
app:
build: .
command: npm run dev
ports:
- "3000:3000"
volumes:
- .:/usr/app
Loading