"""Tests for the track_additional_isrc dual-write mirror helpers.""" from datetime import datetime from backend.connectors import mysql from backend.models import track_additional_isrc from backend.models.track_additional_isrc import TrackAdditionalIsrc from backend.models.track_additional_isrc import TrackAdditionalIsrcType from tests.testutils import db def _rows_for(track_id): """Plain-dict snapshot of every track_additional_isrc row for a track.""" with mysql.db_session() as session: return [ {'isrc': row.isrc, 'type': row.type, 'deleted_at': row.deleted_at} for row in session.query(TrackAdditionalIsrc).filter( TrackAdditionalIsrc.track_id == track_id).all() ] @db.test_schema_no_seed def test_mirror_create_inserts_active_atmos_row(): """A first mirror write inserts one active atmos row carrying the type.""" with mysql.db_session() as session: track_additional_isrc.mirror_create_or_restore( {'track_id': 100, 'isrc': 'US1234567890'}, session) rows = _rows_for(100) assert len(rows) == 1 assert rows[0]['type'] == 'atmos' assert rows[0]['isrc'] == 'US1234567890' assert rows[0]['deleted_at'] is None @db.test_schema_no_seed def test_mirror_create_restores_and_updates_soft_deleted_row(): """Mirroring a re-create restores the soft-deleted row and matches the new ISRC (the old table is authoritative; the new table tracks it), never inserting a second row.""" db.merge_model_objects([ TrackAdditionalIsrc( track_id=100, type=TrackAdditionalIsrcType.ATMOS, isrc='US1234567890', deleted_at=datetime(2026, 1, 1)), ]) with mysql.db_session() as session: track_additional_isrc.mirror_create_or_restore( {'track_id': 100, 'isrc': 'USNEW1234567'}, session) rows = _rows_for(100) assert len(rows) == 1 assert rows[0]['deleted_at'] is None assert rows[0]['isrc'] == 'USNEW1234567' @db.test_schema_no_seed def test_mirror_soft_delete_sets_deleted_at_keeping_row(): """Mirroring a delete sets deleted_at without removing the row.""" with mysql.db_session() as session: track_additional_isrc.mirror_create_or_restore( {'track_id': 100, 'isrc': 'US1234567890'}, session) with mysql.db_session() as session: track_additional_isrc.mirror_soft_delete(100, session) rows = _rows_for(100) assert len(rows) == 1 assert rows[0]['deleted_at'] is not None @db.test_schema_no_seed def test_mirror_soft_delete_no_active_row_is_noop(): """Mirroring a delete for a track with no active atmos row does nothing.""" with mysql.db_session() as session: track_additional_isrc.mirror_soft_delete(999, session) assert _rows_for(999) == [] @db.test_schema_no_seed def test_get_atmos_isrc_returns_isrc_when_present(): """get_atmos_isrc returns the track's atmos ISRC.""" db.merge_model_objects([ TrackAdditionalIsrc( track_id=100, type=TrackAdditionalIsrcType.ATMOS, isrc='US1234567890'), ]) result = track_additional_isrc.get_atmos_isrc(100) assert result.message == 'US1234567890' @db.test_schema_no_seed def test_get_atmos_isrc_reuses_soft_deleted_isrc(): """get_atmos_isrc returns the ISRC even when the row is soft-deleted (permanent).""" db.merge_model_objects([ TrackAdditionalIsrc( track_id=100, type=TrackAdditionalIsrcType.ATMOS, isrc='US1234567890', deleted_at=datetime(2026, 1, 1)), ]) result = track_additional_isrc.get_atmos_isrc(100) assert result.message == 'US1234567890' @db.test_schema_no_seed def test_get_atmos_isrc_returns_none_when_absent(): """get_atmos_isrc returns a None message when the track has no atmos ISRC.""" result = track_additional_isrc.get_atmos_isrc(999) assert result.message is None