extends GdUnitTestSuite var _server: FakeHttpTransport var _snapshot: AutoloadSnapshot var _runner: GdUnitSceneRunner var _window: Control func before_test() -> void: _snapshot = AutoloadSnapshot.take([Settings]) Settings.currently_syncing = false _server = FakeHttpTransport.new().install() _server.respond_bytes("/sync", PackedByteArray()) _runner = scene_runner("res://SyncWindow.tscn") _window = _runner.scene() func after_test() -> void: _server.uninstall() _snapshot.restore() func _node(unique_name: String) -> Control: return _window.get_node("%" + unique_name) func _finish_sync(result: Dictionary) -> void: _server.respond_json("/sync/progress", result) _runner.invoke("_on_sync_timeout") func _empty_result() -> Dictionary: return { "soundtracks_added": [], "soundtracks_re_added": [], "soundtracks_changed_title": {}, "soundtracks_changed_content": [], "soundtracks_removed": [], "catched_errors": [], "total_time": "00:00:03", } func test_start_sync_asks_server_and_shows_progress() -> void: monitor_signals(_window, false) _runner.invoke("start_sync") assert_array(_server.requested_paths).contains_exactly(["/sync"]) assert_bool(Settings.currently_syncing).is_true() assert_bool(_node("ProgressHBoxContainer").visible).is_true() assert_str(_node("SyncTitleLabel").text).is_equal("Sync in Progress") await assert_signal(_window).is_emitted("sync_started") func test_start_sync_does_nothing_while_already_syncing() -> void: Settings.currently_syncing = true _runner.invoke("start_sync") assert_array(_server.requested_paths).is_empty() func test_progress_updates_progress_bar() -> void: _runner.invoke("start_sync") _server.respond_json("/sync/progress", {"progress": "42", "time_spent": "00:00:12"}) _runner.invoke("_on_sync_timeout") assert_float(_node("SyncProgressBar").value).is_equal(42.0) assert_str(_node("SyncTime").text).is_equal("00:00:12") func test_finished_sync_shows_only_sections_with_changes() -> void: _runner.invoke("start_sync") monitor_signals(_window, false) var result: Dictionary = _empty_result() result.soundtracks_added = ["Chrono Cross", "Xenogears"] result.soundtracks_removed = ["Bad Rip"] _finish_sync(result) assert_bool(_node("SoundtracksAddedVBox").visible).is_true() assert_bool(_node("SoundtracksRemovedVBox").visible).is_true() assert_bool(_node("SoundtracksReAddedVBox").visible).is_false() assert_bool(_node("SoundtracksChangedTitleVBox").visible).is_false() assert_bool(_node("NoChangesLabel").visible).is_false() # Header plus one label per soundtrack assert_int(_node("SoundtracksAddedVBox").get_child_count()).is_equal(3) assert_str(_node("SyncTime").text).is_equal("Total time: 00:00:03") assert_bool(Settings.currently_syncing).is_false() await assert_signal(_window).is_emitted("sync_finished") func test_separator_shown_only_between_visible_sections() -> void: _runner.invoke("start_sync") var result: Dictionary = _empty_result() result.soundtracks_added = ["Chrono Cross"] result.soundtracks_removed = ["Bad Rip"] _finish_sync(result) assert_bool(_node("SoundtracksAddedSeparator").visible).is_true() assert_bool(_node("SoundtracksRemovedSeparator").visible).is_false() func test_changed_titles_list_old_and_new_title() -> void: _runner.invoke("start_sync") var result: Dictionary = _empty_result() result.soundtracks_changed_title = {"FF7": "Final Fantasy VII"} _finish_sync(result) var vbox: Control = _node("SoundtracksChangedTitleVBox") assert_bool(vbox.visible).is_true() assert_str((vbox.get_child(1) as ListRow).text).is_equal( "FF7\nchanged title to\nFinal Fantasy VII") func test_no_changes_shows_no_changes_label() -> void: _runner.invoke("start_sync") _finish_sync(_empty_result()) assert_bool(_node("NoChangesLabel").visible).is_true() func test_errors_are_listed() -> void: _runner.invoke("start_sync") var result: Dictionary = _empty_result() result.catched_errors = ["Could not read tags in broken.mp3"] _finish_sync(result) assert_bool(_node("CatchedErrorsVBox").visible).is_true() func test_reopening_after_sync_shows_result_without_syncing_again() -> void: _runner.invoke("start_sync") _finish_sync(_empty_result()) _runner.invoke("start_sync") assert_int(_server.count("/sync")).is_equal(1) assert_str(_node("SyncTitleLabel").text).is_equal("Sync Result") func test_errors_section_has_errors_header() -> void: _runner.invoke("start_sync") var result: Dictionary = _empty_result() result.catched_errors = ["Could not read tags in broken.mp3"] _finish_sync(result) assert_str((_node("CatchedErrorsVBox").get_child(0) as Label).text).is_equal("Errors") func test_long_names_wrap_instead_of_widening_the_window() -> void: _runner.invoke("start_sync") var long_name: String = "The Legend of Zelda: Breath of the Wild Original Soundtrack" var result: Dictionary = _empty_result() result.soundtracks_added = [long_name] result.soundtracks_re_added = [long_name] result.soundtracks_changed_content = [long_name] result.soundtracks_removed = [long_name] result.soundtracks_changed_title = {long_name: long_name} result.catched_errors = [long_name + " could not be read"] _finish_sync(result) await _runner.simulate_frames(2) # The minimum width is what the content needs; wider than the panel it would stick out var panel_width: float = (_window.get_node("SyncPanel") as Control).size.x assert_float(_node("SyncHBoxContainer").get_combined_minimum_size().x) \ .is_less(panel_width) assert_float(_node("CatchedErrorsVBox").get_combined_minimum_size().x) \ .is_less(panel_width) func test_visible_columns_share_the_width_equally() -> void: _runner.invoke("start_sync") var result: Dictionary = _empty_result() result.soundtracks_added = ["Chrono Cross", "Xenoblade Chronicles X Original Soundtrack"] result.soundtracks_removed = ["Bad Rip"] _finish_sync(result) await _runner.simulate_frames(2) assert_float(_node("SoundtracksAddedVBox").size.x).is_equal_approx( _node("SoundtracksRemovedVBox").size.x, 1.0) func test_column_headers() -> void: _runner.invoke("start_sync") var result: Dictionary = _empty_result() result.soundtracks_re_added = ["Super Metroid"] _finish_sync(result) assert_str((_node("SoundtracksReAddedVBox").get_child(0) as Label).text).is_equal("Re-added")