Files
neo/docs/TEST_OBJECT_CREATION.md
2026-01-05 07:48:22 +01:00

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

  1. System Fields Not Required: Record creation succeeds without ownerId, created_at, updated_at
  2. Auto-Population: System fields are populated automatically by model hooks
  3. Immutable Owner: ownerId cannot be changed via update (filtered out in ObjectService.updateRecord)
  4. Timestamp Management: created_at stays same, updated_at changes on update
  5. Model Used: Debug logs should show model is being used (look for "Registered model" logs)

Troubleshooting

If tests fail, check:

  1. Model Registration: Verify model appears in logs after object creation
  2. Hook Execution: Add debug logs to DynamicModel.$beforeInsert and $beforeUpdate
  3. Model Binding: Verify getBoundModel returns properly bound model with correct knex instance
  4. Field Validation: Check if JSON schema validation is preventing record creation