Skip to content

fix(onboarding): SquadsOnboardingFlow ignora a pausa e conclui mesmo assim #490

Description

@sirelves

Descrição do problema

O SquadsOnboardingFlow ignora a pausa. Um onboarding Squads pausado continua avançando normalmente e chega a completed, dando APTO pra alguém que pausou a jornada.

O WelcomeOnboardingFlow recusa nessa mesma situação. É inconsistência entre duas implementações do mesmo contrato: o OnboardingFlow::advance() documenta @throws OnboardingPausedException when the onboarding is paused, e só o Welcome cumpre.

Comportamento esperado

Avançar um onboarding pausado é recusado com OnboardingPausedException, em qualquer flow. Pra continuar, passa pelo ResumeOnboarding.

Comportamento atual

O SquadsOnboardingFlow::advance() não checa OnboardingStatus::Paused. Vai direto marcar o step como done e, se for o último, fecha o onboarding em completed, o que abre o gate APTO.

Não é só teoria de teste unitário: acontece pelo caminho público, via AdvanceStep, que também não checa status.

Passos para reproduzir

  1. Usuário com o Welcome concluído e GitHub vinculado
  2. StartOnboarding com OnboardingType::Squads
  3. AdvanceStep no form
  4. PauseOnboarding, o status vira paused
  5. AdvanceStep de novo

O step git_challenge é concluído, o onboarding vai pra completed e isCompleted($user, Squads) passa a devolver true.

Evidências

Mesmo cenário nos dois flows, pelo AdvanceStep:

Flow Onboarding pausado + AdvanceStep
WelcomeOnboardingFlow OnboardingPausedException, como o contrato manda
SquadsOnboardingFlow conclui e dá APTO

Ambiente

  • Branch: feat/squads
  • Ambiente: camada de domínio, ainda sem UI plugada

Sugestão de correção (opcional)

Replicar no SquadsOnboardingFlow::advance() a checagem que o Welcome já faz:

if ($onboarding->status === OnboardingStatus::Paused) {
    throw OnboardingPausedException::cannotAdvance($onboarding);
}

Se a checagem tem que valer pra todo flow, talvez o lugar dela seja o AdvanceStep, e aí cada flow para de repetir. Fica a discussão de onde a regra mora, mas do jeito que está hoje um flow cumpre o contrato e o outro não.

Contexto adicional

Encontrado enquanto eu levantava o escopo real da #352. Menos urgente que a outra ponta, porque depende da pessoa pausar e alguém avançar mesmo assim, mas é barato de fechar.

Related to #341

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingcoreBackend/domain layerdifficulty:trivialLess than 1 daymod:onboardingOnboarding entry layer (pre-triage, APTO gate)type:fixBug fix

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions