theus-cli-darwin-x64 0.2.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +42 -0
- package/README.md +295 -0
- package/RELEASE.json +18 -0
- package/assets/brand-official/v1.0/logo/theus-lockup-negative-official.png +0 -0
- package/assets/brand-official/v1.0/logo/theus-lockup-primary-dark-official.png +0 -0
- package/assets/fonts/satoshi/satoshi-300.woff2 +0 -0
- package/assets/fonts/satoshi/satoshi-400.woff2 +0 -0
- package/assets/fonts/satoshi/satoshi-500.woff2 +0 -0
- package/assets/fonts/satoshi/satoshi-700.woff2 +0 -0
- package/assets/fonts/satoshi/satoshi-900.woff2 +0 -0
- package/assets/windows-store/Square150x150Logo.png +0 -0
- package/assets/windows-store/Square44x44Logo.png +0 -0
- package/assets/windows-store/StoreLogo.png +0 -0
- package/assets/windows-store/theus-store-icon-master.png +0 -0
- package/bin/theus +0 -0
- package/package.json +18 -0
- package/vendor/theus-arsenal/.arsenal-nombres-ola2.json +6 -0
- package/vendor/theus-arsenal/.arsenal-nombres-ola3.json +72 -0
- package/vendor/theus-arsenal/.mailmap +2 -0
- package/vendor/theus-arsenal/.theus-plugin/marketplace.json +25 -0
- package/vendor/theus-arsenal/.theus-plugin/plugin.json +20 -0
- package/vendor/theus-arsenal/AUTHORS.md +8 -0
- package/vendor/theus-arsenal/CLEANROOM_REPLACEMENT_PLAN.md +11 -0
- package/vendor/theus-arsenal/LICENSE +26 -0
- package/vendor/theus-arsenal/PROVENANCE.md +9 -0
- package/vendor/theus-arsenal/README.md +41 -0
- package/vendor/theus-arsenal/THIRD_PARTY.md +80 -0
- package/vendor/theus-arsenal/agents/actualizador-docs.md +123 -0
- package/vendor/theus-arsenal/agents/analista-comentarios.md +53 -0
- package/vendor/theus-arsenal/agents/analista-conversaciones.md +60 -0
- package/vendor/theus-arsenal/agents/analista-tests-pr.md +53 -0
- package/vendor/theus-arsenal/agents/analista-tipos.md +49 -0
- package/vendor/theus-arsenal/agents/arquitecto-accesibilidad.md +148 -0
- package/vendor/theus-arsenal/agents/arquitecto-codigo.md +79 -0
- package/vendor/theus-arsenal/agents/arquitecto-homelab.md +90 -0
- package/vendor/theus-arsenal/agents/arquitecto-redes.md +116 -0
- package/vendor/theus-arsenal/agents/arquitecto-sistemas.md +219 -0
- package/vendor/theus-arsenal/agents/bifurcador-opensource.md +206 -0
- package/vendor/theus-arsenal/agents/cazador-fallos-silenciosos.md +58 -0
- package/vendor/theus-arsenal/agents/consultor-documentacion.md +76 -0
- package/vendor/theus-arsenal/agents/diagnosticador-redes.md +135 -0
- package/vendor/theus-arsenal/agents/ejecutor-e2e.md +96 -0
- package/vendor/theus-arsenal/agents/empaquetador-opensource.md +257 -0
- package/vendor/theus-arsenal/agents/escaner-secretos.md +196 -0
- package/vendor/theus-arsenal/agents/especialista-seo.md +70 -0
- package/vendor/theus-arsenal/agents/estratega-marketing.md +158 -0
- package/vendor/theus-arsenal/agents/evaluador-agentes.md +214 -0
- package/vendor/theus-arsenal/agents/evaluador-harness.md +217 -0
- package/vendor/theus-arsenal/agents/explorador-codigo.md +79 -0
- package/vendor/theus-arsenal/agents/extractor-specs.md +214 -0
- package/vendor/theus-arsenal/agents/generador-harness.md +139 -0
- package/vendor/theus-arsenal/agents/guia-tdd.md +99 -0
- package/vendor/theus-arsenal/agents/jefe-de-gabinete.md +162 -0
- package/vendor/theus-arsenal/agents/limpiador-refactors.md +93 -0
- package/vendor/theus-arsenal/agents/optimizador-rendimiento.md +454 -0
- package/vendor/theus-arsenal/agents/planificador-harness.md +107 -0
- package/vendor/theus-arsenal/agents/planificador.md +221 -0
- package/vendor/theus-arsenal/agents/resolutor-apps-harmonyos.md +181 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-cpp.md +98 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-dart.md +209 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-django.md +253 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-go.md +102 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-java.md +274 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-kotlin.md +128 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-pytorch.md +128 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-react.md +214 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-rust.md +156 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-swift.md +169 -0
- package/vendor/theus-arsenal/agents/resolutor-builds.md +122 -0
- package/vendor/theus-arsenal/agents/revisor-bd.md +97 -0
- package/vendor/theus-arsenal/agents/revisor-codigo.md +291 -0
- package/vendor/theus-arsenal/agents/revisor-config-red.md +116 -0
- package/vendor/theus-arsenal/agents/revisor-cpp.md +80 -0
- package/vendor/theus-arsenal/agents/revisor-csharp.md +109 -0
- package/vendor/theus-arsenal/agents/revisor-django.md +168 -0
- package/vendor/theus-arsenal/agents/revisor-fastapi.md +82 -0
- package/vendor/theus-arsenal/agents/revisor-flutter.md +251 -0
- package/vendor/theus-arsenal/agents/revisor-go.md +84 -0
- package/vendor/theus-arsenal/agents/revisor-java.md +192 -0
- package/vendor/theus-arsenal/agents/revisor-kotlin.md +171 -0
- package/vendor/theus-arsenal/agents/revisor-ml.md +159 -0
- package/vendor/theus-arsenal/agents/revisor-php.md +108 -0
- package/vendor/theus-arsenal/agents/revisor-python.md +106 -0
- package/vendor/theus-arsenal/agents/revisor-react.md +166 -0
- package/vendor/theus-arsenal/agents/revisor-rust.md +102 -0
- package/vendor/theus-arsenal/agents/revisor-seguridad.md +116 -0
- package/vendor/theus-arsenal/agents/revisor-software-clinico.md +95 -0
- package/vendor/theus-arsenal/agents/revisor-swift.md +115 -0
- package/vendor/theus-arsenal/agents/revisor-typescript.md +123 -0
- package/vendor/theus-arsenal/agents/revisor-vue.md +205 -0
- package/vendor/theus-arsenal/agents/simplificador-codigo.md +55 -0
- package/vendor/theus-arsenal/commands/actualizar-docs.md +88 -0
- package/vendor/theus-arsenal/commands/actualizar-mapas-codigo.md +78 -0
- package/vendor/theus-arsenal/commands/aprender-evaluar.md +109 -0
- package/vendor/theus-arsenal/commands/aprender.md +74 -0
- package/vendor/theus-arsenal/commands/arreglar-build.md +66 -0
- package/vendor/theus-arsenal/commands/bucle-multiperspectiva.md +153 -0
- package/vendor/theus-arsenal/commands/build-cpp.md +173 -0
- package/vendor/theus-arsenal/commands/build-flutter.md +164 -0
- package/vendor/theus-arsenal/commands/build-go.md +183 -0
- package/vendor/theus-arsenal/commands/build-gradle.md +75 -0
- package/vendor/theus-arsenal/commands/build-kotlin.md +176 -0
- package/vendor/theus-arsenal/commands/build-react.md +187 -0
- package/vendor/theus-arsenal/commands/build-rust.md +187 -0
- package/vendor/theus-arsenal/commands/campana-marketing.md +125 -0
- package/vendor/theus-arsenal/commands/checkpoint.md +78 -0
- package/vendor/theus-arsenal/commands/cobertura-tests.md +73 -0
- package/vendor/theus-arsenal/commands/configurar-gestor-paquetes.md +86 -0
- package/vendor/theus-arsenal/commands/consulta.md +164 -0
- package/vendor/theus-arsenal/commands/control-calidad.md +50 -0
- package/vendor/theus-arsenal/commands/crear-skill.md +77 -0
- package/vendor/theus-arsenal/commands/enrutar-modelo.md +30 -0
- package/vendor/theus-arsenal/commands/epica-desbloquear.md +17 -0
- package/vendor/theus-arsenal/commands/epica-descomponer.md +22 -0
- package/vendor/theus-arsenal/commands/epica-publicar.md +21 -0
- package/vendor/theus-arsenal/commands/epica-reclamar.md +25 -0
- package/vendor/theus-arsenal/commands/epica-revisar.md +22 -0
- package/vendor/theus-arsenal/commands/epica-sincronizar.md +21 -0
- package/vendor/theus-arsenal/commands/epica-validar.md +21 -0
- package/vendor/theus-arsenal/commands/evolucionar.md +176 -0
- package/vendor/theus-arsenal/commands/funcionalidad.md +49 -0
- package/vendor/theus-arsenal/commands/guardar-sesion.md +278 -0
- package/vendor/theus-arsenal/commands/harness-build.md +111 -0
- package/vendor/theus-arsenal/commands/harness-diseno.md +46 -0
- package/vendor/theus-arsenal/commands/informe-costos.md +90 -0
- package/vendor/theus-arsenal/commands/iniciar-bucle.md +36 -0
- package/vendor/theus-arsenal/commands/instintos-estado.md +53 -0
- package/vendor/theus-arsenal/commands/instintos-exportar.md +69 -0
- package/vendor/theus-arsenal/commands/instintos-importar.md +120 -0
- package/vendor/theus-arsenal/commands/lienzo-planes.md +48 -0
- package/vendor/theus-arsenal/commands/limpiar-refactor.md +84 -0
- package/vendor/theus-arsenal/commands/modo-seguro.md +96 -0
- package/vendor/theus-arsenal/commands/orq-agregar-funcionalidad.md +36 -0
- package/vendor/theus-arsenal/commands/orq-cambiar-funcionalidad.md +38 -0
- package/vendor/theus-arsenal/commands/orq-construir-mvp.md +36 -0
- package/vendor/theus-arsenal/commands/orq-corregir-defecto.md +40 -0
- package/vendor/theus-arsenal/commands/orq-refinar-codigo.md +44 -0
- package/vendor/theus-arsenal/commands/orq-revisar.md +135 -0
- package/vendor/theus-arsenal/commands/plan-prd.md +160 -0
- package/vendor/theus-arsenal/commands/plan.md +198 -0
- package/vendor/theus-arsenal/commands/podar.md +31 -0
- package/vendor/theus-arsenal/commands/pr.md +181 -0
- package/vendor/theus-arsenal/commands/promover.md +41 -0
- package/vendor/theus-arsenal/commands/proyectos.md +33 -0
- package/vendor/theus-arsenal/commands/prp-commit.md +112 -0
- package/vendor/theus-arsenal/commands/prp-implementar.md +385 -0
- package/vendor/theus-arsenal/commands/prp-planificar.md +501 -0
- package/vendor/theus-arsenal/commands/reanudar-sesion.md +160 -0
- package/vendor/theus-arsenal/commands/revisar-codigo.md +289 -0
- package/vendor/theus-arsenal/commands/revisar-cpp.md +132 -0
- package/vendor/theus-arsenal/commands/revisar-fastapi.md +39 -0
- package/vendor/theus-arsenal/commands/revisar-flutter.md +115 -0
- package/vendor/theus-arsenal/commands/revisar-go.md +148 -0
- package/vendor/theus-arsenal/commands/revisar-kotlin.md +140 -0
- package/vendor/theus-arsenal/commands/revisar-pr.md +37 -0
- package/vendor/theus-arsenal/commands/revisar-python.md +297 -0
- package/vendor/theus-arsenal/commands/revisar-react.md +170 -0
- package/vendor/theus-arsenal/commands/revisar-rust.md +142 -0
- package/vendor/theus-arsenal/commands/revisar-vue.md +174 -0
- package/vendor/theus-arsenal/commands/salud-skills.md +52 -0
- package/vendor/theus-arsenal/commands/sesiones.md +345 -0
- package/vendor/theus-arsenal/commands/test-cpp.md +252 -0
- package/vendor/theus-arsenal/commands/test-flutter.md +143 -0
- package/vendor/theus-arsenal/commands/test-go.md +268 -0
- package/vendor/theus-arsenal/commands/test-kotlin.md +312 -0
- package/vendor/theus-arsenal/commands/test-react.md +265 -0
- package/vendor/theus-arsenal/commands/test-rust.md +309 -0
- package/vendor/theus-arsenal/commands/vigilancia-canary.md +43 -0
- package/vendor/theus-arsenal/hooks/hooks.json +274 -0
- package/vendor/theus-arsenal/package.json +6 -0
- package/vendor/theus-arsenal/rules/angular/coding-style.md +182 -0
- package/vendor/theus-arsenal/rules/angular/hooks.md +25 -0
- package/vendor/theus-arsenal/rules/angular/patterns.md +249 -0
- package/vendor/theus-arsenal/rules/angular/security.md +87 -0
- package/vendor/theus-arsenal/rules/angular/testing.md +164 -0
- package/vendor/theus-arsenal/rules/arkts/coding-style.md +153 -0
- package/vendor/theus-arsenal/rules/arkts/hooks.md +80 -0
- package/vendor/theus-arsenal/rules/arkts/patterns.md +236 -0
- package/vendor/theus-arsenal/rules/arkts/security.md +141 -0
- package/vendor/theus-arsenal/rules/arkts/testing.md +126 -0
- package/vendor/theus-arsenal/rules/common/agents.md +49 -0
- package/vendor/theus-arsenal/rules/common/code-review.md +123 -0
- package/vendor/theus-arsenal/rules/common/coding-style.md +90 -0
- package/vendor/theus-arsenal/rules/common/development-workflow.md +44 -0
- package/vendor/theus-arsenal/rules/common/git-workflow.md +24 -0
- package/vendor/theus-arsenal/rules/common/hooks.md +32 -0
- package/vendor/theus-arsenal/rules/common/patterns.md +31 -0
- package/vendor/theus-arsenal/rules/common/performance.md +53 -0
- package/vendor/theus-arsenal/rules/common/security.md +29 -0
- package/vendor/theus-arsenal/rules/common/testing.md +57 -0
- package/vendor/theus-arsenal/rules/cpp/coding-style.md +44 -0
- package/vendor/theus-arsenal/rules/cpp/hooks.md +39 -0
- package/vendor/theus-arsenal/rules/cpp/patterns.md +51 -0
- package/vendor/theus-arsenal/rules/cpp/security.md +51 -0
- package/vendor/theus-arsenal/rules/cpp/testing.md +44 -0
- package/vendor/theus-arsenal/rules/csharp/coding-style.md +72 -0
- package/vendor/theus-arsenal/rules/csharp/hooks.md +25 -0
- package/vendor/theus-arsenal/rules/csharp/patterns.md +50 -0
- package/vendor/theus-arsenal/rules/csharp/security.md +58 -0
- package/vendor/theus-arsenal/rules/csharp/testing.md +50 -0
- package/vendor/theus-arsenal/rules/dart/coding-style.md +159 -0
- package/vendor/theus-arsenal/rules/dart/hooks.md +68 -0
- package/vendor/theus-arsenal/rules/dart/patterns.md +261 -0
- package/vendor/theus-arsenal/rules/dart/security.md +135 -0
- package/vendor/theus-arsenal/rules/dart/testing.md +215 -0
- package/vendor/theus-arsenal/rules/fsharp/coding-style.md +112 -0
- package/vendor/theus-arsenal/rules/fsharp/hooks.md +26 -0
- package/vendor/theus-arsenal/rules/fsharp/patterns.md +111 -0
- package/vendor/theus-arsenal/rules/fsharp/security.md +76 -0
- package/vendor/theus-arsenal/rules/fsharp/testing.md +62 -0
- package/vendor/theus-arsenal/rules/golang/coding-style.md +32 -0
- package/vendor/theus-arsenal/rules/golang/hooks.md +17 -0
- package/vendor/theus-arsenal/rules/golang/patterns.md +45 -0
- package/vendor/theus-arsenal/rules/golang/security.md +34 -0
- package/vendor/theus-arsenal/rules/golang/testing.md +31 -0
- package/vendor/theus-arsenal/rules/java/coding-style.md +114 -0
- package/vendor/theus-arsenal/rules/java/hooks.md +18 -0
- package/vendor/theus-arsenal/rules/java/patterns.md +147 -0
- package/vendor/theus-arsenal/rules/java/security.md +101 -0
- package/vendor/theus-arsenal/rules/java/testing.md +133 -0
- package/vendor/theus-arsenal/rules/kotlin/coding-style.md +86 -0
- package/vendor/theus-arsenal/rules/kotlin/hooks.md +17 -0
- package/vendor/theus-arsenal/rules/kotlin/patterns.md +146 -0
- package/vendor/theus-arsenal/rules/kotlin/security.md +82 -0
- package/vendor/theus-arsenal/rules/kotlin/testing.md +128 -0
- package/vendor/theus-arsenal/rules/nuxt/coding-style.md +47 -0
- package/vendor/theus-arsenal/rules/nuxt/hooks.md +39 -0
- package/vendor/theus-arsenal/rules/nuxt/patterns.md +54 -0
- package/vendor/theus-arsenal/rules/nuxt/security.md +48 -0
- package/vendor/theus-arsenal/rules/nuxt/testing.md +49 -0
- package/vendor/theus-arsenal/rules/php/coding-style.md +40 -0
- package/vendor/theus-arsenal/rules/php/hooks.md +24 -0
- package/vendor/theus-arsenal/rules/php/patterns.md +33 -0
- package/vendor/theus-arsenal/rules/php/security.md +37 -0
- package/vendor/theus-arsenal/rules/php/testing.md +38 -0
- package/vendor/theus-arsenal/rules/python/coding-style.md +42 -0
- package/vendor/theus-arsenal/rules/python/fastapi.md +58 -0
- package/vendor/theus-arsenal/rules/python/hooks.md +19 -0
- package/vendor/theus-arsenal/rules/python/patterns.md +39 -0
- package/vendor/theus-arsenal/rules/python/security.md +30 -0
- package/vendor/theus-arsenal/rules/python/testing.md +38 -0
- package/vendor/theus-arsenal/rules/react/coding-style.md +109 -0
- package/vendor/theus-arsenal/rules/react/hooks.md +187 -0
- package/vendor/theus-arsenal/rules/react/patterns.md +194 -0
- package/vendor/theus-arsenal/rules/react/security.md +180 -0
- package/vendor/theus-arsenal/rules/react/testing.md +208 -0
- package/vendor/theus-arsenal/rules/react-native/accessibility.md +55 -0
- package/vendor/theus-arsenal/rules/react-native/coding-style.md +71 -0
- package/vendor/theus-arsenal/rules/react-native/hooks.md +28 -0
- package/vendor/theus-arsenal/rules/react-native/patterns.md +88 -0
- package/vendor/theus-arsenal/rules/react-native/performance.md +45 -0
- package/vendor/theus-arsenal/rules/react-native/production-readiness.md +51 -0
- package/vendor/theus-arsenal/rules/react-native/security.md +43 -0
- package/vendor/theus-arsenal/rules/react-native/testing.md +52 -0
- package/vendor/theus-arsenal/rules/ruby/coding-style.md +46 -0
- package/vendor/theus-arsenal/rules/ruby/hooks.md +37 -0
- package/vendor/theus-arsenal/rules/ruby/patterns.md +44 -0
- package/vendor/theus-arsenal/rules/ruby/security.md +51 -0
- package/vendor/theus-arsenal/rules/ruby/testing.md +51 -0
- package/vendor/theus-arsenal/rules/rust/coding-style.md +151 -0
- package/vendor/theus-arsenal/rules/rust/hooks.md +16 -0
- package/vendor/theus-arsenal/rules/rust/patterns.md +168 -0
- package/vendor/theus-arsenal/rules/rust/security.md +141 -0
- package/vendor/theus-arsenal/rules/rust/testing.md +154 -0
- package/vendor/theus-arsenal/rules/swift/coding-style.md +47 -0
- package/vendor/theus-arsenal/rules/swift/hooks.md +20 -0
- package/vendor/theus-arsenal/rules/swift/patterns.md +66 -0
- package/vendor/theus-arsenal/rules/swift/security.md +33 -0
- package/vendor/theus-arsenal/rules/swift/testing.md +45 -0
- package/vendor/theus-arsenal/rules/typescript/coding-style.md +199 -0
- package/vendor/theus-arsenal/rules/typescript/hooks.md +22 -0
- package/vendor/theus-arsenal/rules/typescript/patterns.md +52 -0
- package/vendor/theus-arsenal/rules/typescript/security.md +28 -0
- package/vendor/theus-arsenal/rules/typescript/testing.md +18 -0
- package/vendor/theus-arsenal/rules/vue/coding-style.md +54 -0
- package/vendor/theus-arsenal/rules/vue/hooks.md +45 -0
- package/vendor/theus-arsenal/rules/vue/patterns.md +56 -0
- package/vendor/theus-arsenal/rules/vue/security.md +46 -0
- package/vendor/theus-arsenal/rules/vue/testing.md +53 -0
- package/vendor/theus-arsenal/rules/web/coding-style.md +108 -0
- package/vendor/theus-arsenal/rules/web/design-quality.md +75 -0
- package/vendor/theus-arsenal/rules/web/hooks.md +141 -0
- package/vendor/theus-arsenal/rules/web/patterns.md +91 -0
- package/vendor/theus-arsenal/rules/web/performance.md +76 -0
- package/vendor/theus-arsenal/rules/web/security.md +69 -0
- package/vendor/theus-arsenal/rules/web/testing.md +67 -0
- package/vendor/theus-arsenal/scripts/hooks/bash-hook-dispatcher.js +192 -0
- package/vendor/theus-arsenal/scripts/hooks/block-no-verify.js +556 -0
- package/vendor/theus-arsenal/scripts/hooks/check-console-log.js +92 -0
- package/vendor/theus-arsenal/scripts/hooks/check-hook-enabled.js +16 -0
- package/vendor/theus-arsenal/scripts/hooks/config-protection.js +171 -0
- package/vendor/theus-arsenal/scripts/hooks/design-quality-check.js +132 -0
- package/vendor/theus-arsenal/scripts/hooks/doc-file-warning.js +110 -0
- package/vendor/theus-arsenal/scripts/hooks/modo-seguro.js +158 -0
- package/vendor/theus-arsenal/scripts/hooks/notificacion-escritorio.js +208 -0
- package/vendor/theus-arsenal/scripts/hooks/plugin-hook-bootstrap.js +280 -0
- package/vendor/theus-arsenal/scripts/hooks/post-bash-command-log.js +87 -0
- package/vendor/theus-arsenal/scripts/hooks/post-bash-dispatcher.js +24 -0
- package/vendor/theus-arsenal/scripts/hooks/post-bash-pr-created.js +60 -0
- package/vendor/theus-arsenal/scripts/hooks/post-edit-accumulator.js +94 -0
- package/vendor/theus-arsenal/scripts/hooks/post-edit-console-warn.js +54 -0
- package/vendor/theus-arsenal/scripts/hooks/post-edit-format.js +110 -0
- package/vendor/theus-arsenal/scripts/hooks/post-edit-typecheck.js +98 -0
- package/vendor/theus-arsenal/scripts/hooks/pre-bash-commit-quality.js +447 -0
- package/vendor/theus-arsenal/scripts/hooks/pre-bash-dev-server-block.js +232 -0
- package/vendor/theus-arsenal/scripts/hooks/pre-bash-dispatcher.js +27 -0
- package/vendor/theus-arsenal/scripts/hooks/pre-compact.js +101 -0
- package/vendor/theus-arsenal/scripts/hooks/pretooluse-visible-output.js +49 -0
- package/vendor/theus-arsenal/scripts/hooks/quality-gate.js +168 -0
- package/vendor/theus-arsenal/scripts/hooks/run-with-flags.js +271 -0
- package/vendor/theus-arsenal/scripts/hooks/salud-mcp.js +749 -0
- package/vendor/theus-arsenal/scripts/hooks/seguimiento-costos.js +161 -0
- package/vendor/theus-arsenal/scripts/hooks/session-end.js +340 -0
- package/vendor/theus-arsenal/scripts/hooks/session-start.js +906 -0
- package/vendor/theus-arsenal/scripts/hooks/stop-format-typecheck.js +263 -0
- package/vendor/theus-arsenal/scripts/hooks/suggest-compact.js +286 -0
- package/vendor/theus-arsenal/scripts/hooks/theus-context-monitor.js +289 -0
- package/vendor/theus-arsenal/scripts/hooks/verificacion-factual.js +1278 -0
- package/vendor/theus-arsenal/scripts/lib/agent-data-home.js +96 -0
- package/vendor/theus-arsenal/scripts/lib/cost-estimate.js +66 -0
- package/vendor/theus-arsenal/scripts/lib/hook-flags.js +79 -0
- package/vendor/theus-arsenal/scripts/lib/llm-summary.js +185 -0
- package/vendor/theus-arsenal/scripts/lib/loopback-guard.js +54 -0
- package/vendor/theus-arsenal/scripts/lib/observer-sessions.js +237 -0
- package/vendor/theus-arsenal/scripts/lib/package-manager.d.ts +120 -0
- package/vendor/theus-arsenal/scripts/lib/package-manager.js +434 -0
- package/vendor/theus-arsenal/scripts/lib/path-safety.js +86 -0
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/markdown.js +285 -0
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/sdk.js +238 -0
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/server.js +534 -0
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/sessions.js +274 -0
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/ui.js +546 -0
- package/vendor/theus-arsenal/scripts/lib/project-detect.js +451 -0
- package/vendor/theus-arsenal/scripts/lib/resolve-formatter.js +193 -0
- package/vendor/theus-arsenal/scripts/lib/resolve-theus-root.js +101 -0
- package/vendor/theus-arsenal/scripts/lib/session-aliases.d.ts +138 -0
- package/vendor/theus-arsenal/scripts/lib/session-aliases.js +483 -0
- package/vendor/theus-arsenal/scripts/lib/session-bridge.js +155 -0
- package/vendor/theus-arsenal/scripts/lib/session-manager.d.ts +137 -0
- package/vendor/theus-arsenal/scripts/lib/session-manager.js +555 -0
- package/vendor/theus-arsenal/scripts/lib/shell-split.js +86 -0
- package/vendor/theus-arsenal/scripts/lib/shell-substitution.js +501 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/dashboard.js +414 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/health.js +285 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/index.js +22 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/provenance.js +200 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/tracker.js +157 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/versioning.js +246 -0
- package/vendor/theus-arsenal/scripts/lib/transcript-context.js +232 -0
- package/vendor/theus-arsenal/scripts/lib/utils.d.ts +205 -0
- package/vendor/theus-arsenal/scripts/lib/utils.js +658 -0
- package/vendor/theus-arsenal/scripts/plan-canvas.js +341 -0
- package/vendor/theus-arsenal/scripts/setup-package-manager.js +46 -0
- package/vendor/theus-arsenal/scripts/skills-health.js +143 -0
- package/vendor/theus-arsenal/skills/a11y-frontend/SKILL.md +444 -0
- package/vendor/theus-arsenal/skills/accesibilidad/SKILL.md +144 -0
- package/vendor/theus-arsenal/skills/acelerador-throughput-datos/SKILL.md +72 -0
- package/vendor/theus-arsenal/skills/agente-scraper-datos/SKILL.md +771 -0
- package/vendor/theus-arsenal/skills/analisis-plataformas-competencia/SKILL.md +137 -0
- package/vendor/theus-arsenal/skills/api-x/SKILL.md +233 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/SKILL.md +335 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/observer-loop.sh +374 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/observer.md +188 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/session-guardian.sh +153 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/start-observer.sh +253 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/config.json +8 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/hooks/observe.sh +594 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/detect-project.sh +325 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/instinct-cli.py +1918 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/lib/arsenal-dir.sh +23 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/test_parse_instinct.py +1420 -0
- package/vendor/theus-arsenal/skills/arquitectura-hexagonal/SKILL.md +275 -0
- package/vendor/theus-arsenal/skills/arquitectura-limpia-android/SKILL.md +340 -0
- package/vendor/theus-arsenal/skills/arquitectura-pipelines-recomendacion/SKILL.md +112 -0
- package/vendor/theus-arsenal/skills/atlas-datos-prediccion/SKILL.md +53 -0
- package/vendor/theus-arsenal/skills/auditoria-arquitectura-agentes/SKILL.md +257 -0
- package/vendor/theus-arsenal/skills/auditoria-produccion/SKILL.md +180 -0
- package/vendor/theus-arsenal/skills/auditoria-rutas-clic/SKILL.md +243 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/SKILL.md +180 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/examples/high-score-example.md +89 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/examples/low-score-example.md +87 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/references/evaluation-criteria.md +71 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/references/hook-integration.md +90 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/scripts/evaluate.py +409 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/templates/evaluation-report.md +86 -0
- package/vendor/theus-arsenal/skills/automatizacion-ssh-netmiko/SKILL.md +176 -0
- package/vendor/theus-arsenal/skills/base-datos-pubmed/SKILL.md +174 -0
- package/vendor/theus-arsenal/skills/base-datos-uspto/SKILL.md +173 -0
- package/vendor/theus-arsenal/skills/benchmark/SKILL.md +92 -0
- package/vendor/theus-arsenal/skills/bitacora-crecimiento/SKILL.md +120 -0
- package/vendor/theus-arsenal/skills/bucle-verificacion/SKILL.md +125 -0
- package/vendor/theus-arsenal/skills/buscar-primero/SKILL.md +184 -0
- package/vendor/theus-arsenal/skills/busqueda-exa/SKILL.md +111 -0
- package/vendor/theus-arsenal/skills/cache-por-hash/SKILL.md +160 -0
- package/vendor/theus-arsenal/skills/campana-marketing/SKILL.md +118 -0
- package/vendor/theus-arsenal/skills/capacidad-producto/SKILL.md +138 -0
- package/vendor/theus-arsenal/skills/cazador-vulnerabilidades/SKILL.md +104 -0
- package/vendor/theus-arsenal/skills/compactacion-estrategica/SKILL.md +115 -0
- package/vendor/theus-arsenal/skills/comparador-baskets-prediccion/SKILL.md +69 -0
- package/vendor/theus-arsenal/skills/compras-energia/SKILL.md +206 -0
- package/vendor/theus-arsenal/skills/concurrencia-swift-6-2/SKILL.md +224 -0
- package/vendor/theus-arsenal/skills/consejo/SKILL.md +201 -0
- package/vendor/theus-arsenal/skills/construccion-harness-agentes/SKILL.md +78 -0
- package/vendor/theus-arsenal/skills/constructor-conectores/SKILL.md +119 -0
- package/vendor/theus-arsenal/skills/constructor-equipos/SKILL.md +169 -0
- package/vendor/theus-arsenal/skills/consulta-documentacion/SKILL.md +92 -0
- package/vendor/theus-arsenal/skills/consultas-genomicas-gget/SKILL.md +170 -0
- package/vendor/theus-arsenal/skills/contacto-inversores/SKILL.md +95 -0
- package/vendor/theus-arsenal/skills/corrutinas-flows-kotlin/SKILL.md +284 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/SKILL.md +46 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/3d.md +86 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/animations.md +29 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/charts-bar-chart.tsx +173 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/text-animations-typewriter.tsx +100 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets.md +78 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/audio.md +172 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/calculate-metadata.md +104 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/can-decode.md +75 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/charts.md +58 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/compositions.md +146 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/display-captions.md +126 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/extract-frames.md +229 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/fonts.md +152 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-audio-duration.md +58 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-video-dimensions.md +68 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-video-duration.md +58 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/gifs.md +138 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/images.md +130 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/import-srt-captions.md +67 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/lottie.md +67 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/measuring-dom-nodes.md +34 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/measuring-text.md +143 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/sequencing.md +106 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/tailwind.md +11 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/text-animations.md +20 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/timing.md +179 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/transcribe-captions.md +19 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/transitions.md +122 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/trimming.md +52 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/videos.md +171 -0
- package/vendor/theus-arsenal/skills/cumplimiento-aduanero/SKILL.md +270 -0
- package/vendor/theus-arsenal/skills/cumplimiento-hipaa/SKILL.md +78 -0
- package/vendor/theus-arsenal/skills/datos-sensibles-salud/SKILL.md +149 -0
- package/vendor/theus-arsenal/skills/decimales-tokens-evm/SKILL.md +128 -0
- package/vendor/theus-arsenal/skills/decisiones-arquitectura/SKILL.md +206 -0
- package/vendor/theus-arsenal/skills/demos-ui/SKILL.md +469 -0
- package/vendor/theus-arsenal/skills/desarrollo-por-intencion/SKILL.md +369 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/SKILL.md +149 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/10_proposito-porque.md +42 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/20_posicionamiento.md +47 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/30_audiencia-nicho.md +53 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/40_personalidad-arquetipo.md +61 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/50_voz-tono.md +62 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/60_narrativa-historia.md +54 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/70_tension-fundador.md +50 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/90_SINTESIS.md +133 -0
- package/vendor/theus-arsenal/skills/descubrimiento-plugins-laravel/SKILL.md +230 -0
- package/vendor/theus-arsenal/skills/destilado-reglas/SKILL.md +263 -0
- package/vendor/theus-arsenal/skills/destilado-reglas/scripts/scan-rules.sh +58 -0
- package/vendor/theus-arsenal/skills/destilado-reglas/scripts/scan-skills.sh +129 -0
- package/vendor/theus-arsenal/skills/diagnostico-bgp/SKILL.md +170 -0
- package/vendor/theus-arsenal/skills/direccion-estetica/SKILL.md +220 -0
- package/vendor/theus-arsenal/skills/direccion-estetica/references/taxonomia-generos.md +89 -0
- package/vendor/theus-arsenal/skills/diseno-api/SKILL.md +522 -0
- package/vendor/theus-arsenal/skills/diseno-liquid-glass/SKILL.md +282 -0
- package/vendor/theus-arsenal/skills/e2e-escritorio-windows/SKILL.md +879 -0
- package/vendor/theus-arsenal/skills/edicion-video/SKILL.md +289 -0
- package/vendor/theus-arsenal/skills/enfoque-producto/SKILL.md +91 -0
- package/vendor/theus-arsenal/skills/entornos-flox/SKILL.md +493 -0
- package/vendor/theus-arsenal/skills/estandares-codigo/SKILL.md +548 -0
- package/vendor/theus-arsenal/skills/estandares-cpp/SKILL.md +727 -0
- package/vendor/theus-arsenal/skills/estandares-java/SKILL.md +389 -0
- package/vendor/theus-arsenal/skills/estilo-legado/SKILL.md +149 -0
- package/vendor/theus-arsenal/skills/estructura-informes-competencia/SKILL.md +95 -0
- package/vendor/theus-arsenal/skills/evaluacion-academica/SKILL.md +165 -0
- package/vendor/theus-arsenal/skills/explorador-skills/SKILL.md +129 -0
- package/vendor/theus-arsenal/skills/flujo-git/SKILL.md +714 -0
- package/vendor/theus-arsenal/skills/flujo-ingenieria-ml/SKILL.md +343 -0
- package/vendor/theus-arsenal/skills/flujo-tdd/SKILL.md +584 -0
- package/vendor/theus-arsenal/skills/forja-personas/SKILL.md +298 -0
- package/vendor/theus-arsenal/skills/forja-personas/gacha.py +224 -0
- package/vendor/theus-arsenal/skills/forja-personas/gacha.sh +5 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/avatar-style.md +123 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/boundary-rules.md +53 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/error-handling.md +53 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/identity-tension.md +48 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/naming-system.md +39 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/output-template.md +166 -0
- package/vendor/theus-arsenal/skills/fundamentos-animacion/SKILL.md +296 -0
- package/vendor/theus-arsenal/skills/generacion-iconos-ios/SKILL.md +156 -0
- package/vendor/theus-arsenal/skills/generacion-iconos-ios/scripts/generate_icons.swift +258 -0
- package/vendor/theus-arsenal/skills/generacion-iconos-ios/scripts/iconify_gen.sh +235 -0
- package/vendor/theus-arsenal/skills/gestion-excepciones-logisticas/SKILL.md +208 -0
- package/vendor/theus-arsenal/skills/gestion-transportistas/SKILL.md +204 -0
- package/vendor/theus-arsenal/skills/guia-adopcion-ml/SKILL.md +64 -0
- package/vendor/theus-arsenal/skills/harness-agente-autonomo/SKILL.md +252 -0
- package/vendor/theus-arsenal/skills/harness-eval-clinico/SKILL.md +212 -0
- package/vendor/theus-arsenal/skills/harness-evaluacion/SKILL.md +296 -0
- package/vendor/theus-arsenal/skills/harness-generador-evaluador/SKILL.md +254 -0
- package/vendor/theus-arsenal/skills/homelab-diseno-red/SKILL.md +120 -0
- package/vendor/theus-arsenal/skills/homelab-dns-pihole/SKILL.md +264 -0
- package/vendor/theus-arsenal/skills/homelab-preparacion-red/SKILL.md +144 -0
- package/vendor/theus-arsenal/skills/homelab-segmentacion-vlan/SKILL.md +307 -0
- package/vendor/theus-arsenal/skills/homelab-vpn-wireguard/SKILL.md +299 -0
- package/vendor/theus-arsenal/skills/ingenieria-agentica/SKILL.md +96 -0
- package/vendor/theus-arsenal/skills/inspeccion-animaciones-blender/SKILL.md +164 -0
- package/vendor/theus-arsenal/skills/instaladores-python/SKILL.md +820 -0
- package/vendor/theus-arsenal/skills/integracion-jira/SKILL.md +307 -0
- package/vendor/theus-arsenal/skills/inteligencia-leads/SKILL.md +312 -0
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/agente-enriquecimiento.md +87 -0
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/mapeador-mutuos.md +76 -0
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/puntuador-senales.md +60 -0
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/redactor-outreach.md +102 -0
- package/vendor/theus-arsenal/skills/inteligencia-mercados-prediccion/SKILL.md +53 -0
- package/vendor/theus-arsenal/skills/introspeccion-agente/SKILL.md +150 -0
- package/vendor/theus-arsenal/skills/inventario-skills/SKILL.md +194 -0
- package/vendor/theus-arsenal/skills/inventario-skills/scripts/quick-diff.sh +87 -0
- package/vendor/theus-arsenal/skills/inventario-skills/scripts/save-results.sh +57 -0
- package/vendor/theus-arsenal/skills/inventario-skills/scripts/scan.sh +170 -0
- package/vendor/theus-arsenal/skills/investigacion-mercado/SKILL.md +87 -0
- package/vendor/theus-arsenal/skills/investigacion-oraculos-prediccion/SKILL.md +59 -0
- package/vendor/theus-arsenal/skills/investigacion-profunda/SKILL.md +161 -0
- package/vendor/theus-arsenal/skills/keccak256-nodejs/SKILL.md +100 -0
- package/vendor/theus-arsenal/skills/libro-decisiones-recursivo/SKILL.md +82 -0
- package/vendor/theus-arsenal/skills/lienzo-planes/SKILL.md +111 -0
- package/vendor/theus-arsenal/skills/limpieza-configuracion/SKILL.md +116 -0
- package/vendor/theus-arsenal/skills/logistica-inversa-devoluciones/SKILL.md +241 -0
- package/vendor/theus-arsenal/skills/manejo-errores/SKILL.md +375 -0
- package/vendor/theus-arsenal/skills/materiales-inversores/SKILL.md +101 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/SKILL.md +170 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/forget.mjs +44 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/info.mjs +24 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/init.mjs +152 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/list.mjs +40 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/migrate.mjs +214 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/resume.mjs +36 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/save.mjs +210 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/shared.mjs +402 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/hooks/session-start.mjs +238 -0
- package/vendor/theus-arsenal/skills/metodologia-benchmarks/SKILL.md +131 -0
- package/vendor/theus-arsenal/skills/migraciones-bd/SKILL.md +430 -0
- package/vendor/theus-arsenal/skills/modelos-fundacionales-en-dispositivo/SKILL.md +244 -0
- package/vendor/theus-arsenal/skills/modo-seguro/SKILL.md +86 -0
- package/vendor/theus-arsenal/skills/motion-avanzado/SKILL.md +592 -0
- package/vendor/theus-arsenal/skills/motor-de-contenido/SKILL.md +136 -0
- package/vendor/theus-arsenal/skills/no-conformidades-calidad/SKILL.md +249 -0
- package/vendor/theus-arsenal/skills/onboarding-codigo/SKILL.md +244 -0
- package/vendor/theus-arsenal/skills/operaciones-agentes-empresariales/SKILL.md +51 -0
- package/vendor/theus-arsenal/skills/operaciones-conocimiento/SKILL.md +159 -0
- package/vendor/theus-arsenal/skills/operaciones-correo/SKILL.md +123 -0
- package/vendor/theus-arsenal/skills/operaciones-facturacion/SKILL.md +142 -0
- package/vendor/theus-arsenal/skills/operaciones-flujo-proyectos/SKILL.md +110 -0
- package/vendor/theus-arsenal/skills/operaciones-github/SKILL.md +143 -0
- package/vendor/theus-arsenal/skills/operaciones-google-workspace/SKILL.md +100 -0
- package/vendor/theus-arsenal/skills/operaciones-investigacion/SKILL.md +124 -0
- package/vendor/theus-arsenal/skills/operaciones-mensajes/SKILL.md +103 -0
- package/vendor/theus-arsenal/skills/operaciones-terminal/SKILL.md +110 -0
- package/vendor/theus-arsenal/skills/optimizacion-benchmark/SKILL.md +70 -0
- package/vendor/theus-arsenal/skills/optimizacion-costos-llm/SKILL.md +182 -0
- package/vendor/theus-arsenal/skills/optimizador-conexiones/SKILL.md +191 -0
- package/vendor/theus-arsenal/skills/optimizador-paralelismo/SKILL.md +75 -0
- package/vendor/theus-arsenal/skills/optimizador-prompts/SKILL.md +374 -0
- package/vendor/theus-arsenal/skills/orq-agregar-funcionalidad/SKILL.md +37 -0
- package/vendor/theus-arsenal/skills/orq-cambiar-funcionalidad/SKILL.md +36 -0
- package/vendor/theus-arsenal/skills/orq-construir-mvp/SKILL.md +38 -0
- package/vendor/theus-arsenal/skills/orq-corregir-defecto/SKILL.md +36 -0
- package/vendor/theus-arsenal/skills/orq-pipeline/SKILL.md +134 -0
- package/vendor/theus-arsenal/skills/orq-refinar-codigo/SKILL.md +49 -0
- package/vendor/theus-arsenal/skills/orquestacion-equipos-agentes/SKILL.md +117 -0
- package/vendor/theus-arsenal/skills/pagos-agentes-x402/SKILL.md +237 -0
- package/vendor/theus-arsenal/skills/patrones-angular/SKILL.md +153 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/angular-animations.md +160 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/angular-aria.md +410 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/cli.md +86 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/component-harnesses.md +59 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/component-styling.md +91 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/components.md +117 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/creating-services.md +97 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/data-resolvers.md +69 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/define-routes.md +67 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/defining-providers.md +72 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/di-fundamentals.md +120 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/e2e-testing.md +56 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/effects.md +83 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/hierarchical-injectors.md +43 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/host-elements.md +80 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/injection-context.md +63 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/inputs.md +101 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/linked-signal.md +59 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/loading-strategies.md +61 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/mcp.md +67 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/navigate-to-routes.md +69 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/outputs.md +86 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/reactive-forms.md +122 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/rendering-strategies.md +44 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/resource.md +77 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/route-animations.md +56 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/route-guards.md +52 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/router-lifecycle.md +45 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/router-testing.md +87 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/show-routes-with-outlets.md +68 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/signal-forms.md +795 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/signals-overview.md +94 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/tailwind-css.md +69 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/template-driven-forms.md +114 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/testing-fundamentals.md +65 -0
- package/vendor/theus-arsenal/skills/patrones-animacion/SKILL.md +432 -0
- package/vendor/theus-arsenal/skills/patrones-backend/SKILL.md +560 -0
- package/vendor/theus-arsenal/skills/patrones-cdss-clinico/SKILL.md +249 -0
- package/vendor/theus-arsenal/skills/patrones-cisco-ios/SKILL.md +148 -0
- package/vendor/theus-arsenal/skills/patrones-clickhouse/SKILL.md +443 -0
- package/vendor/theus-arsenal/skills/patrones-compose-multiplatform/SKILL.md +298 -0
- package/vendor/theus-arsenal/skills/patrones-dart-flutter/SKILL.md +566 -0
- package/vendor/theus-arsenal/skills/patrones-despliegue/SKILL.md +426 -0
- package/vendor/theus-arsenal/skills/patrones-django/SKILL.md +739 -0
- package/vendor/theus-arsenal/skills/patrones-django-celery/SKILL.md +456 -0
- package/vendor/theus-arsenal/skills/patrones-docker/SKILL.md +363 -0
- package/vendor/theus-arsenal/skills/patrones-dotnet/SKILL.md +321 -0
- package/vendor/theus-arsenal/skills/patrones-emr-clinico/SKILL.md +168 -0
- package/vendor/theus-arsenal/skills/patrones-fastapi/SKILL.md +513 -0
- package/vendor/theus-arsenal/skills/patrones-frontend/SKILL.md +655 -0
- package/vendor/theus-arsenal/skills/patrones-go/SKILL.md +674 -0
- package/vendor/theus-arsenal/skills/patrones-jpa/SKILL.md +156 -0
- package/vendor/theus-arsenal/skills/patrones-kotlin/SKILL.md +717 -0
- package/vendor/theus-arsenal/skills/patrones-kotlin-exposed/SKILL.md +724 -0
- package/vendor/theus-arsenal/skills/patrones-kotlin-ktor/SKILL.md +694 -0
- package/vendor/theus-arsenal/skills/patrones-kubernetes/SKILL.md +754 -0
- package/vendor/theus-arsenal/skills/patrones-laravel/SKILL.md +414 -0
- package/vendor/theus-arsenal/skills/patrones-mcp/SKILL.md +66 -0
- package/vendor/theus-arsenal/skills/patrones-mysql/SKILL.md +420 -0
- package/vendor/theus-arsenal/skills/patrones-nestjs/SKILL.md +229 -0
- package/vendor/theus-arsenal/skills/patrones-nextjs/SKILL.md +56 -0
- package/vendor/theus-arsenal/skills/patrones-nuxt4/SKILL.md +99 -0
- package/vendor/theus-arsenal/skills/patrones-perl/SKILL.md +508 -0
- package/vendor/theus-arsenal/skills/patrones-postgres/SKILL.md +141 -0
- package/vendor/theus-arsenal/skills/patrones-prisma/SKILL.md +399 -0
- package/vendor/theus-arsenal/skills/patrones-python/SKILL.md +750 -0
- package/vendor/theus-arsenal/skills/patrones-pytorch/SKILL.md +400 -0
- package/vendor/theus-arsenal/skills/patrones-quarkus/SKILL.md +729 -0
- package/vendor/theus-arsenal/skills/patrones-react/SKILL.md +339 -0
- package/vendor/theus-arsenal/skills/patrones-react-native/SKILL.md +325 -0
- package/vendor/theus-arsenal/skills/patrones-redis/SKILL.md +401 -0
- package/vendor/theus-arsenal/skills/patrones-rust/SKILL.md +504 -0
- package/vendor/theus-arsenal/skills/patrones-springboot/SKILL.md +314 -0
- package/vendor/theus-arsenal/skills/patrones-swiftui/SKILL.md +261 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/SKILL.md +281 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/architecture.md +90 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/data-handling.md +60 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/database.md +99 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/routing.md +64 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/system-usage.md +97 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/testing.md +72 -0
- package/vendor/theus-arsenal/skills/patrones-vite/SKILL.md +449 -0
- package/vendor/theus-arsenal/skills/patrones-vue/SKILL.md +469 -0
- package/vendor/theus-arsenal/skills/persistencia-actores-swift/SKILL.md +148 -0
- package/vendor/theus-arsenal/skills/pipeline-opensource/SKILL.md +254 -0
- package/vendor/theus-arsenal/skills/planificacion-demanda-inventario/SKILL.md +236 -0
- package/vendor/theus-arsenal/skills/planificador-trades-prediccion/SKILL.md +60 -0
- package/vendor/theus-arsenal/skills/plano-tecnico/SKILL.md +102 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/SKILL.md +189 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/STYLE_PRESETS.md +330 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/animation-patterns.md +122 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/html-template.md +419 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/scripts/export-pdf.sh +418 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/scripts/extract-pptx.py +96 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/viewport-base.css +153 -0
- package/vendor/theus-arsenal/skills/presupuesto-contexto/SKILL.md +263 -0
- package/vendor/theus-arsenal/skills/procesamiento-documentos-nutrient/SKILL.md +168 -0
- package/vendor/theus-arsenal/skills/programacion-produccion/SKILL.md +220 -0
- package/vendor/theus-arsenal/skills/publicacion-cruzada/SKILL.md +117 -0
- package/vendor/theus-arsenal/skills/publicador-social/SKILL.md +121 -0
- package/vendor/theus-arsenal/skills/puerta-de-entrega/SKILL.md +164 -0
- package/vendor/theus-arsenal/skills/puerta-de-entrega/hooks/puerta-entrega.py +242 -0
- package/vendor/theus-arsenal/skills/pulir-interfaces/SKILL.md +126 -0
- package/vendor/theus-arsenal/skills/qa-navegador/SKILL.md +103 -0
- package/vendor/theus-arsenal/skills/ranking-grafo-social/SKILL.md +153 -0
- package/vendor/theus-arsenal/skills/recuperacion-iterativa/SKILL.md +236 -0
- package/vendor/theus-arsenal/skills/redaccion-articulos/SKILL.md +81 -0
- package/vendor/theus-arsenal/skills/regex-vs-llm/SKILL.md +221 -0
- package/vendor/theus-arsenal/skills/regresion-codigo-ia/SKILL.md +388 -0
- package/vendor/theus-arsenal/skills/rendimiento-react/SKILL.md +567 -0
- package/vendor/theus-arsenal/skills/revision-codigo-flutter-dart/SKILL.md +442 -0
- package/vendor/theus-arsenal/skills/revision-literatura-cientifica/SKILL.md +191 -0
- package/vendor/theus-arsenal/skills/revision-multiperspectiva/SKILL.md +302 -0
- package/vendor/theus-arsenal/skills/revision-riesgo-prediccion/SKILL.md +56 -0
- package/vendor/theus-arsenal/skills/revision-seguridad/SKILL.md +505 -0
- package/vendor/theus-arsenal/skills/revision-seguridad/cloud-infrastructure-security.md +361 -0
- package/vendor/theus-arsenal/skills/runtime-bun/SKILL.md +83 -0
- package/vendor/theus-arsenal/skills/salud-codigo-codescene/SKILL.md +163 -0
- package/vendor/theus-arsenal/skills/salud-interfaces-red/SKILL.md +143 -0
- package/vendor/theus-arsenal/skills/seguimiento-costos/SKILL.md +122 -0
- package/vendor/theus-arsenal/skills/seguridad-agentes-trading/SKILL.md +145 -0
- package/vendor/theus-arsenal/skills/seguridad-amm-defi/SKILL.md +166 -0
- package/vendor/theus-arsenal/skills/seguridad-django/SKILL.md +648 -0
- package/vendor/theus-arsenal/skills/seguridad-laravel/SKILL.md +945 -0
- package/vendor/theus-arsenal/skills/seguridad-perl/SKILL.md +507 -0
- package/vendor/theus-arsenal/skills/seguridad-quarkus/SKILL.md +474 -0
- package/vendor/theus-arsenal/skills/seguridad-springboot/SKILL.md +279 -0
- package/vendor/theus-arsenal/skills/seo/SKILL.md +166 -0
- package/vendor/theus-arsenal/skills/sistema-diseno/SKILL.md +81 -0
- package/vendor/theus-arsenal/skills/sistema-operativo-agentico/SKILL.md +375 -0
- package/vendor/theus-arsenal/skills/sistemas-latencia-critica/SKILL.md +65 -0
- package/vendor/theus-arsenal/skills/tdd-django/SKILL.md +735 -0
- package/vendor/theus-arsenal/skills/tdd-laravel/SKILL.md +673 -0
- package/vendor/theus-arsenal/skills/tdd-quarkus/SKILL.md +817 -0
- package/vendor/theus-arsenal/skills/tdd-springboot/SKILL.md +165 -0
- package/vendor/theus-arsenal/skills/testing-cpp/SKILL.md +328 -0
- package/vendor/theus-arsenal/skills/testing-csharp/SKILL.md +321 -0
- package/vendor/theus-arsenal/skills/testing-e2e/SKILL.md +325 -0
- package/vendor/theus-arsenal/skills/testing-go/SKILL.md +719 -0
- package/vendor/theus-arsenal/skills/testing-kotlin/SKILL.md +829 -0
- package/vendor/theus-arsenal/skills/testing-perl/SKILL.md +479 -0
- package/vendor/theus-arsenal/skills/testing-protocolos-di-swift/SKILL.md +196 -0
- package/vendor/theus-arsenal/skills/testing-python/SKILL.md +815 -0
- package/vendor/theus-arsenal/skills/testing-react/SKILL.md +421 -0
- package/vendor/theus-arsenal/skills/testing-rust/SKILL.md +506 -0
- package/vendor/theus-arsenal/skills/tours-de-codigo/SKILL.md +252 -0
- package/vendor/theus-arsenal/skills/traduccion-documentos-visado/SKILL.md +121 -0
- package/vendor/theus-arsenal/skills/ui-a-vue/SKILL.md +141 -0
- package/vendor/theus-arsenal/skills/validacion-config-red/SKILL.md +211 -0
- package/vendor/theus-arsenal/skills/verificacion-django/SKILL.md +470 -0
- package/vendor/theus-arsenal/skills/verificacion-factual/SKILL.md +142 -0
- package/vendor/theus-arsenal/skills/verificacion-laravel/SKILL.md +184 -0
- package/vendor/theus-arsenal/skills/verificacion-quarkus/SKILL.md +485 -0
- package/vendor/theus-arsenal/skills/verificacion-springboot/SKILL.md +237 -0
- package/vendor/theus-arsenal/skills/videodb/SKILL.md +374 -0
- package/vendor/theus-arsenal/skills/videodb/reference/api-reference.md +550 -0
- package/vendor/theus-arsenal/skills/videodb/reference/capture-reference.md +407 -0
- package/vendor/theus-arsenal/skills/videodb/reference/capture.md +101 -0
- package/vendor/theus-arsenal/skills/videodb/reference/editor.md +443 -0
- package/vendor/theus-arsenal/skills/videodb/reference/generative.md +331 -0
- package/vendor/theus-arsenal/skills/videodb/reference/rtstream-reference.md +564 -0
- package/vendor/theus-arsenal/skills/videodb/reference/rtstream.md +65 -0
- package/vendor/theus-arsenal/skills/videodb/reference/search.md +230 -0
- package/vendor/theus-arsenal/skills/videodb/reference/streaming.md +406 -0
- package/vendor/theus-arsenal/skills/videodb/reference/use-cases.md +118 -0
- package/vendor/theus-arsenal/skills/videodb/scripts/ws_listener.py +279 -0
- package/vendor/theus-arsenal/skills/videos-manim/SKILL.md +91 -0
- package/vendor/theus-arsenal/skills/videos-manim/assets/network_graph_scene.py +52 -0
- package/vendor/theus-arsenal/skills/vigilancia-canary/SKILL.md +108 -0
- package/vendor/theus-arsenal/skills/voz-de-marca/SKILL.md +106 -0
|
@@ -0,0 +1,735 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tdd-django
|
|
3
|
+
description: Estrategias de testing en Django con pytest-django, metodología TDD, factory_boy, mocking, cobertura y testing de API de Django REST Framework.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Testing en Django con TDD
|
|
7
|
+
|
|
8
|
+
Desarrollo guiado por tests (TDD) para aplicaciones Django usando pytest, factory_boy y Django REST Framework.
|
|
9
|
+
|
|
10
|
+
## Cuándo activarla
|
|
11
|
+
|
|
12
|
+
- Escribir nuevas aplicaciones Django
|
|
13
|
+
- Implementar API con Django REST Framework
|
|
14
|
+
- Testear modelos, vistas y serializers de Django
|
|
15
|
+
- Montar la infraestructura de testing de un proyecto Django
|
|
16
|
+
|
|
17
|
+
## Flujo TDD para Django
|
|
18
|
+
|
|
19
|
+
### Ciclo Rojo-Verde-Refactor
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
# Paso 1: ROJO - escribe un test que falle
|
|
23
|
+
def test_creacion_de_usuario():
|
|
24
|
+
user = User.objects.create_user(email='test@example.com', password='testpass123')
|
|
25
|
+
assert user.email == 'test@example.com'
|
|
26
|
+
assert user.check_password('testpass123')
|
|
27
|
+
assert not user.is_staff
|
|
28
|
+
|
|
29
|
+
# Paso 2: VERDE - haz que el test pase
|
|
30
|
+
# Crea el modelo User o la factory
|
|
31
|
+
|
|
32
|
+
# Paso 3: REFACTOR - mejora manteniendo los tests en verde
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Configuración
|
|
36
|
+
|
|
37
|
+
### Configuración de pytest
|
|
38
|
+
|
|
39
|
+
```ini
|
|
40
|
+
# pytest.ini
|
|
41
|
+
[pytest]
|
|
42
|
+
DJANGO_SETTINGS_MODULE = config.settings.test
|
|
43
|
+
testpaths = tests
|
|
44
|
+
python_files = test_*.py
|
|
45
|
+
python_classes = Test*
|
|
46
|
+
python_functions = test_*
|
|
47
|
+
addopts =
|
|
48
|
+
--reuse-db
|
|
49
|
+
--nomigrations
|
|
50
|
+
--cov=apps
|
|
51
|
+
--cov-report=html
|
|
52
|
+
--cov-report=term-missing
|
|
53
|
+
--strict-markers
|
|
54
|
+
markers =
|
|
55
|
+
slow: marca tests lentos
|
|
56
|
+
integration: marca tests de integración
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Settings de test
|
|
60
|
+
|
|
61
|
+
```python
|
|
62
|
+
# config/settings/test.py
|
|
63
|
+
from .base import *
|
|
64
|
+
|
|
65
|
+
DEBUG = True
|
|
66
|
+
DATABASES = {
|
|
67
|
+
'default': {
|
|
68
|
+
'ENGINE': 'django.db.backends.sqlite3',
|
|
69
|
+
'NAME': ':memory:',
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Desactiva las migraciones para acelerar
|
|
74
|
+
class DisableMigrations:
|
|
75
|
+
def __contains__(self, item):
|
|
76
|
+
return True
|
|
77
|
+
|
|
78
|
+
def __getitem__(self, item):
|
|
79
|
+
return None
|
|
80
|
+
|
|
81
|
+
MIGRATION_MODULES = DisableMigrations()
|
|
82
|
+
|
|
83
|
+
# Hashing de contraseñas más rápido
|
|
84
|
+
PASSWORD_HASHERS = [
|
|
85
|
+
'django.contrib.auth.hashers.MD5PasswordHasher',
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
# Backend de correo
|
|
89
|
+
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
|
|
90
|
+
|
|
91
|
+
# Celery siempre eager
|
|
92
|
+
CELERY_TASK_ALWAYS_EAGER = True
|
|
93
|
+
CELERY_TASK_EAGER_PROPAGATES = True
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### conftest.py
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
# tests/conftest.py
|
|
100
|
+
import pytest
|
|
101
|
+
from django.utils import timezone
|
|
102
|
+
from django.contrib.auth import get_user_model
|
|
103
|
+
|
|
104
|
+
User = get_user_model()
|
|
105
|
+
|
|
106
|
+
@pytest.fixture(autouse=True)
|
|
107
|
+
def timezone_settings(settings):
|
|
108
|
+
"""Garantiza una zona horaria consistente."""
|
|
109
|
+
settings.TIME_ZONE = 'UTC'
|
|
110
|
+
|
|
111
|
+
@pytest.fixture
|
|
112
|
+
def user(db):
|
|
113
|
+
"""Crea un usuario de prueba."""
|
|
114
|
+
return User.objects.create_user(
|
|
115
|
+
email='test@example.com',
|
|
116
|
+
password='testpass123',
|
|
117
|
+
username='testuser'
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
@pytest.fixture
|
|
121
|
+
def admin_user(db):
|
|
122
|
+
"""Crea un usuario administrador."""
|
|
123
|
+
return User.objects.create_superuser(
|
|
124
|
+
email='admin@example.com',
|
|
125
|
+
password='adminpass123',
|
|
126
|
+
username='admin'
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
@pytest.fixture
|
|
130
|
+
def authenticated_client(client, user):
|
|
131
|
+
"""Devuelve un cliente autenticado."""
|
|
132
|
+
client.force_login(user)
|
|
133
|
+
return client
|
|
134
|
+
|
|
135
|
+
@pytest.fixture
|
|
136
|
+
def api_client():
|
|
137
|
+
"""Devuelve el cliente de API de DRF."""
|
|
138
|
+
from rest_framework.test import APIClient
|
|
139
|
+
return APIClient()
|
|
140
|
+
|
|
141
|
+
@pytest.fixture
|
|
142
|
+
def authenticated_api_client(api_client, user):
|
|
143
|
+
"""Devuelve un cliente de API autenticado."""
|
|
144
|
+
api_client.force_authenticate(user=user)
|
|
145
|
+
return api_client
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Factory Boy
|
|
149
|
+
|
|
150
|
+
### Definición de factories
|
|
151
|
+
|
|
152
|
+
```python
|
|
153
|
+
# tests/factories.py
|
|
154
|
+
import factory
|
|
155
|
+
from factory import fuzzy
|
|
156
|
+
from datetime import datetime, timedelta
|
|
157
|
+
from django.contrib.auth import get_user_model
|
|
158
|
+
from apps.products.models import Product, Category
|
|
159
|
+
|
|
160
|
+
User = get_user_model()
|
|
161
|
+
|
|
162
|
+
class UserFactory(factory.django.DjangoModelFactory):
|
|
163
|
+
"""Factory del modelo User."""
|
|
164
|
+
|
|
165
|
+
class Meta:
|
|
166
|
+
model = User
|
|
167
|
+
|
|
168
|
+
email = factory.Sequence(lambda n: f"user{n}@example.com")
|
|
169
|
+
username = factory.Sequence(lambda n: f"user{n}")
|
|
170
|
+
password = factory.PostGenerationMethodCall('set_password', 'testpass123')
|
|
171
|
+
first_name = factory.Faker('first_name')
|
|
172
|
+
last_name = factory.Faker('last_name')
|
|
173
|
+
is_active = True
|
|
174
|
+
|
|
175
|
+
class CategoryFactory(factory.django.DjangoModelFactory):
|
|
176
|
+
"""Factory del modelo Category."""
|
|
177
|
+
|
|
178
|
+
class Meta:
|
|
179
|
+
model = Category
|
|
180
|
+
|
|
181
|
+
name = factory.Faker('word')
|
|
182
|
+
slug = factory.LazyAttribute(lambda obj: obj.name.lower())
|
|
183
|
+
description = factory.Faker('text')
|
|
184
|
+
|
|
185
|
+
class ProductFactory(factory.django.DjangoModelFactory):
|
|
186
|
+
"""Factory del modelo Product."""
|
|
187
|
+
|
|
188
|
+
class Meta:
|
|
189
|
+
model = Product
|
|
190
|
+
|
|
191
|
+
name = factory.Faker('sentence', nb_words=3)
|
|
192
|
+
slug = factory.LazyAttribute(lambda obj: obj.name.lower().replace(' ', '-'))
|
|
193
|
+
description = factory.Faker('text')
|
|
194
|
+
price = fuzzy.FuzzyDecimal(10.00, 1000.00, 2)
|
|
195
|
+
stock = fuzzy.FuzzyInteger(0, 100)
|
|
196
|
+
is_active = True
|
|
197
|
+
category = factory.SubFactory(CategoryFactory)
|
|
198
|
+
created_by = factory.SubFactory(UserFactory)
|
|
199
|
+
|
|
200
|
+
@factory.post_generation
|
|
201
|
+
def tags(self, create, extracted, **kwargs):
|
|
202
|
+
"""Añade tags al producto."""
|
|
203
|
+
if not create:
|
|
204
|
+
return
|
|
205
|
+
if extracted:
|
|
206
|
+
for tag in extracted:
|
|
207
|
+
self.tags.add(tag)
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Uso de factories
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
# tests/test_models.py
|
|
214
|
+
import pytest
|
|
215
|
+
from tests.factories import ProductFactory, UserFactory
|
|
216
|
+
|
|
217
|
+
def test_creacion_producto():
|
|
218
|
+
"""Prueba la creación de un producto con la factory."""
|
|
219
|
+
product = ProductFactory(price=100.00, stock=50)
|
|
220
|
+
assert product.price == 100.00
|
|
221
|
+
assert product.stock == 50
|
|
222
|
+
assert product.is_active is True
|
|
223
|
+
|
|
224
|
+
def test_producto_con_tags():
|
|
225
|
+
"""Prueba un producto con tags."""
|
|
226
|
+
tags = [TagFactory(name='electronics'), TagFactory(name='new')]
|
|
227
|
+
product = ProductFactory(tags=tags)
|
|
228
|
+
assert product.tags.count() == 2
|
|
229
|
+
|
|
230
|
+
def test_varios_productos():
|
|
231
|
+
"""Prueba la creación de varios productos."""
|
|
232
|
+
products = ProductFactory.create_batch(10)
|
|
233
|
+
assert len(products) == 10
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Testing de modelos
|
|
237
|
+
|
|
238
|
+
### Tests de modelos
|
|
239
|
+
|
|
240
|
+
```python
|
|
241
|
+
# tests/test_models.py
|
|
242
|
+
import pytest
|
|
243
|
+
from django.core.exceptions import ValidationError
|
|
244
|
+
from tests.factories import UserFactory, ProductFactory
|
|
245
|
+
|
|
246
|
+
class TestUserModel:
|
|
247
|
+
"""Tests del modelo User."""
|
|
248
|
+
|
|
249
|
+
def test_crear_usuario(self, db):
|
|
250
|
+
"""Prueba crear un usuario regular."""
|
|
251
|
+
user = UserFactory(email='test@example.com')
|
|
252
|
+
assert user.email == 'test@example.com'
|
|
253
|
+
assert user.check_password('testpass123')
|
|
254
|
+
assert not user.is_staff
|
|
255
|
+
assert not user.is_superuser
|
|
256
|
+
|
|
257
|
+
def test_crear_superusuario(self, db):
|
|
258
|
+
"""Prueba crear un superusuario."""
|
|
259
|
+
user = UserFactory(
|
|
260
|
+
email='admin@example.com',
|
|
261
|
+
is_staff=True,
|
|
262
|
+
is_superuser=True
|
|
263
|
+
)
|
|
264
|
+
assert user.is_staff
|
|
265
|
+
assert user.is_superuser
|
|
266
|
+
|
|
267
|
+
def test_representacion_str(self, db):
|
|
268
|
+
"""Prueba la representación en string del usuario."""
|
|
269
|
+
user = UserFactory(email='test@example.com')
|
|
270
|
+
assert str(user) == 'test@example.com'
|
|
271
|
+
|
|
272
|
+
class TestProductModel:
|
|
273
|
+
"""Tests del modelo Product."""
|
|
274
|
+
|
|
275
|
+
def test_creacion_producto(self, db):
|
|
276
|
+
"""Prueba la creación de un producto."""
|
|
277
|
+
product = ProductFactory()
|
|
278
|
+
assert product.id is not None
|
|
279
|
+
assert product.is_active is True
|
|
280
|
+
assert product.created_at is not None
|
|
281
|
+
|
|
282
|
+
def test_generacion_slug(self, db):
|
|
283
|
+
"""Prueba la generación automática del slug."""
|
|
284
|
+
product = ProductFactory(name='Test Product')
|
|
285
|
+
assert product.slug == 'test-product'
|
|
286
|
+
|
|
287
|
+
def test_validacion_precio(self, db):
|
|
288
|
+
"""El precio no puede ser negativo."""
|
|
289
|
+
product = ProductFactory(price=-10)
|
|
290
|
+
with pytest.raises(ValidationError):
|
|
291
|
+
product.full_clean()
|
|
292
|
+
|
|
293
|
+
def test_manager_active(self, db):
|
|
294
|
+
"""Prueba el método active del manager."""
|
|
295
|
+
ProductFactory.create_batch(5, is_active=True)
|
|
296
|
+
ProductFactory.create_batch(3, is_active=False)
|
|
297
|
+
|
|
298
|
+
active_count = Product.objects.active().count()
|
|
299
|
+
assert active_count == 5
|
|
300
|
+
|
|
301
|
+
def test_gestion_de_stock(self, db):
|
|
302
|
+
"""Prueba la gestión de stock."""
|
|
303
|
+
product = ProductFactory(stock=10)
|
|
304
|
+
product.reduce_stock(5)
|
|
305
|
+
product.refresh_from_db()
|
|
306
|
+
assert product.stock == 5
|
|
307
|
+
|
|
308
|
+
with pytest.raises(ValueError):
|
|
309
|
+
product.reduce_stock(10) # Stock insuficiente
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Testing de vistas
|
|
313
|
+
|
|
314
|
+
### Tests de vistas Django
|
|
315
|
+
|
|
316
|
+
```python
|
|
317
|
+
# tests/test_views.py
|
|
318
|
+
import pytest
|
|
319
|
+
from django.urls import reverse
|
|
320
|
+
from tests.factories import ProductFactory, UserFactory
|
|
321
|
+
|
|
322
|
+
class TestProductViews:
|
|
323
|
+
"""Tests de las vistas de productos."""
|
|
324
|
+
|
|
325
|
+
def test_lista_productos(self, client, db):
|
|
326
|
+
"""Prueba la vista de listado de productos."""
|
|
327
|
+
ProductFactory.create_batch(10)
|
|
328
|
+
|
|
329
|
+
response = client.get(reverse('products:list'))
|
|
330
|
+
|
|
331
|
+
assert response.status_code == 200
|
|
332
|
+
assert len(response.context['products']) == 10
|
|
333
|
+
|
|
334
|
+
def test_detalle_producto(self, client, db):
|
|
335
|
+
"""Prueba la vista de detalle de producto."""
|
|
336
|
+
product = ProductFactory()
|
|
337
|
+
|
|
338
|
+
response = client.get(reverse('products:detail', kwargs={'slug': product.slug}))
|
|
339
|
+
|
|
340
|
+
assert response.status_code == 200
|
|
341
|
+
assert response.context['product'] == product
|
|
342
|
+
|
|
343
|
+
def test_crear_producto_requiere_login(self, client, db):
|
|
344
|
+
"""La creación de producto exige autenticación."""
|
|
345
|
+
response = client.get(reverse('products:create'))
|
|
346
|
+
|
|
347
|
+
assert response.status_code == 302
|
|
348
|
+
assert response.url.startswith('/accounts/login/')
|
|
349
|
+
|
|
350
|
+
def test_crear_producto_autenticado(self, authenticated_client, db):
|
|
351
|
+
"""Prueba la creación de producto como usuario autenticado."""
|
|
352
|
+
response = authenticated_client.get(reverse('products:create'))
|
|
353
|
+
|
|
354
|
+
assert response.status_code == 200
|
|
355
|
+
|
|
356
|
+
def test_crear_producto_post(self, authenticated_client, db, category):
|
|
357
|
+
"""Prueba crear un producto vía POST."""
|
|
358
|
+
data = {
|
|
359
|
+
'name': 'Test Product',
|
|
360
|
+
'description': 'Un producto de prueba',
|
|
361
|
+
'price': '99.99',
|
|
362
|
+
'stock': 10,
|
|
363
|
+
'category': category.id,
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
response = authenticated_client.post(reverse('products:create'), data)
|
|
367
|
+
|
|
368
|
+
assert response.status_code == 302
|
|
369
|
+
assert Product.objects.filter(name='Test Product').exists()
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
## Testing de API con DRF
|
|
373
|
+
|
|
374
|
+
### Testing de serializers
|
|
375
|
+
|
|
376
|
+
```python
|
|
377
|
+
# tests/test_serializers.py
|
|
378
|
+
import pytest
|
|
379
|
+
from rest_framework.exceptions import ValidationError
|
|
380
|
+
from apps.products.serializers import ProductSerializer
|
|
381
|
+
from tests.factories import ProductFactory
|
|
382
|
+
|
|
383
|
+
class TestProductSerializer:
|
|
384
|
+
"""Tests de ProductSerializer."""
|
|
385
|
+
|
|
386
|
+
def test_serializar_producto(self, db):
|
|
387
|
+
"""Prueba la serialización de un producto."""
|
|
388
|
+
product = ProductFactory()
|
|
389
|
+
serializer = ProductSerializer(product)
|
|
390
|
+
|
|
391
|
+
data = serializer.data
|
|
392
|
+
|
|
393
|
+
assert data['id'] == product.id
|
|
394
|
+
assert data['name'] == product.name
|
|
395
|
+
assert data['price'] == str(product.price)
|
|
396
|
+
|
|
397
|
+
def test_deserializar_producto(self, db):
|
|
398
|
+
"""Prueba la deserialización de datos de producto."""
|
|
399
|
+
data = {
|
|
400
|
+
'name': 'Test Product',
|
|
401
|
+
'description': 'Descripción de prueba',
|
|
402
|
+
'price': '99.99',
|
|
403
|
+
'stock': 10,
|
|
404
|
+
'category': 1,
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
serializer = ProductSerializer(data=data)
|
|
408
|
+
|
|
409
|
+
assert serializer.is_valid()
|
|
410
|
+
product = serializer.save()
|
|
411
|
+
|
|
412
|
+
assert product.name == 'Test Product'
|
|
413
|
+
assert float(product.price) == 99.99
|
|
414
|
+
|
|
415
|
+
def test_validacion_precio(self, db):
|
|
416
|
+
"""Prueba la validación del precio."""
|
|
417
|
+
data = {
|
|
418
|
+
'name': 'Test Product',
|
|
419
|
+
'price': '-10.00',
|
|
420
|
+
'stock': 10,
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
serializer = ProductSerializer(data=data)
|
|
424
|
+
|
|
425
|
+
assert not serializer.is_valid()
|
|
426
|
+
assert 'price' in serializer.errors
|
|
427
|
+
|
|
428
|
+
def test_validacion_stock(self, db):
|
|
429
|
+
"""El stock no puede ser negativo."""
|
|
430
|
+
data = {
|
|
431
|
+
'name': 'Test Product',
|
|
432
|
+
'price': '99.99',
|
|
433
|
+
'stock': -5,
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
serializer = ProductSerializer(data=data)
|
|
437
|
+
|
|
438
|
+
assert not serializer.is_valid()
|
|
439
|
+
assert 'stock' in serializer.errors
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### Testing de ViewSets de API
|
|
443
|
+
|
|
444
|
+
```python
|
|
445
|
+
# tests/test_api.py
|
|
446
|
+
import pytest
|
|
447
|
+
from rest_framework.test import APIClient
|
|
448
|
+
from rest_framework import status
|
|
449
|
+
from django.urls import reverse
|
|
450
|
+
from tests.factories import ProductFactory, UserFactory
|
|
451
|
+
|
|
452
|
+
class TestProductAPI:
|
|
453
|
+
"""Tests de los endpoints de la API de productos."""
|
|
454
|
+
|
|
455
|
+
@pytest.fixture
|
|
456
|
+
def api_client(self):
|
|
457
|
+
"""Devuelve el cliente de API."""
|
|
458
|
+
return APIClient()
|
|
459
|
+
|
|
460
|
+
def test_listar_productos(self, api_client, db):
|
|
461
|
+
"""Prueba el listado de productos."""
|
|
462
|
+
ProductFactory.create_batch(10)
|
|
463
|
+
|
|
464
|
+
url = reverse('api:product-list')
|
|
465
|
+
response = api_client.get(url)
|
|
466
|
+
|
|
467
|
+
assert response.status_code == status.HTTP_200_OK
|
|
468
|
+
assert response.data['count'] == 10
|
|
469
|
+
|
|
470
|
+
def test_obtener_producto(self, api_client, db):
|
|
471
|
+
"""Prueba la obtención de un producto."""
|
|
472
|
+
product = ProductFactory()
|
|
473
|
+
|
|
474
|
+
url = reverse('api:product-detail', kwargs={'pk': product.id})
|
|
475
|
+
response = api_client.get(url)
|
|
476
|
+
|
|
477
|
+
assert response.status_code == status.HTTP_200_OK
|
|
478
|
+
assert response.data['id'] == product.id
|
|
479
|
+
|
|
480
|
+
def test_crear_producto_sin_autenticar(self, api_client, db):
|
|
481
|
+
"""Prueba crear un producto sin autenticación."""
|
|
482
|
+
url = reverse('api:product-list')
|
|
483
|
+
data = {'name': 'Test Product', 'price': '99.99'}
|
|
484
|
+
|
|
485
|
+
response = api_client.post(url, data)
|
|
486
|
+
|
|
487
|
+
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|
|
488
|
+
|
|
489
|
+
def test_crear_producto_autenticado(self, authenticated_api_client, db):
|
|
490
|
+
"""Prueba crear un producto como usuario autenticado."""
|
|
491
|
+
url = reverse('api:product-list')
|
|
492
|
+
data = {
|
|
493
|
+
'name': 'Test Product',
|
|
494
|
+
'description': 'Test',
|
|
495
|
+
'price': '99.99',
|
|
496
|
+
'stock': 10,
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
response = authenticated_api_client.post(url, data)
|
|
500
|
+
|
|
501
|
+
assert response.status_code == status.HTTP_201_CREATED
|
|
502
|
+
assert response.data['name'] == 'Test Product'
|
|
503
|
+
|
|
504
|
+
def test_actualizar_producto(self, authenticated_api_client, db):
|
|
505
|
+
"""Prueba la actualización de un producto."""
|
|
506
|
+
product = ProductFactory(created_by=authenticated_api_client.user)
|
|
507
|
+
|
|
508
|
+
url = reverse('api:product-detail', kwargs={'pk': product.id})
|
|
509
|
+
data = {'name': 'Updated Product'}
|
|
510
|
+
|
|
511
|
+
response = authenticated_api_client.patch(url, data)
|
|
512
|
+
|
|
513
|
+
assert response.status_code == status.HTTP_200_OK
|
|
514
|
+
assert response.data['name'] == 'Updated Product'
|
|
515
|
+
|
|
516
|
+
def test_eliminar_producto(self, authenticated_api_client, db):
|
|
517
|
+
"""Prueba la eliminación de un producto."""
|
|
518
|
+
product = ProductFactory(created_by=authenticated_api_client.user)
|
|
519
|
+
|
|
520
|
+
url = reverse('api:product-detail', kwargs={'pk': product.id})
|
|
521
|
+
response = authenticated_api_client.delete(url)
|
|
522
|
+
|
|
523
|
+
assert response.status_code == status.HTTP_204_NO_CONTENT
|
|
524
|
+
|
|
525
|
+
def test_filtrar_productos_por_precio(self, api_client, db):
|
|
526
|
+
"""Prueba el filtrado de productos por precio."""
|
|
527
|
+
ProductFactory(price=50)
|
|
528
|
+
ProductFactory(price=150)
|
|
529
|
+
|
|
530
|
+
url = reverse('api:product-list')
|
|
531
|
+
response = api_client.get(url, {'price_min': 100})
|
|
532
|
+
|
|
533
|
+
assert response.status_code == status.HTTP_200_OK
|
|
534
|
+
assert response.data['count'] == 1
|
|
535
|
+
|
|
536
|
+
def test_buscar_productos(self, api_client, db):
|
|
537
|
+
"""Prueba la búsqueda de productos."""
|
|
538
|
+
ProductFactory(name='Apple iPhone')
|
|
539
|
+
ProductFactory(name='Samsung Galaxy')
|
|
540
|
+
|
|
541
|
+
url = reverse('api:product-list')
|
|
542
|
+
response = api_client.get(url, {'search': 'Apple'})
|
|
543
|
+
|
|
544
|
+
assert response.status_code == status.HTTP_200_OK
|
|
545
|
+
assert response.data['count'] == 1
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
## Mocking y patching
|
|
549
|
+
|
|
550
|
+
### Mocking de servicios externos
|
|
551
|
+
|
|
552
|
+
```python
|
|
553
|
+
# tests/test_views.py
|
|
554
|
+
from unittest.mock import patch, Mock
|
|
555
|
+
import pytest
|
|
556
|
+
|
|
557
|
+
class TestPaymentView:
|
|
558
|
+
"""Tests de la vista de pagos con pasarela simulada."""
|
|
559
|
+
|
|
560
|
+
@patch('apps.payments.services.stripe')
|
|
561
|
+
def test_pago_exitoso(self, mock_stripe, client, user, product):
|
|
562
|
+
"""Prueba un pago exitoso con Stripe simulado."""
|
|
563
|
+
# Configura el mock
|
|
564
|
+
mock_stripe.Charge.create.return_value = {
|
|
565
|
+
'id': 'ch_123',
|
|
566
|
+
'status': 'succeeded',
|
|
567
|
+
'amount': 9999,
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
client.force_login(user)
|
|
571
|
+
response = client.post(reverse('payments:process'), {
|
|
572
|
+
'product_id': product.id,
|
|
573
|
+
'token': 'tok_visa',
|
|
574
|
+
})
|
|
575
|
+
|
|
576
|
+
assert response.status_code == 302
|
|
577
|
+
mock_stripe.Charge.create.assert_called_once()
|
|
578
|
+
|
|
579
|
+
@patch('apps.payments.services.stripe')
|
|
580
|
+
def test_pago_fallido(self, mock_stripe, client, user, product):
|
|
581
|
+
"""Prueba un pago fallido."""
|
|
582
|
+
mock_stripe.Charge.create.side_effect = Exception('Tarjeta rechazada')
|
|
583
|
+
|
|
584
|
+
client.force_login(user)
|
|
585
|
+
response = client.post(reverse('payments:process'), {
|
|
586
|
+
'product_id': product.id,
|
|
587
|
+
'token': 'tok_visa',
|
|
588
|
+
})
|
|
589
|
+
|
|
590
|
+
assert response.status_code == 302
|
|
591
|
+
assert 'error' in response.url
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
### Mocking del envío de correo
|
|
595
|
+
|
|
596
|
+
```python
|
|
597
|
+
# tests/test_email.py
|
|
598
|
+
from django.core import mail
|
|
599
|
+
from django.test import override_settings
|
|
600
|
+
|
|
601
|
+
@override_settings(EMAIL_BACKEND='django.core.mail.backends.locmem.EmailBackend')
|
|
602
|
+
def test_correo_confirmacion_pedido(db, order):
|
|
603
|
+
"""Prueba el correo de confirmación del pedido."""
|
|
604
|
+
order.send_confirmation_email()
|
|
605
|
+
|
|
606
|
+
assert len(mail.outbox) == 1
|
|
607
|
+
assert order.user.email in mail.outbox[0].to
|
|
608
|
+
assert 'Order Confirmation' in mail.outbox[0].subject
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
## Testing de integración
|
|
612
|
+
|
|
613
|
+
### Testing de flujo completo
|
|
614
|
+
|
|
615
|
+
```python
|
|
616
|
+
# tests/test_integration.py
|
|
617
|
+
import pytest
|
|
618
|
+
from django.urls import reverse
|
|
619
|
+
from tests.factories import UserFactory, ProductFactory
|
|
620
|
+
|
|
621
|
+
class TestCheckoutFlow:
|
|
622
|
+
"""Prueba el flujo completo de checkout."""
|
|
623
|
+
|
|
624
|
+
def test_flujo_de_invitado_a_compra(self, client, db):
|
|
625
|
+
"""Prueba el flujo completo de invitado a compra."""
|
|
626
|
+
# Paso 1: registro
|
|
627
|
+
response = client.post(reverse('users:register'), {
|
|
628
|
+
'email': 'test@example.com',
|
|
629
|
+
'password': 'testpass123',
|
|
630
|
+
'password_confirm': 'testpass123',
|
|
631
|
+
})
|
|
632
|
+
assert response.status_code == 302
|
|
633
|
+
|
|
634
|
+
# Paso 2: login
|
|
635
|
+
response = client.post(reverse('users:login'), {
|
|
636
|
+
'email': 'test@example.com',
|
|
637
|
+
'password': 'testpass123',
|
|
638
|
+
})
|
|
639
|
+
assert response.status_code == 302
|
|
640
|
+
|
|
641
|
+
# Paso 3: navegar productos
|
|
642
|
+
product = ProductFactory(price=100)
|
|
643
|
+
response = client.get(reverse('products:detail', kwargs={'slug': product.slug}))
|
|
644
|
+
assert response.status_code == 200
|
|
645
|
+
|
|
646
|
+
# Paso 4: añadir al carrito
|
|
647
|
+
response = client.post(reverse('cart:add'), {
|
|
648
|
+
'product_id': product.id,
|
|
649
|
+
'quantity': 1,
|
|
650
|
+
})
|
|
651
|
+
assert response.status_code == 302
|
|
652
|
+
|
|
653
|
+
# Paso 5: checkout
|
|
654
|
+
response = client.get(reverse('checkout:review'))
|
|
655
|
+
assert response.status_code == 200
|
|
656
|
+
assert product.name in response.content.decode()
|
|
657
|
+
|
|
658
|
+
# Paso 6: completar la compra
|
|
659
|
+
with patch('apps.checkout.services.process_payment') as mock_payment:
|
|
660
|
+
mock_payment.return_value = True
|
|
661
|
+
response = client.post(reverse('checkout:complete'))
|
|
662
|
+
|
|
663
|
+
assert response.status_code == 302
|
|
664
|
+
assert Order.objects.filter(user__email='test@example.com').exists()
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
## Buenas prácticas de testing
|
|
668
|
+
|
|
669
|
+
### SÍ
|
|
670
|
+
|
|
671
|
+
- **Usa factories**: en lugar de crear objetos manualmente
|
|
672
|
+
- **Una aserción por test**: mantén los tests enfocados
|
|
673
|
+
- **Nombres descriptivos**: `test_usuario_no_puede_borrar_posts_ajenos`
|
|
674
|
+
- **Prueba casos límite**: entradas vacías, valores None, condiciones de frontera
|
|
675
|
+
- **Simula servicios externos**: no dependas de API externas
|
|
676
|
+
- **Usa fixtures**: elimina duplicación
|
|
677
|
+
- **Prueba los permisos**: verifica que la autorización funciona
|
|
678
|
+
- **Mantén los tests rápidos**: usa `--reuse-db` y `--nomigrations`
|
|
679
|
+
|
|
680
|
+
### NO
|
|
681
|
+
|
|
682
|
+
- **No testees los internos de Django**: confía en que Django funciona
|
|
683
|
+
- **No testees código de terceros**: confía en las librerías
|
|
684
|
+
- **No ignores tests que fallan**: todos deben pasar
|
|
685
|
+
- **No hagas tests dependientes**: deben poder ejecutarse en cualquier orden
|
|
686
|
+
- **No abuses de los mocks**: simula solo dependencias externas
|
|
687
|
+
- **No testees métodos privados**: prueba la interfaz pública
|
|
688
|
+
- **No uses la base de datos de producción**: siempre la de test
|
|
689
|
+
|
|
690
|
+
## Cobertura
|
|
691
|
+
|
|
692
|
+
### Configuración de cobertura
|
|
693
|
+
|
|
694
|
+
```bash
|
|
695
|
+
# Ejecutar tests con cobertura
|
|
696
|
+
pytest --cov=apps --cov-report=html --cov-report=term-missing
|
|
697
|
+
|
|
698
|
+
# Generar el reporte HTML
|
|
699
|
+
open htmlcov/index.html
|
|
700
|
+
```
|
|
701
|
+
|
|
702
|
+
### Metas de cobertura
|
|
703
|
+
|
|
704
|
+
| Componente | Cobertura objetivo |
|
|
705
|
+
|------------|--------------------|
|
|
706
|
+
| Modelos | 90%+ |
|
|
707
|
+
| Serializers | 85%+ |
|
|
708
|
+
| Vistas | 80%+ |
|
|
709
|
+
| Servicios | 90%+ |
|
|
710
|
+
| Utilidades | 80%+ |
|
|
711
|
+
| Global | 80%+ |
|
|
712
|
+
|
|
713
|
+
## Referencia rápida
|
|
714
|
+
|
|
715
|
+
| Patrón | Uso |
|
|
716
|
+
|--------|-----|
|
|
717
|
+
| `@pytest.mark.django_db` | Habilita el acceso a la base de datos |
|
|
718
|
+
| `client` | Cliente de test de Django |
|
|
719
|
+
| `api_client` | Cliente de API de DRF |
|
|
720
|
+
| `factory.create_batch(n)` | Crea varios objetos |
|
|
721
|
+
| `patch('modulo.funcion')` | Simula dependencias externas |
|
|
722
|
+
| `override_settings` | Cambia settings temporalmente |
|
|
723
|
+
| `force_authenticate()` | Evita la autenticación en tests |
|
|
724
|
+
| `assertRedirects` | Verifica redirecciones |
|
|
725
|
+
| `assertTemplateUsed` | Verifica el uso de la plantilla |
|
|
726
|
+
| `mail.outbox` | Revisa los correos enviados |
|
|
727
|
+
|
|
728
|
+
Recuerda: los tests son documentación. Un buen test explica cómo debería funcionar tu código. Mantenlos simples, legibles y mantenibles.
|
|
729
|
+
|
|
730
|
+
## Skills relacionadas
|
|
731
|
+
|
|
732
|
+
- `patrones-django` — Arquitectura y estructura de proyecto
|
|
733
|
+
- `patrones-django-celery` — Testing de tareas asíncronas
|
|
734
|
+
- `flujo-tdd` — Metodología TDD general
|
|
735
|
+
- `testing-python` — Configuración de pytest y fixtures
|