FreedomBox/plinth/tests/test_diagnostic_check.py
Sunil Mohan Adapa 4b09d91f93
*: Add type hints for diagnose method
Helps: #2410.

- Ensure that diagnostics methods and parameters are type checked so that we can
catch any potential issues.

- Move plinth/modules/diagnostics/check.py to plinth/diagnostic_check.py to
avoid many circular dependencies created. This is due to
plinth.modules.diagnostics automatically imported when
plinth.modules.diagnostics.check is imported. Also app.py is already (type)
dependent on diagnostic_check due to diagnose() method. To make the Check
classes independent of diagnostic module is okay.

Tests:

- Run make check-type.

- Run full diagnostics with following apps installed: torproxy, tor.
  - Test to netcat to 9051 in tor works.
  - Test 'port available for internal/external networks' in firewall works.
  - Test 'Package is latest' works.
  - Test 'Access url with proxy' in privoxy works.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
[jvalleroy: Also move tests for diagnostic_check]
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2024-03-09 14:23:33 -05:00

68 lines
2.3 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
"""Tests for diagnostic check data type."""
import json
import pytest
from plinth.diagnostic_check import (CheckJSONDecoder, CheckJSONEncoder,
DiagnosticCheck, Result)
def test_result():
"""Test result enum type."""
assert Result.__members__['ERROR'].name == 'ERROR'
assert Result.__members__['ERROR'].value == 'error'
assert Result.NOT_DONE == 'not_done'
assert Result.PASSED == 'passed'
assert Result.WARNING == 'warning'
assert Result.FAILED == 'failed'
assert Result.ERROR == 'error'
def test_diagnostic_check():
"""Test the diagnostic check data class."""
with pytest.raises(TypeError):
DiagnosticCheck()
check = DiagnosticCheck('some-check-id', 'sample check')
assert check.check_id == 'some-check-id'
assert check.description == 'sample check'
assert check.translated_description == 'sample check'
assert check.result == Result.NOT_DONE
assert not check.parameters
check = DiagnosticCheck('some-check-id', 'sample check', Result.PASSED)
assert check.result == Result.PASSED
assert not check.parameters
check = DiagnosticCheck('some-check-id', 'sample check', Result.PASSED,
{'key': 'value'})
assert check.parameters['key'] == 'value'
def test_translate():
"""Test formatting the translated description."""
check = DiagnosticCheck('some-check-id', 'sample check {key}',
Result.FAILED, {'key': 'value'})
assert check.translated_description == 'sample check value'
check = DiagnosticCheck('some-check-id', 'sample check {missing}',
Result.PASSED, {'key': 'value'})
assert check.translated_description == 'sample check ?missing?'
def test_json_encoder_decoder():
"""Test encoding and decoding as JSON."""
check = DiagnosticCheck('some-check-id', 'sample check', Result.PASSED)
check_json = json.dumps(check, cls=CheckJSONEncoder)
for string in [
'"check_id": "some-check-id"', '"description": "sample check"',
'"result": "passed"', '"parameters": {}',
'"__class__": "DiagnosticCheck"'
]:
assert string in check_json
decoded_check = json.loads(check_json, cls=CheckJSONDecoder)
assert decoded_check == check