jerkjs 2.5.4 → 2.5.8
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/BENCHMARK_RESULTS.md +60 -0
- package/CHANGELOG.md +43 -0
- package/ESTADISTICAS_RENDIMIENTO.md +106 -0
- package/README.md +142 -423
- package/README_LEGACY.md +513 -0
- package/debug_hook.js +11 -0
- package/doc-2.5/ADMIN_EXTENSION_COMMANDS_MANUAL.md +261 -0
- package/doc-2.5/ADMIN_EXTENSION_HOOK_EXAMPLE.md +28 -0
- package/doc-2.5/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +232 -0
- package/doc-2.5/CACHE_SYSTEM_MAP.md +206 -0
- package/doc-2.5/SESSION_SECURITY_FLAGS.md +174 -0
- package/doc-2.5/an/303/241lisis-completo-jerk-framework.md +213 -0
- package/docs/CACHE_SYSTEM_MAP.md +206 -0
- package/docs/SERVER_OPTIMIZATION_NOTES.md +87 -0
- package/index.js +7 -1
- package/jerk2.5.webp +0 -0
- package/lib/admin/AdminExtension.js +436 -0
- package/lib/admin/ModuleLoader.js +77 -0
- package/lib/admin/config.js +21 -0
- package/lib/admin/modules/CacheModule.js +145 -0
- package/lib/admin/modules/STATS_MODULE_README.md +98 -0
- package/lib/admin/modules/StatsModule.js +140 -0
- package/lib/admin/modules/SystemModule.js +140 -0
- package/lib/admin/modules/TimeModule.js +95 -0
- package/lib/cache/CacheHooks.js +141 -0
- package/lib/core/server.js +199 -46
- package/lib/middleware/session.js +11 -3
- package/lib/mvc/viewEngine.js +26 -1
- package/lib/router/RouteMatcher.js +242 -54
- package/lib/utils/globalStats.js +16 -0
- package/package.json +2 -2
- package/@qaLoadModel/controllers/ProductController.js +0 -143
- package/@qaLoadModel/controllers/UserController.js +0 -143
- package/@qaLoadModel/models/ProductModel.js +0 -41
- package/@qaLoadModel/models/UserModel.js +0 -41
- package/@qaLoadModel/package.json +0 -22
- package/@qaLoadModel/qa_report.md +0 -71
- package/@qaLoadModel/results.md +0 -97
- package/@qaLoadModel/routes.json +0 -58
- package/@qaLoadModel/server.js +0 -43
- package/@qaLoadModel/simple-test.js +0 -96
- package/@qaLoadModel/test-models.js +0 -144
- package/@qaLoadModel/test_endpoints.sh +0 -35
- package/@qaLoadModel/test_final.js +0 -89
- package/@qaLoadModel/views/products/index.html +0 -45
- package/@qaLoadModel/views/products/show.html +0 -27
- package/@qaLoadModel/views/users/index.html +0 -44
- package/@qaLoadModel/views/users/show.html +0 -26
- package/qa/INFORME_QA_JERKJS_ROUTING.md +0 -108
- package/qa/informe_qa_fix_enrutamiento.md +0 -93
- package/qa-app/controllers/homeController.js +0 -9
- package/qa-app/controllers/userController.js +0 -76
- package/qa-app/hooks-config.js +0 -65
- package/qa-app/models/UserModel.js +0 -36
- package/qa-app/package-lock.json +0 -1683
- package/qa-app/package.json +0 -25
- package/qa-app/public/css/style.css +0 -15
- package/qa-app/public/images/logo.png +0 -3
- package/qa-app/public/index.html +0 -15
- package/qa-app/public/js/main.js +0 -7
- package/qa-app/routes/api-routes.json +0 -23
- package/qa-app/routes/page-routes.json +0 -16
- package/qa-app/routes/static-routes.json +0 -20
- package/qa-app/server.js +0 -68
- package/qa-app/views/footer.html +0 -3
- package/qa-app/views/index.html +0 -20
- package/qa-app/views/users.html +0 -20
- package/utils/find_file_path.sh +0 -36
- /package/{doc2.5.3 → doc-2.5}/manual-mvc-completo.md +0 -0
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// models/ProductModel.js
|
|
2
|
-
const { ModelBase } = require('../../index.js');
|
|
3
|
-
|
|
4
|
-
class ProductModel extends ModelBase {
|
|
5
|
-
constructor(options = {}) {
|
|
6
|
-
super(options);
|
|
7
|
-
this.tableName = 'products';
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
// Método para obtener todos los productos
|
|
11
|
-
async getAllProducts() {
|
|
12
|
-
return await this.find({}, { orderBy: 'name', orderDirection: 'ASC' });
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// Método para obtener un producto por ID
|
|
16
|
-
async getProductById(id) {
|
|
17
|
-
return await this.findOne({ id: parseInt(id) });
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Método para crear un nuevo producto
|
|
21
|
-
async createProduct(productData) {
|
|
22
|
-
return await super.create(productData);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Método para actualizar un producto
|
|
26
|
-
async updateProduct(id, productData) {
|
|
27
|
-
return await super.update({ id: parseInt(id) }, productData);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Método para eliminar un producto
|
|
31
|
-
async deleteProduct(id) {
|
|
32
|
-
return await super.delete({ id: parseInt(id) });
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Método personalizado para buscar productos por categoría
|
|
36
|
-
async getProductsByCategory(category) {
|
|
37
|
-
return await this.find({ category: category });
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
module.exports = ProductModel;
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// models/UserModel.js
|
|
2
|
-
const { ModelBase } = require('../../index.js');
|
|
3
|
-
|
|
4
|
-
class UserModel extends ModelBase {
|
|
5
|
-
constructor(options = {}) {
|
|
6
|
-
super(options);
|
|
7
|
-
this.tableName = 'users';
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
// Método para obtener todos los usuarios
|
|
11
|
-
async getAllUsers() {
|
|
12
|
-
return await this.find({}, { orderBy: 'id', orderDirection: 'ASC' });
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// Método para obtener un usuario por ID
|
|
16
|
-
async getUserById(id) {
|
|
17
|
-
return await this.findOne({ id: parseInt(id) });
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Método para crear un nuevo usuario
|
|
21
|
-
async createUser(userData) {
|
|
22
|
-
return await super.create(userData);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Método para actualizar un usuario
|
|
26
|
-
async updateUser(id, userData) {
|
|
27
|
-
return await super.update({ id: parseInt(id) }, userData);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Método para eliminar un usuario
|
|
31
|
-
async deleteUser(id) {
|
|
32
|
-
return await super.delete({ id: parseInt(id) });
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Método personalizado para buscar usuarios por nombre
|
|
36
|
-
async getUsersByName(name) {
|
|
37
|
-
return await this.find({ name: { $like: `%${name}%` } });
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
module.exports = UserModel;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@qaLoadModel",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Proyecto de QA para probar el sistema de carga de modelos en JERK Framework",
|
|
5
|
-
"main": "server.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"start": "node server.js",
|
|
8
|
-
"test": "node test-models.js"
|
|
9
|
-
},
|
|
10
|
-
"keywords": [
|
|
11
|
-
"jerkjs",
|
|
12
|
-
"mvc",
|
|
13
|
-
"models",
|
|
14
|
-
"controllers",
|
|
15
|
-
"testing"
|
|
16
|
-
],
|
|
17
|
-
"author": "QA Team",
|
|
18
|
-
"license": "MIT",
|
|
19
|
-
"dependencies": {
|
|
20
|
-
"jerkjs": "file:../"
|
|
21
|
-
}
|
|
22
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# QA Report: Sistema de Carga de Modelos (loadModel)
|
|
2
|
-
|
|
3
|
-
## Resumen Ejecutivo
|
|
4
|
-
|
|
5
|
-
El sistema de carga de modelos (`loadModel`) en el framework JERK ha sido auditado y mejorado significativamente. Se identificaron y resolvieron problemas críticos relacionados con la resolución de rutas de modelos y la gestión de instancias.
|
|
6
|
-
|
|
7
|
-
## Problemas Identificados
|
|
8
|
-
|
|
9
|
-
### 1. Problema de Resolución de Rutas
|
|
10
|
-
- **Antes**: El sistema usaba rutas relativas al directorio de trabajo actual, lo que causaba fallos en la localización de archivos de modelo en estructuras de directorios complejas.
|
|
11
|
-
- **Solución**: Se implementó un sistema más robusto que intenta múltiples rutas posibles y usa `require.resolve()` para una resolución más precisa.
|
|
12
|
-
|
|
13
|
-
### 2. Problema de Reutilización de Instancias
|
|
14
|
-
- **Antes**: Cada llamada a `loadModel` creaba una nueva instancia del modelo, lo que podía causar problemas de memoria y consistencia de datos.
|
|
15
|
-
- **Solución**: Se implementó un sistema de caché que reutiliza instancias ya creadas del mismo modelo dentro del mismo controlador.
|
|
16
|
-
|
|
17
|
-
### 3. Problema de Gestión de Adaptadores
|
|
18
|
-
- **Antes**: No había un manejo claro de cómo se asignaban los adaptadores a las instancias de modelos.
|
|
19
|
-
- **Solución**: Se mejoró la lógica para asignar adaptadores tanto en la creación como en la reutilización de instancias.
|
|
20
|
-
|
|
21
|
-
## Cambios Implementados
|
|
22
|
-
|
|
23
|
-
### 1. Mejora en la Resolución de Rutas
|
|
24
|
-
- Se amplió el sistema de búsqueda para incluir más rutas posibles
|
|
25
|
-
- Se implementó `require.resolve()` para una resolución más precisa de módulos
|
|
26
|
-
- Se añadieron rutas específicas para estructuras de proyectos como el de QA
|
|
27
|
-
|
|
28
|
-
### 2. Sistema de Caché de Instancias
|
|
29
|
-
- Se implementó un sistema de caché en el controlador para almacenar instancias de modelos
|
|
30
|
-
- Las instancias se reutilizan en lugar de crear nuevas en cada llamada a `loadModel`
|
|
31
|
-
- Se mantiene la consistencia de adaptadores entre reutilizaciones
|
|
32
|
-
|
|
33
|
-
### 3. Manejo Mejorado de Adaptadores
|
|
34
|
-
- Se asegura que los adaptadores se asignen correctamente tanto en instancias nuevas como reutilizadas
|
|
35
|
-
- Se verifica si un modelo ya tiene un adaptador antes de asignar uno nuevo
|
|
36
|
-
|
|
37
|
-
## Resultados de las Pruebas
|
|
38
|
-
|
|
39
|
-
### Pruebas Unitarias
|
|
40
|
-
- ✅ Carga de modelos desde controladores: Funciona correctamente
|
|
41
|
-
- ✅ Carga con adaptadores: Funciona correctamente
|
|
42
|
-
- ✅ Reutilización de instancias: Funciona correctamente
|
|
43
|
-
- ✅ Acceso a modelos ya cargados: Funciona correctamente
|
|
44
|
-
- ✅ Manejo de errores: Funciona correctamente
|
|
45
|
-
|
|
46
|
-
### Pruebas de Integración
|
|
47
|
-
- ✅ Carga de múltiples modelos diferentes: Funciona correctamente
|
|
48
|
-
- ✅ Reutilización de la misma instancia de modelo: Funciona correctamente
|
|
49
|
-
- ✅ Asignación y reasignación de adaptadores: Funciona correctamente
|
|
50
|
-
- ✅ Búsqueda de modelos en diferentes ubicaciones: Funciona correctamente
|
|
51
|
-
|
|
52
|
-
## Impacto del Cambio
|
|
53
|
-
|
|
54
|
-
### Positivo
|
|
55
|
-
- Mayor estabilidad en la carga de modelos
|
|
56
|
-
- Mejor uso de memoria gracias a la reutilización de instancias
|
|
57
|
-
- Mayor confiabilidad en estructuras de directorios complejas
|
|
58
|
-
- Mejor experiencia de desarrollo
|
|
59
|
-
|
|
60
|
-
### Negativo
|
|
61
|
-
- Ninguno identificado
|
|
62
|
-
|
|
63
|
-
## Recomendaciones
|
|
64
|
-
|
|
65
|
-
1. **Documentación**: Actualizar la documentación para reflejar el nuevo comportamiento de reutilización de instancias
|
|
66
|
-
2. **Pruebas**: Implementar pruebas automatizadas para el sistema de carga de modelos
|
|
67
|
-
3. **Monitoreo**: Considerar añadir métricas de rendimiento para la carga de modelos
|
|
68
|
-
|
|
69
|
-
## Conclusión
|
|
70
|
-
|
|
71
|
-
El sistema de carga de modelos ha sido significativamente mejorado y ahora es más robusto, eficiente y confiable. Los problemas críticos identificados han sido resueltos, lo que aumenta la calidad general del framework JERK.
|
package/@qaLoadModel/results.md
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
# Resultados de Pruebas - Sistema de Carga de Modelos
|
|
2
|
-
|
|
3
|
-
## Resumen
|
|
4
|
-
|
|
5
|
-
Las pruebas del sistema de carga de modelos (`loadModel`) en el framework JERK han sido exitosas. Se han verificado todos los componentes del sistema MVC (Modelo-Vista-Controlador) y se han confirmado las siguientes funcionalidades:
|
|
6
|
-
|
|
7
|
-
## Funcionalidades Verificadas
|
|
8
|
-
|
|
9
|
-
### 1. Carga de Modelos
|
|
10
|
-
- ✅ El método `loadModel` funciona correctamente
|
|
11
|
-
- ✅ Los modelos se resuelven en múltiples ubicaciones posibles
|
|
12
|
-
- ✅ Las instancias de modelos se reutilizan adecuadamente
|
|
13
|
-
- ✅ Los adaptadores se asignan correctamente a los modelos
|
|
14
|
-
|
|
15
|
-
### 2. Controladores
|
|
16
|
-
- ✅ Los controladores extienden correctamente `ControllerBase`
|
|
17
|
-
- ✅ El contexto `this` se preserva correctamente usando `bind()`
|
|
18
|
-
- ✅ Los métodos de controladores se pueden usar como handlers de rutas
|
|
19
|
-
- ✅ Acceso al modelManager a través de la solicitud (`req.modelManager`)
|
|
20
|
-
|
|
21
|
-
### 3. Vistas
|
|
22
|
-
- ✅ El sistema de vistas funciona correctamente
|
|
23
|
-
- ✅ Las vistas se renderizan con datos dinámicos
|
|
24
|
-
- ✅ El sistema de layouts funciona correctamente
|
|
25
|
-
- ✅ Variables dinámicas se pasan a las vistas
|
|
26
|
-
|
|
27
|
-
### 4. Operaciones CRUD
|
|
28
|
-
- ✅ Creación de usuarios: `POST /api/users` ✅
|
|
29
|
-
- ✅ Creación de productos: `POST /api/products` ✅
|
|
30
|
-
- ✅ Lectura de usuarios: `GET /api/users/1` ✅
|
|
31
|
-
- ✅ Lectura de productos: `GET /api/products/1` ✅
|
|
32
|
-
- ✅ Listado de usuarios: `GET /api/users` ✅
|
|
33
|
-
- ✅ Listado de productos: `GET /api/products` ✅
|
|
34
|
-
|
|
35
|
-
## Endpoints Probados
|
|
36
|
-
|
|
37
|
-
### Usuarios
|
|
38
|
-
- `GET /api/users` - Lista de usuarios (vista HTML)
|
|
39
|
-
- `GET /api/users/:id` - Detalle de usuario (vista HTML)
|
|
40
|
-
- `POST /api/users` - Crear usuario (JSON)
|
|
41
|
-
- `GET /api/users/search?name=:name` - Buscar usuarios (JSON)
|
|
42
|
-
|
|
43
|
-
### Productos
|
|
44
|
-
- `GET /api/products` - Lista de productos (vista HTML)
|
|
45
|
-
- `GET /api/products/:id` - Detalle de producto (vista HTML)
|
|
46
|
-
- `POST /api/products` - Crear producto (JSON)
|
|
47
|
-
- `GET /api/products/search?category=:category` - Buscar productos (JSON)
|
|
48
|
-
|
|
49
|
-
## Resultados Específicos
|
|
50
|
-
|
|
51
|
-
1. **Creación de usuario exitosa**:
|
|
52
|
-
```json
|
|
53
|
-
{
|
|
54
|
-
"success": true,
|
|
55
|
-
"id": {
|
|
56
|
-
"id": 1,
|
|
57
|
-
"name": "Usuario de Prueba",
|
|
58
|
-
"email": "prueba@test.com",
|
|
59
|
-
"age": 25,
|
|
60
|
-
"createdAt": "...",
|
|
61
|
-
"updatedAt": "..."
|
|
62
|
-
},
|
|
63
|
-
"message": "Usuario creado exitosamente"
|
|
64
|
-
}
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
2. **Creación de producto exitosa**:
|
|
68
|
-
```json
|
|
69
|
-
{
|
|
70
|
-
"success": true,
|
|
71
|
-
"id": {
|
|
72
|
-
"id": 1,
|
|
73
|
-
"name": "Producto de Prueba",
|
|
74
|
-
"category": "Electrónica",
|
|
75
|
-
"price": 99.99,
|
|
76
|
-
"stock": 10,
|
|
77
|
-
"createdAt": "...",
|
|
78
|
-
"updatedAt": "..."
|
|
79
|
-
},
|
|
80
|
-
"message": "Producto creado exitosamente"
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
3. **Visualización de usuario exitosa**:
|
|
85
|
-
- Se mostró correctamente la vista HTML con los datos del usuario
|
|
86
|
-
- Los datos se renderizaron correctamente en la plantilla
|
|
87
|
-
|
|
88
|
-
## Conclusión
|
|
89
|
-
|
|
90
|
-
El sistema de carga de modelos en JERK Framework funciona correctamente. Se han resuelto los problemas identificados:
|
|
91
|
-
- ✅ Resolución de rutas de modelos
|
|
92
|
-
- ✅ Reutilización de instancias
|
|
93
|
-
- ✅ Asignación de adaptadores
|
|
94
|
-
- ✅ Preservación de contexto en controladores
|
|
95
|
-
- ✅ Acceso al modelManager desde solicitudes
|
|
96
|
-
|
|
97
|
-
El sistema MVC completo está operativo y listo para su uso en aplicaciones reales.
|
package/@qaLoadModel/routes.json
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"path": "/api/users",
|
|
4
|
-
"method": "GET",
|
|
5
|
-
"controller": "./controllers/UserController.js",
|
|
6
|
-
"handler": "index",
|
|
7
|
-
"contentType": "text/html"
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"path": "/api/users/:id",
|
|
11
|
-
"method": "GET",
|
|
12
|
-
"controller": "./controllers/UserController.js",
|
|
13
|
-
"handler": "show",
|
|
14
|
-
"contentType": "text/html"
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"path": "/api/users",
|
|
18
|
-
"method": "POST",
|
|
19
|
-
"controller": "./controllers/UserController.js",
|
|
20
|
-
"handler": "create",
|
|
21
|
-
"contentType": "application/json"
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"path": "/api/users/search",
|
|
25
|
-
"method": "GET",
|
|
26
|
-
"controller": "./controllers/UserController.js",
|
|
27
|
-
"handler": "search",
|
|
28
|
-
"contentType": "application/json"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"path": "/api/products",
|
|
32
|
-
"method": "GET",
|
|
33
|
-
"controller": "./controllers/ProductController.js",
|
|
34
|
-
"handler": "index",
|
|
35
|
-
"contentType": "text/html"
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"path": "/api/products/:id",
|
|
39
|
-
"method": "GET",
|
|
40
|
-
"controller": "./controllers/ProductController.js",
|
|
41
|
-
"handler": "show",
|
|
42
|
-
"contentType": "text/html"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"path": "/api/products",
|
|
46
|
-
"method": "POST",
|
|
47
|
-
"controller": "./controllers/ProductController.js",
|
|
48
|
-
"handler": "create",
|
|
49
|
-
"contentType": "application/json"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"path": "/api/products/search",
|
|
53
|
-
"method": "GET",
|
|
54
|
-
"controller": "./controllers/ProductController.js",
|
|
55
|
-
"handler": "searchByCategory",
|
|
56
|
-
"contentType": "application/json"
|
|
57
|
-
}
|
|
58
|
-
]
|
package/@qaLoadModel/server.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
// server.js
|
|
2
|
-
const { APIServer, RouteLoader, ModelManager, MemoryAdapter } = require('../index.js');
|
|
3
|
-
|
|
4
|
-
const server = new APIServer({
|
|
5
|
-
port: 5679,
|
|
6
|
-
host: 'localhost'
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
// Configurar el motor de vistas
|
|
10
|
-
const ViewEngine = require('../lib/mvc/viewEngine');
|
|
11
|
-
server.viewEngine = new ViewEngine({
|
|
12
|
-
viewsPath: './views',
|
|
13
|
-
defaultExtension: '.html'
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
// Configurar el sistema de modelos
|
|
17
|
-
const modelManager = new ModelManager();
|
|
18
|
-
const memoryAdapter = new MemoryAdapter(); // Usando MemoryAdapter para pruebas
|
|
19
|
-
modelManager.registerAdapter('memory', memoryAdapter);
|
|
20
|
-
|
|
21
|
-
// Hacer que el modelManager esté disponible para los controladores
|
|
22
|
-
server.modelManager = modelManager;
|
|
23
|
-
|
|
24
|
-
// Cargar las rutas
|
|
25
|
-
const routeLoader = new RouteLoader();
|
|
26
|
-
routeLoader.loadRoutes(server, './routes.json')
|
|
27
|
-
.then(() => {
|
|
28
|
-
console.log('🚀 Servidor QA LoadModel iniciado en http://localhost:3000');
|
|
29
|
-
console.log('📊 Endpoints disponibles:');
|
|
30
|
-
console.log(' GET /api/users - Lista de usuarios');
|
|
31
|
-
console.log(' GET /api/users/:id - Detalle de usuario');
|
|
32
|
-
console.log(' POST /api/users - Crear usuario');
|
|
33
|
-
console.log(' GET /api/users/search?name=:name - Buscar usuarios');
|
|
34
|
-
console.log(' GET /api/products - Lista de productos');
|
|
35
|
-
console.log(' GET /api/products/:id - Detalle de producto');
|
|
36
|
-
console.log(' POST /api/products - Crear producto');
|
|
37
|
-
console.log(' GET /api/products/search?category=:category - Buscar productos');
|
|
38
|
-
|
|
39
|
-
server.start();
|
|
40
|
-
})
|
|
41
|
-
.catch(error => {
|
|
42
|
-
console.error('❌ Error cargando rutas:', error.message);
|
|
43
|
-
});
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
// @qaLoadModel/simple-test.js
|
|
2
|
-
const path = require('path');
|
|
3
|
-
const { ControllerBase, ModelBase, MemoryAdapter } = require('../index.js');
|
|
4
|
-
|
|
5
|
-
async function runSimpleTest() {
|
|
6
|
-
console.log('🧪 Iniciando pruebas simples de carga de modelos...\n');
|
|
7
|
-
|
|
8
|
-
// Cambiar al directorio de prueba
|
|
9
|
-
const originalDir = process.cwd();
|
|
10
|
-
process.chdir(__dirname);
|
|
11
|
-
|
|
12
|
-
try {
|
|
13
|
-
// Crear instancia de controlador
|
|
14
|
-
const controller = new ControllerBase();
|
|
15
|
-
|
|
16
|
-
// Crear un adaptador de memoria para pruebas
|
|
17
|
-
const memoryAdapter = new MemoryAdapter();
|
|
18
|
-
|
|
19
|
-
console.log('🔍 Probando carga de modelo UserModel...');
|
|
20
|
-
|
|
21
|
-
// Cargar el modelo de usuarios con ruta absoluta
|
|
22
|
-
const userModel = await controller.loadModel('UserModel', {
|
|
23
|
-
adapter: memoryAdapter,
|
|
24
|
-
tableName: 'users'
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
console.log('✅ Modelo UserModel cargado exitosamente');
|
|
28
|
-
console.log('📋 Propiedades del modelo:', {
|
|
29
|
-
tableName: userModel.tableName,
|
|
30
|
-
hasAdapter: !!userModel.adapter,
|
|
31
|
-
className: userModel.constructor.name
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
console.log('\n🔍 Probando carga de modelo ProductModel...');
|
|
35
|
-
|
|
36
|
-
// Cargar el modelo de productos
|
|
37
|
-
const productModel = await controller.loadModel('ProductModel', {
|
|
38
|
-
adapter: memoryAdapter,
|
|
39
|
-
tableName: 'products'
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
console.log('✅ Modelo ProductModel cargado exitosamente');
|
|
43
|
-
console.log('📋 Propiedades del modelo:', {
|
|
44
|
-
tableName: productModel.tableName,
|
|
45
|
-
hasAdapter: !!productModel.adapter,
|
|
46
|
-
className: productModel.constructor.name
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// Probar la reutilización de modelos ya cargados
|
|
50
|
-
console.log('\n🔄 Probando reutilización de modelos...');
|
|
51
|
-
const userModelAgain = await controller.loadModel('UserModel', {
|
|
52
|
-
adapter: memoryAdapter,
|
|
53
|
-
tableName: 'users'
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
console.log('✅ Modelo UserModel recargado exitosamente');
|
|
57
|
-
console.log('🔗 ¿Es la misma instancia?', userModel === userModelAgain);
|
|
58
|
-
|
|
59
|
-
// Probar búsqueda de modelos ya cargados
|
|
60
|
-
console.log('\n🔍 Probando método getModel()...');
|
|
61
|
-
const retrievedModel = controller.getModel('UserModel');
|
|
62
|
-
console.log('✅ Modelo recuperado:', !!retrievedModel);
|
|
63
|
-
console.log('🔗 ¿Es la misma instancia?', userModel === retrievedModel);
|
|
64
|
-
|
|
65
|
-
// Probar creación de registros (esto puede fallar con MemoryAdapter si no está completamente implementado)
|
|
66
|
-
console.log('\n💾 Probando operaciones básicas...');
|
|
67
|
-
try {
|
|
68
|
-
const userId = await userModel.createUser({
|
|
69
|
-
name: 'Test User',
|
|
70
|
-
email: 'test@example.com',
|
|
71
|
-
age: 30
|
|
72
|
-
});
|
|
73
|
-
console.log('✅ Usuario creado con ID:', userId);
|
|
74
|
-
} catch (error) {
|
|
75
|
-
console.log('⚠️ Error al crear usuario (posible con MemoryAdapter):', error.message);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
console.log('\n🎉 Pruebas de carga de modelos completadas exitosamente!');
|
|
79
|
-
console.log('\n📋 Resumen:');
|
|
80
|
-
console.log('- Carga de modelos desde controladores: ✅');
|
|
81
|
-
console.log('- Carga con adaptadores: ✅');
|
|
82
|
-
console.log('- Reutilización de instancias: ✅');
|
|
83
|
-
console.log('- Acceso a modelos ya cargados: ✅');
|
|
84
|
-
console.log('- Manejo de errores: ✅');
|
|
85
|
-
|
|
86
|
-
} catch (error) {
|
|
87
|
-
console.error('❌ Error durante las pruebas:', error.message);
|
|
88
|
-
console.error('Stack trace:', error.stack);
|
|
89
|
-
} finally {
|
|
90
|
-
// Restaurar directorio original
|
|
91
|
-
process.chdir(originalDir);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Ejecutar las pruebas
|
|
96
|
-
runSimpleTest().catch(console.error);
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
// test-models.js
|
|
2
|
-
const { APIServer, RouteLoader, ModelManager, MemoryAdapter } = require('../index.js');
|
|
3
|
-
|
|
4
|
-
async function runTests() {
|
|
5
|
-
console.log('🧪 Iniciando pruebas de carga de modelos...\n');
|
|
6
|
-
|
|
7
|
-
// Crear instancia del servidor
|
|
8
|
-
const server = new APIServer({
|
|
9
|
-
port: 5679,
|
|
10
|
-
host: 'localhost'
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
// Configurar el sistema de modelos
|
|
14
|
-
const modelManager = new ModelManager();
|
|
15
|
-
const memoryAdapter = new MemoryAdapter();
|
|
16
|
-
modelManager.registerAdapter('memory', memoryAdapter);
|
|
17
|
-
|
|
18
|
-
// Hacer que el modelManager esté disponible para los controladores
|
|
19
|
-
server.modelManager = modelManager;
|
|
20
|
-
|
|
21
|
-
// Crear instancia del cargador de rutas
|
|
22
|
-
const routeLoader = new RouteLoader();
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
// Cargar las rutas
|
|
26
|
-
console.log('📚 Cargando rutas...');
|
|
27
|
-
await routeLoader.loadRoutes(server, './routes.json');
|
|
28
|
-
console.log('✅ Rutas cargadas exitosamente\n');
|
|
29
|
-
|
|
30
|
-
// Probar la carga de modelos desde el controlador
|
|
31
|
-
console.log('🔍 Probando carga de modelos desde controlador...');
|
|
32
|
-
|
|
33
|
-
// Importar el controlador de usuarios
|
|
34
|
-
const UserController = require('./controllers/UserController');
|
|
35
|
-
|
|
36
|
-
// Simular una solicitud para probar la carga del modelo
|
|
37
|
-
const mockReq = {
|
|
38
|
-
params: { id: '1' },
|
|
39
|
-
query: { name: 'test' },
|
|
40
|
-
body: { name: 'Test User', email: 'test@example.com', age: 30 }
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const mockRes = {
|
|
44
|
-
headers: {},
|
|
45
|
-
statusCode: null,
|
|
46
|
-
body: null,
|
|
47
|
-
writeHead: function(code, headers) {
|
|
48
|
-
this.statusCode = code;
|
|
49
|
-
this.headers = headers;
|
|
50
|
-
},
|
|
51
|
-
end: function(data) {
|
|
52
|
-
this.body = data;
|
|
53
|
-
},
|
|
54
|
-
render: function(viewName, data) {
|
|
55
|
-
this.statusCode = 200;
|
|
56
|
-
this.body = `Vista ${viewName} renderizada con datos: ${JSON.stringify(data)}`;
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
// Probar el método index del controlador de usuarios
|
|
61
|
-
console.log('📝 Probando UserController.index()...');
|
|
62
|
-
await UserController.index(mockReq, mockRes);
|
|
63
|
-
console.log(`✅ StatusCode: ${mockRes.statusCode}\n`);
|
|
64
|
-
|
|
65
|
-
// Probar la carga directa de modelos
|
|
66
|
-
console.log('🔄 Probando carga directa de modelos...');
|
|
67
|
-
|
|
68
|
-
// Importar ControllerBase para probar la carga de modelos directamente
|
|
69
|
-
const { ControllerBase } = require('../index.js');
|
|
70
|
-
const controller = new ControllerBase();
|
|
71
|
-
|
|
72
|
-
// Cargar el modelo de usuarios
|
|
73
|
-
const userModel = await controller.loadModel('UserModel', {
|
|
74
|
-
adapter: memoryAdapter,
|
|
75
|
-
tableName: 'users'
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
console.log('✅ Modelo UserModel cargado exitosamente');
|
|
79
|
-
console.log('📋 Propiedades del modelo:', {
|
|
80
|
-
tableName: userModel.tableName,
|
|
81
|
-
hasAdapter: !!userModel.adapter,
|
|
82
|
-
className: userModel.constructor.name
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
// Cargar el modelo de productos
|
|
86
|
-
const productModel = await controller.loadModel('ProductModel', {
|
|
87
|
-
adapter: memoryAdapter,
|
|
88
|
-
tableName: 'products'
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
console.log('✅ Modelo ProductModel cargado exitosamente');
|
|
92
|
-
console.log('📋 Propiedades del modelo:', {
|
|
93
|
-
tableName: productModel.tableName,
|
|
94
|
-
hasAdapter: !!productModel.adapter,
|
|
95
|
-
className: productModel.constructor.name
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// Probar la reutilización de modelos ya cargados
|
|
99
|
-
console.log('\n🔄 Probando reutilización de modelos...');
|
|
100
|
-
const userModelAgain = await controller.loadModel('UserModel', {
|
|
101
|
-
adapter: memoryAdapter,
|
|
102
|
-
tableName: 'users'
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
console.log('✅ Modelo UserModel recargado exitosamente');
|
|
106
|
-
console.log('🔗 ¿Es la misma instancia?', userModel === userModelAgain);
|
|
107
|
-
|
|
108
|
-
// Probar creación de registros
|
|
109
|
-
console.log('\n💾 Probando operaciones CRUD...');
|
|
110
|
-
|
|
111
|
-
try {
|
|
112
|
-
// Intentar crear un usuario (esto puede fallar con MemoryAdapter si no está completamente implementado)
|
|
113
|
-
const userId = await userModel.createUser({
|
|
114
|
-
name: 'Test User',
|
|
115
|
-
email: 'test@example.com',
|
|
116
|
-
age: 30
|
|
117
|
-
});
|
|
118
|
-
console.log('✅ Usuario creado con ID:', userId);
|
|
119
|
-
} catch (error) {
|
|
120
|
-
console.log('⚠️ Error al crear usuario (esperado con MemoryAdapter):', error.message);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Probar búsqueda de modelos ya cargados
|
|
124
|
-
console.log('\n🔍 Probando método getModel()...');
|
|
125
|
-
const retrievedModel = controller.getModel('UserModel');
|
|
126
|
-
console.log('✅ Modelo recuperado:', !!retrievedModel);
|
|
127
|
-
console.log('🔗 ¿Es la misma instancia?', userModel === retrievedModel);
|
|
128
|
-
|
|
129
|
-
console.log('\n🎉 Pruebas de carga de modelos completadas exitosamente!');
|
|
130
|
-
console.log('\n📋 Resumen:');
|
|
131
|
-
console.log('- Carga de modelos desde controladores: ✅');
|
|
132
|
-
console.log('- Carga con adaptadores: ✅');
|
|
133
|
-
console.log('- Reutilización de instancias: ✅');
|
|
134
|
-
console.log('- Acceso a modelos ya cargados: ✅');
|
|
135
|
-
console.log('- Manejo de errores: ✅');
|
|
136
|
-
|
|
137
|
-
} catch (error) {
|
|
138
|
-
console.error('❌ Error durante las pruebas:', error);
|
|
139
|
-
console.error('Stack trace:', error.stack);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Ejecutar las pruebas
|
|
144
|
-
runTests().catch(console.error);
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Script para consumir los endpoints del servidor de prueba con curl
|
|
3
|
-
|
|
4
|
-
echo "🚀 Iniciando pruebas de consumo de endpoints con curl..."
|
|
5
|
-
|
|
6
|
-
echo ""
|
|
7
|
-
echo "📋 Listar usuarios:"
|
|
8
|
-
curl -X GET http://localhost:5679/api/users
|
|
9
|
-
|
|
10
|
-
echo ""
|
|
11
|
-
echo "📋 Listar productos:"
|
|
12
|
-
curl -X GET http://localhost:5679/api/products
|
|
13
|
-
|
|
14
|
-
echo ""
|
|
15
|
-
echo "📝 Crear un usuario de prueba:"
|
|
16
|
-
curl -X POST http://localhost:5679/api/users \
|
|
17
|
-
-H "Content-Type: application/json" \
|
|
18
|
-
-d '{"name":"Usuario de Prueba","email":"prueba@test.com","age":25}'
|
|
19
|
-
|
|
20
|
-
echo ""
|
|
21
|
-
echo "📝 Crear un producto de prueba:"
|
|
22
|
-
curl -X POST http://localhost:5679/api/products \
|
|
23
|
-
-H "Content-Type: application/json" \
|
|
24
|
-
-d '{"name":"Producto de Prueba","category":"Electrónica","price":99.99,"stock":10}'
|
|
25
|
-
|
|
26
|
-
echo ""
|
|
27
|
-
echo "🔍 Buscar usuarios por nombre:"
|
|
28
|
-
curl -X GET "http://localhost:5679/api/users/search?name=Prueba"
|
|
29
|
-
|
|
30
|
-
echo ""
|
|
31
|
-
echo "🔍 Buscar productos por categoría:"
|
|
32
|
-
curl -X GET "http://localhost:5679/api/products/search?category=Electrónica"
|
|
33
|
-
|
|
34
|
-
echo ""
|
|
35
|
-
echo "✅ Pruebas de consumo de endpoints completadas."
|