internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: google/mobly

Issue:
`logger._setup_test_logger` has unused param
The `filename` param is not used.
Let's remove it


Discussion:

Resolving patch:
diff --git a/mobly/logger.py b/mobly/logger.py
--- a/mobly/logger.py
+++ b/mobly/logger.py
@@ -132,7 +132,7 @@ def get_log_file_timestamp(delta=None):
     return _get_timestamp('%m-%d-%Y_%H-%M-%S-%f', delta)
 
 
-def _setup_test_logger(log_path, prefix=None, filename=None):
+def _setup_test_logger(log_path, prefix=None):
     """Customizes the root logger for a test run.
 
     The logger object has a stream handler and a file handler. The stream
@@ -159,10 +159,6 @@ def _setup_test_logger(log_path, prefix=None, filename=None):
     ch.setLevel(logging.INFO)
     # Log everything to file
     f_formatter = logging.Formatter(log_line_format, log_line_time_format)
-    # All the logs of this test class go into one directory
-    if filename is None:
-        filename = get_log_file_timestamp()
-        utils.create_dir(log_path)
     # Write logger output to files
     fh_info = logging.FileHandler(
         os.path.join(log_path, records.OUTPUT_FILE_INFO_LOG))
@@ -210,10 +206,8 @@ def setup_test_logger(log_path, prefix=None, filename=None):
         filename: Name of the files. The default is the time the objects
             are requested.
     """
-    if filename is None:
-        filename = get_log_file_timestamp()
     utils.create_dir(log_path)
-    _setup_test_logger(log_path, prefix, filename)
+    _setup_test_logger(log_path, prefix)
     logging.info('Test output folder: "%s"', log_path)
     create_latest_log_alias(log_path)
 


Test patch:
diff --git a/tests/mobly/output_test.py b/tests/mobly/output_test.py
--- a/tests/mobly/output_test.py
+++ b/tests/mobly/output_test.py
@@ -19,6 +19,7 @@
 import platform
 import shutil
 import tempfile
+import time
 import unittest
 import yaml
 
@@ -151,8 +152,7 @@ def test_setup_logger_before_run(self):
             info_log_path, whitelist=[info_uuid], blacklist=[debug_uuid])
 
     @mock.patch(
-        'mobly.logger.get_log_file_timestamp',
-        side_effect=['12', '12', '13', '13'])
+        'mobly.logger.get_log_file_timestamp', side_effect=str(time.time()))
     def test_run_twice_for_two_sets_of_logs(self, mock_timestamp):
         """Verifies the expected output files from a test run.
 
@@ -173,15 +173,13 @@ def test_run_twice_for_two_sets_of_logs(self, mock_timestamp):
         self.assert_output_logs_exist(output_dir2)
 
     @mock.patch(
-        'mobly.logger.get_log_file_timestamp',
-        side_effect=['423', '423', '5435', '5435'])
+        'mobly.logger.get_log_file_timestamp', side_effect=str(time.time()))
     def test_teardown_erases_logs(self, mock_timestamp):
         """Verifies the expected output files from a test run.
 
         * Files are correctly created.
         * Basic sanity checks of each output file.
         """
-        mock_timestamp.side_effects = ['423' '5346']
         mock_test_config = self.create_mock_test_config(
             self.base_mock_test_config)
         info_uuid1 = '0c3ebb06-700d-496e-b015-62652da9e451'
Repository: google/mobly

Issue:
The kill signal param in `stop_standing_subprocess` is never used
https://github.com/google/mobly/blob/master/mobly/utils.py#L318


Discussion:

Resolving patch:
diff --git a/mobly/utils.py b/mobly/utils.py
--- a/mobly/utils.py
+++ b/mobly/utils.py
@@ -316,7 +316,7 @@ def start_standing_subprocess(cmd, shell=False):
     return proc
 
 
-def stop_standing_subprocess(proc, kill_signal=signal.SIGTERM):
+def stop_standing_subprocess(proc):
     """Stops a subprocess started by start_standing_subprocess.
 
     Before killing the process, we check if the process is running, if it has


Test patch:
Repository: google/mobly

Issue:
Add env argument to start_standing_subprocess



Discussion:

Resolving patch:
diff --git a/mobly/utils.py b/mobly/utils.py
--- a/mobly/utils.py
+++ b/mobly/utils.py
@@ -283,7 +283,7 @@ def concurrent_exec(func, param_list):
         return return_vals
 
 
-def start_standing_subprocess(cmd, shell=False):
+def start_standing_subprocess(cmd, shell=False, env=None):
     """Starts a long-running subprocess.
 
     This is not a blocking call and the subprocess started by it should be
@@ -296,6 +296,9 @@ def start_standing_subprocess(cmd, shell=False):
         cmd: string, the command to start the subprocess with.
         shell: bool, True to run this command through the system shell,
             False to invoke it directly. See subprocess.Proc() docs.
+        env: dict, a custom environment to run the standing subprocess. If not
+            specified, inherits the current environment. See subprocess.Popen()
+            docs.
 
     Returns:
         The subprocess that was started.
@@ -306,7 +309,8 @@ def start_standing_subprocess(cmd, shell=False):
         stdin=subprocess.PIPE,
         stdout=subprocess.PIPE,
         stderr=subprocess.PIPE,
-        shell=shell)
+        shell=shell,
+        env=env)
     # Leaving stdin open causes problems for input, e.g. breaking the
     # code.inspect() shell (http://stackoverflow.com/a/25512460/1612937), so
     # explicitly close it assuming it is not needed for standing subprocesses.


Test patch:
diff --git a/tests/mobly/utils_test.py b/tests/mobly/utils_test.py
--- a/tests/mobly/utils_test.py
+++ b/tests/mobly/utils_test.py
@@ -53,6 +53,31 @@ def test_start_standing_subproc(self):
             p.stderr.close()
             p.wait()
 
+    @mock.patch('subprocess.Popen')
+    def test_start_standing_subproc_without_env(self, mock_Popen):
+        p = utils.start_standing_subprocess(self.sleep_cmd)
+        mock_Popen.assert_called_with(
+            self.sleep_cmd,
+            stdin=subprocess.PIPE,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+            shell=False,
+            env=None,
+        )
+
+    @mock.patch('subprocess.Popen')
+    def test_start_standing_subproc_with_custom_env(self, mock_Popen):
+        mock_env = mock.MagicMock(spec=dict)
+        p = utils.start_standing_subprocess(self.sleep_cmd, env=mock_env)
+        mock_Popen.assert_called_with(
+            self.sleep_cmd,
+            stdin=subprocess.PIPE,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+            shell=False,
+            env=mock_env,
+        )
+
     def test_stop_standing_subproc(self):
         p = utils.start_standing_subprocess([self.sleep_cmd, '4'])
         p1 = psutil.Process(p.pid)
Repository: google/mobly

Issue:
Mobly Release 1.11.1



Discussion:

Resolving patch:
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -18,7 +18,7 @@
 import sys
 
 install_requires = [
-    'portpicker', 'pyserial', 'pyyaml', 'timeout_decorator', 'typing_extensions'
+    'portpicker', 'pyserial', 'pyyaml', 'timeout_decorator', 'typing_extensions>=4.1.1'
 ]
 
 if platform.system() == 'Windows':
@@ -44,13 +44,13 @@ def run_tests(self):
 def main():
   setuptools.setup(
       name='mobly',
-      version='1.11',
+      version='1.11.1',
       maintainer='Ang Li',
       maintainer_email='mobly-github@googlegroups.com',
       description='Automation framework for special end-to-end test cases',
       license='Apache2.0',
       url='https://github.com/google/mobly',
-      download_url='https://github.com/google/mobly/tarball/1.11',
+      download_url='https://github.com/google/mobly/tarball/1.11.1',
       packages=setuptools.find_packages(exclude=['tests']),
       include_package_data=False,
       scripts=['tools/sl4a_shell.py', 'tools/snippet_shell.py'],


Test patch:
Repository: google/mobly

Issue:
Refactor Snippet Client
Mobly supports testing devices of multiple platforms, including Android, iOS and Windows. Mobly has one snippet client for each platform, and these clients share common patterns. So we want to consolidate current clients that they inherit from the same base class.

Currently, the father class of Android snippet client has too much Android-specific code, so it's better to add a new general base class. We will add a base class and one client V2 for each platform and we won't modify existing clients.

This issue is also a prerequisite of making iOS related code open source.



Discussion:

Resolving patch:
diff --git a/mobly/controllers/android_device_lib/services/snippet_management_service.py b/mobly/controllers/android_device_lib/services/snippet_management_service.py
--- a/mobly/controllers/android_device_lib/services/snippet_management_service.py
+++ b/mobly/controllers/android_device_lib/services/snippet_management_service.py
@@ -18,10 +18,6 @@
 
 MISSING_SNIPPET_CLIENT_MSG = 'No snippet client is registered with name "%s".'
 
-# This config is transient and we will remove it after completing the migration
-# from v1 to v2.
-_CLIENT_V2_CONFIG_KEY = 'use_mobly_snippet_client_v2'
-
 
 class Error(errors.ServiceError):
   """Root error type for snippet management service."""


Test patch:
Repository: google/mobly

Issue:
Add abilty to run 'adb reverse' via Mobly
We have the ability to run `adb forward` (for TCP port forwarding) but not `adb reverse` via mobly for TCP port reversing. This feature request is to add this ability in Mobly framework.


Discussion:

Resolving patch:
diff --git a/mobly/controllers/android_device_lib/adb.py b/mobly/controllers/android_device_lib/adb.py
--- a/mobly/controllers/android_device_lib/adb.py
+++ b/mobly/controllers/android_device_lib/adb.py
@@ -459,6 +459,12 @@ def forward(self, args=None, shell=False) -> bytes:
           'forward', args, shell, timeout=None, stderr=None
       )
 
+  def reverse(self, args=None, shell=False) -> bytes:
+    with ADB_PORT_LOCK:
+      return self._exec_adb_cmd(
+          'reverse', args, shell, timeout=None, stderr=None
+      )
+
   def instrument(
       self, package, options=None, runner=None, handler=None
   ) -> bytes:


Test patch:
diff --git a/tests/mobly/controllers/android_device_lib/adb_test.py b/tests/mobly/controllers/android_device_lib/adb_test.py
--- a/tests/mobly/controllers/android_device_lib/adb_test.py
+++ b/tests/mobly/controllers/android_device_lib/adb_test.py
@@ -702,7 +702,23 @@ def test_getprops_when_empty_string_always_returned(self, mock_sleep):
 
   def test_forward(self):
     with mock.patch.object(adb.AdbProxy, '_exec_cmd') as mock_exec_cmd:
-      adb.AdbProxy().forward(MOCK_SHELL_COMMAND)
+      adb.AdbProxy().forward(['tcp:12345', 'tcp:98765'])
+      mock_exec_cmd.assert_called_with(
+          ['adb', 'forward', 'tcp:12345', 'tcp:98765'],
+          shell=False,
+          timeout=None,
+          stderr=None,
+      )
+
+  def test_reverse(self):
+    with mock.patch.object(adb.AdbProxy, '_exec_cmd') as mock_exec_cmd:
+      adb.AdbProxy().reverse(['tcp:12345', 'tcp:98765'])
+      mock_exec_cmd.assert_called_with(
+          ['adb', 'reverse', 'tcp:12345', 'tcp:98765'],
+          shell=False,
+          timeout=None,
+          stderr=None,
+      )
 
   def test_instrument_without_parameters(self):
     """Verifies the AndroidDevice object's instrument command is correct in
Repository: jazzband/django-axes

Issue:
can't install django-axes
can't get version number from axes/**init**.py

in https://github.com/codekoala/django-axes/blob/master/axes/__init__.py#L17 we should probably have `django.core.exceptions.ImproperlyConfigured` instead of `ImportError`



Discussion:
@slafs how can i reproduce the error?


Resolving patch:
diff --git a/axes/__init__.py b/axes/__init__.py
--- a/axes/__init__.py
+++ b/axes/__init__.py
@@ -1,43 +1,6 @@
-import os
-import logging
 
-
-VERSION = (1, 3, 2)
+VERSION = (1, 3, 3)
 
 
 def get_version():
     return '%s.%s.%s' % VERSION
-
-try:
-    # check for existing logging configuration
-    # valid for Django>=1.3
-    from django.conf import settings
-    if settings.LOGGING:
-        pass
-except ImportError:
-    # if we have any problems, we most likely don't have a settings module
-    # loaded
-    pass
-except AttributeError:
-    # fallback configuration if there is no logging configuration
-    LOGFILE = os.path.join(settings.DIRNAME, 'axes.log')
-
-    log_format = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s'
-    logging.basicConfig(level=logging.DEBUG,
-                        format=log_format,
-                        datefmt='%a, %d %b %Y %H:%M:%S',
-                        filename=LOGFILE,
-                        filemode='w')
-
-    fileLog = logging.FileHandler(LOGFILE, 'w')
-    fileLog.setLevel(logging.DEBUG)
-
-    # set a format which is simpler for console use
-    console_format = '%(asctime)s %(name)-12s: %(levelname)-8s %(message)s'
-    formatter = logging.Formatter(console_format)
-
-    # tell the handler to use this format
-    fileLog.setFormatter(formatter)
-
-    # add the handler to the root logger
-    logging.getLogger('').addHandler(fileLog)
diff --git a/axes/decorators.py b/axes/decorators.py
--- a/axes/decorators.py
+++ b/axes/decorators.py
@@ -2,7 +2,6 @@
 
 from datetime import timedelta
 
-from django import template
 from django.conf import settings
 from django.contrib.auth import logout
 from django.core.exceptions import ObjectDoesNotExist
@@ -12,11 +11,11 @@
 from django.shortcuts import render_to_response
 from django.template import RequestContext
 from django.utils import timezone as datetime
-from django.utils.translation import ugettext_lazy, ugettext as _
+from django.utils.translation import ugettext_lazy
 
 try:
     from django.contrib.auth import get_user_model
-except ImportError: # django < 1.5
+except ImportError:  # django < 1.5
     from django.contrib.auth.models import User
 else:
     User = get_user_model()
@@ -35,7 +34,7 @@
 
 USE_USER_AGENT = getattr(settings, 'AXES_USE_USER_AGENT', False)
 
-# see if the django app is sitting behind a reverse proxy 
+# see if the django app is sitting behind a reverse proxy
 BEHIND_REVERSE_PROXY = getattr(settings, 'AXES_BEHIND_REVERSE_PROXY', False)
 
 # if the django app is behind a reverse proxy, look for the ip address using this HTTP header value


Test patch:
Repository: jazzband/django-axes

Issue:
Does not work on heroku - improve get_ip
When running on heroku, axes is useless because of heroku's internal ip reported on REMOTE_ADDR. Django easy timezones includes a nice block for getting the real ip - 

https://github.com/Miserlou/django-easy-timezones/blob/master/easy_timezones/utils.py

Will add a pull with the changes.



Discussion:

Resolving patch:
diff --git a/axes/decorators.py b/axes/decorators.py
--- a/axes/decorators.py
+++ b/axes/decorators.py
@@ -1,4 +1,5 @@
 import logging
+import socket
 
 from datetime import timedelta
 
@@ -77,9 +78,54 @@
     log.debug('Axes is configured to be behind reverse proxy...looking for header value %s', REVERSE_PROXY_HEADER)
 
 
+def is_valid_ip(ip_address):
+    """ Check Validity of an IP address """
+    valid = True
+    try:
+        socket.inet_aton(ip_address.strip())
+    except:
+        valid = False
+    return valid
+
+
+def get_ip_address_from_request(request):
+    """ Makes the best attempt to get the client's real IP or return the loopback """
+    PRIVATE_IPS_PREFIX = ('10.', '172.', '192.', '127.')
+    ip_address = ''
+    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR', '')
+    if x_forwarded_for and ',' not in x_forwarded_for:
+        if not x_forwarded_for.startswith(PRIVATE_IPS_PREFIX) and is_valid_ip(x_forwarded_for):
+            ip_address = x_forwarded_for.strip()
+    else:
+        ips = [ip.strip() for ip in x_forwarded_for.split(',')]
+        for ip in ips:
+            if ip.startswith(PRIVATE_IPS_PREFIX):
+                continue
+            elif not is_valid_ip(ip):
+                continue
+            else:
+                ip_address = ip
+                break
+    if not ip_address:
+        x_real_ip = request.META.get('HTTP_X_REAL_IP', '')
+        if x_real_ip:
+            if not x_real_ip.startswith(PRIVATE_IPS_PREFIX) and is_valid_ip(x_real_ip):
+                ip_address = x_real_ip.strip()
+    if not ip_address:
+        remote_addr = request.META.get('REMOTE_ADDR', '')
+        if remote_addr:
+            if not remote_addr.startswith(PRIVATE_IPS_PREFIX) and is_valid_ip(remote_addr):
+                ip_address = remote_addr.strip()
+            if remote_addr.startswith(PRIVATE_IPS_PREFIX) and is_valid_ip(remote_addr):
+                ip_address = remote_addr.strip()
+    if not ip_address:
+            ip_address = '127.0.0.1'
+    return ip_address
+
+
 def get_ip(request):
     if not BEHIND_REVERSE_PROXY:
-        ip = request.META.get('REMOTE_ADDR', '')
+        ip = get_ip_address_from_request(request)
     else:
         ip = request.META.get(REVERSE_PROXY_HEADER, '')
         ip = ip.split(",", 1)[0].strip()


Test patch:
Repository: jazzband/django-axes

Issue:
not Python3 compatible print in axes_list_attempts.py while installing
  File "d:\dev\python\lib\site-packages\django_axes-1.3.8-py3.4.egg\axes\management\commands\axes_list_attempts.py", line 12
    print "%s %s %s" % (at.ip_address,  at.username, at.failures)
                   ^
SyntaxError: invalid syntax

I'm using django 1.7 & Python 3.4.1



Discussion:
I'm experiencing the same issue.

![screenshot - 241114 - 01 45 25](https://cloud.githubusercontent.com/assets/3357792/5160000/a8f1d2c2-737b-11e4-9a88-7f946014fa15.png)


Resolving patch:
diff --git a/axes/management/commands/axes_list_attempts.py b/axes/management/commands/axes_list_attempts.py
--- a/axes/management/commands/axes_list_attempts.py
+++ b/axes/management/commands/axes_list_attempts.py
@@ -9,5 +9,5 @@ class Command(BaseCommand):
 
     def handle(self, *args, **kwargs):
         for at in  AccessAttempt.objects.all():
-            print "%s %s %s" % (at.ip_address,  at.username, at.failures)
+            print ("%s %s %s" % (at.ip_address,  at.username, at.failures))
 


Test patch:
Repository: jazzband/django-axes

Issue:
UnicodeDecodeError
Hi,

I'm encountering an issue when trying to setup django-axes. When invoking command pip3 install django-axes, I'm having the following error:

> Downloading django-axes-1.6.1.tar.gz
>     Complete output from command python setup.py egg_info:
>     Traceback (most recent call last):
>       File "<string>", line 1, in <module>
>       File "/tmp/pip-build-eepf_eck/django-axes/setup.py", line 15, in <module>
>         open("CHANGES.txt").read()),
>       File "/usr/lib/python3.5/encodings/ascii.py", line 26, in decode
>         return codecs.ascii_decode(input, self.errors)[0]
>     UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 545: ordinal not in range(128)

It seems there is a character in CHANGES.txt which does not belong to standard ascii table (probably russian characters). Could you please fix it by forcing utf-8 decoding?



Discussion:

Resolving patch:
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -2,6 +2,7 @@
 # -*- coding: utf-8 -*-
 
 import os
+import codecs
 from setuptools import setup, find_packages
 
 VERSION = '1.6.1'
@@ -11,8 +12,8 @@
     version=VERSION,
     description="Keep track of failed login attempts in Django-powered sites.",
     long_description=(
-        open("README.rst").read() + '\n' +
-        open("CHANGES.txt").read()),
+        codecs.open("README.rst", encoding='utf-8').read() + '\n' +
+        codecs.open("CHANGES.txt", encoding='utf-8').read()),
     keywords='authentication, django, pci, security',
     author='Josh VanderLinden, Philip Neustrom, Michael Blume, Camilo Nova',
     author_email='codekoala@gmail.com',


Test patch:
Repository: jazzband/django-axes

Issue:
illegal IP address string passed to inet_pton
Keep getting error: illegal IP address string passed to inet_pton

https://github.com/jazzband/django-axes/blob/752783fe52e456c5d7c1b14862aa83e28045e96a/axes/decorators.py#L33

Looks like you are trying to catch OSError but inet_pton in Python 2.7.12 does not raise this exception.  Python 3.5.2 raises OSError but python Python 2.7.12 does not.

I can replicate the error with the following code (Python 2.7.12)
```python
from socket import inet_pton, AF_INET6
inet_pton(AF_INET6, '67.255.125.204') 
```


Discussion:
@samkuehn Would you like to elaborate a PR to fix it?


Resolving patch:
diff --git a/axes/decorators.py b/axes/decorators.py
--- a/axes/decorators.py
+++ b/axes/decorators.py
@@ -1,6 +1,6 @@
 import json
 import logging
-from socket import inet_pton, AF_INET6
+from socket import inet_pton, AF_INET6, error
 
 from django.contrib.auth import get_user_model
 from django.contrib.auth import logout
@@ -31,7 +31,7 @@
 def is_ipv6(ip):
     try:
         inet_pton(AF_INET6, ip)
-    except OSError:
+    except (OSError, error):
         return False
     return True
 


Test patch:
diff --git a/axes/tests.py b/axes/tests.py
--- a/axes/tests.py
+++ b/axes/tests.py
@@ -386,3 +386,9 @@ def test_iso8601(self):
         }
         for timedelta, iso_duration in six.iteritems(EXPECTED):
             self.assertEqual(iso8601(timedelta), iso_duration)
+
+    def test_is_ipv6(self):
+        from axes.decorators import is_ipv6
+        self.assertTrue(is_ipv6('ff80::220:16ff:fec9:1'))
+        self.assertFalse(is_ipv6('67.255.125.204'))
+        self.assertFalse(is_ipv6('foo'))
Repository: jazzband/django-axes

Issue:
get() returned more than one User -- it returned 2! (Multiple None user names)
Attempting to use axes with combination user and ip has resulted in the entire site being unreachable, every single page simply showing the plain message: `get() returned more than one User -- it returned 2!`

This is before a user has actually logged into django at all. Our system allows for multiple `None` usernames as not every user actually needs to be able to log in, while it appears axes has (admittedly fairly) assumed that there will never be more than one user with a blank username.

I haven't dug any further into this, if there is some configuration that will allow axes to work with our system then that would be wonderful.


Discussion:
We rely on the uniqueness of `USERNAME` maybe you can try to work on a patch and see if we can support that.

Hmm. It seems to me that the place where this occurs `is_user_lockable(request)` should not be executed on a `GET` request, only on a `POST` request.


Resolving patch:
diff --git a/axes/decorators.py b/axes/decorators.py
--- a/axes/decorators.py
+++ b/axes/decorators.py
@@ -94,6 +94,12 @@ def is_user_lockable(request):
     If so, then return the value to see if this user is special
     and doesn't get their account locked out
     """
+    if hasattr(request.user, 'nolockout'):
+        return not request.user.nolockout
+
+    if request.method != 'POST':
+        return True
+
     try:
         field = getattr(get_user_model(), 'USERNAME_FIELD', 'username')
         kwargs = {


Test patch:
diff --git a/axes/tests.py b/axes/tests.py
--- a/axes/tests.py
+++ b/axes/tests.py
@@ -361,6 +361,24 @@ def test_valid_login_without_log(self):
         self.assertEqual(response.status_code, 302)
         self.assertEqual(AccessLog.objects.all().count(), 0)
 
+    @patch('axes.decorators.DISABLE_ACCESS_LOG', True)
+    def test_check_is_not_made_on_GET(self):
+        AccessLog.objects.all().delete()
+
+        try:
+            admin_login = reverse('admin:login')
+        except NoReverseMatch:
+            admin_login = reverse('admin:index')
+
+        response = self.client.get(admin_login)
+        self.assertEqual(response.status_code, 200)
+
+        response = self._login(is_valid_username=True, is_valid_password=True)
+        self.assertEqual(response.status_code, 302)
+
+        response = self.client.get(reverse('admin:index'))
+        self.assertEqual(response.status_code, 200)
+
 
 class UtilsTest(TestCase):
     def test_iso8601(self):