Files
gridpilot.gg/tests/integration/media/IMPLEMENTATION_NOTES.md
Marc Mintel 597bb48248
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 4m51s
Contract Testing / contract-snapshot (pull_request) Has been skipped
integration tests
2026-01-22 17:29:06 +01:00

8.4 KiB

Media Integration Tests - Implementation Notes

Overview

This document describes the implementation of integration tests for media functionality in the GridPilot project.

Implemented Tests

Avatar Management Integration Tests

File: avatar-management.integration.test.ts

Tests Implemented:

  • GetAvatarUseCase - Success Path
    • Retrieves driver avatar when avatar exists
    • Returns AVATAR_NOT_FOUND when driver has no avatar
  • GetAvatarUseCase - Error Handling
    • Handles repository errors gracefully
  • UpdateAvatarUseCase - Success Path
    • Updates existing avatar for a driver
    • Updates avatar when driver has no existing avatar
  • UpdateAvatarUseCase - Error Handling
    • Handles repository errors gracefully
  • RequestAvatarGenerationUseCase - Success Path
    • Requests avatar generation from photo
    • Requests avatar generation with default style
  • RequestAvatarGenerationUseCase - Validation
    • Rejects generation with invalid face photo
  • SelectAvatarUseCase - Success Path
    • Selects a generated avatar
  • SelectAvatarUseCase - Error Handling
    • Rejects selection when request does not exist
    • Rejects selection when request is not completed
  • GetUploadedMediaUseCase - Success Path
    • Retrieves uploaded media
    • Returns null when media does not exist
  • DeleteMediaUseCase - Success Path
    • Deletes media file
  • DeleteMediaUseCase - Error Handling
    • Returns MEDIA_NOT_FOUND when media does not exist

Use Cases Tested:

  • GetAvatarUseCase - Retrieves driver avatar
  • UpdateAvatarUseCase - Updates an existing avatar for a driver
  • RequestAvatarGenerationUseCase - Requests avatar generation from a photo
  • SelectAvatarUseCase - Selects a generated avatar
  • GetUploadedMediaUseCase - Retrieves uploaded media
  • DeleteMediaUseCase - Deletes media files

In-Memory Adapters Created:

  • InMemoryAvatarRepository - Stores avatar entities in memory
  • InMemoryAvatarGenerationRepository - Stores avatar generation requests in memory
  • InMemoryMediaRepository - Stores media entities in memory
  • InMemoryMediaStorageAdapter - Simulates file storage in memory
  • InMemoryFaceValidationAdapter - Simulates face validation in memory
  • InMemoryImageServiceAdapter - Simulates image service in memory
  • InMemoryMediaEventPublisher - Stores domain events in memory

Placeholder Tests

The following test files remain as placeholders because they reference domains that are not part of the core/media directory:

Category Icon Management

File: category-icon-management.integration.test.ts

Status: Placeholder - Not implemented

Reason: Category icon management would be part of the core/categories domain, not core/media. The test placeholders reference use cases like GetCategoryIconsUseCase, UploadCategoryIconUseCase, etc., which would be implemented in the categories domain.

League Media Management

File: league-media-management.integration.test.ts

Status: Placeholder - Not implemented

Reason: League media management would be part of the core/leagues domain, not core/media. The test placeholders reference use cases like GetLeagueMediaUseCase, UploadLeagueCoverUseCase, etc., which would be implemented in the leagues domain.

Sponsor Logo Management

File: sponsor-logo-management.integration.test.ts

Status: Placeholder - Not implemented

Reason: Sponsor logo management would be part of the core/sponsors domain, not core/media. The test placeholders reference use cases like GetSponsorLogosUseCase, UploadSponsorLogoUseCase, etc., which would be implemented in the sponsors domain.

Team Logo Management

File: team-logo-management.integration.test.ts

Status: Placeholder - Not implemented

Reason: Team logo management would be part of the core/teams domain, not core/media. The test placeholders reference use cases like GetTeamLogosUseCase, UploadTeamLogoUseCase, etc., which would be implemented in the teams domain.

Track Image Management

File: track-image-management.integration.test.ts

Status: Placeholder - Not implemented

Reason: Track image management would be part of the core/tracks domain, not core/media. The test placeholders reference use cases like GetTrackImagesUseCase, UploadTrackImageUseCase, etc., which would be implemented in the tracks domain.

Architecture Compliance

Core Layer (Business Logic)

Compliant: All tests focus on Core Use Cases only

  • Tests use In-Memory adapters for repositories and event publishers
  • Tests follow Given/When/Then pattern for business logic scenarios
  • Tests verify Use Case orchestration (interaction between Use Cases and their Ports)
  • Tests do NOT test HTTP endpoints, DTOs, or Presenters

Adapters Layer (Infrastructure)

Compliant: In-Memory adapters created for testing

  • InMemoryAvatarRepository implements AvatarRepository port
  • InMemoryMediaRepository implements MediaRepository port
  • InMemoryMediaStorageAdapter implements MediaStoragePort port
  • InMemoryFaceValidationAdapter implements FaceValidationPort port
  • InMemoryImageServiceAdapter implements ImageServicePort port
  • InMemoryMediaEventPublisher stores domain events for verification

Test Framework

Compliant: Using Vitest as specified

  • All tests use Vitest's describe, it, expect, beforeAll, beforeEach
  • Tests are asynchronous and use async/await
  • Tests verify both success paths and error handling

Observations

Media Implementation Structure

The core/media directory contains:

  • Domain Layer: Entities (Avatar, Media, AvatarGenerationRequest), Value Objects (AvatarId, MediaUrl), Repositories (AvatarRepository, MediaRepository, AvatarGenerationRepository)
  • Application Layer: Use Cases (GetAvatarUseCase, UpdateAvatarUseCase, RequestAvatarGenerationUseCase, SelectAvatarUseCase, GetUploadedMediaUseCase, DeleteMediaUseCase), Ports (MediaStoragePort, AvatarGenerationPort, FaceValidationPort, ImageServicePort)

Missing Use Cases

The placeholder tests reference use cases that don't exist in the core/media directory:

  • UploadAvatarUseCase - Not found (likely part of a different domain)
  • DeleteAvatarUseCase - Not found (likely part of a different domain)
  • GenerateAvatarFromPhotoUseCase - Not found (replaced by RequestAvatarGenerationUseCase + SelectAvatarUseCase)

Domain Boundaries

The media functionality is split across multiple domains:

  • core/media: Avatar management and general media management
  • core/categories: Category icon management (not implemented)
  • core/leagues: League media management (not implemented)
  • core/sponsors: Sponsor logo management (not implemented)
  • core/teams: Team logo management (not implemented)
  • core/tracks: Track image management (not implemented)

Each domain would have its own media-related use cases and repositories, following the same pattern as the core/media domain.

Recommendations

  1. For categories, leagues, sponsors, teams, and tracks domains:

    • Create similar integration tests in their respective test directories
    • Follow the same pattern as avatar-management.integration.test.ts
    • Use In-Memory adapters for repositories and event publishers
    • Test Use Case orchestration only, not HTTP endpoints
  2. For missing use cases:

    • If UploadAvatarUseCase and DeleteAvatarUseCase are needed, they should be implemented in the appropriate domain
    • The current implementation uses UpdateAvatarUseCase and DeleteMediaUseCase instead
  3. For event publishing:

    • The current implementation uses InMemoryMediaEventPublisher for testing
    • In production, a real event publisher would be used
    • Events should be published for all significant state changes (avatar uploaded, avatar updated, media deleted, etc.)

Conclusion

The integration tests for avatar management have been successfully implemented following the architecture requirements:

  • Tests Core Use Cases directly
  • Use In-Memory adapters for repositories and event publishers
  • Test Use Case orchestration (interaction between Use Cases and their Ports)
  • Follow Given/When/Then pattern for business logic scenarios
  • Do NOT test HTTP endpoints, DTOs, or Presenters

The placeholder tests for category, league, sponsor, team, and track media management remain as placeholders because they belong to different domains and would need to be implemented in their respective test directories.