"""Test ISRC Utilities.""" from unittest.mock import MagicMock from unittest.mock import patch import pytest from royalties.isrc import allocate_track_isrc from royalties.isrc import get_track_id_list from royalties.isrc import get_unused_isrc from royalties.isrc import reserve_isrc EXPECTED_FIND_SQL = """ SELECT t.`id` FROM `accountingflat`.`dig_sales_detail` d INNER JOIN `art_relations`.`track` t ON d.`upc` = t.`upc` AND d.`cd` = t.`cd` AND d.`track_id` = t.`track_id` WHERE (d.`cd` <> 0 AND d.`track_id` <> 0) AND t.`isrc` IS NULL """ EXPECTED_UPDATE_SQL = """ UPDATE `track` SET `isrc` = 'abc' WHERE `id` = 1 AND `isrc` IS NULL """ EXPECTED_ISRC_SQL = """ SELECT i.`isrc` FROM `isrcs` i WHERE i.`status` = 'unused' AND SUBSTRING(i.`isrc`, 6, 2) = '22' LIMIT 1 """ @patch('royalties.isrc.reserve_isrc', return_value='abc') def test_isrc_allocate_track_isrc(mock_reserve): """Test allocate_track_isrc.""" mock_cursor = MagicMock() allocate_track_isrc(mock_cursor, 1) assert mock_reserve.call_args[0][0] == mock_cursor assert mock_cursor.execute.call_args[0][0] == EXPECTED_UPDATE_SQL def test_isrc_get_track_id_list(): """Test get_track_id_list.""" mock_cursor = MagicMock() mock_cursor.fetchall.return_value = 'abc' track_list = get_track_id_list(mock_cursor) assert track_list == 'abc' assert mock_cursor.execute.call_args[0][0] == EXPECTED_FIND_SQL def test_isrc_reserve_isrc_max_retry(): """Test reserve_isrc with no more retries.""" mock_cursor = MagicMock() with pytest.raises(Exception): reserve_isrc(mock_cursor, 0) def test_isrc_reserve_isrc_no_result(): """Test reserve_isrc with no available ISRCs.""" mock_cursor = MagicMock() mock_cursor.fetchone.return_value = () with pytest.raises(Exception): reserve_isrc(mock_cursor) assert mock_cursor.execute.call_args[0][0] == EXPECTED_ISRC_SQL @patch('royalties.isrc.get_unused_isrc', return_value='abc') def test_isrc_reserve_isrc_with_retry(_): """Test reserve_isrc with retries.""" mock_cursor = MagicMock() mock_cursor.rowcount = 0 with pytest.raises(Exception) as e: reserve_isrc(mock_cursor) assert str(e) == 'Maximum ISRC fetch retries reached' @patch('royalties.isrc.get_unused_isrc', return_value='abc') def test_isrc_reserve_isrc_success(_): """Test reserve_isrc.""" mock_cursor = MagicMock() mock_cursor.rowcount = 1 actual = reserve_isrc(mock_cursor) assert actual == 'abc' def test_isrc_get_unused_isrc(): """Test get_unused_isrc.""" mock_cursor = MagicMock() mock_cursor.fetchone.return_value = ('abc',) result = get_unused_isrc(mock_cursor) assert mock_cursor.execute.call_args[0][0] == EXPECTED_ISRC_SQL assert result == 'abc' def test_isrc_get_unused_isrc_no_isrcs(): """Test get_unused_isrc when no ISRCs are available.""" mock_cursor = MagicMock() mock_cursor.fetchone.return_value = () with pytest.raises(Exception): get_unused_isrc(mock_cursor)