Source code for evennia.server.tests.test_misc

# -*- coding: utf-8 -*-

"""
Testing various individual functionalities in the server package.

"""
import unittest
from django.test import TestCase

from evennia.server.validators import EvenniaPasswordValidator
from evennia.utils.test_resources import EvenniaTest

from django.test.runner import DiscoverRunner

from evennia.server.throttle import Throttle

from ..deprecations import check_errors


[docs]class MockSettings(object): """ Class for simulating django.conf.settings. Created with a single value, and then sets the required WEBSERVER_ENABLED setting to True or False depending if we're testing WEBSERVER_PORTS. """
[docs] def __init__(self, setting, value=None): setattr(self, setting, value) if setting == "WEBSERVER_PORTS": self.WEBSERVER_ENABLED = True else: self.WEBSERVER_ENABLED = False
[docs]class TestDeprecations(TestCase): """ Class for testing deprecations.check_errors. """ deprecated_settings = ( "CMDSET_DEFAULT", "CMDSET_OOC", "BASE_COMM_TYPECLASS", "COMM_TYPECLASS_PATHS", "CHARACTER_DEFAULT_HOME", "OBJECT_TYPECLASS_PATHS", "SCRIPT_TYPECLASS_PATHS", "ACCOUNT_TYPECLASS_PATHS", "CHANNEL_TYPECLASS_PATHS", "SEARCH_MULTIMATCH_SEPARATOR", "TIME_SEC_PER_MIN", "TIME_MIN_PER_HOUR", "TIME_HOUR_PER_DAY", "TIME_DAY_PER_WEEK", "TIME_WEEK_PER_MONTH", "TIME_MONTH_PER_YEAR", "GAME_DIRECTORY_LISTING", )
[docs] def test_check_errors(self): """ All settings in deprecated_settings should raise a DeprecationWarning if they exist. WEBSERVER_PORTS raises an error if the iterable value passed does not have a tuple as its first element. """ for setting in self.deprecated_settings: self.assertRaises(DeprecationWarning, check_errors, MockSettings(setting)) # test check for WEBSERVER_PORTS having correct value self.assertRaises( DeprecationWarning, check_errors, MockSettings("WEBSERVER_PORTS", value=["not a tuple"]) )
[docs]class ValidatorTest(EvenniaTest):
[docs] def test_validator(self): # Validator returns None on success and ValidationError on failure. validator = EvenniaPasswordValidator() # This password should meet Evennia standards. self.assertFalse(validator.validate("testpassword", user=self.account)) # This password contains illegal characters and should raise an Exception. from django.core.exceptions import ValidationError self.assertRaises(ValidationError, validator.validate, "(#)[#]<>", user=self.account)
[docs]class ThrottleTest(EvenniaTest): """ Class for testing the connection/IP throttle. """
[docs] def test_throttle(self): ips = ("94.100.176.153", "45.56.148.77", "5.196.1.129") kwargs = {"limit": 5, "timeout": 15 * 60} throttle = Throttle(**kwargs) for ip in ips: # Throttle should not be engaged by default self.assertFalse(throttle.check(ip)) # Pretend to fail a bunch of events for x in range(50): obj = throttle.update(ip) self.assertFalse(obj) # Next ones should be blocked self.assertTrue(throttle.check(ip)) for x in range(throttle.cache_size * 2): obj = throttle.update(ip) self.assertFalse(obj) # Should still be blocked self.assertTrue(throttle.check(ip)) # Number of values should be limited by cache size self.assertEqual(throttle.cache_size, len(throttle.get(ip))) cache = throttle.get() # Make sure there are entries for each IP self.assertEqual(len(ips), len(cache.keys())) # There should only be (cache_size * num_ips) total in the Throttle cache self.assertEqual(sum([len(cache[x]) for x in cache.keys()]), throttle.cache_size * len(ips))