Files
MusicPlayer/tests/unit/test_music_player.gd
T
Sansan 4a275e6a88 Add GdUnit4 testing framework with comprehensive test coverage
- Add GdUnit4 v6.2.1 framework in addons/gdUnit4/
- Create test directory structure (tests/unit/, tests/integration/, tests/mocks/)
- Add unit tests for MusicPlayer.gd (8 tests)
- Add unit tests for MainWindow.gd (15+ tests)
- Add unit tests for Settings.gd (5 tests)
- Add unit tests for Playlist.gd (11 tests)
- Add integration tests for full flow (10+ tests)
- Add MockHTTPRequest for HTTP request mocking
- Add TestHelpers with utility functions
- Add Gitea Actions CI workflow (.gitea/workflows/test.yml)
- Add .runsettings for GdUnit4 CLI configuration
- Add run_tests.sh for convenient test execution
- Add TESTING.md with comprehensive documentation
- Add TESTING_PLAN.md with implementation details
- Update .gitignore for test artifacts
- Enable GdUnit4 plugin in project.godot

Features:
- Test button functionality (play, pause, search, sync, etc.)
- Mock REST API requests to server
- Test complete application flows
- Run tests in CI (headless mode)
- Run tests in GUI for visual feedback
- JUnit XML and HTML test reports

Generated by OpenCode AI assistant.
2026-10-01 20:55:09 +02:00

159 lines
4.3 KiB
GDScript

class_name MusicPlayerTest
extends GdUnitTestSuite
func test_play_or_pause_toggles_play_state():
var music_player = MusicPlayer.new()
var mock_audio = mock(AudioStreamPlayer)
var mock_play_button = mock(TextureButton)
music_player.audio_player = mock_audio
music_player.play_button = mock_play_button
music_player.play_icon = load("res://icons/play_icon_light.svg")
music_player.pause_icon = load("res://icons/pause_icon_light.svg")
# Initial state - paused
mock_audio.stream_paused = true
music_player.song_finished = false
# First call should play
music_player.play_or_pause()
assert_false(mock_audio.stream_paused)
assert_eq(mock_play_button.texture_normal, music_player.pause_icon)
# Second call should pause
music_player.play_or_pause()
assert_true(mock_audio.stream_paused)
assert_eq(mock_play_button.texture_normal, music_player.play_icon)
func test_restart_resets_playback():
var music_player = MusicPlayer.new()
var mock_audio = mock(AudioStreamPlayer)
var mock_slider = mock(HSlider)
music_player.audio_player = mock_audio
music_player.progress_slider = mock_slider
mock_audio.stream_paused = false
mock_slider.value = 50.0
music_player.song_finished = true
music_player.restart()
assert_true(mock_audio.stop.was_called())
assert_false(mock_audio.stream_paused)
assert_false(music_player.song_finished)
assert_eq(mock_slider.value, 0)
assert_true(mock_audio.play.was_called())
func test_pause_sets_correct_state():
var music_player = MusicPlayer.new()
var mock_audio = mock(AudioStreamPlayer)
var mock_play_button = mock(TextureButton)
music_player.audio_player = mock_audio
music_player.play_button = mock_play_button
music_player.play_icon = load("res://icons/play_icon_light.svg")
mock_audio.stream_paused = false
music_player.pause()
assert_true(mock_audio.stream_paused)
assert_eq(mock_play_button.texture_normal, music_player.play_icon)
func test_format_time_correctly_formats_seconds():
var music_player = MusicPlayer.new()
assert_eq(music_player.format_time(65.0), "01:05")
assert_eq(music_player.format_time(0.0), "00:00")
assert_eq(music_player.format_time(3661.0), "61:01")
func test_format_text_hides_info_when_configured():
var music_player = MusicPlayer.new()
# Test with hide_beginning and hide_length
Settings.hide_beginning = true
Settings.hide_length = true
Settings.hide_for_seconds = 5.0
assert_eq(music_player.format_text(3.0, 100.0), "??:?? / ??:??")
Settings.hide_beginning = false
Settings.hide_length = true
assert_eq(music_player.format_text(10.0, 100.0), "00:10 / ??:??")
Settings.hide_beginning = true
Settings.hide_length = false
assert_eq(music_player.format_text(3.0, 100.0), "??:?? / 01:40")
Settings.hide_beginning = false
Settings.hide_length = false
assert_eq(music_player.format_text(10.0, 100.0), "00:10 / 01:40")
# Reset
Settings.hide_beginning = false
Settings.hide_length = false
func test_on_drag_started_sets_is_changing():
var music_player = MusicPlayer.new()
assert_false(music_player.is_changing)
music_player._on_drag_started()
assert_true(music_player.is_changing)
func test_on_drag_ended_updates_position():
var music_player = MusicPlayer.new()
var mock_audio = mock(AudioStreamPlayer)
var mock_slider = mock(HSlider)
music_player.audio_player = mock_audio
music_player.progress_slider = mock_slider
mock_slider.value = 30.0
music_player.is_changing = true
music_player._on_drag_ended(true)
assert_false(music_player.is_changing)
assert_true(mock_audio.seek.was_called_with([30.0]))
assert_eq(music_player.playback_position, 30.0)
func test_seek_updates_slider_and_position():
var music_player = MusicPlayer.new()
var mock_audio = mock(AudioStreamPlayer)
var mock_slider = mock(HSlider)
music_player.audio_player = mock_audio
music_player.progress_slider = mock_slider
mock_slider.value = 10.0
music_player.seek(5.0)
assert_eq(mock_slider.value, 15.0)
assert_true(mock_audio.seek.was_called_with([15.0]))
assert_eq(music_player.playback_position, 15.0)
func test_change_volume_updates_slider():
var music_player = MusicPlayer.new()
var mock_slider = mock(HSlider)
music_player.volume_slider = mock_slider
mock_slider.value = 0.5
music_player.change_volume(0.1)
assert_eq(mock_slider.value, 0.6)
assert_true(mock_slider.change_volume.was_called_with([0.6]))