"""SQL rendering tests for participant/summary.sql and participant/summary_default.sql. Verifies that SOUND_RECORDING queries join against GLOBAL_SOUND_RECORDING to exclude ISRCs that have no corresponding GlobalSoundRecording node in Neo4j, and that no AccountingDummy filter exists in either template. """ import pytest from analytics.queries.participant_summary import ( ParticipantSummary, ParticipantSummaryDefault, ) from tests.unit.queries.test_macros import strip_sql BASE_PARAMS = { "global_participant_id": "016519b2-51fc-4a6a-9810-c2e403fe526d", "distributors": ["theorchard", "awal"], "permission_label_ids": [], "permission_artist_ids": [], "permission_subaccount_ids": [], "permission_label_participant_ids": [], } class TestParticipantSummaryGSRJoin: """participant/summary.sql — GSR join is present iff is_sound_recording=True.""" def _sql(self, mock_execute_orm, **overrides): params = {**BASE_PARAMS, **overrides} ParticipantSummary(params).execute() return strip_sql(mock_execute_orm.call_args[0][0]) def test_sound_recording_includes_gsr_join(self, mock_execute_orm): sql = self._sql( mock_execute_orm, is_sound_recording=True, group_by_column="isrc", ) assert "INNER JOIN GLOBAL_SOUND_RECORDING gsr ON gsr.isrc = s.isrc" in sql def test_sound_recording_gsr_join_present_in_both_ctes(self, mock_execute_orm): sql = self._sql( mock_execute_orm, is_sound_recording=True, group_by_column="isrc", ) # streams CTE and track_downloads CTE each get the join assert ( sql.count("INNER JOIN GLOBAL_SOUND_RECORDING gsr ON gsr.isrc = s.isrc") == 2 ) def test_non_sound_recording_omits_gsr_join(self, mock_execute_orm): sql = self._sql(mock_execute_orm, is_sound_recording=False) assert "GLOBAL_SOUND_RECORDING" not in sql def test_no_accounting_dummy_filter(self, mock_execute_orm): for is_sr in (True, False): sql = self._sql( mock_execute_orm, is_sound_recording=is_sr, group_by_column="isrc" if is_sr else "global_participant_id", ) assert "AccountingDummy" not in sql class TestParticipantSummaryDefaultGSRJoin: """participant/summary_default.sql — GSR join is present iff is_sound_recording=True.""" def _sql(self, mock_execute_orm, **overrides): params = {**BASE_PARAMS, **overrides} ParticipantSummaryDefault(params).execute() return strip_sql(mock_execute_orm.call_args[0][0]) def test_sound_recording_includes_gsr_join(self, mock_execute_orm): sql = self._sql(mock_execute_orm, is_sound_recording=True) assert "INNER JOIN GLOBAL_SOUND_RECORDING gsr ON gsr.isrc = s.isrc" in sql def test_non_sound_recording_omits_gsr_join(self, mock_execute_orm): sql = self._sql(mock_execute_orm, is_sound_recording=False) assert "GLOBAL_SOUND_RECORDING" not in sql def test_no_accounting_dummy_filter(self, mock_execute_orm): for is_sr in (True, False): sql = self._sql(mock_execute_orm, is_sound_recording=is_sr) assert "AccountingDummy" not in sql