Adds validation and testing to cover some of the common settings

This commit is contained in:
Trenton Holmes 2022-09-09 11:42:43 -07:00
parent 0bf9e55ca7
commit d408900a91
4 changed files with 140 additions and 6 deletions

View File

@ -1,4 +1,5 @@
from .checks import binaries_check from .checks import binaries_check
from .checks import paths_check from .checks import paths_check
from .checks import settings_values_check
__all__ = ["binaries_check", "paths_check"] __all__ = ["binaries_check", "paths_check", "settings_values_check"]

View File

@ -96,3 +96,52 @@ def debug_mode_check(app_configs, **kwargs):
] ]
else: else:
return [] return []
@register()
def settings_values_check(app_configs, **kwargs):
"""
Validates at least some of the user provided settings
"""
def _ocrmypdf_settings_check():
"""
Validates some of the arguments which will be provided to ocrmypdf
against the valid options. Use "ocrmypdf --help" to see the valid
inputs
"""
msgs = []
if settings.OCR_OUTPUT_TYPE not in {
"pdfa",
"pdf",
"pdfa-1",
"pdfa-2",
"pdfa-3",
}:
msgs.append(
Error(f'OCR output type "{settings.OCR_OUTPUT_TYPE}" is not valid'),
)
if settings.OCR_MODE not in {"force", "skip", "redo_ocr"}:
msgs.append(Error(f'OCR output mode "{settings.OCR_MODE}" is not valid'))
if settings.OCR_CLEAN not in {"clean", "clean_final"}:
msgs.append(Error(f'OCR clean mode "{settings.OCR_CLEAN}" is not valid'))
return msgs
def _timezone_validate():
"""
Validates the user provided timezone is a valid timezone
"""
try:
import zoneinfo
except ImportError: # pragma: nocover
import backports.zoneinfo as zoneinfo
msgs = []
if settings.TIME_ZONE not in zoneinfo.available_timezones():
msgs.append(
Error(f'Timezone "{settings.TIME_ZONE}" is not a valid timezone'),
)
return msgs
return _ocrmypdf_settings_check() + _timezone_validate()

View File

@ -532,11 +532,9 @@ OCR_PAGES = int(os.getenv("PAPERLESS_OCR_PAGES", 0))
OCR_LANGUAGE = os.getenv("PAPERLESS_OCR_LANGUAGE", "eng") OCR_LANGUAGE = os.getenv("PAPERLESS_OCR_LANGUAGE", "eng")
# OCRmyPDF --output-type options are available. # OCRmyPDF --output-type options are available.
# TODO: validate this setting.
OCR_OUTPUT_TYPE = os.getenv("PAPERLESS_OCR_OUTPUT_TYPE", "pdfa") OCR_OUTPUT_TYPE = os.getenv("PAPERLESS_OCR_OUTPUT_TYPE", "pdfa")
# skip. redo, force # skip. redo, force
# TODO: validate this.
OCR_MODE = os.getenv("PAPERLESS_OCR_MODE", "skip") OCR_MODE = os.getenv("PAPERLESS_OCR_MODE", "skip")
OCR_IMAGE_DPI = os.getenv("PAPERLESS_OCR_IMAGE_DPI") OCR_IMAGE_DPI = os.getenv("PAPERLESS_OCR_IMAGE_DPI")

View File

@ -1,12 +1,12 @@
import os import os
import shutil
from django.test import override_settings from django.test import override_settings
from django.test import TestCase from django.test import TestCase
from documents.tests.utils import DirectoriesMixin from documents.tests.utils import DirectoriesMixin
from paperless import binaries_check from paperless.checks import binaries_check
from paperless import paths_check
from paperless.checks import debug_mode_check from paperless.checks import debug_mode_check
from paperless.checks import paths_check
from paperless.checks import settings_values_check
class TestChecks(DirectoriesMixin, TestCase): class TestChecks(DirectoriesMixin, TestCase):
@ -54,3 +54,89 @@ class TestChecks(DirectoriesMixin, TestCase):
@override_settings(DEBUG=True) @override_settings(DEBUG=True)
def test_debug_enabled(self): def test_debug_enabled(self):
self.assertEqual(len(debug_mode_check(None)), 1) self.assertEqual(len(debug_mode_check(None)), 1)
class TestSettingsChecks(DirectoriesMixin, TestCase):
def test_all_valid(self):
"""
GIVEN:
- Default settings
WHEN:
- Settings are validated
THEN:
- No system check errors reported
"""
msgs = settings_values_check(None)
self.assertEqual(len(msgs), 0)
@override_settings(OCR_OUTPUT_TYPE="notapdf")
def test_invalid_output_type(self):
"""
GIVEN:
- Default settings
- OCR output type is invalid
WHEN:
- Settings are validated
THEN:
- system check error reported for OCR output type
"""
msgs = settings_values_check(None)
self.assertEqual(len(msgs), 1)
msg = msgs[0]
self.assertIn('OCR output type "notapdf"', msg.msg)
@override_settings(OCR_MODE="makeitso")
def test_invalid_ocr_type(self):
"""
GIVEN:
- Default settings
- OCR type is invalid
WHEN:
- Settings are validated
THEN:
- system check error reported for OCR type
"""
msgs = settings_values_check(None)
self.assertEqual(len(msgs), 1)
msg = msgs[0]
self.assertIn('OCR output mode "makeitso"', msg.msg)
@override_settings(OCR_CLEAN="cleanme")
def test_invalid_ocr_clean(self):
"""
GIVEN:
- Default settings
- OCR cleaning type is invalid
WHEN:
- Settings are validated
THEN:
- system check error reported for OCR cleaning type
"""
msgs = settings_values_check(None)
self.assertEqual(len(msgs), 1)
msg = msgs[0]
self.assertIn('OCR clean mode "cleanme"', msg.msg)
@override_settings(TIME_ZONE="TheMoon\\MyCrater")
def test_invalid_timezone(self):
"""
GIVEN:
- Default settings
- Timezone is invalid
WHEN:
- Settings are validated
THEN:
- system check error reported for timezone
"""
msgs = settings_values_check(None)
self.assertEqual(len(msgs), 1)
msg = msgs[0]
self.assertIn('Timezone "TheMoon\\MyCrater"', msg.msg)