import os import tempfile import unittest from pathlib import Path from copienator_gui.app import CopienatorApp from copienator_gui.workflow import command_display from copienator.commands.page_splitter import _selected_inputs from copienator import EvaluationWorkspace @unittest.skipUnless(os.environ.get("DISPLAY"), "Tk requires a display") class GuiConvenienceTests(unittest.TestCase): def setUp(self): self.temp = tempfile.TemporaryDirectory() self.repository = Path(self.temp.name) self.evaluation = self.repository / "Évaluation avec espaces" self.evaluation.mkdir() self.app = CopienatorApp(self.repository, False, self.evaluation) self.app.update() def tearDown(self): for callback in self.app.tk.splitlist(self.app.tk.call("after", "info")): self.app.after_cancel(callback) self.app.destroy() self.temp.cleanup() def test_reload_detects_added_and_removed_files_without_advancing(self): for name in ("enonce.pdf", "enonce.tex", "correction.tex"): (self.evaluation / name).touch() self.app._reload_inputs() self.assertIn("names", self.app.info_var.get()) (self.repository / "names").touch() self.app._reload_inputs() self.app.update() self.assertEqual(self.app.state_store.step("inputs")["status"], "success") self.assertEqual(self.app.current_step.id, "inputs") (self.evaluation / "enonce.pdf").unlink() self.app._reload_inputs() self.assertEqual(self.app.state_store.step("inputs")["status"], "ready") self.assertIn("enonce.pdf", self.app.description_label.cget("text")) def test_redo_targets_selected_copy_and_copies_runnable_command(self): for folder in ("Copies", "Copies Originales"): (self.evaluation / folder).mkdir() for name in ("Copie01.pdf", "Copie02.pdf"): (self.evaluation / folder / name).touch() self.app.tree.selection_set("page_splitter") self.app.update() self.app.copy_var.set("Copie02.pdf") self.app._redo_selected_pages() command = self.app._make_command() target = Path(command[-1]) self.assertEqual(target, self.evaluation / "Copies" / "Copie02.pdf") self.assertEqual(_selected_inputs(EvaluationWorkspace(self.evaluation), target), [self.evaluation / "Copies Originales" / "Copie02.pdf"]) self.app._copy_command() self.assertEqual(self.app.clipboard_get(), command_display(command)) self.app._target_all_pages() self.assertEqual(self.app.arg_vars["target"].get(), self.app._evaluation_arg()) def test_console_selection_survives_output_and_is_read_only(self): self.app._append_console("Première ligne\nDeuxième ligne\n") self.app.console.tag_add("sel", "1.0", "1.end") self.app._append_console("Suite\n") self.app._copy_console_selection() self.assertEqual(self.app.clipboard_get(), "Première ligne") self.app._copy_console_all() expected = "Première ligne\nDeuxième ligne\nSuite\n" self.assertEqual(self.app.clipboard_get(), expected) self.app.console.insert("end", "unwanted edit") self.assertEqual(self.app.console.get("1.0", "end-1c"), expected) self.app._select_console_all() self.app._copy_console_selection() self.assertEqual(self.app.clipboard_get(), expected)