from playlist.queries.time_series.placement_position_time_series_query import ( PlacementPositionTimeSeriesQuery, ) from tests.unit.utils import raises_validation_error isrc = "QZK6M1903348" isrc2 = "USHR12108509" def test_default_args(): q = PlacementPositionTimeSeriesQuery( {"isrc": isrc, "store_playlist_id": "aplaylistid", "store_id": "1"} ) params = q.query_params assert params["isrc"] == isrc assert params["store_id"] == "1" assert params["store_playlist_id"] == "aplaylistid" def test_invalid_keys_are_deleted(): q = PlacementPositionTimeSeriesQuery( { "isrc": isrc, "store_id": "1", "store_playlist_id": "aplaylistid", "storefront": "asd", "limit": 50, "offset": 100, "a": 1, "b": 2, } ) assert "a" not in q.query_params assert "b" not in q.query_params assert "isrc" in q.query_params assert "storefront" in q.query_params def test_missing_params(): with raises_validation_error( {"store_playlist_id": ["Missing data for required field."]} ): PlacementPositionTimeSeriesQuery({"isrc": isrc, "store_id": "1"}) with raises_validation_error({"_schema": ["Either 'isrc' or 'isrcs' is required"]}): PlacementPositionTimeSeriesQuery( {"store_playlist_id": "aplaylistid", "store_id": "1"} ) with raises_validation_error({"store_id": ["Missing data for required field."]}): PlacementPositionTimeSeriesQuery( {"isrc": isrc, "store_playlist_id": "aplaylistid"} ) def test_invalid_isrc(): with raises_validation_error({"isrc": ["String does not match expected pattern."]}): PlacementPositionTimeSeriesQuery( {"isrc": "AHHHHH", "store_playlist_id": "aplaylistid", "store_id": "1"} ) # Batch query tests def test_batch_with_isrcs(): """Test query with multiple ISRCs""" q = PlacementPositionTimeSeriesQuery( { "isrcs": [isrc, isrc2], "store_playlist_id": "aplaylistid", "store_id": "1", } ) params = q.query_params assert params["isrcs"] == [isrc, isrc2] assert params["store_id"] == "1" assert params["store_playlist_id"] == "aplaylistid" assert "isrc" not in params def test_batch_with_storefront(): """Test batch query with storefront parameter""" q = PlacementPositionTimeSeriesQuery( { "isrcs": [isrc, isrc2], "store_playlist_id": "aplaylistid", "store_id": "1", "storefront": "us", } ) params = q.query_params assert params["isrcs"] == [isrc, isrc2] assert params["store_id"] == "1" assert params["store_playlist_id"] == "aplaylistid" assert params["storefront"] == "us" assert "isrc" not in params def test_missing_both_isrc_and_isrcs(): """Test that query requires either isrc or isrcs""" with raises_validation_error({"_schema": ["Either 'isrc' or 'isrcs' is required"]}): PlacementPositionTimeSeriesQuery( {"store_playlist_id": "aplaylistid", "store_id": "1"} ) def test_both_isrc_and_isrcs_provided(): """Test that query rejects both isrc and isrcs""" with raises_validation_error( {"_schema": ["Provide either 'isrc' (single) or 'isrcs' (list), not both"]} ): PlacementPositionTimeSeriesQuery( { "isrc": isrc, "isrcs": [isrc, isrc2], "store_playlist_id": "aplaylistid", "store_id": "1", } ) def test_invalid_isrc_in_batch(): """Test that batch query validates ISRCs""" with raises_validation_error( {"isrcs": {1: ["String does not match expected pattern."]}} ): PlacementPositionTimeSeriesQuery( { "isrcs": [isrc, "INVALID"], "store_playlist_id": "aplaylistid", "store_id": "1", } ) def test_empty_isrcs_list(): """Test that batch query rejects empty isrcs list""" with raises_validation_error({"isrcs": ["Length must be between 1 and 1000."]}): PlacementPositionTimeSeriesQuery( { "isrcs": [], "store_playlist_id": "aplaylistid", "store_id": "1", } ) def test_isrcs_list_exceeds_max(): """Test that batch query rejects lists with more than 1000 ISRCs""" with raises_validation_error({"isrcs": ["Length must be between 1 and 1000."]}): PlacementPositionTimeSeriesQuery( { "isrcs": [isrc] * 1001, # 1001 ISRCs "store_playlist_id": "aplaylistid", "store_id": "1", } )