Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 7 additions & 17 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,18 @@ jobs:
fail-fast: false
max-parallel: 5
matrix:
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12-dev']
django-version: ['3.2', '4.2', 'main']
python-version: ['3.10', '3.11', '3.12', '3.13', '3.14', '3.15-dev']
django-version: ['5.2', '6.0', 'main']
exclude:
- python-version: '3.10'
django-version: '6.0'
- python-version: '3.11'
django-version: '3.2'
- python-version: '3.12-dev'
django-version: '3.2'

- python-version: '3.11'
django-version: '4.0'
- python-version: '3.12-dev'
django-version: '4.0'

- python-version: '3.12-dev'
django-version: '4.1'
django-version: '6.0'

- python-version: '3.8'
django-version: 'main'
- python-version: '3.9'
django-version: 'main'
- python-version: '3.10'
django-version: 'main'
- python-version: '3.11'
django-version: 'main'

steps:
- uses: actions/checkout@v3
Expand Down
20 changes: 11 additions & 9 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,29 +1,31 @@
TARGET?=tests

.PHONY: ruff example test coverage
.PHONY: ruff example test coverage generate-mmdb-fixtures

ruff:
ruff user_sessions example tests

example:
DJANGO_SETTINGS_MODULE=example.settings PYTHONPATH=. \
django-admin.py runserver
django-admin runserver

check:
DJANGO_SETTINGS_MODULE=example.settings PYTHONPATH=. \
python -Wd example/manage.py check

generate-mmdb-fixtures:
docker --context=default buildx build -f tests/Dockerfile --tag test-mmdb-maker tests
docker run --rm --volume $$(pwd)/tests:/data test-mmdb-maker
$(TARGET)/test_city.mmdb $(TARGET)/test_country.mmdb: $(TARGET)/generate_mmdb.py
python3 $(TARGET)/generate_mmdb.py
stat $@

generate-mmdb-fixtures: $(TARGET)/test_city.mmdb $(TARGET)/test_country.mmdb

test: generate-mmdb-fixtures
DJANGO_SETTINGS_MODULE=tests.settings PYTHONPATH=. \
django-admin.py test ${TARGET}
django-admin test ${TARGET}

migrations:
DJANGO_SETTINGS_MODULE=tests.settings PYTHONPATH=. \
django-admin.py makemigrations user_sessions
django-admin makemigrations user_sessions

coverage:
coverage erase
Expand All @@ -34,8 +36,8 @@ coverage:

tx-pull:
tx pull -a
cd user_sessions; django-admin.py compilemessages
cd user_sessions; django-admin compilemessages

tx-push:
cd user_sessions; django-admin.py makemessages -l en
cd user_sessions; django-admin makemessages -l en
tx push -s
5 changes: 3 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ requires = ["setuptools>=45", "wheel", "setuptools_scm>=6.2"]
[project]
name = "django-user-sessions"
authors = [
{name = "Bouke Haarsma", email = "[email protected]"},
{name = "Bouke Haarsma", email = "[email protected]"},
]
description = "Django sessions with a foreign key to the user"
readme = "README.rst"
Expand All @@ -30,7 +30,7 @@ classifiers = [
"Topic :: Security",
]
dependencies = [
"Django>=3.2",
"Django>=3.2",
]
dynamic = ["version"]

Expand Down Expand Up @@ -58,6 +58,7 @@ dev = [
# Build
"bumpversion",
"twine",
"mmdb-writer",
]

[tool.ruff]
Expand Down
9 changes: 0 additions & 9 deletions tests/Dockerfile

This file was deleted.

89 changes: 0 additions & 89 deletions tests/generate_mmdb.pl

This file was deleted.

85 changes: 85 additions & 0 deletions tests/generate_mmdb.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
from netaddr import IPSet

from mmdb_writer import MMDBWriter


city_writer = MMDBWriter(database_type="GeoIP2-City")

city_writer.insert_network(
IPSet(["44.55.66.77/32"]),
{
"city": {
"names": {
"en": "San Diego",
},
},
"continent": {
"code": "NA",
"names": {
"en": "North America",
},
},
"country": {
"iso_code": "US",
"names": {
"en": "United States",
},
},
"is_in_european_union": False,
"location": {
"latitude": 37.751,
"longitude": -97.822,
"metro_code": "custom metro code",
"time_zone": "America/Los Angeles",
},
"postal": {
"code": "custom postal code",
},
"subdivisions": [
{
"iso_code": "ABC",
"names": {
"en": 'Absolute Basic Class',
},
},
],
},
)
city_writer.insert_network(
IPSet(["8.8.8.8/32"]),
{
"country": {
"iso_code": "US",
"names": {
"en": "United States",
},
},
},
)
city_writer.to_db_file("tests/test_city.mmdb")

country_writer = MMDBWriter(database_type="GeoIP2-Country")
country_writer.insert_network(
IPSet(["55.66.77.88/32"]),
{
"country": {
"iso_code": "US",
"names": {
"en": "United States",
},
},
},
)
country_writer.insert_network(
IPSet(["8.8.4.4/32"]),
{
"country": {
"iso_code": "US",
"names": {
"en": "United States",
},
},
},
)

country_writer.to_db_file("tests/test_country.mmdb")
54 changes: 44 additions & 10 deletions tests/test_template_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from django.test import TestCase
from django.test.utils import override_settings

from user_sessions.templatetags import user_sessions
from user_sessions.templatetags.user_sessions import (
browser, city, country, device, location, platform,
)
Expand All @@ -13,24 +14,23 @@
geoip = GeoIP2()
geoip_msg = None
except Exception as error_geoip2: # pragma: no cover
try:
from django.contrib.gis.geoip import GeoIP
geoip = GeoIP()
geoip_msg = None
except Exception as error_geoip:
geoip = None
geoip_msg = str(error_geoip2) + " and " + str(error_geoip)
geoip = None
geoip_msg = str(error_geoip2)


class LocationTemplateFilterTest(TestCase):
@override_settings(GEOIP_PATH=None)
def setUp(self):
# Remove the cached GeoIP object, since it caches the database type and
# this fails when we switch between city and country MMDB files
user_sessions._geoip = None

@override_settings(GEOIP_CITY="")
def test_no_location(self):
with self.assertWarnsRegex(
UserWarning,
r"The address 127\.0\.0\.1 is not in the database",
):
loc = location('127.0.0.1')
self.assertEqual(loc, None)
self.assertIsNone(location('127.0.0.1'))

@skipUnless(geoip, geoip_msg)
def test_city(self):
Expand All @@ -46,6 +46,40 @@ def test_locations(self):
self.assertEqual('San Diego, United States', location('44.55.66.77'))


@override_settings(GEOIP_CITY="doesnt_exist")
class CountryLocationTemplateFilterTest(TestCase):
def setUp(self):
# Remove the cached GeoIP object, since it caches the database type and
# this fails when we switch between city and country MMDB files
user_sessions._geoip = None

def test_no_location(self):
with self.assertWarnsRegex(
UserWarning,
r"The address 127\.0\.0\.1 is not in the database",
):
self.assertIsNone(location('127.0.0.1'))

@skipUnless(geoip, geoip_msg)
def test_city(self):
self.assertIsNone(city('55.66.77.88'))
self.assertIsNone(city('8.8.4.4'))
# Make sure it isn't somehow pulling any IP addresses from the city
# database
self.assertIsNone(city('44.55.66.77'))
self.assertIsNone(city('8.8.8.8'))

@skipUnless(geoip, geoip_msg)
def test_country(self):
self.assertEqual('United States', country('55.66.77.88'))
self.assertEqual('United States', country('8.8.4.4'))

@skipUnless(geoip, geoip_msg)
def test_locations(self):
self.assertEqual('United States', location('55.66.77.88'))
self.assertEqual('United States', location('8.8.4.4'))


class PlatformTemplateFilterTest(TestCase):
def test_windows(self):
# Generic Windows
Expand Down
Loading
Loading