Skip to content

Commit 99c3741

Browse files
authored
Merge pull request #7 from MarCassMari/feat/lastcenario
feat/novos-cenários
2 parents 9c03f50 + d636ee5 commit 99c3741

File tree

5 files changed

+62
-3
lines changed

5 files changed

+62
-3
lines changed

README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
| **Postman** | Documentação e testes manuais de API. | 🟠 | [Acessar Doc](https://learning.postman.com/) |
1313
| **Zod** | Validação de schemas e contratos de API. | 🛡️ | [Acessar Doc](https://zod.dev/) |
1414

15+
### Ferramentas de Setup:
16+
* [ESLint](https://eslint.org/) - Análise estática do código.
17+
* [Prettier](https://prettier.io/) - Formatação automática de arquivos.
18+
* [Husky](https://typicode.github.io/husky/) - Git Hooks para automação de tarefas.
19+
* [lint-staged](https://github.com/lint-staged/lint-staged) - Verificação de arquivos modificados antes do commit.
20+
1521

1622

1723

@@ -75,5 +81,6 @@ Este projeto entrega um **framework de automação E2E robusto e escalável**, d
7581
* **Arquitetura Multicamadas**: Implementação rigorosa do padrão **Page Object Model (POM)**, garantindo a separação entre a lógica de teste e a interação com elementos da interface.
7682
* **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.
7783
* **Isolamento e Independência**: Testes desenhados para serem independentes, com setups e cleanups que garantem a confiabilidade da execução (evitando estados compartilhados).
78-
* **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.
84+
* **Entrega 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.
7985
* **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 e status definidos.
86+
* **Qualidade de Código e Git Hooks**: Para garantir a consistência do código e evitar que erros simples subam para o repositório, este projeto utiliza **ESLint** e **Prettier**, que sçao ferramentas que analisam estaticamente e identifica os padrões de código problemáticos, e formatam para garantir que todos os arquivos sigam o mesmo estilo. O projeto, na etapa de pré-commit, também utiliza **Husky** na gerência dos Git Hooks garantindo que o código seja automaticamente formatado e verificado. Se houver algum erro de linting que não possa ser corrigido automaticamente, o commit será bloqueado, garantindo que apenas código limpo chegue ao GitHub a cada branch.

pages/CheckoutPage.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ export class CheckoutPage {
77
readonly zipCodeInput: Locator;
88
readonly continueBtn: Locator;
99
readonly subtotalLabel: Locator;
10+
readonly finishBtn: Locator;
11+
readonly successHeader: Locator;
1012

1113
constructor(page: Page) {
1214
this.page = page;
@@ -15,6 +17,8 @@ export class CheckoutPage {
1517
this.zipCodeInput = page.locator('[data-test="postalCode"]');
1618
this.continueBtn = page.locator('[data-test="continue"]');
1719
this.subtotalLabel = page.locator('[data-test="subtotal-label"]');
20+
this.finishBtn = page.locator('[data-test="finish"]');
21+
this.successHeader = page.locator('.complete-header');
1822
}
1923

2024
async preencherDadosEContinuar(first: string, last: string, zip: string) {
@@ -23,4 +27,8 @@ export class CheckoutPage {
2327
await this.zipCodeInput.fill(zip);
2428
await this.continueBtn.click();
2529
}
30+
31+
async finalizarCompra() {
32+
await this.finishBtn.click();
33+
}
2634
}

pages/ItensPage.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ export class ItensPage {
77
readonly bikeLightAddToCartBtn: Locator;
88
readonly boltTshirtAddToCartBtn: Locator;
99
readonly cartLink: Locator;
10+
readonly removeBackpackButton: Locator;
11+
readonly cartItem: Locator;
12+
readonly backpackInCart: Locator;
1013

1114
constructor(page: Page) {
1215
this.page = page;
@@ -16,11 +19,18 @@ export class ItensPage {
1619
this.bikeLightAddToCartBtn = page.locator('[data-test="add-to-cart-sauce-labs-bike-light"]');
1720
this.boltTshirtAddToCartBtn = page.locator('[data-test="add-to-cart-sauce-labs-bolt-t-shirt"]');
1821
this.cartLink = page.locator('[data-test="shopping-cart-link"]');
22+
this.removeBackpackButton = page.locator('[data-test="remove-sauce-labs-backpack"]');
23+
this.cartItem = page.locator('.cart_item');
24+
this.backpackInCart = page.locator('.cart_item').filter({ hasText: 'Sauce Labs Backpack' });
1925
}
2026

2127
async adicionarBackpackAoCarrinho() {
2228
await this.backpackAddToCartBtn.click();
2329
await this.bikeLightAddToCartBtn.click();
2430
await this.boltTshirtAddToCartBtn.click();
2531
}
32+
33+
async removeBackPack() {
34+
await this.removeBackpackButton.click();
35+
}
2636
}

tests/e2e/checkout.spec.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import { test, expect } from '@playwright/test';
22
import { CartFlows } from '../../fluxos/cartilhaFluxos';
33
import { CheckoutPage } from '../../pages/CheckoutPage';
44
import { LoginPage } from '../../pages/LoginPage';
5+
import { ItensPage } from '../../pages/ItensPage';
56

67
test.describe('Cenários de Checkout', () => {
7-
// Setup de Login obrigatório para acessar o inventário
88
test.beforeEach(async ({ page }) => {
99
const loginPage = new LoginPage(page);
1010
await loginPage.acessarPagina();
@@ -22,4 +22,23 @@ test.describe('Cenários de Checkout', () => {
2222

2323
await expect(checkout.subtotalLabel).toContainText('55.97');
2424
});
25+
26+
test('Fluxo completo do checkout com sucesso após adicionar itens', async ({ page }) => {
27+
const itens = new ItensPage(page);
28+
const checkout = new CheckoutPage(page);
29+
30+
await itens.adicionarBackpackAoCarrinho();
31+
await itens.cartLink.click();
32+
await page.locator('[data-test="checkout"]').click();
33+
34+
await checkout.preencherDadosEContinuar('Marcus', 'Machado', '31030080');
35+
36+
await expect(checkout.subtotalLabel).toContainText('Item total: $');
37+
await expect(
38+
page.locator('.inventory_item_name').filter({ hasText: 'Sauce Labs Backpack' })
39+
).toBeVisible();
40+
41+
await checkout.finalizarCompra();
42+
await expect(checkout.successHeader).toHaveText('Thank you for your order!');
43+
});
2544
});

tests/e2e/itensCarrinho.spec.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { test, expect } from '@playwright/test';
22
import { LoginPage } from '../../pages/LoginPage';
33
import { ItensPage } from '../../pages/ItensPage';
44

5-
test.describe('Cenários de adicionar itens no Carrinho', () => {
5+
test.describe('Cenários de adicionar e remover itens no Carrinho', () => {
66
test.beforeEach(async ({ page }) => {
77
const loginPage = new LoginPage(page);
88
await loginPage.acessarPagina();
@@ -17,4 +17,19 @@ test.describe('Cenários de adicionar itens no Carrinho', () => {
1717
await expect(item.cartBadge).toHaveText('3');
1818
await expect(page.locator('[data-test="remove-sauce-labs-backpack"]')).toBeVisible();
1919
});
20+
21+
test('Remover item do carrinho e validar a exclusão', async ({ page }) => {
22+
const item = new ItensPage(page);
23+
24+
await item.adicionarBackpackAoCarrinho();
25+
await item.cartLink.click();
26+
27+
await expect(item.backpackInCart).toBeVisible();
28+
29+
await item.removeBackPack();
30+
31+
await expect(item.backpackInCart).not.toBeAttached();
32+
33+
await expect(item.cartBadge).toHaveText('2');
34+
});
2035
});

0 commit comments

Comments
 (0)