[archweb,1/2] mirrorlist: Accept GET parameters as filters

Message ID d3a8b6da7aa2a7c17288e4fe3500e296f6e81892.1524361923.git.sky@genki.is
State New
Headers show
Series
  • mirrorlist: Accept GET parameter filters, improve tests
Related show

Commit Message

Eli Schwartz via arch-projects April 22, 2018, 1:59 a.m. UTC
This fixes a regression. Originally request.REQUEST was used, but django
1.9 removed this. In its stead, request.POST was used unconditionally.
However, this results in any GET request returning *all* mirrors, rather
than filtering as requested in the parameters.

This patch uses POST or GET based on the request method. This fixes the
behavior of the [mirror-filter-form], and any scripts depending on the
generated URL format. Accordingly, make test_mirrorlist_filter() test
both the success and failure cases, rather than just success.

[mirror-filter-form]: https://www.archlinux.org/mirrorlist/

Signed-off-by: Genki Sky <sky@genki.is>
---
 mirrors/tests/__init__.py        | 11 ++++++-----
 mirrors/tests/test_mirrorlist.py | 16 ++++++++++++++--
 mirrors/views/mirrorlist.py      |  3 ++-
 3 files changed, 22 insertions(+), 8 deletions(-)

Patch

diff --git a/mirrors/tests/__init__.py b/mirrors/tests/__init__.py
index fb6c10d..a1d3c2c 100644
--- a/mirrors/tests/__init__.py
+++ b/mirrors/tests/__init__.py
@@ -1,12 +1,13 @@ 
 from mirrors.models import MirrorUrl, MirrorProtocol, Mirror
 
 
-def create_mirror_url():
-        mirror = Mirror.objects.create(name='mirror1',
+def create_mirror_url(name='mirror1', country='US',
+                      protocol='http', url='https://archlinux.org'):
+        mirror = Mirror.objects.create(name=name,
                                        admin_email='admin@archlinux.org')
-        mirror_protocol = MirrorProtocol.objects.create(protocol='http')
-        mirror_url = MirrorUrl.objects.create(url='https://archlinux.org',
+        mirror_protocol = MirrorProtocol.objects.create(protocol=protocol)
+        mirror_url = MirrorUrl.objects.create(url=url,
                                               protocol=mirror_protocol,
                                               mirror=mirror,
-                                              country='US')
+                                              country=country)
         return mirror_url
diff --git a/mirrors/tests/test_mirrorlist.py b/mirrors/tests/test_mirrorlist.py
index 5590a96..1ad3d8d 100644
--- a/mirrors/tests/test_mirrorlist.py
+++ b/mirrors/tests/test_mirrorlist.py
@@ -30,9 +30,21 @@  def test_mirrorlist_all_https(self):
         # TODO: test 200 case
 
     def test_mirrorlist_filter(self):
-        response = self.client.get('/mirrorlist/?country=all&protocol=http&ip_version=4')
+        jp_mirror_url = create_mirror_url(
+            name='jp_mirror',
+            country='JP',
+            protocol='https',
+            url='https://wikipedia.jp')
+
+        # First test that we correctly see the above mirror.
+        response = self.client.get('/mirrorlist/?country=JP&protocol=https')
         self.assertEqual(response.status_code, 200)
-        self.assertIn(self.mirror_url.hostname, response.content)
+        self.assertIn(jp_mirror_url.hostname, response.content)
+
+        # Now confirm that the US mirror did not show up.
+        self.assertNotIn(self.mirror_url.hostname, response.content)
+
+        jp_mirror_url.delete()
 
     def test_generate(self):
         response = self.client.get('/mirrorlist/?country=all&protocol=http&ip_version=4')
diff --git a/mirrors/views/mirrorlist.py b/mirrors/views/mirrorlist.py
index 35d59e8..45c0181 100644
--- a/mirrors/views/mirrorlist.py
+++ b/mirrors/views/mirrorlist.py
@@ -55,7 +55,8 @@  def as_div(self):
 @csrf_exempt
 def generate_mirrorlist(request):
     if request.method == 'POST' or len(request.GET) > 0:
-        form = MirrorlistForm(data=request.POST)
+        data = request.POST if request.method == 'POST' else request.GET
+        form = MirrorlistForm(data=data)
         if form.is_valid():
             countries = form.cleaned_data['country']
             protocols = form.cleaned_data['protocol']