93 lines
4.9 KiB
Python
93 lines
4.9 KiB
Python
import importlib.util
|
|
import json
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
spec = importlib.util.spec_from_file_location('rice', Path(__file__).resolve().parents[1] / 'lib/rice.py')
|
|
rice = importlib.util.module_from_spec(spec)
|
|
spec.loader.exec_module(rice)
|
|
|
|
|
|
class ConfigTests(unittest.TestCase):
|
|
def test_kconfig_preserves_unrelated_state_and_combines_window_rules(self):
|
|
old = '# comment\n[General]\nrules=my-rule\ncount=1\nkeep=value\n[Session]\nprivate=preserved\n'
|
|
desired = '[General]\nrules=fiw-dolphin-opacity\ncount=1\n[Style]\ncolour=purple\n'
|
|
result = rice.merge_kconfig(old, desired)
|
|
self.assertIn('# comment', result)
|
|
self.assertIn('private=preserved', result)
|
|
self.assertIn('keep=value', result)
|
|
self.assertIn('rules=my-rule,fiw-dolphin-opacity', result)
|
|
self.assertIn('count=2', result)
|
|
self.assertEqual(rice.merge_kconfig(result, desired), result)
|
|
|
|
def test_json_merge_preserves_account_and_unrelated_preferences(self):
|
|
old = '{"session": "existing", "nested": {"unrelated": 1, "selected": 2}}'
|
|
desired = '{"nested": {"selected": 3}}'
|
|
self.assertEqual(json.loads(rice.merge_json(old, desired)),
|
|
{'session': 'existing', 'nested': {'unrelated': 1, 'selected': 3}})
|
|
|
|
def test_conflicts_backup_and_updates_preserve_local_edits(self):
|
|
selection = rice.load_selection()
|
|
selection['configs'] = ['fastfetch']
|
|
with tempfile.TemporaryDirectory() as temp:
|
|
home = Path(temp)
|
|
target = home / '.config/fastfetch/config.jsonc'
|
|
target.parent.mkdir(parents=True)
|
|
target.write_text('original local config\n')
|
|
kept = rice.apply_configs(selection, home, conflict='keep')
|
|
self.assertEqual(target.read_text(), 'original local config\n')
|
|
self.assertEqual(len(kept['kept']), 1)
|
|
rice.apply_configs(selection, home, conflict='apply')
|
|
backups = list((home / '.local/state/Fiw-Gentoo-Dots/backups').rglob('config.jsonc'))
|
|
self.assertEqual(backups[0].read_text(), 'original local config\n')
|
|
target.write_text('user edited config\n')
|
|
rice.apply_configs(selection, home, update=True, conflict='apply')
|
|
self.assertEqual(target.read_text(), 'user edited config\n')
|
|
pending = Path(str(target) + '.new')
|
|
self.assertEqual(json.loads(pending.read_text())['logo']['source'], 'gentoo')
|
|
pending.write_text('user edited review\n')
|
|
rice.apply_configs(selection, home, update=True, conflict='apply')
|
|
self.assertEqual(pending.read_text(), 'user edited review\n')
|
|
|
|
def test_shortcut_launchers_expand_target_home(self):
|
|
selection = rice.load_selection()
|
|
selection['configs'] = ['kde-shortcuts']
|
|
with tempfile.TemporaryDirectory() as temp:
|
|
home = Path(temp)
|
|
rice.apply_configs(selection, home, conflict='apply')
|
|
desktop = home / '.local/share/applications/net.local.fiw-shot-region.desktop'
|
|
self.assertIn('Exec="' + str(home) + '/.local/bin/fiw-shot" region', desktop.read_text())
|
|
self.assertNotIn('{{HOME}}', desktop.read_text())
|
|
self.assertTrue((home / '.local/bin/fiw-shot').stat().st_mode & 0o111)
|
|
|
|
def test_actual_kde_session_is_rejected_before_any_writes(self):
|
|
selection = rice.load_selection()
|
|
selection['configs'] = ['kde-style']
|
|
with tempfile.TemporaryDirectory() as temp, patch.object(rice, 'active_plasma', return_value=True):
|
|
home = Path(temp)
|
|
with self.assertRaises(RuntimeError):
|
|
rice.apply_configs(selection, home, conflict='apply')
|
|
self.assertEqual(list(home.iterdir()), [])
|
|
|
|
def test_source_plan_distinguishes_binary_payloads_and_dependencies(self):
|
|
output = '[binary N ] app-misc/jq-1.8.2::gentoo\n[ebuild N ] dev-libs/foo-2.0::gentoo\n[ebuild N ] games-util/ge-proton-bin-11.7::fiw-dots\n'
|
|
self.assertEqual(rice.source_builds(output), {'dev-libs/foo-2.0'})
|
|
self.assertEqual(rice.cp_from_cpv('dev-libs/foo-2.0'), 'dev-libs/foo')
|
|
|
|
def test_category_separation_and_stock_kernel(self):
|
|
selection = rice.load_selection()
|
|
packages = rice.package_map(selection)
|
|
self.assertIn('sys-kernel/gentoo-kernel-bin', packages['system'])
|
|
self.assertNotIn('sys-kernel/gentoo-kernel', packages['system'])
|
|
self.assertFalse(any(p.startswith('=sys-kernel/gentoo-kernel-') for p in packages['system']))
|
|
self.assertNotIn('kde-apps/dolphin', packages['kde'])
|
|
self.assertIn('kde-apps/dolphin', packages['fiw-apps'])
|
|
self.assertNotIn('kde-apps/filelight', packages['fiw-apps'])
|
|
self.assertEqual(selection['bootloader'], 'keep')
|
|
self.assertNotIn('autostart', selection['configs'])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|