Files
attune/work-summary/sessions/2026-01-22-e2e-test-import-fix.md
2026-02-04 17:46:30 -06:00

8.7 KiB

E2E Test Import and Client Method Fix - Session Summary

Date: 2026-01-22
Duration: ~30 minutes
Status: COMPLETE

Overview

Fixed import errors and missing client methods affecting 11 E2E test files across Tier 1 and Tier 3 test suites. Added missing helper functions, updated exports, and implemented missing AttuneClient methods to ensure all 151 tests collect successfully.

Problems

Problem 1: Missing Helper Functions

Multiple E2E test files failed to import with ImportError exceptions:

Affected Tests (8 files):

  • tests/e2e/tier1/test_t1_02_date_timer.py - Missing timestamp_future
  • tests/e2e/tier1/test_t1_08_action_failure.py - Missing create_failing_action
  • tests/e2e/tier3/test_t3_07_complex_workflows.py - Missing wait_for_execution_completion
  • tests/e2e/tier3/test_t3_08_chained_webhooks.py - Missing wait_for_execution_completion
  • tests/e2e/tier3/test_t3_09_multistep_approvals.py - Missing wait_for_execution_completion
  • tests/e2e/tier3/test_t3_14_execution_notifications.py - Missing wait_for_execution_completion
  • tests/e2e/tier3/test_t3_17_container_runner.py - Missing wait_for_execution_completion
  • tests/e2e/tier3/test_t3_21_log_size_limits.py - Missing wait_for_execution_completion

Root Causes:

  1. Missing Function: Tests were importing wait_for_execution_completion() which didn't exist in helpers/polling.py
  2. Missing Exports: Several helper functions existed but weren't exported from helpers/__init__.py

Problem 2: Missing Client Methods

Three additional test files failed with AttributeError and TypeError:

Affected Tests (3 files):

  • tests/e2e/tier3/test_t3_11_system_packs.py - AttributeError: 'AttuneClient' object has no attribute 'create_pack'
  • tests/e2e/tier3/test_t3_20_secret_injection.py (2 tests) - TypeError: AttuneClient.create_secret() got an unexpected keyword argument 'encrypted'

Root Causes:

  1. Missing Method: AttuneClient.create_pack() method didn't exist
  2. Incorrect Signature: create_secret() method had wrong parameters (API uses /api/v1/keys endpoint with different schema)

Solutions

1. Added wait_for_execution_completion() Function

File: tests/helpers/polling.py

def wait_for_execution_completion(
    client: AttuneClient,
    execution_id: int,
    timeout: float = 30.0,
    poll_interval: float = 0.5,
) -> dict:
    """
    Wait for execution to complete (reach terminal status)
    
    Terminal statuses are: succeeded, failed, canceled, timeout
    """

Purpose: Convenience wrapper that waits for an execution to reach any terminal status, without needing to specify which one.

2. Updated Helper Exports

File: tests/helpers/__init__.py

Added Polling Utility Exports:

  • wait_for_execution_completion - NEW: Wait for execution to complete
  • wait_for_enforcement_count - Wait for enforcement count thresholds
  • wait_for_inquiry_count - Wait for inquiry count thresholds
  • wait_for_inquiry_status - Wait for inquiry status changes

Added Fixture Creator Exports:

  • timestamp_future - Generate future timestamps for timer tests
  • create_failing_action - Create actions that intentionally fail
  • create_sleep_action - Create actions with sleep duration
  • create_timer_automation - Complete timer automation setup
  • create_webhook_automation - Complete webhook automation setup

3. Added create_pack() Method to AttuneClient

File: tests/helpers/client.py

New Method:

def create_pack(
    self,
    pack_data: Dict[str, Any] = None,
    ref: str = None,
    label: str = None,
    version: str = "1.0.0",
    description: str = None,
    conf_schema: Dict[str, Any] = None,
    config: Dict[str, Any] = None,
    meta: Dict[str, Any] = None,
    tags: List[str] = None,
    **kwargs,
) -> Dict[str, Any]

Features:

  • Accepts either a dict (pack_data) or keyword arguments for flexibility
  • Maps name to label for backwards compatibility
  • Sends request to POST /api/v1/packs

4. Fixed create_secret() Method Signature

File: tests/helpers/client.py

Updated Method:

def create_secret(
    self,
    key: str = None,
    value: str = None,
    name: str = None,
    encrypted: bool = True,
    owner_type: str = "system",
    owner: str = None,
    owner_identity: int = None,
    owner_pack: int = None,
    owner_pack_ref: str = None,
    owner_action: int = None,
    owner_action_ref: str = None,
    owner_sensor: int = None,
    owner_sensor_ref: str = None,
    **kwargs,
) -> Dict[str, Any]

Changes:

  • Added encrypted parameter (defaults to True)
  • Added all owner-related parameters to match API schema
  • Changed endpoint from /api/v1/secrets to /api/v1/keys
  • Maps key parameter to ref field in API request
  • Handles legacy kwargs for backwards compatibility

Results

Before:

ERROR e2e/tier1/test_t1_02_date_timer.py
ERROR e2e/tier1/test_t1_08_action_failure.py
ERROR e2e/tier3/test_t3_07_complex_workflows.py
ERROR e2e/tier3/test_t3_08_chained_webhooks.py
ERROR e2e/tier3/test_t3_09_multistep_approvals.py
ERROR e2e/tier3/test_t3_14_execution_notifications.py
ERROR e2e/tier3/test_t3_17_container_runner.py
ERROR e2e/tier3/test_t3_21_log_size_limits.py

After (Phase 1 - Helper Functions):

========================= 151 tests collected in 0.14s =========================

All import errors resolved

After (Phase 2 - Client Methods):

========================= 151 tests collected in 0.13s =========================

All tests collect successfully with no errors

Test Coverage Summary

Total E2E Tests: 151

  • Tier 1 (Core Flows): 34 tests
  • Tier 2 (Orchestration): 50 tests
  • Tier 3 (Advanced): 67 tests

Status: All tests can now be imported and collected. Tests are ready to run when services are available.

Files Modified

  1. tests/helpers/polling.py

    • Added wait_for_execution_completion() function (41 lines)
  2. tests/helpers/__init__.py

    • Added 10 missing exports to __all__ list
    • Organized imports by category (polling, fixtures)
  3. tests/helpers/client.py

    • Added create_pack() method (30 lines)
    • Updated create_secret() method signature with 10+ new parameters
    • Fixed endpoint from /api/v1/secrets to /api/v1/keys
  4. work-summary/PROBLEM.md

    • Documented both issues and resolutions
  5. CHANGELOG.md

    • Added entries for E2E test fixes

Lessons Learned

  1. Helper Function Consistency: When creating test helper functions, ensure they're properly exported from __init__.py

  2. Common Patterns: The wait_for_execution_completion() function is a common pattern - it's often more convenient than specifying exact terminal statuses

  3. Import Verification: After adding new test files, verify imports work by running pytest --collect-only before trying to execute tests

  4. Documentation: Keep helper function exports organized and well-documented for easy discovery

Next Steps

  1. All import issues resolved
  2. 🎯 Tests ready for execution when services are running
  3. 📋 No remaining import or collection errors
  4. 🚀 E2E test infrastructure is complete and stable

Technical Details

API Schema Alignment

The create_secret() fix revealed that the API uses a "keys" data model, not "secrets":

  • Endpoint: /api/v1/keys (not /api/v1/secrets)
  • DTO: CreateKeyRequest with fields: ref, name, value, encrypted, owner_type, plus optional owner fields
  • Response: KeyResponse with full key metadata

The client method maintains backwards compatibility by:

  • Accepting key parameter and mapping it to ref in the API
  • Providing sensible defaults (encrypted=True, owner_type="system")
  • Ignoring deprecated parameters like description (not in API schema)

Pack Creation Flexibility

The create_pack() method supports two calling styles:

Style 1: Dict parameter

pack_data = {"ref": "mypack", "name": "My Pack", "version": "1.0.0"}
client.create_pack(pack_data)

Style 2: Keyword arguments

client.create_pack(ref="mypack", label="My Pack", version="1.0.0")

This flexibility accommodates different test patterns across the test suite.

Impact

  • Developer Experience: Tests can now be imported and discovered properly
  • CI/CD Readiness: Test collection phase will no longer fail
  • Test Maintainability: Helper functions are consistently accessible
  • Code Quality: Test infrastructure is complete and professional

Session Outcome: SUCCESS
Tests Fixed: 11 files, 151 total tests now collecting
Methods Added/Fixed: 2 (create_pack, create_secret)
Time Spent: 30 minutes
Blocker Status: RESOLVED