debugpy/tests/debugger_protocol/schema/test_metadata.py
2018-01-10 22:13:01 +00:00

210 lines
6.9 KiB
Python

from datetime import datetime
import io
import os.path
from textwrap import dedent
import unittest
from .helpers import StubOpener
from debugger_protocol.schema.upstream import URL as UPSTREAM
from debugger_protocol.schema.metadata import (
open_metadata, read_metadata,
MetadataError, Metadata)
class Stringlike:
def __init__(self, value):
self.value = value
def __str__(self):
return self.value
class Hash(Stringlike):
pass
class OpenMetadataTests(unittest.TestCase):
def test_success(self):
expected = object()
opener = StubOpener(expected)
schemadir = os.path.join('x', 'y', 'z', '')
metafile, filename = open_metadata(schemadir + 'schema.json',
_open=opener.open)
self.assertIs(metafile, expected)
self.assertEqual(filename, schemadir + 'UPSTREAM')
def test_file_missing(self):
metafile = None
opener = StubOpener(metafile)
with self.assertRaises(MetadataError):
open_metadata('schema.json', _open=opener.open)
class ReadMetadataTests(unittest.TestCase):
def test_success(self):
metafile = io.StringIO(dedent("""
upstream: https://x.y.z/schema.json
revision: abcdef0123456789
checksum: deadbeefdeadbeefdeadbeefdeadbeef
downloaded: 2018-01-09 13:10:59 (UTC)
"""))
opener = StubOpener(metafile)
schemadir = os.path.join('x', 'y', 'z', '')
meta, filename = read_metadata(schemadir + 'schema.json',
_open=opener.open)
self.assertEqual(meta,
Metadata('https://x.y.z/schema.json',
'abcdef0123456789',
'deadbeefdeadbeefdeadbeefdeadbeef',
datetime(2018, 1, 9, 13, 10, 59),
))
self.assertEqual(filename, schemadir + 'UPSTREAM')
def test_file_missing(self):
metafile = None
opener = StubOpener(metafile)
with self.assertRaises(MetadataError):
read_metadata('schema.json', _open=opener.open)
def test_file_invalid(self):
metafile = io.StringIO('<bogus>')
opener = StubOpener(metafile)
with self.assertRaises(MetadataError):
read_metadata('schema.json', _open=opener.open)
class MetadataTests(unittest.TestCase):
def test_parse_minimal(self):
expected = Metadata('https://x.y.z/schema.json',
'abcdef0123456789',
'deadbeefdeadbeefdeadbeefdeadbeef',
datetime(2018, 1, 9, 13, 10, 59),
)
meta = Metadata.parse(dedent("""
upstream: https://x.y.z/schema.json
revision: abcdef0123456789
checksum: deadbeefdeadbeefdeadbeefdeadbeef
downloaded: 2018-01-09 13:10:59 (UTC)
"""))
self.assertEqual(meta, expected)
def test_parse_with_whitespace_and_comments(self):
expected = Metadata('https://x.y.z/schema.json',
'abcdef0123456789',
'deadbeefdeadbeefdeadbeefdeadbeef',
datetime(2018, 1, 9, 13, 10, 59),
)
meta = Metadata.parse(dedent("""
# generated by x.y.z
upstream: https://x.y.z/schema.json
revision: abcdef0123456789
checksum: deadbeefdeadbeefdeadbeefdeadbeef
downloaded: 2018-01-09 13:10:59 (UTC)
# done!
""")) # noqa
self.assertEqual(meta, expected)
def test_parse_roundtrip_from_object(self):
orig = Metadata('https://x.y.z/schema.json',
'abcdef0123456789',
'deadbeefdeadbeefdeadbeefdeadbeef',
datetime(2018, 1, 9, 13, 10, 59),
)
meta = Metadata.parse(
orig.format())
self.assertEqual(meta, orig)
def test_parse_roundtrip_from_string(self):
orig = dedent("""\
upstream: https://x.y.z/schema.json
revision: abcdef0123456789
checksum: deadbeefdeadbeefdeadbeefdeadbeef
downloaded: 2018-01-09 13:10:59 (UTC)
""")
data = (Metadata.parse(orig)
).format()
self.assertEqual(data, orig)
def test_coercion_noop(self):
meta = Metadata('https://x.y.z/schema.json',
'abcdef0123456789',
'deadbeefdeadbeefdeadbeefdeadbeef',
datetime(2018, 1, 9, 13, 10, 59),
)
self.assertEqual(meta, (
'https://x.y.z/schema.json',
'abcdef0123456789',
'deadbeefdeadbeefdeadbeefdeadbeef',
datetime(2018, 1, 9, 13, 10, 59),
))
def test_coercion_change_all(self):
meta = Metadata(Stringlike('https://x.y.z/schema.json'),
Hash('abcdef0123456789'),
Hash('deadbeefdeadbeefdeadbeefdeadbeef'),
'2018-01-09 13:10:59 (UTC)',
)
self.assertEqual(meta, (
'https://x.y.z/schema.json',
'abcdef0123456789',
'deadbeefdeadbeefdeadbeefdeadbeef',
datetime(2018, 1, 9, 13, 10, 59),
))
def test_validation_fail(self):
baseargs = [
'https://x.y.z/schema.json',
'abcdef0123456789',
'deadbeefdeadbeefdeadbeefdeadbeef',
datetime(2018, 1, 9, 13, 10, 59),
]
for i in range(len(baseargs)):
with self.subTest(baseargs[i]):
args = list(baseargs)
args[i] = ''
with self.assertRaises(ValueError):
Metadata(*args)
def test_url(self):
meta = Metadata(UPSTREAM,
'abcdef0123456789',
'deadbeefdeadbeefdeadbeefdeadbeef',
datetime(2018, 1, 9, 13, 10, 59),
)
url = meta.url
self.assertEqual(url, 'https://github.com/Microsoft/vscode-debugadapter-node/raw/abcdef0123456789/debugProtocol.json') # noqa
def test_format(self):
meta = Metadata('https://x.y.z/schema.json',
'abcdef0123456789',
'deadbeefdeadbeefdeadbeefdeadbeef',
datetime(2018, 1, 9, 13, 10, 59),
)
formatted = meta.format()
self.assertEqual(formatted, dedent("""\
upstream: https://x.y.z/schema.json
revision: abcdef0123456789
checksum: deadbeefdeadbeefdeadbeefdeadbeef
downloaded: 2018-01-09 13:10:59 (UTC)
"""))