Consolidar uma suite E2E interna do
praxis-metadata-starter antes da migracao de consumidores
externos, usando fixture canonica em
src/test/java/org/praxisplatform/uischema/e2e/fixture.
e2e-h2: implementado e validadoe2e-pg: pendente; ainda nao existe dependencia de
Testcontainers ou PostgreSQL no pom.xmlSprint E2E final de consistencia/negativos/override em H2:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-final-e2e ^
-Dtest=MutableResourceLifecycleE2ETest,CapabilityConsistencyE2ETest,WorkflowNegativePathsE2ETest,CapabilityE2ETest,ActionCatalogE2ETest,SurfaceCatalogE2ETest,OpenApiUiSchemaAutoConfigurationSurfaceAvailabilityTest,OpenApiUiSchemaAutoConfigurationActionAvailabilityTest,GlobalExceptionHandlerTest testResultado validado:
BUILD SUCCESS/capabilities e os catalogos
dedicados de surfaces/actions em escopo
COLLECTION e ITEMbulk-approveSurfaceAvailabilityRule no container, no mesmo nivel ja
coberto para actionspom.xml agora
publica spring-boot-starter-validation, garantindo que
@Valid nos controllers canonicos realmente produza
400 Validation error no runtime HTTPPOST /employees invalido
falha canonicamente, confirmando que a correcao de validacao nao ficou
restrita a endpoints de workflowHardening transversal de repetibilidade e concorrencia leve:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-transversal-hardening ^
-Dtest=AnnotationDrivenSurfaceDefinitionRegistryTest,AnnotationDrivenActionDefinitionRegistryTest,CapabilityServiceTest,CapabilityE2ETest,OpenApiUiSchemaAutoConfigurationSurfaceAvailabilityTest,OpenApiUiSchemaAutoConfigurationActionAvailabilityTest testObjetivo deste corte:
surfaces e
actions constroem snapshot uma unica vez mesmo sob lookup
concorrente leve/capabilities e
DefaultCapabilityService permanecem deterministas em
chamadas repetidas para o mesmo contextoCobertura inicial da Fase 5 de WorkflowAction em H2:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-phase5-actions ^
-Dtest=ActionCatalogE2ETest,AnnotationDrivenActionDefinitionRegistryTest,ActionCatalogServiceTest,DefaultActionAvailabilityEvaluatorTest,SurfaceCatalogE2ETest,AnnotationDrivenSurfaceDefinitionRegistryTest,AbstractResourceControllerJpaWriteIntegrationTest testResultado validado:
BUILD SUCCESSactions, valida a
separacao surface vs workflow, prova execucao
tipada real com POST /employees/{id}/actions/approve e
POST /employees/actions/bulk-approve, e cobre a
availability composicional por contexto, RBAC e estado do recurso em
escopos ITEM e COLLECTIONHardening adicional da availability de actions no mesmo
nivel final da Fase 4:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-phase5-actions-availability ^
-Dtest=ActionCatalogE2ETest,ActionCatalogServiceTest,DefaultActionAvailabilityEvaluatorTest,DefaultActionAvailabilityContextResolverTest,OpenApiUiSchemaAutoConfigurationActionAvailabilityTest,AnnotationDrivenActionDefinitionRegistryTest,SurfaceCatalogE2ETest,AnnotationDrivenSurfaceDefinitionRegistryTest,AbstractResourceControllerJpaWriteIntegrationTest testResultado validado:
BUILD SUCCESSActionAvailabilityRule, com short-circuit no primeiro deny,
metadata incremental e cobertura para:
resource-context-requiredmissing-authorityresource-state-blockedresource-state-unavailablePrimeiro corte validado da Fase 6 de capabilities
unificadas:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-phase6-capabilities ^
-Dtest=OpenApiCanonicalCapabilityResolverTest,CapabilityServiceTest,CapabilityE2ETest,AbstractResourceControllerJpaWriteIntegrationTest,SurfaceCatalogE2ETest,ActionCatalogE2ETest,ApiDocsControllerTest testResultado validado:
BUILD SUCCESSGET /{resource}/capabilitiesGET /{resource}/{id}/capabilitiessurfaces +
actionsCapabilitySnapshot.group segue o
grupo OpenAPI canonico resolvido por resourcePath,
normalmente o grupo individual do recursoFechamento de ActionScope.COLLECTION na Fase 5:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-phase5-actions-collection ^
-Dtest=ActionCatalogE2ETest,ActionCatalogServiceTest,AnnotationDrivenActionDefinitionRegistryTest,DefaultActionAvailabilityEvaluatorTest,DefaultActionAvailabilityContextResolverTest,OpenApiUiSchemaAutoConfigurationActionAvailabilityTest,SurfaceCatalogE2ETest,AnnotationDrivenSurfaceDefinitionRegistryTest,AbstractResourceControllerJpaWriteIntegrationTest testResultado validado:
BUILD SUCCESSGET /{resource}/actions, o
caso real POST /employees/actions/bulk-approve e a
convivencia correta entre escopos ITEM e
COLLECTIONCobertura adicional que fecha a Fase 4 de surfaces em
H2:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-phase4-availability ^
-Dtest=SurfaceCatalogE2ETest,AnnotationDrivenSurfaceDefinitionRegistryTest,DefaultSurfaceAvailabilityContextResolverTest,DefaultSurfaceAvailabilityEvaluatorTest,SurfaceCatalogServiceTest,OpenApiUiSchemaAutoConfigurationSurfaceAvailabilityTest,AbstractResourceControllerJpaWriteIntegrationTest testResultado validado:
BUILD SUCCESSsurfaces, a
availability por composicao, o guardrail contra N+1 por surface e o
wiring plugavel basico por regrasHardening adicional da Fase 4 em src/test:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-phase4-exhaustive-tests ^
-Dtest=SurfaceCatalogE2ETest,AnnotationDrivenSurfaceDefinitionRegistryTest,DefaultSurfaceAvailabilityContextResolverTest,DefaultSurfaceAvailabilityEvaluatorTest,SurfaceCatalogServiceTest,OpenApiUiSchemaAutoConfigurationSurfaceAvailabilityTest,AbstractResourceControllerJpaWriteIntegrationTest testResultado validado:
BUILD SUCCESSresource-state-unavailablenot found, conflito de valor canonico e
caching por grupo no SurfaceCatalogServiceBaseline do Sprint 1 em H2:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-e2e ^
-Dtest=MutableResourceLifecycleE2ETest,ReadOnlyResourceE2ETest,SchemaDiscoveryE2ETest,OpenApiGroupRegistrationE2ETest,LegacyCoexistenceE2ETest,GlobalExceptionHandlerTest testResultado validado:
BUILD SUCCESSCorte mais recente do Sprint 3 em H2:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-e2e-stats ^
-Dtest=OptionsAndOptionSourcesE2ETest,StarterBootstrapE2ETest,StatsE2ETest,LimitsAndErrorsE2ETest testResultado validado:
BUILD SUCCESSoption-sources e bootstrap puro do starter para recurso
novo + docs canonicos200, 400,
501, /schemas/filtered e
/schemas/catalogImplementada em:
src/test/java/org/praxisplatform/uischema/e2e/fixture/E2eFixtureApplication.javasrc/test/java/org/praxisplatform/uischema/e2e/fixture/E2eFixtureEntities.javasrc/test/java/org/praxisplatform/uischema/e2e/fixture/E2eFixtureDtos.javasrc/test/java/org/praxisplatform/uischema/e2e/fixture/E2eFixtureResources.javasrc/test/java/org/praxisplatform/uischema/e2e/fixture/E2eFixtureDataSupport.javasrc/test/resources/application-e2e-h2.ymlRecursos cobertos pela fixture:
EmployeeController no novo core
(AbstractResourceController)PayrollViewController no novo core read-only
(AbstractReadOnlyResourceController)DepartmentController no novo core
(AbstractResourceController)LegacyEmployeeController no core legado
(AbstractCrudController)Implementado:
MutableResourceLifecycleE2ETestReadOnlyResourceE2ETestSchemaDiscoveryE2ETestOpenApiGroupRegistrationE2ETestLegacyCoexistenceE2ETestEscopo validado no Sprint 1:
/schemas/filtered sobre controllers novosapplication e
praxis-metadata-infraAchados canonicos corrigidos durante a implementacao do Sprint 1:
PraxisMetadataAutoConfiguration nao estava registrando
automaticamente o pacote
org.praxisplatform.uischema.rest.exceptionhandler, o que
fazia hosts apoiados apenas no starter perderem o tratamento global de
errosGlobalExceptionHandler nao tratava
NoResourceFoundException, fazendo endpoint inexistente cair
como 500 em vez de 404GlobalExceptionHandler nao tratava
HttpRequestMethodNotSupportedException, fazendo
PUT e DELETE sem mapping cair como
500 em vez de 405/schemas/filtered em cenarios E2E exigiu blindagem de
query string para paths com /{id}, reforcando o contrato
canonico por path + operation + schemaTypeArquivos centrais endurecidos por esses achados:
src/main/java/org/praxisplatform/uischema/configuration/PraxisMetadataAutoConfiguration.javasrc/main/java/org/praxisplatform/uischema/rest/exceptionhandler/GlobalExceptionHandler.javasrc/test/java/org/praxisplatform/uischema/e2e/AbstractE2eH2Test.javasrc/test/java/org/praxisplatform/uischema/rest/exceptionhandler/GlobalExceptionHandlerTest.javaImplementado e validado:
CatalogDiscoveryE2ETestLimitsAndErrorsE2ETestResourceQuerySurfaceE2ETestHateoasAndPayloadSizeE2ETestAchados canonicos corrigidos ao abrir o Sprint 2:
DomainCatalogController passou a usar
application como fallback real quando a consulta chega sem
group e sem path, eliminando o grupo sintetico
apiDynamicSwaggerConfig deixou de registrar grupos
agregados com wildcard amplo derivado de /; agora publica
pathsToMatch explicitos por recurso do grupoDynamicSwaggerConfigTest foi isolado por
@Profile para nao poluir o @SpringBootTest da
fixture E2EAinda pendente: - nenhum teste adicional de Sprint 2 em H2
Achados canonicos corrigidos ao fechar o Sprint 2:
employees agora cobre navegacao
positiva de cursor e locate, permitindo
validar o backlog de query surface sem depender do consumidor
externoLimitsAndErrorsE2ETest passou a manter o caminho
501 Not Implemented sobre o recurso read-only
payroll-view, separando explicitamente o caso suportado do
nao suportadopraxis.hateoas.enabled=false remove links top-level e
item-level, enquanto recursos read-only continuam sem links de escrita
mesmo com HATEOAS ligadoImplementado e validado:
OptionsAndOptionSourcesE2ETestStarterBootstrapE2ETestStatsE2ETestObservacoes do estado atual:
options e
option-sources na fixture H2, incluindo a exposicao
metadata-driven de x-ui.optionSource em
/schemas/filtered/schemas/filtered + /schemas/catalog + grupos
OpenAPI usando E2eBootstrapFixtureApplication, sem beans
manuais extras para docs, scanner ou query coreoption-sources continua usando fixture
enriquecida com beans locais para
OptionSourceQueryExecutor,
OptionSourceEligibility e
OptionSourceRegistry; isso ficou explicitamente separado do
bootstrap puro para nao misturar capacidade opcional com subida basica
do starterStatsE2ETest agora cobre COUNT,
SUM, AVG, MIN, MAX,
distribuicao HISTOGRAM e TERMS, alem de
ETag/If-None-Match e variacao estrutural com
includeInternalSchemas em schemas de statsPendente:
e2e-pg com PostgreSQL e TestcontainersNao migrar consumidor externo enquanto a fixture E2E do starter nao estiver verde e documentada no minimo para o Sprint 1.
Antes de migrar um consumidor externo, a base minima do starter deve incluir:
e2e-pg, sem tratar H2 como
substituto definitivo de cenarios enterpriseO comando oficial minimo de validacao pre-piloto, no estado atual do starter, e:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-final-e2e ^
-Dtest=MutableResourceLifecycleE2ETest,CapabilityConsistencyE2ETest,WorkflowNegativePathsE2ETest,CapabilityE2ETest,ActionCatalogE2ETest,SurfaceCatalogE2ETest,OpenApiUiSchemaAutoConfigurationSurfaceAvailabilityTest,OpenApiUiSchemaAutoConfigurationActionAvailabilityTest,GlobalExceptionHandlerTest testComplemento recomendado de hardening transversal:
mvn -Dproject.build.directory=D:\Developer\praxis-plataform\praxis-metadata-starter\.codex-build-transversal-hardening ^
-Dtest=AnnotationDrivenSurfaceDefinitionRegistryTest,AnnotationDrivenActionDefinitionRegistryTest,CapabilityServiceTest,CapabilityE2ETest,OpenApiUiSchemaAutoConfigurationSurfaceAvailabilityTest,OpenApiUiSchemaAutoConfigurationActionAvailabilityTest testNao precisa bloquear o primeiro piloto real por:
e2e-pg com PostgreSQL/TestcontainersEsses itens continuam sendo hardening transversal desejavel, mas nao sao gate minimo para sair do starter.
surfaces esta encerrada no starterWorkflowAction esta formalmente encerrada
no startercapabilities esta formalmente encerrada no
starter