Skip to content

Documentação e Implementação: Sprint 3

Rafael Ghiorzi edited this page Jun 30, 2026 · 7 revisions

Sistema CAMAAR — Wiki do projeto

Como rodar o projeto

Pré-requisitos

Sem Docker:

  • Ruby 3.4.9
  • Bundler

Com Docker:

  • Docker Engine 20+
  • Docker Compose v2+

Opção A — Sem Docker

A partir do diretório project/:

bundle install
bundle exec rails db:migrate
bundle exec rails db:seed
bundle exec rails server

Acesse em: http://localhost:3000


Opção B — Com Docker

Na raiz do repositório (CAMAAR/):

# 1. Build inicial
docker compose build

# 2. Configurar o banco de dados
docker compose run --no-deps --rm web bundle exec rails db:migrate
docker compose run --no-deps --rm web bundle exec rails db:seed

# 3. Iniciar a aplicação
docker compose up

Acesse em: http://localhost:3000

Os comandos das seções seguintes devem ser executados a partir do diretório project/. Com Docker, prefixe cada comando com:

docker compose run --no-deps --rm web <comando>

Importar dados do SIGAA

Para popular turmas, docentes e discentes a partir dos JSONs:

  1. Faça login como admin em http://localhost:3000
  2. Acesse o menu "Importar dados do SIGAA"
  3. Selecione o semestre desejado e confirme a importação

Após a importação, os usuários participantes receberão e-mails com links para definir sua senha. Em ambiente de desenvolvimento, esses e-mails são exibidos diretamente no log do servidor.


Credenciais de acesso

Admin (disponível após rails db:seed):

E-mail Senha
admin.cic@unb.br Senha@123

Professores e alunos são criados automaticamente ao importar os dados do SIGAA. O seed não cria esses usuários.


Executar testes e analisar qualidade de código

Os comandos abaixo devem ser executados a partir do diretório project/.

Testes RSpec e cobertura (SimpleCov)

bundle exec rspec

A gema SimpleCov é embutida no processo de testagem e gera ao final um relatório HTML no diretório coverage/index.html.

Cenários BDD (Cucumber)

bundle exec cucumber

Os cenários requerem que os dados do SIGAA estejam importados previamente.

Métricas de qualidade (RuboCop + RubyCritic)

# ABC score e complexidade ciclomática
bundle exec rubocop --only Metrics/AbcSize
bundle exec rubocop --only Metrics/CyclomaticComplexity

# Relatório completo de qualidade de código
bundle exec rubycritic app/

O relatório do RubyCritic é salvo em tmp/rubycritic/overview.html.

Documentação (RDoc)

A documentação do código foi produzida com a gema RDoc, adicionada às dependências de desenvolvimento. O escopo da documentação foi definido no arquivo .document, incluindo controllers, helpers, jobs, mailers, models e services.

O arquivo .rdoc_options foi configurado para utilizar codificação UTF-8, incluir métodos privados e definir o título da documentação.

Para gerar a documentação, a partir do diretório project/, execute:

bundle install
bundle exec rdoc

O relatório HTML é gerado no diretório doc/ e pode ser visualizado abrindo doc/index.html.


Resultados da refatoração

Após análise do código com rubocop e rubycritic, todos os métodos com ABC score acima de 15 e complexidade ciclomática acima de 7 foram refatorados. Os resultados estão apresentados abaixo.

1. Cobertura de Código (RSpec / SimpleCov)

Arquivo Coverage antes Coverage depois Mudanças realizadas
app/controllers/course_classes_controller.rb 0.00% 100% Criado spec/requests/course_classes_spec.rb com testes de index (listagem por departamento) e show (acesso negado para turmas de outro departamento)
app/jobs/application_job.rb 0.00% 100% Criado spec/jobs/application_job_spec.rb verificando herança de ActiveJob::Base
app/helpers/formularios_helper.rb 55.56% 100% Criado spec/helpers/formularios_helper_spec.rb cobrindo todos os branches: boolean (Sim/Não/—), rating (valor/—) e text (valor/—)
app/controllers/password_resets_controller.rb 86.67% 100% Adicionados testes para: senha incompatível com confirmação, exibição do formulário edit com token válido
app/controllers/sessions_controller.rb 89.47% 100% Adicionado teste para ação destroy (logout)
app/controllers/templates_controller.rb 90.41% 100% Adicionados testes para: ação show, botão + (add_questao) durante edição
app/controllers/formularios_controller.rb 93.88% 100% Adicionados testes para: ação new e show para usuário não-admin
Total geral 92.74% 99.14%

2. ABC Score (Metrics/AbcSize)

Arquivo / Método ABC score antes ABC score depois Mudanças realizadas
sessions_controller.rb#create 20.78 ≤15 Extraídos handle_pending_setup, handle_login_success, handle_login_failure
password_resets_controller.rb#update 15.56 ≤15 Extraídos passwords_match?, render_password_mismatch, apply_password_reset
resposta_controller.rb#create 20.83 ≤15 Extraídos carregar_formulario_e_respostas, redirect_para_formulario_com_alerta, salvar_respostas
formularios_controller.rb#create 20.71 ≤15 Extraídos render_create_success, render_create_failure
formularios_controller.rb#exportar_csv 17.83 ≤15 Extraídos gerar_csv, cabecalho_csv, linha_csv
formularios_controller.rb#formularios_pendentes_para 16.43 ≤15 Extraído papel_por_turma
templates_controller.rb#create 20.83 ≤15 Extraído salvar_novo_template
templates_controller.rb#update 32.26 ≤15 Extraídos processar_atualizacao_template, atualizar_template, persistir_questao
class_members_importer.rb#call 19.85 ≤15 Extraído process_member
class_members_importer.rb#department_for 16.16 ≤15 Extraído resolve_department_code
class_members_importer.rb#sync_user 27.44 ≤15 Extraídos create_user, apply_user_updates, build_user_updates
classes_importer.rb#call 17.72 ≤15 Extraídos find_course_class, sync_course_class
classes_importer.rb#department_for 16.16 ≤15 Extraído resolve_department_code
data_synchronizer.rb#call 20.42 ≤15 Extraído build_result

Resultado: rubocop --only Metrics/AbcSize - 0 ofensas detectadas.

RubyCritic: 84.44% do código nota A

3. Complexidade Ciclomática (Metrics/CyclomaticComplexity)

Arquivo / Método Complexidade antes Complexidade depois Mudanças realizadas
class_members_importer.rb#department_for 8 ≤7 Extração de resolve_department_code eliminou a cadeia de || com safe navigation do método principal
class_members_importer.rb#sync_user 9 ≤7 Extração de create_user, apply_user_updates e build_user_updates distribuiu os branches condicionais
classes_importer.rb#department_for 8 ≤7 Extração de resolve_department_code (mesmo padrão do importer acima)

Resultado: rubocop --only Metrics/CyclomaticComplexity - 0 ofensas detectadas.

Nota 1: A ferramenta Saikuro não possuía versão estável para Ruby > 4.5; por isso o rubocop foi utilizado como ferramenta principal de análise de complexidade ciclomática.

Nota 2: a redução de complexidade ciclomática foi obtida como consequência direta da refatoração do ABC score. Os mesmos métodos eram fonte de ambos os problemas.


Processo de revisão de código

ABC Score e qualidade geral

Para análise do ABC Score foram utilizadas as gemas rubycritic e rubocop. O RubyCritic gerava um documento indicando a qualidade do código por arquivo com notas de A até F, enquanto o RuboCop indicava quais arquivos precisavam de atenção e correção imediata:

bundle exec rubocop --only Metrics/AbcSize
bundle exec rubycritic app/

O painel do RubyCritic é gerado e armazenado no diretório tmp/rubycritic/.

Documentação com RDoc

Foram documentados, para cada método:

  • Sua finalidade;
  • Os argumentos recebidos;
  • Os valores de retorno possíveis;
  • Seus efeitos colaterais, como alterações no banco, envio de e-mails, renderizações e redirecionamentos.

Exemplo do padrão utilizado:

##
# Localiza um usuário pelo e-mail ou pela matrícula.
#
# === Argumentos
#
# +identifier+:: E-mail ou matrícula informada no login.
#
# === Retorno
#
# Retorna o User encontrado ou +nil+ quando não há correspondência.
#
# === Efeitos colaterais
#
# Consulta o banco de dados.
def self.find_for_login(identifier)

Cobertura dos testes com SimpleCov

A gema SimpleCov já faz parte do pacote de testes RSpec. Foram adicionados os testes necessários para completar os métodos novos da sprint, além de refatorados os testes já existentes de acordo com o nível de cobertura indicado pela análise. Foi alcançada uma cobertura de 99.14% no final da sprint.

Happy Path e Sad Path nos cenários BDD e testes RSpec

Os testes criados ou refatorados foram todos implementados contemplando os caminhos feliz e triste. Os cenários BDD já foram implementados com ambos os caminhos desde a sprint 1, garantindo que fosse possível ajustar o funcionamento da aplicação com eles em mente desde o início.


Fluxo do sistema

TODO DESCRIÇÃO DO FLUXO