1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
#!/usr/bin/env python3
# coding: utf-8
from xdg.DesktopEntry import DesktopEntry
from xdg.Exceptions import ValidationError, ParsingError, NoKeyError
from xdg.util import u
import resources
import io
import os
import shutil
import re
import tempfile
import unittest
class DesktopEntryTest(unittest.TestCase):
def setUp(self):
self.tmpdir = tempfile.mkdtemp()
self.test_file = os.path.join(self.tmpdir, "gedit.desktop")
with io.open(self.test_file, "w", encoding='utf-8') as f:
f.write(resources.gedit_desktop)
def tearDown(self):
shutil.rmtree(self.tmpdir)
def test_write_file(self):
de = DesktopEntry()
de.parse(self.test_file)
de.removeKey("Name")
de.addGroup("Hallo")
de.set("key", "value", "Hallo")
new_file = os.path.join(self.tmpdir, "test.desktop")
de.write(new_file, trusted=True)
with io.open(new_file, encoding='utf-8') as f:
contents = f.read()
assert "[Hallo]" in contents, contents
assert re.search(r"key\s*=\s*value", contents), contents
# This is missing the Name key, and has an unknown Hallo group, so it
# shouldn't validate.
new_entry = DesktopEntry(new_file)
self.assertRaises(ValidationError, new_entry.validate)
def test_validate(self):
entry = DesktopEntry(self.test_file)
entry.validate()
def test_values(self):
entry = DesktopEntry(self.test_file)
self.assertEqual(entry.getName(), 'gedit')
#self.assertEqual(entry.getGenericName(), 'Text Editor')
self.assertEqual(entry.getNoDisplay(), False)
#self.assertEqual(entry.getComment(), 'Edit text files')
self.assertEqual(entry.getIcon(), 'accessories-text-editor')
self.assertEqual(entry.getHidden(), False)
self.assertEqual(entry.getOnlyShowIn(), [])
self.assertEqual(entry.getExec(), 'gedit %U')
self.assertEqual(entry.getTerminal(), False)
self.assertEqual(entry.getMimeTypes(), ['text/plain'])
self.assertEqual(entry.getCategories(), ['GNOME', 'GTK', 'Utility', 'TextEditor'])
self.assertEqual(entry.getTerminal(), False)
def test_basic(self):
entry = DesktopEntry(self.test_file)
assert entry.hasKey("Categories")
assert not entry.hasKey("TryExec")
assert entry.hasGroup("Desktop Action Window")
assert not entry.hasGroup("Desktop Action Door")
def test_unicode_name(self):
with io.open(self.test_file, "w", encoding='utf-8') as f:
f.write(resources.unicode_desktop)
entry = DesktopEntry(self.test_file)
self.assertEqual(entry.getName(), u('Abc€þ'))
def test_invalid(self):
test_file = os.path.join(self.tmpdir, "spout.desktop")
with io.open(test_file, "w", encoding='utf-8') as f:
f.write(resources.spout_desktop)
self.assertRaises(ParsingError, DesktopEntry, test_file)
def test_invalid_unicode(self):
test_file = os.path.join(self.tmpdir, "gnome-alsamixer.desktop")
with io.open(test_file, "w", encoding='latin-1') as f:
f.write(resources.gnome_alsamixer_desktop)
# Just check this doesn't throw a UnicodeError.
DesktopEntry(test_file)
class TestTryExec(unittest.TestCase):
def setUp(self):
self.tmpdir = tempfile.mkdtemp()
self.test_file = os.path.join(self.tmpdir, "foo.desktop")
def test_present(self):
with io.open(self.test_file, "w", encoding='utf-8') as f:
f.write(resources.python_desktop)
entry = DesktopEntry(self.test_file)
res = entry.findTryExec()
assert res, repr(res)
def test_absent(self):
with io.open(self.test_file, "w", encoding='utf-8') as f:
f.write(resources.unicode_desktop)
entry = DesktopEntry(self.test_file)
res = entry.findTryExec()
assert res is None, repr(res)
def test_no_TryExec(self):
with io.open(self.test_file, "w", encoding='utf-8') as f:
f.write(resources.gedit_desktop)
entry = DesktopEntry(self.test_file)
self.assertRaises(NoKeyError, entry.findTryExec)
|