Skip to content

Commit

Permalink
Adds validation and testing to cover some of the common settings
Browse files Browse the repository at this point in the history
  • Loading branch information
stumpylog committed Sep 9, 2022
1 parent 0bf9e55 commit dded33c
Show file tree
Hide file tree
Showing 4 changed files with 140 additions and 6 deletions.
3 changes: 2 additions & 1 deletion src/paperless/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .checks import binaries_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"]
49 changes: 49 additions & 0 deletions src/paperless/checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,52 @@ def debug_mode_check(app_configs, **kwargs):
]
else:
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()
2 changes: 0 additions & 2 deletions src/paperless/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -532,11 +532,9 @@ def default_threads_per_worker(task_workers) -> int:
OCR_LANGUAGE = os.getenv("PAPERLESS_OCR_LANGUAGE", "eng")

# OCRmyPDF --output-type options are available.
# TODO: validate this setting.
OCR_OUTPUT_TYPE = os.getenv("PAPERLESS_OCR_OUTPUT_TYPE", "pdfa")

# skip. redo, force
# TODO: validate this.
OCR_MODE = os.getenv("PAPERLESS_OCR_MODE", "skip")

OCR_IMAGE_DPI = os.getenv("PAPERLESS_OCR_IMAGE_DPI")
Expand Down
92 changes: 89 additions & 3 deletions src/paperless/tests/test_checks.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import os
import shutil

from django.test import override_settings
from django.test import TestCase
from documents.tests.utils import DirectoriesMixin
from paperless import binaries_check
from paperless import paths_check
from paperless.checks import binaries_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):
Expand Down Expand Up @@ -54,3 +54,89 @@ def test_debug_disabled(self):
@override_settings(DEBUG=True)
def test_debug_enabled(self):
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=r"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(r'Timezone "TheMoon\MyCrater"', msg.msg)

0 comments on commit dded33c

Please sign in to comment.