diff --git a/src/seedpass_gui/app.py b/src/seedpass_gui/app.py index dcc38ff..88ea909 100644 --- a/src/seedpass_gui/app.py +++ b/src/seedpass_gui/app.py @@ -251,29 +251,61 @@ class EntryDialog(toga.Window): if self.entry_id is None: if kind == EntryType.PASSWORD.value: - self.main.entries.add_entry(label, length, username=username, url=url) + entry_id = self.main.entries.add_entry( + label, length, username=username, url=url + ) elif kind == EntryType.TOTP.value: - self.main.entries.add_totp(label) + entry_id = self.main.entries.add_totp(label) elif kind == EntryType.SSH.value: - self.main.entries.add_ssh_key(label) + entry_id = self.main.entries.add_ssh_key(label) elif kind == EntryType.SEED.value: - self.main.entries.add_seed(label) + entry_id = self.main.entries.add_seed(label) elif kind == EntryType.PGP.value: - self.main.entries.add_pgp_key(label) + entry_id = self.main.entries.add_pgp_key(label) elif kind == EntryType.NOSTR.value: - self.main.entries.add_nostr_key(label) + entry_id = self.main.entries.add_nostr_key(label) elif kind == EntryType.KEY_VALUE.value: - self.main.entries.add_key_value(label, value or "") + entry_id = self.main.entries.add_key_value(label, value or "") elif kind == EntryType.MANAGED_ACCOUNT.value: - self.main.entries.add_managed_account(label) + entry_id = self.main.entries.add_managed_account(label) else: + entry_id = self.entry_id kwargs = {"label": label} if kind == EntryType.PASSWORD.value: kwargs.update({"username": username, "url": url}) elif kind == EntryType.KEY_VALUE.value: kwargs.update({"value": value}) - self.main.entries.modify_entry(self.entry_id, **kwargs) - self.main.refresh_entries() + self.main.entries.modify_entry(entry_id, **kwargs) + + entry = self.main.entries.retrieve_entry(entry_id) or {} + kind = entry.get("kind", entry.get("type", kind)) + info1 = "" + info2 = "" + if kind == EntryType.PASSWORD.value: + info1 = username or "" + info2 = url or "" + elif kind == EntryType.KEY_VALUE.value: + info1 = entry.get("value", value or "") + else: + info1 = str(entry.get("index", "")) + + row = { + "id": entry_id, + "label": label, + "kind": kind, + "info1": info1, + "info2": info2, + } + + if self.entry_id is None: + self.main.entry_source.append(row) + else: + for existing in self.main.entry_source: + if getattr(existing, "id", None) == entry_id: + for key, value in row.items(): + setattr(existing, key, value) + break + self.close() diff --git a/src/tests/test_gui_headless.py b/src/tests/test_gui_headless.py index cf371e8..dc895a8 100644 --- a/src/tests/test_gui_headless.py +++ b/src/tests/test_gui_headless.py @@ -1,5 +1,6 @@ import os from types import SimpleNamespace +from toga.sources import ListSource import toga import pytest @@ -112,7 +113,9 @@ def test_unlock_creates_main_window(): def test_entrydialog_add_calls_service(kind, expect): toga.App("Test2", "org.example2") entries = FakeEntries() - main = SimpleNamespace(entries=entries, refresh_entries=lambda: None) + entries.retrieve_entry = lambda _id: {"kind": kind} + source = ListSource(["id", "label", "kind", "info1", "info2"]) + main = SimpleNamespace(entries=entries, entry_source=source) dlg = EntryDialog(main, None) dlg.label_input.value = "L" @@ -124,6 +127,10 @@ def test_entrydialog_add_calls_service(kind, expect): dlg.save(None) assert entries.added[-1] == expect + assert len(main.entry_source) == 1 + row = main.entry_source[0] + assert row.label == "L" + assert row.kind == kind @pytest.mark.parametrize( @@ -142,8 +149,9 @@ def test_entrydialog_edit_calls_service(kind, expected): return {"kind": kind} entries.retrieve_entry = retrieve - - main = SimpleNamespace(entries=entries, refresh_entries=lambda: None) + source = ListSource(["id", "label", "kind", "info1", "info2"]) + source.append({"id": 1, "label": "Old", "kind": kind, "info1": "", "info2": ""}) + main = SimpleNamespace(entries=entries, entry_source=source) dlg = EntryDialog(main, 1) dlg.label_input.value = "New" dlg.kind_input.value = kind @@ -153,3 +161,4 @@ def test_entrydialog_edit_calls_service(kind, expected): dlg.save(None) assert entries.modified[-1] == expected + assert source[0].label == "New"