django-analytical/tests/unit/test_utils.py
2025-04-04 13:25:00 +02:00

150 lines
4.8 KiB
Python

"""
Tests for the analytical.utils module.
"""
# import django
import pytest
from django.contrib.auth.models import AbstractBaseUser
from django.db import models
from django.http import HttpRequest
from django.template import Context
from django.test.utils import override_settings
from utils import TestCase
from analytical.utils import (
AnalyticalException,
get_domain,
get_identity,
get_required_setting,
is_internal_ip,
)
class SettingDeletedTestCase(TestCase):
@override_settings(USER_ID=None)
def test_get_required_setting(self):
"""
Make sure using get_required_setting fails in the right place.
"""
with pytest.raises(AnalyticalException, match='USER_ID setting is not set'):
get_required_setting('USER_ID', r'\d+', 'invalid USER_ID')
class MyUser(AbstractBaseUser):
identity = models.CharField(max_length=50)
USERNAME_FIELD = 'identity'
class Meta:
abstract = False
app_label = 'testapp'
class GetIdentityTestCase(TestCase):
def test_custom_username_field(self):
get_id = get_identity(Context({}), user=MyUser(identity='fake_id'))
assert get_id == 'fake_id'
def test_custom_identity_specific_provider(self):
get_id = get_identity(
Context(
{
'foo_provider_identity': 'bar',
'analytical_identity': 'baz',
}
),
prefix='foo_provider',
)
assert get_id == 'bar'
def test_custom_identity_general(self):
get_id = get_identity(
Context(
{
'analytical_identity': 'baz',
}
),
prefix='foo_provider',
)
assert get_id == 'baz'
@override_settings(ANALYTICAL_DOMAIN='example.org')
class GetDomainTestCase(TestCase):
def test_get_service_domain_from_context(self):
context = Context({'test_domain': 'example.com'})
assert get_domain(context, 'test') == 'example.com'
def test_get_analytical_domain_from_context(self):
context = Context({'analytical_domain': 'example.com'})
assert get_domain(context, 'test') == 'example.com'
@override_settings(TEST_DOMAIN='example.net')
def test_get_service_domain_from_settings(self):
context = Context()
assert get_domain(context, 'test') == 'example.net'
def test_get_analytical_domain_from_settings(self):
context = Context()
assert get_domain(context, 'test') == 'example.org'
# FIXME: enable Django apps dynamically and enable test again
# @with_apps('django.contrib.sites')
# @override_settings(TEST_DOMAIN=SETTING_DELETED, ANALYTICAL_DOMAIN=SETTING_DELETED)
# class GetDomainTestCaseWithSites(TestCase):
# def test_get_domain_from_site(self):
# site = Site.objects.create(domain="example.com", name="test")
# with override_settings(SITE_ID=site.id):
# context = Context()
# self.assertEqual(get_domain(context, 'test'), 'example.com')
class InternalIpTestCase(TestCase):
@override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
def test_render_no_internal_ip(self):
context = Context()
assert not is_internal_ip(context)
@override_settings(INTERNAL_IPS=['1.1.1.1'])
@override_settings(ANALYTICAL_INTERNAL_IPS=[])
def test_render_analytical_internal_ips_override_when_empty(self):
req = HttpRequest()
req.META['REMOTE_ADDR'] = '1.1.1.1'
context = Context({'request': req})
assert not is_internal_ip(context)
@override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
def test_render_internal_ip(self):
req = HttpRequest()
req.META['REMOTE_ADDR'] = '1.1.1.1'
context = Context({'request': req})
assert is_internal_ip(context)
@override_settings(TEST_INTERNAL_IPS=['1.1.1.1'])
def test_render_prefix_internal_ip(self):
req = HttpRequest()
req.META['REMOTE_ADDR'] = '1.1.1.1'
context = Context({'request': req})
assert is_internal_ip(context, 'TEST')
@override_settings(INTERNAL_IPS=['1.1.1.1'])
def test_render_internal_ip_fallback(self):
req = HttpRequest()
req.META['REMOTE_ADDR'] = '1.1.1.1'
context = Context({'request': req})
assert is_internal_ip(context)
@override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
def test_render_internal_ip_forwarded_for(self):
req = HttpRequest()
req.META['HTTP_X_FORWARDED_FOR'] = '1.1.1.1'
context = Context({'request': req})
assert is_internal_ip(context)
@override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
def test_render_different_internal_ip(self):
req = HttpRequest()
req.META['REMOTE_ADDR'] = '2.2.2.2'
context = Context({'request': req})
assert not is_internal_ip(context)