feat: Shared Steps -- passo reutilizavel e versionado (item 4) #49

Merged
jhony75 merged 1 commit from feature/shared-steps into develop 2026-09-09 19:32:38 -03:00
Owner

Implementa o item 4 do roadmap: uma biblioteca de Shared Steps versionada, com pin explicito por cenario.

Empilhado sobre #48 (feature/scenario-external-key-edit, ainda nao mergeada) -- esta branch parte do commit ff74458 (external_key). Mergear #48 primeiro; depois desta ou rebase automatico ao mergear via Forgejo.

O que muda

  • Novo dominio modules/shared_steps/: SharedStep (linha viva, cache do texto/versao atual) + SharedStepVersion (guarda TODA versao, nao so historico -- diferente de TestScenarioTemplateVersion, pq uma referencia externa fixada precisa resolver qualquer versao, atual ou passada, do mesmo jeito).
  • Um passo de cenario (TestStepTemplate) pode fixar um Shared Step numa versao especifica (shared_step_id + shared_step_version). O texto do passo e sempre uma COPIA resolvida da versao fixada -- nunca uma referencia viva -- entao nenhum export/copia-pra-run precisou mudar.
  • Editar um Shared Step SEMPRE cria versao nova; NUNCA propaga sozinho pros cenarios que ja usam uma versao anterior. Upgrade so acontece com um shared_step_version explicito e diferente no payload.
  • Cenarios podem misturar passos soltos e passos vinculados livremente (decisao confirmada com o usuario).
  • Deletar um Shared Step so desfaz o vinculo (SET NULL); o passo mantem o ultimo texto que tinha.

Frontend

  • Nova tela Shared Steps: criar, editar (gera versao nova), tags, "onde e usado" (com flag de desatualizado), diff de 2 versoes lado a lado (LCS de palavras local, wordDiff.ts, sem lib nova -- decisao confirmada com o usuario de incluir isso ja nesta rodada, nao deixar pra depois).
  • ScenarioBuilder: inserir Shared Step existente num passo, "Tornar Shared Step" (extrai um passo solto pra um Shared Step novo -- os dois caminhos de criacao confirmados com o usuario), badge de vinculo + upgrade explicito quando a versao fixada fica pra tras.
  • Library: "Editar cenario" -- nao existia NENHUMA forma de editar os passos de um cenario ja existente antes disso (so criar). Necessario pra poder gerenciar vinculo/upgrade/desvinculo depois que o cenario ja existe.

Bugs achados e corrigidos durante a implementacao

  1. update_scenario_template bumpava versao/historico em QUALQUER PUT, ate um que so mudasse metadado (tags/external_key/suite_id). Sem o fix, todo vinculo/upgrade de Shared Step geraria uma entrada de historico espuria no cenario que nem mudou de conteudo. Mesmo padrao aplicado tambem em update_shared_step.
  2. ondelete=SET NULL no FK so limpa a propria coluna -- deletar um Shared Step nulava shared_step_id mas deixava shared_step_version orfao. Fix: UPDATE explicito das duas colunas na mesma operacao de delete.

Verificacao

  • Backend: pytest -n auto -- 166 passed (9 testes novos em test_shared_steps.py).
  • Frontend: tsc --noEmit, eslint, vitest -- 116 passed (8 testes novos), build, build-storybook -- todos ok.
  • Manual, ponta a ponta contra o banco de dev real: criar Shared Step -> vincular a um cenario real -> editar o Shared Step -> "desatualizado" aparece na leitura e na edicao -> upgrade explicito funciona -> desfeito depois.

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Implementa o item 4 do roadmap: uma biblioteca de Shared Steps versionada, com pin explicito por cenario. **Empilhado sobre #48** (`feature/scenario-external-key-edit`, ainda nao mergeada) -- esta branch parte do commit `ff74458` (external_key). Mergear #48 primeiro; depois desta ou rebase automatico ao mergear via Forgejo. ## O que muda - Novo dominio `modules/shared_steps/`: `SharedStep` (linha viva, cache do texto/versao atual) + `SharedStepVersion` (guarda TODA versao, nao so historico -- diferente de `TestScenarioTemplateVersion`, pq uma referencia externa fixada precisa resolver qualquer versao, atual ou passada, do mesmo jeito). - Um passo de cenario (`TestStepTemplate`) pode fixar um Shared Step numa versao especifica (`shared_step_id` + `shared_step_version`). O texto do passo e sempre uma COPIA resolvida da versao fixada -- nunca uma referencia viva -- entao nenhum export/copia-pra-run precisou mudar. - Editar um Shared Step SEMPRE cria versao nova; NUNCA propaga sozinho pros cenarios que ja usam uma versao anterior. Upgrade so acontece com um `shared_step_version` explicito e diferente no payload. - Cenarios podem misturar passos soltos e passos vinculados livremente (decisao confirmada com o usuario). - Deletar um Shared Step so desfaz o vinculo (SET NULL); o passo mantem o ultimo texto que tinha. ## Frontend - Nova tela **Shared Steps**: criar, editar (gera versao nova), tags, "onde e usado" (com flag de desatualizado), diff de 2 versoes lado a lado (LCS de palavras local, `wordDiff.ts`, sem lib nova -- decisao confirmada com o usuario de incluir isso ja nesta rodada, nao deixar pra depois). - `ScenarioBuilder`: inserir Shared Step existente num passo, "Tornar Shared Step" (extrai um passo solto pra um Shared Step novo -- os dois caminhos de criacao confirmados com o usuario), badge de vinculo + upgrade explicito quando a versao fixada fica pra tras. - `Library`: "Editar cenario" -- nao existia NENHUMA forma de editar os passos de um cenario ja existente antes disso (so criar). Necessario pra poder gerenciar vinculo/upgrade/desvinculo depois que o cenario ja existe. ## Bugs achados e corrigidos durante a implementacao 1. `update_scenario_template` bumpava versao/historico em QUALQUER PUT, ate um que so mudasse metadado (tags/external_key/suite_id). Sem o fix, todo vinculo/upgrade de Shared Step geraria uma entrada de historico espuria no cenario que nem mudou de conteudo. Mesmo padrao aplicado tambem em `update_shared_step`. 2. `ondelete=SET NULL` no FK so limpa a propria coluna -- deletar um Shared Step nulava `shared_step_id` mas deixava `shared_step_version` orfao. Fix: UPDATE explicito das duas colunas na mesma operacao de delete. ## Verificacao - Backend: `pytest -n auto` -- 166 passed (9 testes novos em `test_shared_steps.py`). - Frontend: `tsc --noEmit`, `eslint`, `vitest` -- 116 passed (8 testes novos), `build`, `build-storybook` -- todos ok. - Manual, ponta a ponta contra o banco de dev real: criar Shared Step -> vincular a um cenario real -> editar o Shared Step -> "desatualizado" aparece na leitura e na edicao -> upgrade explicito funciona -> desfeito depois. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
feat: editar identidade de automação (external_key) na Library
All checks were successful
EEG QA CI / validate-and-build (pull_request) Successful in 4m41s
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Deploy development (pull_request) Has been skipped
ff744584ff
Fecha a lacuna deixada em aberto desde o item 1 do roadmap: o backend
já suportava external_key por completo (criar/editar, unicidade
verificada, nunca roubado em duplicação), mas não existia nenhuma UI
pra editar um cenário na Library -- external_key só era setado via
mapeamento de Automation Discovery.

Adiciona "Editar identidade de automação" no menu "..." do cenário,
com o mesmo padrão de formulário inline já usado pra renomear suíte.

fix: editar só external_key/suite_id/tags não deve virar uma versão
nova do cenário -- são metadados de classificação, não uma forma
diferente de testar a mesma coisa. update_scenario_template sempre
criava uma entrada de TestScenarioTemplateVersion e incrementava
version em QUALQUER PUT, mesmo um que só mudasse a external_key --
nunca dava pra perceber isso porque não havia UI nenhuma chamando esse
endpoint até agora. Version só bump quando name/description/steps
(conteúdo de verdade) estão no payload.
feat: Shared Steps -- passo reutilizavel e versionado (item 4)
All checks were successful
EEG QA CI / validate-and-build (pull_request) Successful in 4m15s
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Deploy development (pull_request) Has been skipped
1b19e0d7ed
Nova biblioteca de passos (modules/shared_steps/) independente de
qualquer cenario: um SharedStep tem versao propria (SharedStepVersion
guarda TODA versao, nao so historico -- diferente do padrao de
TestScenarioTemplateVersion, porque aqui uma referencia externa
precisa resolver "o conteudo exato da versao N" de forma uniforme).

Um passo de cenario (TestStepTemplate) pode opcionalmente referenciar
um SharedStep FIXADO numa versao especifica (shared_step_id +
shared_step_version). Editar um SharedStep NUNCA muda silenciosamente
quem ja usa uma versao antiga -- description/keyword do passo sao uma
copia real da versao fixada (todo export/copia-pra-run que ja le
step.description/step.keyword funciona sem nenhuma mudanca). Upgrade
so acontece quando o payload manda um shared_step_version diferente,
explicitamente -- resolvido sempre a partir de SharedStepVersion
(nunca do SharedStep "atual" direto), entao reenviar o mesmo pin em
edicoes sem relacao nenhuma nunca faz upgrade sem querer.

Cenarios podem misturar passos soltos e passos vinculados livremente.
Deletar um SharedStep so desfaz o vinculo (SET NULL) -- o passo mantem
a ultima copia de texto que tinha, nunca é apagado.

Frontend:
- Nova tela "Shared Steps" (biblioteca propria): criar, editar (sempre
  gera versao nova), tags, "onde e usado" (com flag de desatualizado),
  comparar 2 versoes lado a lado (diff de palavras, LCS local em
  wordDiff.ts -- sem biblioteca nova).
- ScenarioBuilder ganha: inserir um Shared Step existente num passo,
  "Tornar Shared Step" (extrai o texto de um passo solto pra um
  SharedStep novo), badge de vinculo + "Atualizar pra vN" quando a
  versao fixada fica pra tras.
- Library ganha "Editar cenario" (reusa ScenarioBuilder com prefill) --
  não existia NENHUMA forma de editar passos de um cenario ja
  existente antes disso; sem essa capacidade não dava pra gerenciar
  vinculo/upgrade/desvinculo em cenarios que ja existem.

fix (achado testando): update_scenario_template sempre criava uma
versao nova em QUALQUER PUT, mesmo um que so mudasse metadado
(external_key/suite_id/tags) -- ver commit da PR #48. Sem essa
correcao, cada vinculo/upgrade de Shared Step teria gerado uma entrada
de historico espuria no cenario.

Migration: shared_steps, shared_step_versions, shared_step_tags +
2 colunas em test_step_templates. Testado upgrade/downgrade.

Verificacao: backend pytest -n auto (166 passed, 9 testes novos),
frontend tsc/lint/vitest (116 passed, 8 testes novos)/build/
build-storybook -- todos ok. Testado manualmente ponta a ponta contra
o dev real: criar Shared Step -> vincular a um cenario real -> editar
o Shared Step -> "desatualizado" aparece na leitura e na edicao ->
upgrade explicito funciona -> revertido depois.
jhony75 merged commit 96f889c6d0 into develop 2026-09-09 19:32:38 -03:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jhony75/eeg-qa!49
No description provided.