3.6 KiB
3.6 KiB
Object and Record Creation Test
Goal
Test that the Objection.js model system properly handles system-managed fields:
- ownerId (should be auto-set from userId)
- created_at (should be auto-set to current timestamp)
- updated_at (should be auto-set to current timestamp)
- id (should be auto-generated UUID)
Users should NOT need to provide these fields when creating records.
Test Sequence
1. Create an Object (if not exists)
curl -X POST http://localhost:3001/api/objects \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "X-Tenant-ID: tenant1" \
-d '{
"apiName": "TestContact",
"label": "Test Contact",
"pluralLabel": "Test Contacts",
"description": "Test object for model validation"
}'
Expected response:
{
"id": "uuid...",
"apiName": "TestContact",
"label": "Test Contact",
"tableName": "test_contacts",
"...": "..."
}
2. Create a Record WITHOUT System Fields
This should succeed and system fields should be auto-populated:
curl -X POST http://localhost:3001/api/records/TestContact \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "X-Tenant-ID: tenant1" \
-d '{
"name": "John Doe",
"email": "john@example.com"
}'
Expected response:
{
"id": "uuid-auto-generated",
"name": "John Doe",
"email": "john@example.com",
"ownerId": "current-user-id",
"created_at": "2025-01-26T...",
"updated_at": "2025-01-26T...",
"tenantId": "tenant-uuid"
}
3. Verify Fields Were Set Automatically
curl -X GET http://localhost:3001/api/records/TestContact/RECORD_ID \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "X-Tenant-ID: tenant1"
Verify response includes:
- ✅ id (UUID)
- ✅ ownerId (matches current user ID)
- ✅ created_at (timestamp)
- ✅ updated_at (timestamp)
- ✅ name, email (provided fields)
4. Update Record and Verify updated_at Changes
Get the created_at value, wait a second, then update:
curl -X PATCH http://localhost:3001/api/records/TestContact/RECORD_ID \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "X-Tenant-ID: tenant1" \
-d '{
"name": "Jane Doe"
}'
Verify in response:
- ✅ name is updated to "Jane Doe"
- ✅ updated_at is newer than original created_at
- ✅ created_at is unchanged
- ✅ ownerId is unchanged (not overwritable)
Key Points to Verify
- System Fields Not Required: Record creation succeeds without ownerId, created_at, updated_at
- Auto-Population: System fields are populated automatically by model hooks
- Immutable Owner: ownerId cannot be changed via update (filtered out in ObjectService.updateRecord)
- Timestamp Management: created_at stays same, updated_at changes on update
- Model Used: Debug logs should show model is being used (look for "Registered model" logs)
Troubleshooting
If tests fail, check:
- Model Registration: Verify model appears in logs after object creation
- Hook Execution: Add debug logs to DynamicModel.$beforeInsert and $beforeUpdate
- Model Binding: Verify getBoundModel returns properly bound model with correct knex instance
- Field Validation: Check if JSON schema validation is preventing record creation
Related Files
- backend/src/object/models/dynamic-model.factory.ts - Model creation with hooks
- backend/src/object/models/model.service.ts - Model lifecycle management
- backend/src/object/object.service.ts - Updated CRUD to use models