Files
attune/work-summary/sessions/2026-01-23-e2e-field-fixes.md
2026-02-04 17:46:30 -06:00

6.4 KiB

E2E Test Field Name Fixes - 2026-01-23

Summary

Fixed field name mismatches between E2E tests and the actual API responses. Updated test client library to properly handle the new API schema that uses ref/label instead of legacy name/type fields.

Problems Fixed

1. Trigger Field Mismatches

Problem: Tests were accessing trigger['name'] and trigger['type'] which don't exist in API responses.

API Schema:

  • Uses ref (e.g., "core.webhook", "core.intervaltimer")
  • Uses label (human-readable name)
  • No type or name fields

Fixed:

  • Updated all tests to use trigger['label'] instead of trigger['name']
  • Updated assertions to check trigger['ref'] instead of trigger['type']

2. Rule Field Mismatches

Problem: Tests were accessing rule['name'] which doesn't exist.

API Schema:

  • Uses ref (unique identifier)
  • Uses label (human-readable name)

Fixed:

  • Updated all tests to use rule['label'] instead of rule['name']

3. Action Field Mismatches

Problem: Test was checking action['runner_type'] which doesn't exist.

API Schema:

  • Uses runtime (runtime ID, optional)
  • No runner_type field in response

Fixed:

  • Removed invalid runner_type assertion from tests

4. Timer Helper Return Structure

Problem: Timer helpers were returning different structures - interval timer returned sensor dict, but date/cron timers returned plain trigger dict.

Fixed:

  • Updated create_date_timer() to create sensor like interval timer
  • Updated create_cron_timer() to create sensor like interval timer
  • All timer helpers now return consistent structure:
    {
        "id": core_trigger_id,
        "ref": core_trigger_ref,
        "label": sensor_label,
        "trigger": core_trigger_dict,
        "sensor": sensor_dict,
        "sensor_id": sensor_id,
        # Plus helper-specific fields like fire_at, cron_expression, etc.
    }
    

Client Library Updates

AttuneClient.create_trigger()

  • Already supported new API schema
  • Maps legacy name parameter to label
  • Handles ref generation from pack_ref and name

AttuneClient.create_rule()

Updated to handle new API schema:

  • Maps legacy name to ref/label
  • Converts trigger_id to trigger_ref by looking up trigger
  • Maps criteria (string) to conditions (JSON)
  • Maps action_parameters to action_params
  • Adds support for trigger_params

API Expectations:

{
    "ref": "pack.rule_name",
    "pack_ref": "pack",
    "label": "Human Readable",
    "description": "...",
    "action_ref": "pack.action",
    "trigger_ref": "pack.trigger",
    "conditions": {},       # JSON Logic
    "action_params": {},
    "trigger_params": {},
    "enabled": true
}

AttuneClient.create_action()

Updated to handle new API schema:

  • Maps legacy name to ref/label
  • Converts runner_type (string) to runtime (ID) by:
    1. Looking up runtime by reference
    2. Trying common mappings (python3 → core.action.python3, etc.)
    3. Finding runtime ID from the list

API Expectations:

{
    "ref": "pack.action_name",
    "pack_ref": "pack",
    "label": "Human Readable",
    "description": "...",
    "entrypoint": "/actions/script.py",
    "runtime": 1,           # Optional runtime ID
    "param_schema": {},
    "out_schema": {}
}

AttuneClient.list_runtimes()

Added new method:

  • GET /api/v1/runtimes
  • Returns list of available runtimes
  • Used by create_action() to look up runtime IDs

Service Management

restart_sensor_service()

Added new helper function:

  • Restarts sensor service after creating sensors
  • Tries multiple methods:
    1. Docker-compose restart (if in container)
    2. systemctl restart (if systemd service)
    3. Falls back to waiting for auto-reload
  • Called automatically by timer creation helpers

Why needed:

  • Sensor service loads sensors at startup
  • New sensors must be loaded before they can generate events
  • Without restart, timers won't fire

Files Modified

Test Files

  • tests/e2e/tier1/test_t1_01_interval_timer.py - Fixed field names
  • tests/e2e/tier1/test_t1_02_date_timer.py - Fixed field names, updated assertions
  • tests/e2e/tier1/test_t1_03_cron_timer.py - Fixed field names, updated assertions
  • tests/e2e/tier1/test_t1_04_webhook_trigger.py - Fixed field names
  • tests/e2e/tier1/test_t1_08_action_failure.py - Fixed field names

Helper Files

  • tests/helpers/client.py - Updated create_rule(), create_action(), added list_runtimes()
  • tests/helpers/fixtures.py - Updated timer helpers, added restart_sensor_service()

Testing Status

Ready to Test

All field name mismatches have been resolved. Tests should now:

  1. Import without errors
  2. Create triggers/actions/rules with correct API schema
  3. Access response fields correctly (ref, label instead of name, type)
  4. Create sensors for all timer types
  5. Restart sensor service after sensor creation

Next Steps

  1. Run Tier 1 tests:

    pytest tests/e2e/tier1/ -v
    
  2. Check for any remaining issues:

    • Timer firing correctly
    • Events being created
    • Rules matching events
    • Executions being created
  3. If sensor service restart doesn't work automatically:

    • Manually restart sensor service before running timer tests
    • Or implement API endpoint for sensor reload (future enhancement)

Technical Notes

API Schema Migration

The Attune API has been updated to use a more consistent schema across all entities:

  • ref - Unique identifier (replaces legacy name/type)
  • label - Human-readable label
  • description - Longer description
  • All entities follow this pattern (triggers, sensors, actions, rules, packs)

Backward Compatibility

The client library maintains backward compatibility:

  • Old parameters (name, trigger_id, runner_type, etc.) still work
  • They are transparently converted to new schema
  • This allows existing test code to work with minimal changes

Sensor Service Reload

Currently requires service restart to load new sensors. Future improvements:

  • API endpoint for sensor reload (POST /api/v1/sensors/reload)
  • Database watcher to detect new sensors
  • Hot-reload capability in sensor service

Success Criteria

  • All imports resolved
  • No field name access errors
  • Client properly converts legacy parameters
  • Timer helpers create sensors consistently
  • Sensor service restart mechanism in place
  • 🔄 Tests run successfully (pending execution)