test-simplekeyvaluefile.py
90 lines
| 3.0 KiB
| text/x-python
|
PythonLexer
/ tests / test-simplekeyvaluefile.py
Kostia Balytskyi
|
r31553 | from __future__ import absolute_import | ||
import unittest | ||||
import silenttestrunner | ||||
from mercurial import ( | ||||
error, | ||||
scmutil, | ||||
) | ||||
class mockfile(object): | ||||
def __init__(self, name, fs): | ||||
self.name = name | ||||
self.fs = fs | ||||
def __enter__(self): | ||||
return self | ||||
def __exit__(self, *args, **kwargs): | ||||
pass | ||||
def write(self, text): | ||||
self.fs.contents[self.name] = text | ||||
def read(self): | ||||
return self.fs.contents[self.name] | ||||
class mockvfs(object): | ||||
def __init__(self): | ||||
self.contents = {} | ||||
def read(self, path): | ||||
return mockfile(path, self).read() | ||||
def readlines(self, path): | ||||
Kostia Balytskyi
|
r32269 | # lines need to contain the trailing '\n' to mock the real readlines | ||
return [l for l in mockfile(path, self).read().splitlines(True)] | ||||
Kostia Balytskyi
|
r31553 | |||
def __call__(self, path, mode, atomictemp): | ||||
return mockfile(path, self) | ||||
class testsimplekeyvaluefile(unittest.TestCase): | ||||
def setUp(self): | ||||
self.vfs = mockvfs() | ||||
Kostia Balytskyi
|
r32269 | def testbasicwritingiandreading(self): | ||
Augie Fackler
|
r37958 | dw = {b'key1': b'value1', b'Key2': b'value2'} | ||
scmutil.simplekeyvaluefile(self.vfs, b'kvfile').write(dw) | ||||
self.assertEqual(sorted(self.vfs.read(b'kvfile').split(b'\n')), | ||||
[b'', b'Key2=value2', b'key1=value1']) | ||||
dr = scmutil.simplekeyvaluefile(self.vfs, b'kvfile').read() | ||||
Kostia Balytskyi
|
r32269 | self.assertEqual(dr, dw) | ||
Kostia Balytskyi
|
r31553 | |||
Augie Fackler
|
r37733 | if not getattr(unittest.TestCase, 'assertRaisesRegex', False): | ||
# Python 3.7 deprecates the regex*p* version, but 2.7 lacks | ||||
# the regex version. | ||||
assertRaisesRegex = (# camelcase-required | ||||
unittest.TestCase.assertRaisesRegexp) | ||||
Kostia Balytskyi
|
r31553 | def testinvalidkeys(self): | ||
Augie Fackler
|
r37958 | d = {b'0key1': b'value1', b'Key2': b'value2'} | ||
Augie Fackler
|
r37733 | with self.assertRaisesRegex(error.ProgrammingError, | ||
Gregory Szorc
|
r32279 | 'keys must start with a letter.*'): | ||
Augie Fackler
|
r37958 | scmutil.simplekeyvaluefile(self.vfs, b'kvfile').write(d) | ||
Gregory Szorc
|
r32279 | |||
Augie Fackler
|
r37958 | d = {b'key1@': b'value1', b'Key2': b'value2'} | ||
Augie Fackler
|
r37733 | with self.assertRaisesRegex(error.ProgrammingError, 'invalid key.*'): | ||
Augie Fackler
|
r37958 | scmutil.simplekeyvaluefile(self.vfs, b'kvfile').write(d) | ||
Kostia Balytskyi
|
r31553 | |||
def testinvalidvalues(self): | ||||
Augie Fackler
|
r37958 | d = {b'key1': b'value1', b'Key2': b'value2\n'} | ||
Augie Fackler
|
r37733 | with self.assertRaisesRegex(error.ProgrammingError, 'invalid val.*'): | ||
Augie Fackler
|
r37958 | scmutil.simplekeyvaluefile(self.vfs, b'kvfile').write(d) | ||
Kostia Balytskyi
|
r31553 | |||
def testcorruptedfile(self): | ||||
Augie Fackler
|
r37958 | self.vfs.contents[b'badfile'] = b'ababagalamaga\n' | ||
Augie Fackler
|
r37733 | with self.assertRaisesRegex(error.CorruptedState, | ||
Gregory Szorc
|
r32279 | 'dictionary.*element.*'): | ||
Augie Fackler
|
r37958 | scmutil.simplekeyvaluefile(self.vfs, b'badfile').read() | ||
Kostia Balytskyi
|
r31553 | |||
Kostia Balytskyi
|
r32270 | def testfirstline(self): | ||
Augie Fackler
|
r37958 | dw = {b'key1': b'value1'} | ||
scmutil.simplekeyvaluefile(self.vfs, b'fl').write(dw, firstline=b'1.0') | ||||
self.assertEqual(self.vfs.read(b'fl'), b'1.0\nkey1=value1\n') | ||||
dr = scmutil.simplekeyvaluefile(self.vfs, b'fl')\ | ||||
Kostia Balytskyi
|
r32270 | .read(firstlinenonkeyval=True) | ||
Augie Fackler
|
r37958 | self.assertEqual(dr, {b'__firstline': b'1.0', b'key1': b'value1'}) | ||
Kostia Balytskyi
|
r32270 | |||
Kostia Balytskyi
|
r31553 | if __name__ == "__main__": | ||
silenttestrunner.main(__name__) | ||||