Skip to content

Commit 1b127ec

Browse files
committed
Update fixture generation and tests for country MMDB files
1 parent 416e054 commit 1b127ec

File tree

5 files changed

+106
-34
lines changed

5 files changed

+106
-34
lines changed

Makefile

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
TARGET?=tests
22

3-
.PHONY: ruff example test coverage
3+
.PHONY: ruff example test coverage generate-mmdb-fixtures
44

55
ruff:
66
ruff user_sessions example tests
@@ -13,8 +13,11 @@ check:
1313
DJANGO_SETTINGS_MODULE=example.settings PYTHONPATH=. \
1414
python -Wd example/manage.py check
1515

16-
generate-mmdb-fixtures:
17-
[ -e tests/test_city.mmdb ] || python3 generate_mmdb.py
16+
$(TARGET)/test_city.mmdb $(TARGET)/test_country.mmdb: $(TARGET)/generate_mmdb.py
17+
python3 $(TARGET)/generate_mmdb.py
18+
stat $@
19+
20+
generate-mmdb-fixtures: $(TARGET)/test_city.mmdb $(TARGET)/test_country.mmdb
1821

1922
test: generate-mmdb-fixtures
2023
DJANGO_SETTINGS_MODULE=tests.settings PYTHONPATH=. \

tests/generate_mmdb.py

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from mmdb_writer import MMDBWriter
44

55

6-
city_writer = MMDBWriter()
6+
city_writer = MMDBWriter(database_type="GeoIP2-City")
77

88
city_writer.insert_network(
99
IPSet(["44.55.66.77/32"]),
@@ -45,19 +45,41 @@
4545
],
4646
},
4747
)
48-
48+
city_writer.insert_network(
49+
IPSet(["8.8.8.8/32"]),
50+
{
51+
"country": {
52+
"iso_code": "US",
53+
"names": {
54+
"en": "United States",
55+
},
56+
},
57+
},
58+
)
4959
city_writer.to_db_file("tests/test_city.mmdb")
5060

51-
# country_writer = MMDBWriter(
52-
# IPSet(["8.8.8.8/32"]),
53-
# {
54-
# "country": {
55-
# "iso_code": "US",
56-
# "names": {
57-
# "en": "United States",
58-
# },
59-
# },
60-
# },
61-
# )
61+
country_writer = MMDBWriter(database_type="GeoIP2-Country")
62+
country_writer.insert_network(
63+
IPSet(["55.66.77.88/32"]),
64+
{
65+
"country": {
66+
"iso_code": "US",
67+
"names": {
68+
"en": "United States",
69+
},
70+
},
71+
},
72+
)
73+
country_writer.insert_network(
74+
IPSet(["8.8.4.4/32"]),
75+
{
76+
"country": {
77+
"iso_code": "US",
78+
"names": {
79+
"en": "United States",
80+
},
81+
},
82+
},
83+
)
6284

63-
# country_writer.to_db_file("tests/test_country.mmdb")
85+
country_writer.to_db_file("tests/test_country.mmdb")

tests/test_admin.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,32 +25,37 @@ def setUp(self):
2525
self.admin_url = reverse('admin:user_sessions_session_changelist')
2626

2727
def test_list(self):
28-
response = self.client.get(self.admin_url)
28+
with self.assertWarnsRegex(UserWarning, r"The address 1\.1\.1\.1 is not in the database"):
29+
response = self.client.get(self.admin_url)
2930
self.assertContains(response, 'Select session to change')
3031
self.assertContains(response, '127.0.0.1')
3132
self.assertContains(response, '20.13.1.1')
3233
self.assertContains(response, '1.1.1.1')
3334

3435
def test_search(self):
35-
response = self.client.get(self.admin_url, {'q': 'bouke'})
36+
with self.assertWarnsRegex(UserWarning, r"The address 127\.0\.0\.1 is not in the database"):
37+
response = self.client.get(self.admin_url, {'q': 'bouke'})
3638
self.assertContains(response, '127.0.0.1')
3739
self.assertNotContains(response, '20.13.1.1')
3840
self.assertNotContains(response, '1.1.1.1')
3941

4042
def test_mine(self):
4143
my_sessions = f"{self.admin_url}?{urlencode({'owner': 'my'})}"
42-
response = self.client.get(my_sessions)
44+
with self.assertWarnsRegex(UserWarning, r"The address 127\.0\.0\.1 is not in the database"):
45+
response = self.client.get(my_sessions)
4346
self.assertContains(response, '127.0.0.1')
4447
self.assertNotContains(response, '1.1.1.1')
4548

4649
def test_expired(self):
4750
expired = f"{self.admin_url}?{urlencode({'active': '0'})}"
48-
response = self.client.get(expired)
51+
with self.assertWarnsRegex(UserWarning, r"The address 20\.13\.1\.1 is not in the database"):
52+
response = self.client.get(expired)
4953
self.assertContains(response, '20.13.1.1')
5054
self.assertNotContains(response, '1.1.1.1')
5155

5256
def test_unexpired(self):
5357
unexpired = f"{self.admin_url}?{urlencode({'active': '1'})}"
54-
response = self.client.get(unexpired)
58+
with self.assertWarnsRegex(UserWarning, r"The address 1\.1\.1\.1 is not in the database"):
59+
response = self.client.get(unexpired)
5560
self.assertContains(response, '1.1.1.1')
5661
self.assertNotContains(response, '20.13.1.1')

tests/test_template_filters.py

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from django.test import TestCase
44
from django.test.utils import override_settings
55

6+
from user_sessions.templatetags import user_sessions
67
from user_sessions.templatetags.user_sessions import (
78
browser, city, country, device, location, platform,
89
)
@@ -13,19 +14,23 @@
1314
geoip = GeoIP2()
1415
geoip_msg = None
1516
except Exception as error_geoip2: # pragma: no cover
16-
try:
17-
from django.contrib.gis.geoip import GeoIP
18-
geoip = GeoIP()
19-
geoip_msg = None
20-
except Exception as error_geoip:
21-
geoip = None
22-
geoip_msg = str(error_geoip2) + " and " + str(error_geoip)
17+
geoip = None
18+
geoip_msg = str(error_geoip2)
2319

2420

2521
class LocationTemplateFilterTest(TestCase):
26-
@override_settings(GEOIP_PATH=None)
22+
def setUp(self):
23+
# Remove the cached GeoIP object, since it caches the database type and
24+
# this fails when we switch between city and country MMDB files
25+
user_sessions._geoip = None
26+
27+
@override_settings(GEOIP_CITY="")
2728
def test_no_location(self):
28-
self.assertIsNone(location('127.0.0.1'))
29+
with self.assertWarnsRegex(
30+
UserWarning,
31+
r"The address 127\.0\.0\.1 is not in the database",
32+
):
33+
self.assertIsNone(location('127.0.0.1'))
2934

3035
@skipUnless(geoip, geoip_msg)
3136
def test_city(self):
@@ -41,6 +46,40 @@ def test_locations(self):
4146
self.assertEqual('San Diego, United States', location('44.55.66.77'))
4247

4348

49+
@override_settings(GEOIP_CITY="doesnt_exist")
50+
class CountryLocationTemplateFilterTest(TestCase):
51+
def setUp(self):
52+
# Remove the cached GeoIP object, since it caches the database type and
53+
# this fails when we switch between city and country MMDB files
54+
user_sessions._geoip = None
55+
56+
def test_no_location(self):
57+
with self.assertWarnsRegex(
58+
UserWarning,
59+
r"The address 127\.0\.0\.1 is not in the database",
60+
):
61+
self.assertIsNone(location('127.0.0.1'))
62+
63+
@skipUnless(geoip, geoip_msg)
64+
def test_city(self):
65+
self.assertIsNone(city('55.66.77.88'))
66+
self.assertIsNone(city('8.8.4.4'))
67+
# Make sure it isn't somehow pulling any IP addresses from the city
68+
# database
69+
self.assertIsNone(city('44.55.66.77'))
70+
self.assertIsNone(city('8.8.8.8'))
71+
72+
@skipUnless(geoip, geoip_msg)
73+
def test_country(self):
74+
self.assertEqual('United States', country('55.66.77.88'))
75+
self.assertEqual('United States', country('8.8.4.4'))
76+
77+
@skipUnless(geoip, geoip_msg)
78+
def test_locations(self):
79+
self.assertEqual('United States', location('55.66.77.88'))
80+
self.assertEqual('United States', location('8.8.4.4'))
81+
82+
4483
class PlatformTemplateFilterTest(TestCase):
4584
def test_windows(self):
4685
# Generic Windows

tests/test_views.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ def test_list(self):
2020
self.user.session_set.create(session_key='ABC123', ip='127.0.0.1',
2121
expire_date=now() + timedelta(days=1),
2222
user_agent='Firefox')
23-
response = self.client.get(reverse('user_sessions:session_list'))
23+
with self.assertWarnsRegex(UserWarning, r"The address 127\.0\.0\.1 is not in the database"):
24+
response = self.client.get(reverse('user_sessions:session_list'))
2425
self.assertContains(response, 'Active Sessions')
2526
self.assertContains(response, 'Firefox')
2627
self.assertNotContains(response, 'ABC123')
@@ -35,7 +36,8 @@ def test_delete_all_other(self):
3536
self.user.session_set.create(ip='127.0.0.1', expire_date=now() + timedelta(days=1))
3637
self.assertEqual(self.user.session_set.count(), 2)
3738
response = self.client.post(reverse('user_sessions:session_delete_other'))
38-
self.assertRedirects(response, reverse('user_sessions:session_list'))
39+
with self.assertWarnsRegex(UserWarning, r"The address 127\.0\.0\.1 is not in the database"):
40+
self.assertRedirects(response, reverse('user_sessions:session_list'))
3941
self.assertEqual(self.user.session_set.count(), 1)
4042

4143
def test_delete_some_other(self):
@@ -44,5 +46,6 @@ def test_delete_some_other(self):
4446
self.assertEqual(self.user.session_set.count(), 2)
4547
response = self.client.post(reverse('user_sessions:session_delete',
4648
args=[other.session_key]))
47-
self.assertRedirects(response, reverse('user_sessions:session_list'))
49+
with self.assertWarnsRegex(UserWarning, r"The address 127\.0\.0\.1 is not in the database"):
50+
self.assertRedirects(response, reverse('user_sessions:session_list'))
4851
self.assertEqual(self.user.session_set.count(), 1)

0 commit comments

Comments
 (0)