murano-pkg-check/muranopkgcheck/tests/functional/test_cases.py

96 lines
2.8 KiB
Python

# Copyright (c) 2016 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import io
import os
import oslotest.base
import testscenarios
import yaml
from muranopkgcheck import consts
from muranopkgcheck import manager
from muranopkgcheck import pkg_loader
class DictLoader(pkg_loader.BaseLoader):
@classmethod
def _try_load(cls, pkg):
if consts.MANIFEST_PATH in pkg:
return cls(pkg)
return None
def __init__(self, pkg):
super(DictLoader, self).__init__('')
self.pkg = pkg
def open_file(self, path, mode='r'):
if self.pkg[path]['format'] == 'raw':
sio = io.BytesIO(self.pkg[path]['content'].encode())
setattr(sio, 'name', path)
elif self.pkg[path]['format'] == 'yaml':
content = yaml.safe_dump(self.pkg[path]['content'])
sio = io.BytesIO(content.encode())
setattr(sio, 'name', path)
else:
raise ValueError('Unknown type of content')
return sio
def list_files(self, subdir=None):
files = self.pkg.keys()
if subdir is None:
return files
subdir_len = len(subdir)
return [file_[subdir_len:].lstrip('/') for file_ in files
if file_.startswith(subdir)]
def exists(self, name):
return name in self.pkg
class DictFormatter(manager.Formatter):
def format(self, error):
return sorted([{'code': e.code, 'msg': e.message} for e in error],
key=lambda item: item['code'])
def load_cases():
cases_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
'cases')
cases_files = [os.path.join(cases_path, f)for f in os.listdir(cases_path)
if os.path.isfile(os.path.join(cases_path, f))]
cases = []
for cases_file in cases_files:
with open(cases_file) as f:
cases.extend(list(yaml.load_all(f, yaml.SafeLoader)))
return cases
cases = load_cases()
class TestCase(testscenarios.WithScenarios, oslotest.base.BaseTestCase):
"""Test case base class for all unit tests."""
scenarios = cases
def test_foo(self):
m = manager.Manager(self.pkg, loader=DictLoader)
errors = m.validate()
fmt = DictFormatter()
self.assertEqual(self.expected, fmt.format(errors))