Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
# -*- coding: utf-8 -*-
import os
import unittest
import mozpack.path as mozpath
from mozunit import main
from six import StringIO
from mozbuild.dotproperties import DotProperties
test_data_path = mozpath.abspath(mozpath.dirname(__file__))
test_data_path = mozpath.join(test_data_path, "data")
class TestDotProperties(unittest.TestCase):
def test_get(self):
contents = StringIO(
"""
key=value
"""
)
p = DotProperties(contents)
self.assertEqual(p.get("missing"), None)
self.assertEqual(p.get("missing", "default"), "default")
self.assertEqual(p.get("key"), "value")
def test_update(self):
contents = StringIO(
"""
old=old value
key=value
"""
)
p = DotProperties(contents)
self.assertEqual(p.get("old"), "old value")
self.assertEqual(p.get("key"), "value")
new_contents = StringIO(
"""
key=new value
"""
)
p.update(new_contents)
self.assertEqual(p.get("old"), "old value")
self.assertEqual(p.get("key"), "new value")
def test_get_list(self):
contents = StringIO(
"""
list.0=A
list.1=B
list.2=C
order.1=B
order.0=A
order.2=C
"""
)
p = DotProperties(contents)
self.assertEqual(p.get_list("missing"), [])
self.assertEqual(p.get_list("list"), ["A", "B", "C"])
self.assertEqual(p.get_list("order"), ["A", "B", "C"])
def test_get_list_with_shared_prefix(self):
contents = StringIO(
"""
list.0=A
list.1=B
list.2=C
list.sublist.1=E
list.sublist.0=D
list.sublist.2=F
list.sublist.second.0=G
list.other.0=H
"""
)
p = DotProperties(contents)
self.assertEqual(p.get_list("list"), ["A", "B", "C"])
self.assertEqual(p.get_list("list.sublist"), ["D", "E", "F"])
self.assertEqual(p.get_list("list.sublist.second"), ["G"])
self.assertEqual(p.get_list("list.other"), ["H"])
def test_get_dict(self):
contents = StringIO(
"""
A.title=title A
B.title=title B
B.url=url B
C=value
"""
)
p = DotProperties(contents)
self.assertEqual(p.get_dict("missing"), {})
self.assertEqual(p.get_dict("A"), {"title": "title A"})
self.assertEqual(p.get_dict("B"), {"title": "title B", "url": "url B"})
with self.assertRaises(ValueError):
p.get_dict("A", required_keys=["title", "url"])
with self.assertRaises(ValueError):
p.get_dict("missing", required_keys=["key"])
# A key=value pair is considered to root an empty dict.
self.assertEqual(p.get_dict("C"), {})
with self.assertRaises(ValueError):
p.get_dict("C", required_keys=["missing_key"])
def test_get_dict_with_shared_prefix(self):
contents = StringIO(
"""
A.title=title A
A.subdict.title=title A subdict
B.title=title B
B.url=url B
B.subdict.title=title B subdict
B.subdict.url=url B subdict
"""
)
p = DotProperties(contents)
self.assertEqual(p.get_dict("A"), {"title": "title A"})
self.assertEqual(p.get_dict("B"), {"title": "title B", "url": "url B"})
self.assertEqual(p.get_dict("A.subdict"), {"title": "title A subdict"})
self.assertEqual(
p.get_dict("B.subdict"),
{"title": "title B subdict", "url": "url B subdict"},
)
def test_get_dict_with_value_prefix(self):
contents = StringIO(
"""
A.default=A
A.default.B=B
A.default.B.ignored=B ignored
A.default.C=C
A.default.C.ignored=C ignored
"""
)
p = DotProperties(contents)
self.assertEqual(p.get("A.default"), "A")
# This enumerates the properties.
self.assertEqual(p.get_dict("A.default"), {"B": "B", "C": "C"})
# They can still be fetched directly.
self.assertEqual(p.get("A.default.B"), "B")
self.assertEqual(p.get("A.default.C"), "C")
def test_unicode(self):
contents = StringIO(
"""
# Danish.
# #### ~~ Søren Munk Skrøder, sskroeder - 2009-05-30 @ #mozmae
# Korean.
A.title=한메일
# Russian.
list.0 = test
list.1 = Яндекс
"""
)
p = DotProperties(contents)
self.assertEqual(p.get_dict("A"), {"title": "한메일"})
self.assertEqual(p.get_list("list"), ["test", "Яндекс"])
def test_valid_unicode_from_file(self):
# The contents of valid.properties is identical to the contents of the
# test above. This specifically exercises reading from a file.
p = DotProperties(os.path.join(test_data_path, "valid.properties"))
self.assertEqual(p.get_dict("A"), {"title": "한메일"})
self.assertEqual(p.get_list("list"), ["test", "Яндекс"])
def test_bad_unicode_from_file(self):
# The contents of bad.properties is not valid Unicode; see the comments
# in the file itself for details.
with self.assertRaises(UnicodeDecodeError):
DotProperties(os.path.join(test_data_path, "bad.properties"))
if __name__ == "__main__":
main()