Skip to content

Commit 1ea7969

Browse files
authored
Merge pull request #5 from MarCassMari/feat/api-tests
feat/testes-apizod
2 parents a40f5bb + ac8e6e5 commit 1ea7969

File tree

9 files changed

+111
-3
lines changed

9 files changed

+111
-3
lines changed

.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
GOREST_BASE_URL=https://gorest.co.in/public/v2
2+
GOREST_TOKEN=insira_seu_token_sem_aspas

.github/workflows/playwright.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ jobs:
2626
run: npx playwright install --with-deps
2727

2828
- name: Run Playwright tests
29+
env:
30+
GOREST_BASE_URL: ${{ secrets.GOREST_BASE_URL }}
31+
GOREST_TOKEN: ${{ secrets.GOREST_TOKEN }}
32+
2933
run: npx playwright test
3034

3135
- name: Upload Test Report

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ node_modules/
66
/blob-report/
77
/playwright/.cache/
88
/playwright/.auth/
9+
.env

README.md

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
| **TypeScript** | Linguagem principal para tipagem e segurança. | 📘 | [Acessar Doc](https://www.typescriptlang.org/) |
1010
| **Node.js** | Ambiente de execução do projeto. | 🟢 | [Acessar Doc](https://nodejs.org/) |
1111
| **GitHub Actions** | Orquestração de CI/CD e execução em nuvem. | 🚀 | [Acessar Doc](https://github.com/features/actions) |
12+
| **Postman** | Documentação e testes manuais de API. | 🟠 | [Acessar Doc](https://learning.postman.com/) |
13+
| **Zod** | Validação de schemas e contratos de API. | 🛡️ | [Acessar Doc](https://zod.dev/) |
1214

1315

1416

@@ -26,18 +28,32 @@ cd onlyfly
2628
npm install
2729
```
2830

29-
### 3. Instalar os Browsers do Playwright
31+
### 3. 🔑 Configuração de Variáveis de Ambiente
32+
33+
Para rodar os testes de API localmente, é necessário configurar as credenciais de acesso. O projeto já conta com um arquivo de base para facilitar esse processo:
34+
Localize o arquivo **.env.example** na raiz do projeto.
35+
36+
Duplique-o e renomeie a cópia para apenas **.env**
37+
38+
Preencha as chaves com seus dados da API GoRest:
39+
40+
```bash
41+
GOREST_BASE_URL=https://gorest.co.in/public/v2
42+
GOREST_TOKEN=insira_seu_token_aqui_sem_aspas
43+
```
44+
45+
Instalando as dependências do projeto:
3046

3147
```bash
3248
npx playwright install
3349
```
3450

35-
### 4. Executando os Testes E2E:
51+
### 4.1. Executando os Testes E2E:
3652

3753
```bash
3854
npx playwright test
3955
```
40-
4.1. Modo UI(Interface Visual):
56+
4.2. Modo UI(Interface Visual):
4157
```bash
4258
npx playwright test --ui
4359
```
@@ -60,3 +76,4 @@ Este projeto entrega um **framework de automação E2E robusto e escalável**, d
6076
* **Programação Orientada a Objetos (POO)**: Utilização de classes e métodos para encapsular comportamentos, facilitando a reutilização de código e a legibilidade dos cenários.
6177
* **Isolamento e Independência**: Testes desenhados para serem independentes, com setups e cleanups que garantem a confiabilidade da execução (evitando estados compartilhados).
6278
* **Qualidade Contínua (CI/CD)**: Pipeline totalmente integrada via GitHub Actions, validando o projeto em múltiplos motores de renderização (Chromium e Firefox) a cada nova alteração.
79+
* **Testes de API com Validação de Contrato**: Além da UI, o projeto integra validações de camada de serviço utilizando **Zod**, garantindo que a comunicação com o backend siga rigorosamente os schemas definidos.

package-lock.json

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,9 @@
3232
"husky": "^8.0.0",
3333
"lint-staged": "^16.2.7",
3434
"prettier": "^3.8.1"
35+
},
36+
"dependencies": {
37+
"dotenv": "^17.2.3",
38+
"zod": "^4.3.6"
3539
}
3640
}

playwright.config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import { defineConfig, devices } from '@playwright/test';
2+
import dotenv from 'dotenv';
3+
import path from 'path';
4+
5+
dotenv.config({ path: path.resolve(__dirname, '.env') });
26

37
/**
48
* Read environment variables from file.

tests/api/schemas/schemas.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { z } from 'zod';
2+
3+
export const userSchema = z.object({
4+
id: z.number(),
5+
name: z.string(),
6+
email: z.string().email(),
7+
gender: z.enum(['male', 'female']),
8+
status: z.enum(['active', 'inactive']),
9+
});
10+
11+
export const userListSchema = z.array(userSchema);

tests/api/users.spec.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { test, expect } from '@playwright/test';
2+
import { userSchema, userListSchema } from './schemas/schemas';
3+
4+
test('Buscar Lista de Usuários com Auth via .env', async ({ request }) => {
5+
const response = await request.get(`${process.env.GOREST_BASE_URL}/users`, {
6+
headers: {
7+
Authorization: `Bearer ${process.env.GOREST_TOKEN}`,
8+
'Content-Type': 'application/json',
9+
},
10+
});
11+
12+
expect(response.status()).toBe(200);
13+
14+
const responseBody = await response.json();
15+
16+
const users = userListSchema.parse(responseBody);
17+
18+
expect(users.length).toBeGreaterThan(0);
19+
});
20+
21+
test('POST - Deve criar um usuário e validar a integridade do payload', async ({ request }) => {
22+
const response = await request.post(`${process.env.GOREST_BASE_URL}/users`, {
23+
headers: { Authorization: `Bearer ${process.env.GOREST_TOKEN}` },
24+
data: {
25+
name: 'Marcus Machado',
26+
email: `marcus.${Date.now()}@onfly.com.br`,
27+
gender: 'male',
28+
status: 'active',
29+
},
30+
});
31+
32+
expect(response.status()).toBe(201);
33+
34+
const responseBody = await response.json();
35+
36+
const userValidado = userSchema.parse(responseBody);
37+
38+
expect(userValidado.name).toBe('Marcus Machado');
39+
expect(userValidado.status).toBe('active');
40+
});

0 commit comments

Comments
 (0)