# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Tests for Tor module.
"""

from unittest.mock import patch

import pytest
from django.core.exceptions import ValidationError

from plinth.modules.tor import forms, utils


class TestTor:
    """Test cases for testing the Tor module."""

    @staticmethod
    @pytest.mark.usefixtures('needs_root')
    def test_is_apt_transport_tor_enabled():
        """Test that is_apt_transport_tor_enabled does not raise any unhandled
        exceptions.
        """
        utils.is_apt_transport_tor_enabled()

    @staticmethod
    @patch('plinth.app.App.get')
    @pytest.mark.usefixtures('needs_root', 'load_cfg')
    def test_get_status(_app_get):
        """Test that get_status does not raise any unhandled exceptions.

        This should work regardless of whether tor is installed, or
        /etc/tor/torrc exists.
        """
        utils.get_status()


class TestTorForm:
    """Test whether Tor configration form works."""

    @staticmethod
    def test_bridge_validator():
        """Test upstream bridges' form field validator."""
        validator = forms.bridges_validator

        # Just IP:port
        validator('73.237.165.184:9001')
        validator('73.237.165.184')
        validator('[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443')
        validator('[2001:db8:85a3:8d3:1319:8a2e:370:7348]')

        # With fingerprint
        validator('73.237.165.184:9001 '
                  '0D04F10F497E68D2AF32375BB763EC3458A908C8')

        # With transport type
        validator('obfs4 73.237.165.184:9001 '
                  '0D04F10F497E68D2AF32375BB763EC3458A908C8')

        # With transport type and extra options
        validator('obfs4 10.1.1.1:30000 '
                  '0123456789ABCDEF0123456789ABCDEF01234567 '
                  'cert=A/b+1 iat-mode=0')

        # Leading, trailing spaces and empty lines
        validator('\n'
                  '  \n'
                  '73.237.165.184:9001 '
                  '0D04F10F497E68D2AF32375BB763EC3458A908C8'
                  '  \n'
                  '73.237.165.184:9001 '
                  '0D04F10F497E68D2AF32375BB763EC3458A908C8'
                  '  \n'
                  '\n')

        # Invalid number for parts
        with pytest.raises(ValidationError):
            validator('  ')

        # Invalid IP address/port
        with pytest.raises(ValidationError):
            validator('73.237.165.384:9001')

        with pytest.raises(ValidationError):
            validator('73.237.165.184:90001')

        with pytest.raises(ValidationError):
            validator('[a2001:db8:85a3:8d3:1319:8a2e:370:7348]:443')

        with pytest.raises(ValidationError):
            validator('[2001:db8:85a3:8d3:1319:8a2e:370:7348]:90443')
