teachingAssistant / tests /unit /application /dtos /test_audio_upload_dto.py
Michael Hu
Create unit tests for application layer
acd758a
"""Unit tests for AudioUploadDto"""
import pytest
import os
from src.application.dtos.audio_upload_dto import AudioUploadDto
class TestAudioUploadDto:
"""Test cases for AudioUploadDto"""
def test_valid_audio_upload_dto(self):
"""Test creating a valid AudioUploadDto"""
filename = "test_audio.wav"
content = b"fake_audio_content_" + b"x" * 1000 # 1KB+ of fake audio
content_type = "audio/wav"
dto = AudioUploadDto(
filename=filename,
content=content,
content_type=content_type
)
assert dto.filename == filename
assert dto.content == content
assert dto.content_type == content_type
assert dto.size == len(content)
def test_audio_upload_dto_with_explicit_size(self):
"""Test creating AudioUploadDto with explicit size"""
filename = "test_audio.mp3"
content = b"fake_audio_content_" + b"x" * 2000
content_type = "audio/mpeg"
size = 2500
dto = AudioUploadDto(
filename=filename,
content=content,
content_type=content_type,
size=size
)
assert dto.size == size # Should use explicit size, not calculated
def test_empty_filename_validation(self):
"""Test validation with empty filename"""
with pytest.raises(ValueError, match="Filename cannot be empty"):
AudioUploadDto(
filename="",
content=b"fake_audio_content_" + b"x" * 1000,
content_type="audio/wav"
)
def test_empty_content_validation(self):
"""Test validation with empty content"""
with pytest.raises(ValueError, match="Audio content cannot be empty"):
AudioUploadDto(
filename="test.wav",
content=b"",
content_type="audio/wav"
)
def test_empty_content_type_validation(self):
"""Test validation with empty content type"""
with pytest.raises(ValueError, match="Content type cannot be empty"):
AudioUploadDto(
filename="test.wav",
content=b"fake_audio_content_" + b"x" * 1000,
content_type=""
)
def test_unsupported_file_extension_validation(self):
"""Test validation with unsupported file extension"""
with pytest.raises(ValueError, match="Unsupported file extension"):
AudioUploadDto(
filename="test.xyz",
content=b"fake_audio_content_" + b"x" * 1000,
content_type="audio/wav"
)
def test_supported_file_extensions(self):
"""Test all supported file extensions"""
supported_extensions = ['.wav', '.mp3', '.m4a', '.flac', '.ogg']
content = b"fake_audio_content_" + b"x" * 1000
for ext in supported_extensions:
filename = f"test{ext}"
content_type = f"audio/{ext[1:]}" if ext != '.m4a' else "audio/mp4"
# Should not raise exception
dto = AudioUploadDto(
filename=filename,
content=content,
content_type=content_type
)
assert dto.file_extension == ext
def test_case_insensitive_extension_validation(self):
"""Test case insensitive extension validation"""
content = b"fake_audio_content_" + b"x" * 1000
# Should work with uppercase extension
dto = AudioUploadDto(
filename="test.WAV",
content=content,
content_type="audio/wav"
)
assert dto.file_extension == ".wav" # Should be normalized to lowercase
def test_file_too_large_validation(self):
"""Test validation with file too large"""
max_size = 100 * 1024 * 1024 # 100MB
large_content = b"x" * (max_size + 1)
with pytest.raises(ValueError, match="File too large"):
AudioUploadDto(
filename="test.wav",
content=large_content,
content_type="audio/wav"
)
def test_file_too_small_validation(self):
"""Test validation with file too small"""
small_content = b"x" * 500 # Less than 1KB
with pytest.raises(ValueError, match="File too small"):
AudioUploadDto(
filename="test.wav",
content=small_content,
content_type="audio/wav"
)
def test_invalid_content_type_validation(self):
"""Test validation with invalid content type"""
content = b"fake_audio_content_" + b"x" * 1000
with pytest.raises(ValueError, match="Invalid content type"):
AudioUploadDto(
filename="test.wav",
content=content,
content_type="text/plain" # Not audio/*
)
def test_file_extension_property(self):
"""Test file_extension property"""
dto = AudioUploadDto(
filename="test_audio.MP3",
content=b"fake_audio_content_" + b"x" * 1000,
content_type="audio/mpeg"
)
assert dto.file_extension == ".mp3"
def test_base_filename_property(self):
"""Test base_filename property"""
dto = AudioUploadDto(
filename="test_audio.wav",
content=b"fake_audio_content_" + b"x" * 1000,
content_type="audio/wav"
)
assert dto.base_filename == "test_audio"
def test_to_dict_method(self):
"""Test to_dict method"""
filename = "test_audio.wav"
content = b"fake_audio_content_" + b"x" * 1000
content_type = "audio/wav"
dto = AudioUploadDto(
filename=filename,
content=content,
content_type=content_type
)
result = dto.to_dict()
assert result['filename'] == filename
assert result['content_type'] == content_type
assert result['size'] == len(content)
assert result['file_extension'] == ".wav"
# Should not include content in dict representation
assert 'content' not in result
def test_size_calculation_on_init(self):
"""Test that size is calculated automatically if not provided"""
content = b"fake_audio_content_" + b"x" * 1500
dto = AudioUploadDto(
filename="test.wav",
content=content,
content_type="audio/wav"
)
assert dto.size == len(content)
def test_validation_called_on_init(self):
"""Test that validation is called during initialization"""
# This should trigger validation and raise an error
with pytest.raises(ValueError):
AudioUploadDto(
filename="", # Invalid empty filename
content=b"fake_audio_content_" + b"x" * 1000,
content_type="audio/wav"
)
def test_edge_case_minimum_valid_size(self):
"""Test edge case with minimum valid file size"""
min_content = b"x" * 1024 # Exactly 1KB
dto = AudioUploadDto(
filename="test.wav",
content=min_content,
content_type="audio/wav"
)
assert dto.size == 1024
def test_edge_case_maximum_valid_size(self):
"""Test edge case with maximum valid file size"""
max_size = 100 * 1024 * 1024 # Exactly 100MB
max_content = b"x" * max_size
dto = AudioUploadDto(
filename="test.wav",
content=max_content,
content_type="audio/wav"
)
assert dto.size == max_size
def test_content_type_mismatch_handling(self):
"""Test handling of content type mismatch with filename"""
content = b"fake_audio_content_" + b"x" * 1000
# This should still work as long as content_type starts with 'audio/'
dto = AudioUploadDto(
filename="test.wav",
content=content,
content_type="audio/mpeg" # Different from .wav extension
)
assert dto.content_type == "audio/mpeg"
assert dto.file_extension == ".wav"