"""
Test Slinky
"""
from typing import Any
from unittest import TestCase, mock

from slinky import web


@mock.patch.dict('slinky.web.cfg', {'db': 'sqlite:///tests/test.db'})
class TestWeb(TestCase):
    """
    Class to test Slinky code
    """

    def test_simple_redirect(self, *_: Any) -> None:
        """
        Ensure simple redirect works
        """
        response = web.try_path_as_shortcode('egie')
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response.location, 'https://example.com')

    def test_fixed_views(self, *_: Any) -> None:
        """
        Ensure simple redirect works
        """
        response = web.try_path_as_shortcode('egig')
        self.assertEqual(response.status_code, 404)

    def test_expiry(self, *_: Any) -> None:
        """
        Ensure simple redirect works
        """
        response = web.try_path_as_shortcode('egif')
        self.assertEqual(response.status_code, 404)

    @mock.patch(
        'slinky.web.ShortURLForm',
        return_value=mock.Mock(
            shortcode=mock.Mock(data=''),
            url=mock.Mock(data='https://example.com'),
            fixed_views=mock.Mock(data=0),
            expiry=mock.Mock(data='1970-01-01 00:00:00.000000'),
        ),
    )
    @mock.patch('slinky.random_string', return_value='egie')
    def test_no_unique_shortcode(self, *_: Any) -> None:
        """
        Ensure non-unique shortcode generation returns a 500 error
        """
        response = web.add()
        self.assertEqual(response.status_code, 500)