#!/usr/bin/env python3 # # Copyright (C) 2026 Danilo M. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """Self-checks for mailrules.py, the shared tagging-rule store. The risk in this file is the format, not the notmuch calls: a rule that silently loses a field on save, or one that sorts into the wrong stage, mis-tags real mail on the next sync and does it quietly. Run: ./test_mailrules.py """ import json import tempfile from pathlib import Path import mailrules def write_rules(tmp, payload): path = Path(tmp) / "rules.json" path.write_text(json.dumps(payload)) return path def test_loads_a_rule(): with tempfile.TemporaryDirectory() as tmp: path = write_rules(tmp, { "version": 1, "rules": [ { "id": "notify-forge", "stage": 50, "enabled": True, "add": ["notify/forge"], "remove": [], "query": "from:notifications@example.com", "note": "All repositories, not one project.", } ], }) store = mailrules.load(path) assert store.warnings == [], store.warnings assert len(store.rules) == 1 rule = store.rules[0] assert rule.id == "notify-forge" assert rule.stage == 50 assert rule.enabled is True assert rule.add == ["notify/forge"] assert rule.remove == [] assert rule.query == "from:notifications@example.com" assert rule.note == "All repositories, not one project." def test_defaults_are_applied(): """stage, enabled, remove and note are all optional in the file.""" with tempfile.TemporaryDirectory() as tmp: path = write_rules(tmp, { "version": 1, "rules": [{"id": "minimal", "add": ["x"], "query": "from:someone@example.com"}], }) store = mailrules.load(path) assert store.warnings == [], store.warnings rule = store.rules[0] assert rule.stage == 50 assert rule.enabled is True assert rule.remove == [] assert rule.note == "" def run_all(): for name, fn in sorted(globals().items()): if name.startswith("test_") and callable(fn): fn() print(f"ok {name}") if __name__ == "__main__": run_all() print("\nall passed")