"""Tests for Track Business Logic Validation.""" import pytest from ows_product_physical.constant import validation from ows_product_physical.validation import track_validation @pytest.fixture def fixture_valid_track_set(): """A set of tracks that passes business logic validation.""" return [ { 'track_id': 1001, 'track_number': 1, 'disc': 1, 'isrc': 'MEX0001', 'upc': 12345 }, { 'track_id': 1002, 'track_number': 2, 'disc': 1, 'isrc': 'MEX0002', 'upc': 12345 }, { 'track_id': 1003, 'track_number': 3, 'disc': 1, 'isrc': 'MEX0003', 'upc': 12345 }, { 'track_id': 1004, 'track_number': 1, 'disc': 2, 'isrc': 'MEX0004', 'upc': 12345 }, { 'track_id': 1005, 'track_number': 2, 'disc': 2, 'isrc': 'MEX0005', 'upc': 12345 }, { 'track_id': 1006, 'track_number': 3, 'disc': 2, 'isrc': 'MEX0006', 'upc': 12345 }, ] def test_track_validation_database_state_success(fixture_valid_track_set): """Test tracks in valid state.""" validation_response = track_validation.validate_database_state( fixture_valid_track_set) assert validation_response.status == 200 def test_track_validation_database_state_success_shuffled( fixture_valid_track_set): """Test tracks in valid state, shuffled.""" shuffled = [fixture_valid_track_set[i] for i in [3, 2, 5, 0, 1, 4]] validation_response = track_validation.validate_database_state( shuffled) assert validation_response.status == 200 def test_track_validation_database_state_isrc_duplicate( fixture_valid_track_set): """Cannot have 2 tracks on disc with the same ISRC.""" mutated_set = fixture_valid_track_set mutated_set[5]['isrc'] = mutated_set[0]['isrc'] validation_response = track_validation.validate_database_state( mutated_set) assert validation_response.status == 400 assert validation_response.errors.get( 'message') == validation.ISRC_UNIQUE_MSG def test_track_validation_database_state_unique_combo( fixture_valid_track_set): """Test tracks with with the same track number.""" mutated_set = fixture_valid_track_set mutated_set[5]['track_number'] = 1 validation_response = track_validation.validate_database_state( mutated_set) assert validation_response.status == 400 assert validation_response.errors.get( 'message') == validation.TRACKS_UNIQUE_MSG def test_track_validation_database_state_sequence_error( fixture_valid_track_set): """Test non sequenced tracks numbers.""" mutated_set = fixture_valid_track_set mutated_set[5]['track_number'] = 4 validation_response = track_validation.validate_database_state( mutated_set) assert validation_response.status == 400 assert validation_response.errors.get( 'message') == validation.SEQUENCE_INTEGRITY_MSG def test_disc_validation_database_state_sequence_error( fixture_valid_track_set): """Test non sequenced disc numbers.""" mutated_set = fixture_valid_track_set mutated_set[5]['disc'] = 5 validation_response = track_validation.validate_database_state( mutated_set) assert validation_response.status == 400 assert validation_response.errors.get( 'message') == validation.SEQUENCE_DISC_INTEGRITY_MSG def test_track_validation_with_null_isrcs(fixture_valid_track_set): """Test tracks without isrcs.""" mutated_set = fixture_valid_track_set mutated_set[4]['isrc'] = None mutated_set[5]['isrc'] = None validation_response = track_validation.validate_database_state( mutated_set) assert validation_response.status == 200 def test_track_validation_with_empty_tracks(): """Test empty list of tracks.""" validation_response = track_validation.validate_database_state( []) assert validation_response.status == 200 def test_track_sides(): """Test list of tracks with sides.""" tracks_with_sides = [ { 'track_id': 1001, 'track_number': 1, 'disc': 1, 'side': 1, }, { 'track_id': 1002, 'track_number': 2, 'disc': 1, 'side': 1, }, { 'track_id': 1003, 'track_number': 1, 'disc': 1, 'side': 2, }, { 'track_id': 1004, 'track_number': 1, 'disc': 2, 'side': 1, }, { 'track_id': 1005, 'track_number': 2, 'disc': 2, 'side': 1, }, { 'track_id': 1006, 'track_number': 1, 'disc': 2, 'side': 2, }, ] validation_response = track_validation.validate_database_state( tracks_with_sides) assert validation_response.status == 200