"""Unit tests for Promo Player logic.""" from unittest.mock import MagicMock from promo_player.constants import promo_player as promo_player_constants from promo_player.logic import promo_player from promo_player.models import promo_player as promo_player_model from promo_player.models import promo_player_track as promo_player_track_model def test_generate_code(): """Test that a 20 characters string can be generated.""" result = promo_player.generate_code() assert type(result) is str assert len(result) == 20 def test_create( monkeypatch, fixture_promo_player_code, fixture_promo_player_response, fixture_fatal): """Test creating a promo player.""" monkeypatch.setattr( promo_player, 'get_active_by_product_id', MagicMock(return_value=fixture_fatal)) monkeypatch.setattr( promo_player, 'generate_code', MagicMock(return_value=fixture_promo_player_code)) monkeypatch.setattr( promo_player_model, 'create', MagicMock(return_value=fixture_promo_player_response)) data = { 'product_id': 4, 'vendor_id': 5, 'expiration_mode': promo_player_constants.EXPIRATION_MODE_NONE, 'skin': promo_player_constants.SKIN_LIGHT } result = promo_player.create(data) assert result assert result.message == fixture_promo_player_response.message def test_create_active( monkeypatch, fixture_promo_player_code, fixture_promo_player_response, fixture_success): """Test creating a promo player when there is already an active one.""" monkeypatch.setattr( promo_player, 'get_active_by_product_id', MagicMock(return_value=fixture_promo_player_response)) monkeypatch.setattr( promo_player, 'update', MagicMock(return_value=fixture_success)) monkeypatch.setattr( promo_player, 'generate_code', MagicMock(return_value=fixture_promo_player_code)) monkeypatch.setattr( promo_player_model, 'create', MagicMock(return_value=fixture_promo_player_response)) data = { 'product_id': 4, 'vendor_id': 5, 'expiration_mode': promo_player_constants.EXPIRATION_MODE_NONE, 'skin': promo_player_constants.SKIN_LIGHT } expected_update_data = { 'promo_player_id': 1, 'product_id': 4, 'active': False } result = promo_player.create(data) promo_player.update.assert_called_with(expected_update_data) assert result assert result.message == fixture_promo_player_response.message def test_create_without_product( monkeypatch, fixture_promo_player_code, fixture_promo_player_response, fixture_success): """Test creating a promo player without a product_id.""" monkeypatch.setattr( promo_player, 'generate_code', MagicMock(return_value=fixture_promo_player_code)) monkeypatch.setattr( promo_player_model, 'create', MagicMock(return_value=fixture_promo_player_response)) data = { 'vendor_id': 5, 'expiration_mode': promo_player_constants.EXPIRATION_MODE_NONE, 'skin': promo_player_constants.SKIN_LIGHT } result = promo_player.create(data) assert result assert result.message == fixture_promo_player_response.message def test_get_active_by_product_id( monkeypatch, fixture_promo_player_response, fixture_promo_player_with_tracks_response): """Test retrieving the active promo player for a product.""" monkeypatch.setattr( promo_player_model, 'get_active_by_product_id', MagicMock(return_value=fixture_promo_player_response)) monkeypatch.setattr( promo_player, 'get_tracks_for_promo_player', MagicMock(return_value=fixture_promo_player_with_tracks_response)) product_id = 1 result = promo_player.get_active_by_product_id(product_id) promo_player.get_tracks_for_promo_player.assert_called_with( fixture_promo_player_response) assert result assert result.message == fixture_promo_player_with_tracks_response.message def test_update(monkeypatch, fixture_promo_player_response): """Test updating a promo player.""" monkeypatch.setattr( promo_player_model, 'update', MagicMock(return_value=fixture_promo_player_response)) data = { 'promo_player_id': 1, 'active': False } result = promo_player.update(data) assert result assert result.message == fixture_promo_player_response.message def test_get_by_product_id(monkeypatch, fixture_promo_players_response): """Test retrieving promo players by product_id.""" monkeypatch.setattr( promo_player_model, 'get_by_product_id', MagicMock(return_value=fixture_promo_players_response)) product_id = 2 result = promo_player.get_by_product_id(product_id) assert result assert result.message == fixture_promo_players_response.message def test_get_by_vendor_id(monkeypatch, fixture_promo_players_response): """Test retrieving promo players by vendor_id.""" monkeypatch.setattr( promo_player_model, 'get_by_vendor_id', MagicMock(return_value=fixture_promo_players_response)) vendor_id = 3 result = promo_player.get_by_vendor_id(vendor_id) assert result assert result.message == fixture_promo_players_response.message def test_get_by_code( monkeypatch, fixture_promo_player_response, fixture_promo_player_with_tracks_response): """Test retrieving a promo player by code.""" monkeypatch.setattr( promo_player_model, 'get_by_code', MagicMock(return_value=fixture_promo_player_response)) monkeypatch.setattr( promo_player, 'get_tracks_for_promo_player', MagicMock(return_value=fixture_promo_player_with_tracks_response)) code = '0123456789abcdefghij' result = promo_player.get_by_code(code) promo_player.get_tracks_for_promo_player.assert_called_with( fixture_promo_player_response) assert result assert result.message == fixture_promo_player_with_tracks_response.message def test_delete_by_product_id(monkeypatch, fixture_promo_players_response): """Test deleting promo players by product_id.""" monkeypatch.setattr( promo_player_model, 'delete_by_product_id', MagicMock(return_value=fixture_promo_players_response)) product_id = 3 result = promo_player.delete_by_product_id(product_id) assert result assert result.message == fixture_promo_players_response.message def test_get_tracks_for_promo_player( monkeypatch, fixture_promo_player_response, fixture_promo_player_tracks_response): """Test retrieving tracks for a promo player.""" monkeypatch.setattr( promo_player_track_model, 'get_by_promo_player_id', MagicMock(return_value=fixture_promo_player_tracks_response)) result = promo_player.get_tracks_for_promo_player( fixture_promo_player_response) expected_message = fixture_promo_player_response.message expected_message['tracks'] = fixture_promo_player_tracks_response.message[ 'items'] promo_player_track_model.get_by_promo_player_id.assert_called_with( fixture_promo_player_response.message['promo_player_id']) assert result assert result.message == expected_message def test_get_tracks_for_promo_player_no_promo_player( monkeypatch, fixture_fatal, fixture_promo_player_tracks_response): """Test that an error is returned if no promo player.""" result = promo_player.get_tracks_for_promo_player(fixture_fatal) assert not result assert result.status == fixture_fatal.status def test_get_tracks_for_promo_player_no_tracks( monkeypatch, fixture_fatal, fixture_promo_player_response): """Test that an error is returned if no tracks.""" monkeypatch.setattr( promo_player_track_model, 'get_by_promo_player_id', MagicMock(return_value=fixture_fatal)) result = promo_player.get_tracks_for_promo_player( fixture_promo_player_response) promo_player_track_model.get_by_promo_player_id.assert_called_with( fixture_promo_player_response.message['promo_player_id']) assert not result assert result.status == fixture_fatal.status