Skip to content

Feature/issue 357 group route tests - #493

Merged
viniciussanchez merged 2 commits into
HashLoad:masterfrom
regyssilveira:feature/issue-357-group-route-tests
Jul 3, 2026
Merged

Feature/issue 357 group route tests#493
viniciussanchez merged 2 commits into
HashLoad:masterfrom
regyssilveira:feature/issue-357-group-route-tests

Conversation

@regyssilveira

Copy link
Copy Markdown
Contributor

fix(core): resolução da quebra de fluidez e perda de prefixo em grupos (#357)

Descrição do Bug

Ao declarar rotas agrupadas contendo sub-rotas via método .Route(), a chamada subsequente ao método .End de encerramento da sub-rota forçava a API fluente a retornar a classe principal do core (THorseCore).

Isso quebrava o escopo do grupo na mesma linha de instrução. Como consequência, qualquer declaração fluente subsequente (como um .Put() logo após o .End da sub-rota) era processada no escopo principal do Core, fazendo com que a rota fosse registrada erroneamente na raiz (ex: /teste3 em vez de /api/teste3).


Causa Raiz

No design original das interfaces:

  1. IHorseCoreRoute<T: class> possuía a restrição : class, impedindo que o parâmetro genérico T recebesse tipos de interface (como IHorseCoreGroup).
  2. O método .Route() de IHorseCoreGroup<T> retornava obrigatoriamente IHorseCoreRoute<T> (sendo T o core principal THorseCore), forçando a saída precoce do escopo de grupo no fechamento da rota.

Solução Implementada (Design Orientado a Objetos Puro)

Adotamos uma solução estática de tipos, totalmente livre de variáveis globais de estado e de riscos de vazamento de escopo na memória (ARC):

  1. Desacoplamento de Restrição de Classe:
    • Removemos a restrição : class na interface IHorseCoreRoute<T> em Horse.Core.Route.Contract.pas.
  2. Refatoração do Contrato de Grupo:
    • Alteramos a assinatura do método Route em IHorseCoreGroup<T> (Horse.Core.Group.Contract.pas) para retornar IHorseCoreRoute<IHorseCoreGroup<T>>.
  3. Classe Proxy de Rota de Grupo (THorseCoreGroupRoute):
    • Implementamos a classe proxy THorseCoreGroupRoute<T: THorseCoreBase> em Horse.Core.Group.pas. Esta classe delega os registros de endpoints para o core mas retorna a referência ao próprio grupo (IHorseCoreGroup<T>) ao invés do Core principal no seu método &End.
    • Ajustamos a classe THorseCoreGroup<T> para instanciar e retornar esta rota proxy.

Com essa modificação, a própria linguagem (via compilador) gerencia o retorno estático correto do grupo após a finalização de uma sub-rota.


Validação e Testes Realizados

Os testes cobriram ambas as engines de roteamento do Horse: RouterTree (padrão) e RadixRouter (via -DHORSE_RADIX_ROUTER).

1. Teste Unitário (DUnitX)

Criamos a fixture Tests.Horse.Core.Group.pas replicando exatamente o cenário da issue:

THorse.Group.Prefix('/api')
  .Delete('/test1/:id', DoDeleteApi)
  .Route('/test2')
    .Get(DoGetApi)
    .Post(DoPostApi)
  .&End
  .Put('/teste3', DoPutApi);

@viniciussanchez
viniciussanchez merged commit 660365d into HashLoad:master Jul 3, 2026
@regyssilveira
regyssilveira deleted the feature/issue-357-group-route-tests branch July 3, 2026 21:10
@elsoftrp

elsoftrp commented Jul 4, 2026

Copy link
Copy Markdown

Estou tentando compilar o projeto da pasta "samples\lazarus\epoll" no lazarus com linux e parece que esse PR fez não compilar mais.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants