This repository has been archived on 2023-03-26. You can view files and clone it, but cannot push or open issues or pull requests.
md-pdf/tests/test_config.py

247 lines
8.5 KiB
Python

from tests import BaseTestCase
from md_pdf.config import read, validate
from md_pdf.exceptions import ConfigValidationException
from md_pdf.consts import CSL_DIR
from md_pdf.utils import remove_dir
import os
import datetime
from unittest import skipIf
class ReadConfigTestCase(BaseTestCase):
def test_reads_config(self):
config = read.load_config(os.path.abspath('test-files/mdp.yml'))
self.assertIsInstance(config, dict)
def test_throws_at_missing_config(self):
with self.assertRaises(ConfigValidationException):
read.load_config(os.path.abspath('non-existant'))
class ConfigValidatorBaseTestCase(BaseTestCase):
def setUp(self):
self.BASE_VALID_CONFIG = {
'title': 'test title',
'input': 'test-files/*.md',
'output_formats': [
'html', 'pdf'
],
'output_dir': 'out/',
}
validate.validate_config(self.BASE_VALID_CONFIG)
class ValidateSubmissionDateTestCase(ConfigValidatorBaseTestCase):
def test_transparent_to_datetime(self):
self.BASE_VALID_CONFIG['submission_date'] = datetime.datetime.now()
validate.validate_config(self.BASE_VALID_CONFIG)
def test_transparent_to_date(self):
self.BASE_VALID_CONFIG['submission_date'] = datetime.datetime.now().date()
validate.validate_config(self.BASE_VALID_CONFIG)
def test_transparent_to_time(self):
self.BASE_VALID_CONFIG['submission_date'] = datetime.datetime.now().time()
validate.validate_config(self.BASE_VALID_CONFIG)
def test_valid_date_format(self):
for date in [
'2017-01-01',
'01-01-2017',
'1st jan 2017',
'1 january 2017'
]:
self.BASE_VALID_CONFIG['submission_date'] = date
validate.validate_config(self.BASE_VALID_CONFIG)
def test_invalid_date_format(self):
for date in [
'nothing',
'31-02-2017',
'01-2017-01',
'1st smarch 2017'
]:
self.BASE_VALID_CONFIG['submission_date'] = date
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
class ValidateWordcountTestCase(ConfigValidatorBaseTestCase):
def test_boolean_values_only(self):
self.BASE_VALID_CONFIG['show_word_count'] = True
validate.validate_config(self.BASE_VALID_CONFIG)
self.BASE_VALID_CONFIG['show_word_count'] = False
validate.validate_config(self.BASE_VALID_CONFIG)
def test_invalid_values(self):
for value in [
'True',
'False',
0,
1
]:
self.BASE_VALID_CONFIG['show_word_count'] = value
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
class ValidateTOCTestCase(ConfigValidatorBaseTestCase):
def test_boolean_values_only(self):
self.BASE_VALID_CONFIG['toc'] = True
validate.validate_config(self.BASE_VALID_CONFIG)
self.BASE_VALID_CONFIG['toc'] = False
validate.validate_config(self.BASE_VALID_CONFIG)
def test_invalid_values(self):
for value in [
'True',
'False',
0,
1
]:
self.BASE_VALID_CONFIG['toc'] = value
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
class ValidateContextTestCase(ConfigValidatorBaseTestCase):
def test_should_be_dict(self):
for value in [
[],
'dict',
1
]:
self.BASE_VALID_CONFIG['context'] = value
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
self.BASE_VALID_CONFIG['context'] = {}
validate.validate_config(self.BASE_VALID_CONFIG)
def test_non_string_keys(self):
self.BASE_VALID_CONFIG['context'] = {
1: 'test'
}
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
def test_string_keys(self):
self.BASE_VALID_CONFIG['context'] = {
'1': 'test'
}
validate.validate_config(self.BASE_VALID_CONFIG)
def test_valid_values(self):
for value in [
'test',
1
]:
self.BASE_VALID_CONFIG['context'] = {
'test': value
}
validate.validate_config(self.BASE_VALID_CONFIG)
def test_invalid_values(self):
for value in [
[],
{}
]:
self.BASE_VALID_CONFIG['context'] = {
'test': value
}
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
class ValidateBibliographyTestCase(ConfigValidatorBaseTestCase):
def test_contains_all_keys(self):
self.BASE_VALID_CONFIG['bibliography'] = {}
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
self.BASE_VALID_CONFIG['bibliography'] = {
'references': 'test'
}
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
self.BASE_VALID_CONFIG['bibliography'] = {
'csl': 'test'
}
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
def test_valid_references(self):
self.BASE_VALID_CONFIG['bibliography'] = {
'references': 'non-existant',
'csl': 'chicago-author-date'
}
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
self.BASE_VALID_CONFIG['bibliography']['references'] = 'test-files/bib.yaml'
validate.validate_config(self.BASE_VALID_CONFIG)
@skipIf(not os.path.isdir(CSL_DIR), 'Missing CSL Files')
def test_valid_csl(self):
self.BASE_VALID_CONFIG['bibliography'] = {
'references': 'test-files/bib.yaml',
'csl': 'nothing'
}
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
self.BASE_VALID_CONFIG['bibliography']['csl'] = 'chicago-author-date'
validate.validate_config(self.BASE_VALID_CONFIG)
class ValidateInputTestCase(ConfigValidatorBaseTestCase):
def test_no_matches(self):
self.BASE_VALID_CONFIG['input'] = 'test-files/*.mp4'
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
def test_invalid_glob(self):
self.BASE_VALID_CONFIG['input'] = 'test-files/'
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
class ValidateOutputTestCase(ConfigValidatorBaseTestCase):
def tearDown(self):
super().tearDown()
remove_dir('test-files/test')
def test_creates_output_dir(self):
self.assertFalse(os.path.isdir('test-files/test'))
self.BASE_VALID_CONFIG['output_dir'] = 'test-files/test'
validate.validate_config(self.BASE_VALID_CONFIG)
self.assertTrue(os.path.isdir('test-files/test'))
def test_valid_output_formats(self):
for format in [
'html',
'pdf'
]:
self.BASE_VALID_CONFIG['output_formats'] = [format]
validate.validate_config(self.BASE_VALID_CONFIG)
def test_invalid_output_formats(self):
for format in [
'text',
'foo'
]:
self.BASE_VALID_CONFIG['output_formats'] = [format]
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
def test_part_invalid_format(self):
self.BASE_VALID_CONFIG['output_formats'] = ['html', 'foo']
with self.assertRaises(ConfigValidationException):
validate.validate_config(self.BASE_VALID_CONFIG)
class ValidateRequiredKeysTestCase(ConfigValidatorBaseTestCase):
def test_required_keys(self):
for key in validate.REQUIRED_KEYS:
base_config = self.BASE_VALID_CONFIG.copy()
del base_config[key]
with self.assertRaises(ConfigValidationException):
validate.validate_config(base_config)