test-simplekeyvaluefile.py
100 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, | ||||
) | ||||
Augie Fackler
|
r43346 | |||
Kostia Balytskyi
|
r31553 | 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] | ||||
Augie Fackler
|
r43346 | |||
Kostia Balytskyi
|
r31553 | 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) | ||||
Augie Fackler
|
r43346 | |||
Kostia Balytskyi
|
r31553 | 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) | ||||
Augie Fackler
|
r43346 | self.assertEqual( | ||
sorted(self.vfs.read(b'kvfile').split(b'\n')), | ||||
[b'', b'Key2=value2', b'key1=value1'], | ||||
) | ||||
Augie Fackler
|
r37958 | 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. | ||||
Augie Fackler
|
r43346 | assertRaisesRegex = ( # camelcase-required | ||
unittest.TestCase.assertRaisesRegexp | ||||
) | ||||
Augie Fackler
|
r37733 | |||
Kostia Balytskyi
|
r31553 | def testinvalidkeys(self): | ||
Augie Fackler
|
r37958 | d = {b'0key1': b'value1', b'Key2': b'value2'} | ||
Augie Fackler
|
r43346 | with self.assertRaisesRegex( | ||
error.ProgrammingError, '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
|
r43346 | 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
|
r43346 | with self.assertRaisesRegex( | ||
error.CorruptedState, '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') | ||||
Augie Fackler
|
r43346 | dr = scmutil.simplekeyvaluefile(self.vfs, b'fl').read( | ||
firstlinenonkeyval=True | ||||
) | ||||
Augie Fackler
|
r37958 | self.assertEqual(dr, {b'__firstline': b'1.0', b'key1': b'value1'}) | ||
Kostia Balytskyi
|
r32270 | |||
Augie Fackler
|
r43346 | |||
Kostia Balytskyi
|
r31553 | if __name__ == "__main__": | ||
silenttestrunner.main(__name__) | ||||