Repository navigation
test: [TESIS-161] make the tenant isolation sweep cover every route with an id - #114
Conversation
…e with an id The isolation spec sweeps a hand-written list of routes that receive an id of another company and expects 404 on each. A new route was only covered if someone remembered to add it: POST /shipments/:id/dispatch and the creation and deletion of product mappings were never swept. Those three are added (all answer 404), and a new example takes every /api/v1 route whose path carries an id from the router and fails, naming it, when one is not in the sweep. Routes whose id is not a record of a company (the global service of integrations#update) are listed apart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Revisado. Lo veo bien para implementar. Lo mergearía por lo que encontró: Lo que verifiqué
Antes de mergear Igual que #113: Lo tomaría como parte del trabajo de QA del tablero, no como una card de desarrollo. |
TomasMartin2004
left a comment
There was a problem hiding this comment.
Revisión del diff completo. El código es idéntico al que leí cuando los PRs estaban en draft —ningún commit nuevo—, así que lo que sigue es el veredicto formal.
✅ Aprobado
Es el PR con mejor relación valor/costo de la tanda, junto con #113: 41 líneas, todas de spec, y cubre una de las tareas transversales de QA que siguen abiertas.
Lo que encontró es el punto: POST /shipments/:id/dispatch, POST /products/:product_id/mappings y DELETE .../mappings/:id estaban fuera del barrido de aislamiento. Son tres rutas que mueven stock o tocan el vínculo con un canal, y el criterio de aceptación de E4b §2.6 pide que ningún tenant alcance datos de otro bajo ningún escenario de prueba. Que faltaran no quiere decir que fueran vulnerables —el default_scope de CompanyScoped las cubre— pero sí que nadie lo estaba demostrando, que es lo que el criterio pide.
Lo que verifiqué
- El ejemplo
sweeps every route of the API that takes an idcierra el agujero de raíz: usarecognize_pathy compara contra lo que el router expone. Una ruta nueva con id que nadie sume hace fallar el spec y la nombra. Eso es lo que lo convierte en una garantía y no en otra lista que se va a quedar vieja. tenantless_id_routes = %w[integrations#update]es la única excepción y está escrita como excepción, no escondida en el filtro. El:service_idapunta a una plantilla global y la integración que se actualiza es siempre la de la sesión.other_mappingnace dentro deas_intruder, así que tiene elcompany_idde la otra empresa y no el que dejó colgado un request anterior.
Sin objeciones. Lo tomaría como trabajo de QA del tablero, no como una card de desarrollo.
Ticket de Jira
https://proyectofinalfrlp.atlassian.net/browse/TESIS-161
Descripción
El criterio de aceptación de E4b §2.6 pide que «ningún tenant pueda acceder a datos de otro tenant bajo ningún escenario de prueba».
tenant_isolation_spec.rblo prueba barriendo rutas con un id de otra empresa y esperando 404, pero la lista de rutas está escrita a mano: una ruta nueva sólo quedaba cubierta si alguien se acordaba de sumarla. Revisándola contra el router, faltaban tres:POST /api/v1/shipments/:id/dispatchPOST /api/v1/products/:product_id/mappingsDELETE /api/v1/products/:product_id/mappings/:idLas tres responden 404 con un id ajeno: no hay fuga, pero no estaban probadas.
other_mappingde la otra empresa para la baja)./api/v1cuyo path lleva un id (:id,:order_id,:product_id,:service_id) y falla, nombrándola, si no está en el barrido.integrations#updatequeda listada aparte: su id es una plantilla global (Service), y la integración que toca es siempre la de la empresa de la sesión.Dientes: sacando la línea de
dispatchdel barrido, el ejemplo nuevo falla conexpected ["shipments#confirm"].empty? to be truthy.Orden de merge: proyecto-api#102 (card 009) agrega
POST /orders/:id/cancel; ya sumé esa ruta al barrido en su propia rama, así que mergear una antes que la otra no rompe nada (a lo sumo, un conflicto de líneas vecinas en la lista).Evidencia visual
N/A
Cómo probar
bundle exec rspec spec/requests/api/v1/tenant_isolation_spec.rb→ en verde.controlador#acción.Verificación:
bundle exec rspec(1568 ejemplos, 0 fallas),rubocoplimpio.Impacto y consideraciones
¿Introduce breaking changes?
No. Sólo tests.
¿Requiere nuevas variables de entorno?
No
¿Afecta la arquitectura o genera un nuevo patrón?
No. Mismo criterio que la card 031 para ADR-015: la regla se verifica contra el router y no contra una lista.
🤖 Generated with Claude Code