NhanNguyen1309/audio-separation-api
0
1from pathlib import Path2from unittest import mock3import tempfile4import unittest5 6from app.errors import ApiError7from app.separation_validation import validate_separation_outputs8 9 10class SeparationValidationTests(unittest.TestCase):11 def test_missing_required_output_is_rejected(self):12 with tempfile.TemporaryDirectory() as temp_dir:13 vocals = Path(temp_dir) / "vocals.wav"14 vocals.write_bytes(b"x" * 2048)15 16 with self.assertRaises(ApiError) as raised:17 validate_separation_outputs(18 {"vocals": vocals, "instrumental": Path(temp_dir) / "instrumental.wav"},19 input_duration_sec=10.0,20 )21 22 self.assertIn("instrumental.wav", raised.exception.message)23 24 def test_duration_mismatch_is_rejected(self):25 with tempfile.TemporaryDirectory() as temp_dir:26 vocals = Path(temp_dir) / "vocals.wav"27 instrumental = Path(temp_dir) / "instrumental.wav"28 vocals.write_bytes(b"x" * 2048)29 instrumental.write_bytes(b"x" * 2048)30 31 with (32 mock.patch("app.separation_validation.ensure_decodable"),33 mock.patch("app.separation_validation.probe_duration_seconds", return_value=15.0),34 self.assertRaises(ApiError) as raised,35 ):36 validate_separation_outputs(37 {"vocals": vocals, "instrumental": instrumental},38 input_duration_sec=10.0,39 )40 41 self.assertIn("duration", raised.exception.message)42 43 def test_valid_outputs_are_returned(self):44 with tempfile.TemporaryDirectory() as temp_dir:45 vocals = Path(temp_dir) / "vocals.wav"46 instrumental = Path(temp_dir) / "instrumental.wav"47 vocals.write_bytes(b"x" * 2048)48 instrumental.write_bytes(b"x" * 2048)49 50 with (51 mock.patch("app.separation_validation.ensure_decodable"),52 mock.patch("app.separation_validation.probe_duration_seconds", return_value=10.5),53 ):54 outputs = validate_separation_outputs(55 {"vocals": vocals, "instrumental": instrumental},56 input_duration_sec=10.0,57 )58 59 self.assertEqual(outputs["vocals"], vocals)60 self.assertEqual(outputs["instrumental"], instrumental)61 62 63if __name__ == "__main__":64 unittest.main()65 