Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
66097af
Add Cenarios file
JoaoTeles87 Dec 16, 2024
0778d09
Create criacaoManutencaoUsuario.rb
JoaoTeles87 Dec 16, 2024
afd7fff
feat: creation of the CadastroManutencao and Login features
JoaoTeles87 Dec 18, 2024
a529771
feat(CadastroManutencao): add validation for mismatched passwords and…
JoaoTeles87 Dec 18, 2024
79d5180
feat: add file ReservaSalas
JoaoTeles87 Dec 18, 2024
6b9bd3e
feat: add file ReservaSalas
JoaoTeles87 Dec 19, 2024
9715914
feat: update file ReservaSalas
JoaoTeles87 Dec 19, 2024
1c5ae9d
feat: adding backend and connecting with vite.js server in frontend
JoaoTeles87 Feb 7, 2025
e9daa0f
Update README.md
JoaoTeles87 Feb 7, 2025
4707504
feat: adding requirements.txt in backend venv
JoaoTeles87 Feb 7, 2025
2f277e8
Merge branch 'dev' of https://github.com/JoaoTeles87/2024.2-Equipe3 i…
JoaoTeles87 Feb 7, 2025
df69306
Adicionando rotas de Login e Cadastro e sistematizandoesqueleto da ap…
JoaoTeles87 Feb 9, 2025
c2b59a4
fix: retirando expiração de token, access_token
JoaoTeles87 Feb 9, 2025
7a2f68d
updating: requirements.txt
JoaoTeles87 Feb 9, 2025
b8c1083
criacao de rotas backend
JoaoTeles87 Feb 9, 2025
f8a8f4f
Merge pull request #1 from JoaoTeles87/login/cadastro
JoaoTeles87 Feb 9, 2025
db1fb93
feat: implements resource and maintenance request routes
fernandapascoal Feb 11, 2025
6d6ee5b
refactor: adjust new route conditions according to scenarios
fernandapascoal Feb 15, 2025
b6f050e
fix(validatio): correcting imports and routes
JoaoTeles87 Feb 15, 2025
a563162
fix(service): adequando as rotas as features de serviço.
JoaoTeles87 Feb 15, 2025
7d7a165
test(service): Adicionando testes de serviço.
JoaoTeles87 Feb 15, 2025
0082b65
feat: adds necessary routes/endpoints to reservas and salas
lucasddmc Feb 16, 2025
e2285bd
fix(backend): Changing the logic to catch edge cases
JoaoTeles87 Feb 16, 2025
fd588ef
fix(services): Changing scenarios and tests requests
JoaoTeles87 Feb 16, 2025
34af047
fix(services): Correcting comments and Login Feature
JoaoTeles87 Feb 16, 2025
271d0a2
Refactoring(services): changing success scenarios
JoaoTeles87 Feb 16, 2025
659077f
test: Atualizando testes para rodá-los na mesma instância
JoaoTeles87 Feb 16, 2025
a7dc31c
remove: JWT engine
JoaoTeles87 Feb 16, 2025
34408e9
cleanup: comments and standardizing variables
JoaoTeles87 Feb 16, 2025
107e873
docs: updating tips for run the project
JoaoTeles87 Feb 16, 2025
7ede35d
feat(recursos/manutencao): adds all service scenarios and tests and a…
fernandapascoal Feb 17, 2025
0b4c924
feat: Adds new feature files for salas and reservas
lucasddmc Feb 17, 2025
a44ac21
feat: Adds new feature files for salas and reservas
lucasddmc Feb 17, 2025
c42f32c
Merge pull request #3 from lucasddmc/reservas-salas
fernandapascoal Feb 17, 2025
33ea051
Merge branch 'dev' into login/cadastro
fernandapascoal Feb 18, 2025
c01227f
Merge pull request #7 from JoaoTeles87/login/cadastro
fernandapascoal Feb 18, 2025
2d0cc33
Merge branch 'dev' into recursos/manutencao
JoaoTeles87 Feb 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
1 change: 0 additions & 1 deletion .env.example

This file was deleted.

65 changes: 65 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,71 @@ npm run dev

This command will run the React app in development with Vite.js script

## Rodando o backend Flask

No powerShell mude para o diretório backend
```
cd backend
```
Crie arquivos __init__.py em todos diretórios dentro de backend, inclusive nele.

backend/
__init__.py
main.py
testes/
__init__.py
teste_exemplo.py

MacOS
Dentro da pasta backend no terminal, execute os seguintes comandos:

```
export PYTHONPATH=$(pwd)/backend
export FLASK_APP=main
flask run
```

Dentro da pasta backend/testes, execute:

```
export PYTHONPATH=$(pwd)/backend
pytest
Windows (Powershell)
```
Dentro da pasta backend no PowerShell, execute os seguintes comandos:

```
$env:PYTHONPATH = "$(pwd)/backend"
$env:FLASK_APP = "main"
flask run
```


Crie a venv
```
python -m venv venv
```
Ative a venv
```
venv\Scripts\activate
```
e agora você deve instalar todas as dependencias do projeto

```
pip install -r requirements.txt
```

obs: caso sejam necessárias novas bibliotecas e deseja atualizar o requirements.txt por favor recirar arquivo.
```
pip freeze > requirements.txt
```

Rodando servidor Flask localmente na rota 5000.
```
python main.py
```


## Running the tests

There are two types of tests configured in the base project: unit tests using Vitest with React Testing Library and E2E acceptance tests using Cypress with Cucumber. It's interesting to create the **.env.testing** at the root of the project the same way it was created to run in development, changing the necessary values.
Expand Down
Empty file added backend/__init__.py
Empty file.
Binary file added backend/__pycache__/__init__.cpython-312.pyc
Binary file not shown.
Binary file added backend/__pycache__/blueprints.cpython-312.pyc
Binary file not shown.
Binary file added backend/__pycache__/blueprints.cpython-313.pyc
Binary file not shown.
Binary file added backend/__pycache__/config.cpython-312.pyc
Binary file not shown.
Binary file added backend/__pycache__/config.cpython-313.pyc
Binary file not shown.
Binary file added backend/__pycache__/main.cpython-312.pyc
Binary file not shown.
Binary file added backend/__pycache__/main.cpython-313.pyc
Binary file not shown.
20 changes: 20 additions & 0 deletions backend/blueprints.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from backend.rotas.login import login_bp
from backend.rotas.cadastro import cadastro_bp
from backend.rotas.logout import logout_bp
from backend.rotas.criar_solicitacao_manutencao import criar_manutencao_bp
from backend.rotas.criar_solicitacao_recursos import criar_recursos_bp
from backend.rotas.excluir_solicitacao_manutencao import excluir_manutencao_bp
from backend.rotas.excluir_solicitacao_recursos import excluir_recursos_bp
from backend.rotas.editar_solicitacao_manutencao import editar_manutencao_bp
from backend.rotas.editar_solicitacao_recursos import editar_recursos_bp
from backend.rotas.reservas import reservas_bp
from backend.rotas.salas import salas_bp
from backend.rotas.usuario import usuarios_bp

# Registra os Blueprints
def registrarBlueprints(app):
blueprints = [
login_bp, cadastro_bp, logout_bp, criar_manutencao_bp, criar_recursos_bp, excluir_manutencao_bp, excluir_recursos_bp, editar_recursos_bp, editar_manutencao_bp
]
for blueprint in blueprints:
app.register_blueprint(blueprint)
7 changes: 7 additions & 0 deletions backend/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import os

class Config:
SECRET_KEY = os.urandom(24)
SQLALCHEMY_DATABASE_URI = "sqlite:///users.db"
SQLALCHEMY_TRACK_MODIFICATIONS = False

100 changes: 100 additions & 0 deletions backend/features/cadastroServico.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
Feature: Serviço de Cadastro de Usuários

Scenario: Sucesso no cadastro de usuário
Given o usuário deseja se cadastrar
When ele informa o nome "Demosténes"
And ele informa o CPF "126.455.789-00"
And ele informa o email "demostenessouza@example.com"
And ele informa se é professor "N"
And ele informa a senha "SecurePassword123"
And ele informa a confirmação da senha "SecurePassword123"
And ele envia uma requisição POST para "/api/cadastro"
Then a resposta deve conter a mensagem "Cadastro criado com sucesso!"
And o status code deve ser "201"

Scenario: Sucesso no cadastro de professor
Given o usuário deseja se cadastrar
When ele informa o nome "Tatiana"
And ele informa o CPF "331.879.789-33"
And ele informa o email "vanessasilva@example.com"
And ele informa se é professor "S"
And ele informa o SIAPE "101110"
And ele informa a senha "12345678"
And ele informa a confirmação da senha "12345678"
And ele envia uma requisição POST para "/api/cadastro"
Then a resposta deve conter a mensagem "Cadastro criado com sucesso!"
And o status code deve ser "201"

Scenario: Fracasso no cadastro por campos obrigatórios não preenchidos
Given o usuário deseja se cadastrar
When ele informa o nome "João"
And ele informa o CPF "987.654.321-00"
And ele informa o email "joao@iat.com"
And ele informa se é professor "N"
And ele informa a senha "Password123"
And ele deixa o campo "Confirmar Senha" com ""
And ele envia uma requisição POST para "/api/cadastro"
Then a resposta deve conter a mensagem "Confirmar Senha é obrigatório."
And o status code deve ser "400"

Scenario: Fracasso no cadastro por duplicação de ID única
Given o usuário deseja se cadastrar
When ele informa o nome "Carlos Mendes"
And ele informa o CPF "126.456.789-00"
And ele informa o email "demostenes@example.com"
And ele informa se é professor "S"
And ele informa o SIAPE "010101"
And ele informa a senha "Password456"
And ele informa a confirmação da senha "Password456"
And ele envia uma requisição POST para "/api/cadastro"
Then a resposta deve conter a mensagem "Erro: email/cpf já está registrado."
And o status code deve ser "409"

Scenario: Fracasso no cadastro por senhas que não coincidem
Given o usuário deseja se cadastrar
When ele informa o nome "Beatriz"
And ele informa o CPF "789.456.123-00"
And ele informa o email "Beatriz.oliveira@example.com"
And ele informa se é professor "N"
And ele informa a senha "MyPassword123"
And ele informa a confirmação da senha "DifferentPassword123"
And ele envia uma requisição POST para "/api/cadastro"
Then a resposta deve conter a mensagem "As senhas não coincidem."
And o status code deve ser "400"

Scenario: Fracasso no cadastro por formato inválido de email
Given o usuário deseja se cadastrar
When ele informa o nome "Lucas"
And ele informa o CPF "987.654.321-00"
And ele informa o email "lucas.example.com"
And ele informa se é professor "N"
And ele informa a senha "SenhaForte123"
And ele informa a confirmação da senha "SenhaForte123"
And ele envia uma requisição POST para "/api/cadastro"
Then a resposta deve conter a mensagem "Formato de email inválido. Use um email válido, como exemplo@dominio.com."
And o status code deve ser "400"

Scenario: Fracasso no cadastro por formato inválido de CPF
Given o usuário deseja se cadastrar
When ele informa o nome "Fabricio"
And ele informa o CPF "123"
And ele informa o email "fabricio@example.com"
And ele informa se é professor "N"
And ele informa a senha "SenhaSegura456"
And ele informa a confirmação da senha "SenhaSegura456"
And ele envia uma requisição POST para "/api/cadastro"
Then a resposta deve conter a mensagem "CPF inválido. Digite um CPF válido no formato XXX.XXX.XXX-XX."
And o status code deve ser "400"

Scenario: Fracasso no cadastro por siape já registrado
Given o usuário deseja se cadastrar
When ele informa o nome "Max"
And ele informa o CPF "987.654.321-00"
And ele informa o email "max@gmail.com"
And ele informa se é professor "S"
And ele informa o SIAPE "101010"
And ele informa a senha "Senha123"
And ele informa a confirmação da senha "Senha123"
And ele envia uma requisição POST para "/api/cadastro"
Then a resposta deve conter a mensagem "Erro: siape já está registrado."
And o status code deve ser "409"
21 changes: 21 additions & 0 deletions backend/features/loginServico.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Feature: Autenticação de usuários

Scenario: Sucesso no login
Given o usuário possui o email "demostenes@example.com" e a senha "SecurePassword123" válidos
When ele envia uma requisição POST para "/api/login" com os dados "demostenes@example.com" e "SecurePassword123"
Then a resposta deve conter os dados do usuário
And o status code deve ser "200"

Scenario: Fracasso no login por senha incorreta
Given o usuário possui o email "demostenes@example.com" válido e a senha "SecureIncorreta123" inválida
When ele envia uma requisição POST para "/api/login" com os dados "demostenes@example.com" e "SecureIncorreta123"
Then a resposta deve conter a mensagem "Usuário ou senha inválidos."
And o status code deve ser "401"

Scenario: Fracasso no login por falta de email ou senha
Given o usuário envia uma requisição sem email ou senha
When ele envia uma requisição POST para "/api/login" com os dados " " e " "
Then a resposta deve conter a mensagem "Usuário e senha são obrigatórios."
And o status code deve ser "400"


28 changes: 28 additions & 0 deletions backend/features/manutencao.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
Feature: Criar/remover solicitação de manutenção de sala

Scenario: sucesso ao criar uma solicitação de manutenção para uma reserva concluída
Given o professor possui uma reserva de sala reserva_id "1" que já foi encerrada
When ele envia uma requisição POST /solicitacoes/manutencao com os dados: reserva_id: "1", descricao: "Mesa quebrada."
Then o sistema retorna "mensagem" "Parabéns, sua solicitação de manutenção foi criada!" e um status "201"
And a reserva reserva_id: "1" possui uma solicitação de manutenção com descricao: "Mesa quebrada."

Scenario: fracasso ao criar uma solicitação de manutenção sem preencher o campo descricao
Given o professor possui uma reserva de sala reserva_id "1" que já foi encerrada
When ele envia uma requisição POST /solicitacoes/manutencao com os dados: reserva_id: "1", descricao: " "
Then o sistema retorna "erro" "O campo 'descricao' não pode estar vazio." e um status "400"

Scenario: sucesso ao editar uma solicitação de manutenção existente
Given o professor já criou uma solicitação de manutenção associada a reserva_id "1"
When ele envia uma requisição PUT /solicitacoes/manutencao/"1" contendo o ID da solicitação de manutenção e a alteração descricao: "Mesa e cadeira quebradas."
Then o sistema retorna "mensagem" "Solicitação de manutenção atualizada com sucesso" e um status "200"
And o sistema atualiza os detalhes da solicitação com descricao: "Mesa e cadeira quebradas."

Scenario: fracasso ao editar solicitação de manutenção sem preencher o campo descricao
Given o professor já criou uma solicitação de manutenção associada a reserva_id "1"
When ele envia uma requisição PUT /solicitacoes/manutencao/"1" contendo o ID da solicitação de manutenção e a alteração descricao: " "
Then o sistema retorna "erro" "A descrição da manutenção não pode ser vazia" e um status "400"

Scenario: sucesso ao excluir uma solicitação de manutenção existente
Given o professor já criou uma solicitação de manutenção associada a reserva_id "1"
When ele envia uma requisição DELETE /solicitacoes/manutencao/"1",
Then o sistema remove a solicitação do banco de dados e retorna um status "204"
57 changes: 57 additions & 0 deletions backend/features/recursos.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
Feature: Criar/remover solicitação de recursos de sala

Scenario: sucesso ao criar solicitação de recursos para uma reserva ativa com todos os campos preenchidos
Given o professor possui uma reserva ativa com reserva_id "1"
When ele envia uma requisição POST /solicitacoes/recursos com os dados: reserva_id: "1", recursos: "Projetor, Teclado", itens_nao_listados: "Extensão elétrica", observacoes: "Para aula prática"
Then o sistema retorna "mensagem" "Parabéns, sua solicitação de recursos foi criada!" e um status "201"
And a reserva_id "1" possui uma solicitação com recursos "Projetor, Teclado", itens_nao_listados "Extensão elétrica" e observacoes "Para aula prática"

Scenario: fracasso ao criar solicitação de recursos com campos preenchidos com espaços ou não preenchidos
Given o professor possui uma reserva ativa com reserva_id "1"
When ele envia uma requisição POST /solicitacoes/recursos com os dados: reserva_id: "1", recursos: " ", itens_nao_listados: " ", observacoes: " "
Then o sistema retorna "erro" "Você deve selecionar um recurso ou especificar itens não listados." e um status "400"

Scenario: fracasso ao criar solicitação de recursos com apenas o campo observacoes preenchido
Given o professor possui uma reserva ativa com reserva_id "1"
When ele envia uma requisição POST /solicitacoes/recursos com os dados: reserva_id: "1", recursos: " ", itens_nao_listados: " ", observacoes: "Para aula prática"
Then o sistema retorna "erro" "Você deve selecionar um recurso ou especificar itens não listados." e um status "400"

Scenario: sucesso ao criar solicitação de recursos sem preencher o campo itens_nao_listados
Given o professor possui uma reserva ativa com reserva_id "1"
When ele envia uma requisição POST /solicitacoes/recursos com os dados: reserva_id: "1", recursos: "Projetor, Teclado", itens_nao_listados: " ", observacoes: "Para aula prática"
Then o sistema retorna "mensagem" "Parabéns, sua solicitação de recursos foi criada!" e um status "201"
And a reserva_id "1" possui uma solicitação com recursos "Projetor, Teclado", itens_nao_listados " " e observacoes "Para aula prática"

Scenario: sucesso ao criar solicitação de recursos sem preencher o campo itens_nao_listados e o campo observacoes
Given o professor possui uma reserva ativa com reserva_id "1"
When ele envia uma requisição POST /solicitacoes/recursos com os dados: reserva_id: "1", recursos: "Projetor, Teclado", itens_nao_listados: " ", observacoes: " "
Then o sistema retorna "mensagem" "Parabéns, sua solicitação de recursos foi criada!" e um status "201"
And a reserva_id "1" possui uma solicitação com recursos "Projetor, Teclado", itens_nao_listados " " e observacoes " "

Scenario: sucesso ao criar solicitação de recursos com o campo de recursos vazio e apenas especificando os itens não listados
Given o professor possui uma reserva ativa com reserva_id "1"
When ele envia uma requisição POST /solicitacoes/recursos com os dados: reserva_id: "1", recursos: " ", itens_nao_listados: "Extensão elétrica", observacoes: " "
Then o sistema retorna "mensagem" "Parabéns, sua solicitação de recursos foi criada!" e um status "201"
And a reserva_id "1" possui uma solicitação com recursos " ", itens_nao_listados "Extensão elétrica" e observacoes " "

Scenario: sucesso ao criar solicitação de recursos com o campo de recursos vazio e especificando os itens não listados e as observacoes
Given o professor possui uma reserva ativa com reserva_id "1"
When ele envia uma requisição POST /solicitacoes/recursos com os dados: reserva_id: "1", recursos: " ", itens_nao_listados: "Extensão elétrica", observacoes: "Para aula prática"
Then o sistema retorna "mensagem" "Parabéns, sua solicitação de recursos foi criada!" e um status "201"
And a reserva_id "1" possui uma solicitação com recursos " ", itens_nao_listados "Extensão elétrica" e observacoes "Para aula prática"

Scenario: sucesso ao editar uma solicitação de recursos existente
Given o professor possui uma solicitação de recursos associada a reserva_id "1"
When ele envia uma requisição PUT /solicitacoes/recursos/"1" contendo o ID da solicitação e os novos detalhes da solicitação recursos: "Projetor, Caixas de som", observacoes: "Para evento especial"
Then o sistema retorna "mensagem" "Solicitação de recursos atualizada com sucesso" e um status "200"
And o sistema atualiza os detalhes da solicitação: recursos: "Projetor, Caixas de som", observacoes: "Para evento especial"

Scenario: fracasso ao editar uma solicitação de recursos com apenas o campo observacoes preenchido
Given o professor possui uma reserva ativa com reserva_id "1"
When ele envia uma requisição POST /solicitacoes/recursos com os dados: reserva_id: "1", recursos: " ", itens_nao_listados: " ", observacoes: "Para aula prática"
Then o sistema retorna "erro" "Você deve selecionar um recurso ou especificar itens não listados." e um status "400"

Scenario: sucesso ao excluir uma solicitação de recursos existente
Given o professor possui uma solicitação de recursos associada a reserva_id "1"
When ele envia uma requisição DELETE /solicitacoes/recursos/"1" contendo o ID da solicitação
Then o sistema remove a solicitação do banco de dados e retorna um status "204"
41 changes: 41 additions & 0 deletions backend/features/reservas.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
Feature: API de Reservas

Scenario: Criar uma reserva com sucesso
Given a sala de id "5" está disponível no dia "2025-03-03" das "14:00" às "15:00"
And o professor de id "3" não tem uma reserva no dia "2025-03-03" das "14:00" às "15:00"
When uma requisição "POST" for enviada para "/api/reservas/3" com o corpo: "{"sala_id": 5,"data": "2025-03-03","start_time": "14:00","end_time": "15:00"}"
Then o status da resposta deve ser "201"
And o JSON da resposta deve conter "mensagem": "Reserva criada com sucesso!"
And o JSON da reserva deve conter "sala_id": "5"
And o JSON da reserva deve conter "professor_id": "3"


Scenario: Erro ao tentar reservar uma sala já ocupada
Given a sala de id "5" não está disponível no dia "2025-02-20" das "14:30" às "16:00"
When uma requisição "POST" for enviada para "/api/reservas/3" com o corpo: "{"sala_id": 5,"data": "2025-02-20","start_time": "14:30","end_time": "16:00"}"
Then o status da resposta deve ser "409"
And o JSON da resposta deve conter "erro": "Sala já reservada para esse horário"


Scenario: Erro ao tentar reservar com campos ausentes
Given a sala de id "5" está disponível no dia "2025-01-21" das "14:00" às "15:00"
And o professor de id "3" não tem uma reserva no dia "2025-01-21" das "14:00" às "15:00"
When uma requisição "POST" for enviada para "/api/reservas/3" com o corpo: "{"data": "2025-01-21","start_time": "14:00","end_time": "15:00"}"
Then o status da resposta deve ser "400"
And o JSON da resposta deve conter "erro": "Campos obrigatórios ausentes"


Scenario: Cancelar uma reserva com sucesso
Given o professor de id "3" tem uma reserva ativa de id "2"
When uma requisição "DELETE" for enviada para "/api/reservas/2" com o corpo: """"
Then o status da resposta deve ser "200"
And o JSON da resposta deve conter "mensagem": "Reserva cancelada!"
And o JSON da reserva deve conter "id": "2"


Scenario: Erro ao tentar cancelar uma reserva inexistente
When uma requisição "DELETE" for enviada para "/api/reservas/99" com o corpo: """"
Then o status da resposta deve ser "404"
And o JSON da resposta deve conter "erro": "Reserva não encontrada."


Loading