From a7ff9111a6528ef5a4b62586b30027f93de1d41f Mon Sep 17 00:00:00 2001
From: godog <godog@autistici.org>
Date: Sat, 19 Apr 2025 23:34:08 +0200
Subject: [PATCH] Test with pytest

---
 README.rst                                    |  2 +-
 configure.ac                                  |  4 +-
 debian/control                                |  2 +-
 src/mod_sso/test/httpd_integration_test.py    | 24 ++---
 src/python/Makefile.am                        |  2 +-
 src/python/test/sso_test.py                   |  6 +-
 src/python/test/ticket_test.py                | 10 +-
 src/python/test/verifier_test.py              |  8 +-
 src/sso_server/Makefile.am                    |  2 +-
 src/sso_server/sso_server/test/__init__.py    |  4 +-
 src/sso_server/sso_server/test/main_test.py   |  6 +-
 src/sso_server/sso_server/test/saml_test.py   | 14 +--
 .../sso_server/test/sso_server_test.py        | 92 +++++++++----------
 13 files changed, 88 insertions(+), 88 deletions(-)

diff --git a/README.rst b/README.rst
index 265f031..31175e7 100644
--- a/README.rst
+++ b/README.rst
@@ -163,7 +163,7 @@ On a Debian/Ubuntu system this can be accomplished with the following
 command (including dependencies required to run tests)::
 
     $ sudo apt-get install swig libpam0g-dev apache2-dev \
-        python-dev python-setuptools python-nose python-m2crypto
+        python3-dev python3-setuptools python3-nose python3-m2crypto
 
 Then it should be just a matter of running::
 
diff --git a/configure.ac b/configure.ac
index 764afdc..d52a0a0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -92,8 +92,8 @@ AM_CONDITIONAL(ENABLE_PAM_SSO, [ test "$build_pam_sso" != "no" ])
 dnl Python-dev (actually only used for $PYTHON)
 AX_PYTHON_DEVEL
 
-dnl nosetests
-AC_PATH_PROG([NOSETESTS], [nosetests${PYTHON_VERSION}])
+dnl pytest
+AC_PATH_PROG([PYTEST], [pytest])
 
 dnl GoogleTest (use the embedded version)
 GTEST_LIBS="\$(top_builddir)/lib/gtest/libgtest.la"
diff --git a/debian/control b/debian/control
index 89e0c29..a4ec488 100644
--- a/debian/control
+++ b/debian/control
@@ -5,7 +5,7 @@ Maintainer: Autistici/Inventati <debian@autistici.org>
 Build-Depends: debhelper (>= 10), apache2-dev | apache2-prefork-dev | apache2-threaded-dev,
  apache2, autoconf, automake, libtool, python3-dev, dh-python, python3-all,
  libpam-dev, libssl-dev, python3-setuptools, pkg-config, libz-dev,
- python3-requests, python3-nose
+ python3-requests, python3-pytest
 Standards-Version: 3.7.2
 
 Package: ai-sso
diff --git a/src/mod_sso/test/httpd_integration_test.py b/src/mod_sso/test/httpd_integration_test.py
index 996b667..fa40c29 100755
--- a/src/mod_sso/test/httpd_integration_test.py
+++ b/src/mod_sso/test/httpd_integration_test.py
@@ -130,7 +130,7 @@ class HttpdKeyLoadingTest(unittest.TestCase):
             ts = signer.sign(t)
             status, body, location = _query("/index.html", 
                                             cookie="SSO_test=%s" % ts)
-            self.assertEquals(200, status)
+            self.assertEqual(200, status)
         finally:
             _stop_httpd(httpd)
 
@@ -246,7 +246,7 @@ class HttpdIntegrationTestBase(unittest.TestCase):
                                                 cookie=check.get("cookie"))
                 if use_nonce and location:
                     location = drop_nonce_rx.sub('', location)
-                self.assertEquals(
+                self.assertEqual(
                     check["status"], status,
                     "test: '%s'\nunexpected HTTP status for %s (got %d, exp %d)" % (
                         name, check["url"], status, check["status"]))
@@ -256,7 +256,7 @@ class HttpdIntegrationTestBase(unittest.TestCase):
                         "test: '%s'\nbody mismatch for %s (exp '%s')" % (
                             name, check["url"], check["body"]))
                 if "location" in check:
-                    self.assertEquals(
+                    self.assertEqual(
                         check["location"], location,
                         "test: '%s'\nunexpected redirect for %s (got %s, exp %s)" % (
                             name, check["url"], location, check["location"]))
@@ -276,7 +276,7 @@ class HttpdIntegrationTestBase(unittest.TestCase):
             f'http://127.0.0.1:{APACHE_PORT}{url}',
             headers={'Host': host_header},
             allow_redirects=False)
-        self.assertEquals(302, resp.status_code)
+        self.assertEqual(302, resp.status_code)
         location = resp.headers["Location"]
         location_u = urlsplit(location)
         location_args = dict(parse_qsl(location_u.query))
@@ -292,10 +292,10 @@ class HttpdIntegrationTestBase(unittest.TestCase):
             headers={'Host': host_header},
             cookies={'_sso_local_session': session_cookie},
             allow_redirects=False)
-        self.assertEquals(302, resp.status_code)
+        self.assertEqual(302, resp.status_code)
         self.assertTrue('SSO_test' in resp.cookies,
                         'missing cookie: %s\n%s' % (resp.cookies, resp.headers))
-        self.assertEquals(tkt, resp.cookies['SSO_test'])
+        self.assertEqual(tkt, resp.cookies['SSO_test'])
 
         # Make the original request again.
         resp = sess.get(
@@ -303,7 +303,7 @@ class HttpdIntegrationTestBase(unittest.TestCase):
             headers={'Host': host_header},
             cookies={'SSO_test': tkt},
             allow_redirects=False)
-        self.assertEquals(200, resp.status_code)
+        self.assertEqual(200, resp.status_code)
 
 
 class HttpdIntegrationTest(HttpdIntegrationTestBase):
@@ -321,14 +321,14 @@ class HttpdIntegrationTest(HttpdIntegrationTestBase):
         for i in range(n):
             cookie = 'SSO_test=%s' % self._ticket()
             status, body, location = _query("/index.html", cookie=cookie)
-            self.assertEquals(200, status)
+            self.assertEqual(200, status)
 
     def test_cgi_environment(self):
         # test that environment variables are correctly set
         tkt = self._ticket(nonce='NONCE1')
         status, body, location = _query("/cgi/env.cgi",
                                         cookie=mkcookie(tkt))
-        self.assertEquals(200, status)
+        self.assertEqual(200, status)
         self.assertTrue(body)
         self.assertTrue("REMOTE_USER=testuser" in body)
         self.assertTrue("SSO_USER=testuser" in body)
@@ -344,12 +344,12 @@ class HttpdIntegrationTest(HttpdIntegrationTestBase):
         resp = requests.get(
             f'http://127.0.0.1:{APACHE_PORT}/sso_login?{query_args}',
             allow_redirects=False)
-        self.assertEquals(302, resp.status_code)
+        self.assertEqual(302, resp.status_code)
         set_cookie_hdr = resp.headers["Set-Cookie"]
         self.assertTrue(set_cookie_hdr)
         self.assertTrue('SSO_test' in resp.cookies,
                         'missing cookie: %s' % resp.cookies)
-        self.assertEquals(tkt, resp.cookies['SSO_test'])
+        self.assertEqual(tkt, resp.cookies['SSO_test'])
 
     def test_sso_logout(self):
         # test the /sso_logout endpoint
@@ -379,7 +379,7 @@ class HttpdIntegrationTestWithNonces(HttpdIntegrationTestBase):
         tkt = self._ticket(nonce='NONCE1')
         status, body, location = _query("/cgi/env.cgi",
                                         cookie=mkcookie(tkt))
-        self.assertEquals(200, status)
+        self.assertEqual(200, status)
         self.assertTrue(body)
         self.assertTrue("REMOTE_USER=testuser" in body)
         self.assertTrue("SSO_USER=testuser" in body)
diff --git a/src/python/Makefile.am b/src/python/Makefile.am
index 836b840..a3f7404 100644
--- a/src/python/Makefile.am
+++ b/src/python/Makefile.am
@@ -15,7 +15,7 @@ check-local:
 	env \
 	    LD_LIBRARY_PATH=$(top_builddir)/src/sso/.libs \
 	    DYLD_LIBRARY_PATH=$(top_builddir)/src/sso/.libs \
-	    $(NOSETESTS) -v
+	    $(PYTEST) -v
 
 clean-local:
 	-rm -f $(wildcard sso/_pysso*.so)
diff --git a/src/python/test/sso_test.py b/src/python/test/sso_test.py
index 1a527c3..3998a2f 100644
--- a/src/python/test/sso_test.py
+++ b/src/python/test/sso_test.py
@@ -17,8 +17,8 @@ class CommonTest(unittest.TestCase):
 
     def test_generate_keys(self):
         pub, sec = sso.generate_keys()
-        self.assertEquals(32, len(pub))
-        self.assertEquals(64, len(sec))
+        self.assertEqual(32, len(pub))
+        self.assertEqual(64, len(sec))
 
     #def test_read_key_from_file(self):
     #    pub, sec = sso.generate_keys()
@@ -26,7 +26,7 @@ class CommonTest(unittest.TestCase):
     #    with open(pkey_file, 'w') as fd:
     #        fd.write(sec)
     #    sec2 = sso.read_key_from_file(pkey_file)
-    #    self.assertEquals(sec, sec2)
+    #    self.assertEqual(sec, sec2)
 
 
 if __name__ == '__main__':
diff --git a/src/python/test/ticket_test.py b/src/python/test/ticket_test.py
index 6c81985..e20b9d8 100644
--- a/src/python/test/ticket_test.py
+++ b/src/python/test/ticket_test.py
@@ -8,9 +8,9 @@ class TicketTest(unittest.TestCase):
         tkt = sso.Ticket('user', 'service', 'domain')
         self.assertTrue(tkt is not None)
         self.assertFalse(tkt.empty())
-        self.assertEquals('user', tkt.user())
-        self.assertEquals('service', tkt.service())
-        self.assertEquals('domain', tkt.domain())
+        self.assertEqual('user', tkt.user())
+        self.assertEqual('service', tkt.service())
+        self.assertEqual('domain', tkt.domain())
         expires = tkt.expires()
         self.assertTrue(isinstance(expires, int))
         self.assertTrue(expires > 0)
@@ -25,12 +25,12 @@ class TicketTest(unittest.TestCase):
         self.assertFalse(tkt.empty())
         groups2 = tkt.groups()
         self.assertTrue(isinstance(groups2, set))
-        self.assertEquals(groups, groups2)
+        self.assertEqual(groups, groups2)
 
     def test_create_ticket_with_nonce(self):
         tkt = sso.Ticket('user', 'service', 'domain', nonce='nonce')
         self.assertFalse(tkt.empty())
-        self.assertEquals('nonce', tkt.nonce())
+        self.assertEqual('nonce', tkt.nonce())
 
 
 if __name__ == '__main__':
diff --git a/src/python/test/verifier_test.py b/src/python/test/verifier_test.py
index 0309cc8..28c9bcc 100644
--- a/src/python/test/verifier_test.py
+++ b/src/python/test/verifier_test.py
@@ -23,7 +23,7 @@ class VerifierTest(unittest.TestCase):
         signed = self._sign_token(tkt)
         v = sso.Verifier(self.public, 'service/', 'domain')
         tkt2 = v.verify(signed)
-        self.assertEquals(tkt, tkt2)
+        self.assertEqual(tkt, tkt2)
 
     def test_verify_ok(self):
         tkt = sso.Ticket('user', 'service/', 'domain', groups=set(['group1']))
@@ -33,15 +33,15 @@ class VerifierTest(unittest.TestCase):
 
         v = sso.Verifier(self.public, 'service/', 'domain', self.groups)
         tkt2 = v.verify(signed)
-        self.assertEquals(tkt, tkt2)
+        self.assertEqual(tkt, tkt2)
 
     def test_verify_ok_with_nonce(self):
         tkt = sso.Ticket('user', 'service/', 'domain', nonce='nonce')
         signed = self._sign_token(tkt)
         v = sso.Verifier(self.public, 'service/', 'domain')
         tkt2 = v.verify(signed, 'nonce')
-        self.assertEquals(tkt, tkt2)
-        self.assertEquals('user', tkt2.user())
+        self.assertEqual(tkt, tkt2)
+        self.assertEqual('user', tkt2.user())
 
     def test_verify_fail_with_bad_nonce(self):
         tkt = sso.Ticket('user', 'service/', 'domain', nonce='nonce')
diff --git a/src/sso_server/Makefile.am b/src/sso_server/Makefile.am
index eddd04f..bf15a9a 100644
--- a/src/sso_server/Makefile.am
+++ b/src/sso_server/Makefile.am
@@ -8,7 +8,7 @@ check-local:
 	    LD_LIBRARY_PATH=$(top_builddir)/src/sso/.libs \
 	    DYLD_LIBRARY_PATH=$(top_builddir)/src/sso/.libs \
 	    PYTHONPATH=$(top_builddir)/src/python \
-	    nosetests -v
+	    pytest -v
 
 clean-local:
 	$(PYTHON) setup.py clean --all
diff --git a/src/sso_server/sso_server/test/__init__.py b/src/sso_server/sso_server/test/__init__.py
index 4fb2a6b..982854a 100644
--- a/src/sso_server/sso_server/test/__init__.py
+++ b/src/sso_server/sso_server/test/__init__.py
@@ -48,11 +48,11 @@ class SSOServerTestBase(unittest.TestCase):
     def _login(self, c, location, query_args):
         query_args['d'] = query_args['d'][0].replace('http://', 'https://')
         response = c.get(location, query_string=query_args)
-        self.assertEquals(200, response.status_code, response.data)
+        self.assertEqual(200, response.status_code, response.data)
         values = parse_form(response)
         self.assertTrue('_csrf' in values, values)
         values['username'] = 'admin'
         values['password'] = 'admin'
         response = c.post('/', data=values)
-        self.assertEquals(302, response.status_code, response.data)
+        self.assertEqual(302, response.status_code, response.data)
         return response
diff --git a/src/sso_server/sso_server/test/main_test.py b/src/sso_server/sso_server/test/main_test.py
index 94d666f..b88c174 100644
--- a/src/sso_server/sso_server/test/main_test.py
+++ b/src/sso_server/sso_server/test/main_test.py
@@ -44,14 +44,14 @@ class SSOServerCommandLineTest(mox.MoxTestBase):
 
     def test_prints_usage(self):
         status, out = self.run_server(['--help'])
-        self.assertEquals(0, status)
+        self.assertEqual(0, status)
         self.assert_("Usage" in out)
 
     def test_run_fails_setup(self):
         application.create_app('test.conf').AndRaise(Exception('error'))
         self.mox.ReplayAll()
         status, out = self.run_server(['--config=test.conf'])
-        self.assertEquals(1, status)
+        self.assertEqual(1, status)
 
     def test_run_with_options(self):
         app = 'app'
@@ -61,7 +61,7 @@ class SSOServerCommandLineTest(mox.MoxTestBase):
         self.mox.ReplayAll()
 
         status, out = self.run_server(['--config=test.conf', '--port=10000'])
-        self.assertEquals(0, status)
+        self.assertEqual(0, status)
 
     def test_run_server_fcgi(self):
         self.mox.StubOutWithMock(main, 'autodetect_fastcgi')
diff --git a/src/sso_server/sso_server/test/saml_test.py b/src/sso_server/sso_server/test/saml_test.py
index 79f03df..2997da0 100644
--- a/src/sso_server/sso_server/test/saml_test.py
+++ b/src/sso_server/sso_server/test/saml_test.py
@@ -50,7 +50,7 @@ class SAMLTest(SSOServerTestBase):
         # blueprint is properly plugged into the main app.
         with self.app.test_client() as c:
             response = c.get('/saml/metadata/xml/')
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
 
     def _make_saml_request(self):
         saml_request = "<samlp:AuthnRequest AssertionConsumerServiceURL='https://saml.example.com/users/auth/saml/callback' Destination='https://localhost/saml/login' ID='_14443901-284e-4780-ae25-686f6fd781aa' IssueInstant='%(stamp)s' Version='2.0' xmlns:saml='urn:oasis:names:tc:SAML:2.0:assertion' xmlns:samlp='urn:oasis:names:tc:SAML:2.0:protocol'><saml:Issuer>https://saml.example.com</saml:Issuer><samlp:NameIDPolicy AllowCreate='true' Format='urn:oasis:names:tc:SAML:2.0:nameid-format:transient'/></samlp:AuthnRequest>" % {
@@ -63,14 +63,14 @@ class SAMLTest(SSOServerTestBase):
     def test_saml_login_empty_request(self):
         with self.app.test_client() as c:
             response = c.get('/saml/login')
-            self.assertEquals(400, response.status_code)
+            self.assertEqual(400, response.status_code)
 
     def test_saml_login(self):
         with self.app.test_client() as c:
 
             def _follow(path, data):
                 response = c.get(path, query_string=data)
-                self.assertEquals(302, response.status_code,
+                self.assertEqual(302, response.status_code,
                                   'got %d for %s, expecting 302' % (
                                       response.status_code, path))
                 path, data = parse_args(response.location)
@@ -81,15 +81,15 @@ class SAMLTest(SSOServerTestBase):
             # Follow the redirect to /login/process.
             path, data = _follow(path, data)
             # Submit the login form.
-            self.assertEquals('/', path)
+            self.assertEqual('/', path)
             response = self._login(c, path, data)
             # Now request the /sso_login endpoint.
             path, data = parse_args(response.location)
-            self.assertEquals('/saml/sso_login', path)
+            self.assertEqual('/saml/sso_login', path)
             # Follow to the sso_login endpoint
             path, data = _follow(path, data)
-            self.assertEquals('/saml/login/process', path)
+            self.assertEqual('/saml/login/process', path)
             # Back to the SAML app at last
             # Finally we're getting some xml thingy or what            
             response = c.get(path, query_string=data)
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
diff --git a/src/sso_server/sso_server/test/sso_server_test.py b/src/sso_server/sso_server/test/sso_server_test.py
index 5fd44ca..481ece1 100644
--- a/src/sso_server/sso_server/test/sso_server_test.py
+++ b/src/sso_server/sso_server/test/sso_server_test.py
@@ -51,8 +51,8 @@ class SSOServerTest(SSOServerTestBase):
     def _check_ticket(self, query_string, expected_d, expected_s, nonce=None):
         # Check the query string arguments.
         args = urldecode(query_string)
-        self.assertEquals(expected_d, args.get('d'))
-        self.assertEquals(expected_s, args.get('s'))
+        self.assertEqual(expected_d, args.get('d'))
+        self.assertEqual(expected_s, args.get('s'))
         self.assertTrue(args.get('t'))
 
         # Check that we got a valid ticket for the remote service.
@@ -71,14 +71,14 @@ class SSOServerTest(SSOServerTestBase):
             response = c.get('/', query_string=parms)
 
             # Check that we got a 302 redirect
-            self.assertEquals(302, response.status_code)
+            self.assertEqual(302, response.status_code)
             location = response.headers['Location']
             path, qs = location.split('?', 1)
-            self.assertEquals('https://someservice.org/sso_login', path)
+            self.assertEqual('https://someservice.org/sso_login', path)
 
             ticket = self._check_ticket(
                 qs, 'https://someservice.org/dest', 'someservice.org/')
-            self.assertEquals('user', ticket.user())
+            self.assertEqual('user', ticket.user())
 
             # Check that we are tracking the active services in the session.
             active_services = flask.session.get('active_services')
@@ -97,15 +97,15 @@ class SSOServerTest(SSOServerTestBase):
             response = c.get('/', query_string=parms)
 
             # Check that we got a 302 redirect
-            self.assertEquals(302, response.status_code)
+            self.assertEqual(302, response.status_code)
             location = response.headers['Location']
             path, qs = location.split('?', 1)
-            self.assertEquals('https://someservice.org/sso_login', path)
+            self.assertEqual('https://someservice.org/sso_login', path)
 
             # Check the resulting ticket.
             ticket = self._check_ticket(
                 qs, 'https://someservice.org/dest', 'someservice.org/')
-            self.assertEquals('user', ticket.user())
+            self.assertEqual('user', ticket.user())
             self.assertTrue('group1' in ticket.groups())
 
     def test_login_fail_with_wrong_cookie(self):
@@ -114,7 +114,7 @@ class SSOServerTest(SSOServerTestBase):
             parms = {'s': 'someservice.org/',
                      'd': 'https://someservice.org/dest'}
             response = c.get('/', query_string=parms)
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
 
     def test_login_fail_with_cookie_and_nonmatching_groups(self):
         # Test that non-matching groups will cause auth to fail even
@@ -126,7 +126,7 @@ class SSOServerTest(SSOServerTestBase):
             response = c.get('/', query_string=parms)
 
         # Check that we got a 403 reply
-        self.assertEquals(403, response.status_code)
+        self.assertEqual(403, response.status_code)
 
     def test_login_show_form(self):
         # Test that the login form is shown properly, with CSRF protection.
@@ -134,7 +134,7 @@ class SSOServerTest(SSOServerTestBase):
             parms = {'s': 'someservice.org/',
                      'd': 'https://someservice.org/'}
             response = c.get('/', query_string=parms)
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
             self.assertTrue('<form' in response.data)
             self.assertTrue('name="username"' in response.data)
             self.assertTrue('name="password"' in response.data)
@@ -148,7 +148,7 @@ class SSOServerTest(SSOServerTestBase):
             # Check that the CSRF tokens match.
             csrf_html = self._extract_csrf(response.data)
             csrf_session = flask.session['_csrf']
-            self.assertEquals(csrf_html, csrf_session)
+            self.assertEqual(csrf_html, csrf_session)
 
     def test_login_show_form_with_groups(self):
         # Test that group information is correctly present in the login form.
@@ -157,7 +157,7 @@ class SSOServerTest(SSOServerTestBase):
                      'd': 'https://someservice.org/',
                      'g': 'mygroup'}
             response = c.get('/', query_string=parms)
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
             self.assertTrue('name="g" value="mygroup"' in response.data)
 
     def test_login_ok_with_form(self):
@@ -166,21 +166,21 @@ class SSOServerTest(SSOServerTestBase):
             parms = {'s': 'someservice.org/',
                      'd': 'https://someservice.org/dest'}
             response = c.get('/', query_string=parms)
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
             csrf_token = self._extract_csrf(response.data)
 
             parms.update({'username': 'admin',
                           'password': 'admin',
                           '_csrf': csrf_token})
             response = c.post('/', data=parms)
-            self.assertEquals(302, response.status_code, response.data)
+            self.assertEqual(302, response.status_code, response.data)
             location = response.headers['Location']
             path, qs = location.split('?', 1)
-            self.assertEquals('https://someservice.org/sso_login', path)
+            self.assertEqual('https://someservice.org/sso_login', path)
 
             ticket = self._check_ticket(
                 qs, 'https://someservice.org/dest', 'someservice.org/')
-            self.assertEquals('admin', ticket.user())
+            self.assertEqual('admin', ticket.user())
 
     def test_login_ok_with_form_utf8(self):
         # Test that the login form understands non-ASCII parameters.
@@ -188,7 +188,7 @@ class SSOServerTest(SSOServerTestBase):
             parms = {'s': 'someservice.org/',
                      'd': 'https://someservice.org/dest'}
             response = c.get('/', query_string=parms)
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
             csrf_token = self._extract_csrf(response.data)
 
             u = u'\xc3dmin'
@@ -196,14 +196,14 @@ class SSOServerTest(SSOServerTestBase):
                           'password': u,
                           '_csrf': csrf_token})
             response = c.post('/', data=parms)
-            self.assertEquals(302, response.status_code, response.data)
+            self.assertEqual(302, response.status_code, response.data)
             location = response.headers['Location']
             path, qs = location.split('?', 1)
-            self.assertEquals('https://someservice.org/sso_login', path)
+            self.assertEqual('https://someservice.org/sso_login', path)
 
             ticket = self._check_ticket(
                 qs, 'https://someservice.org/dest', 'someservice.org/')
-            self.assertEquals(u, unicode(ticket.user(), 'utf-8'))
+            self.assertEqual(u, unicode(ticket.user(), 'utf-8'))
 
     def test_login_ok_with_form_and_nonce(self):
         # Test that we can successfully login via the login form,
@@ -213,22 +213,22 @@ class SSOServerTest(SSOServerTestBase):
                      'd': 'https://someservice.org/dest',
                      'n': 'testnonce'}
             response = c.get('/', query_string=parms)
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
             csrf_token = self._extract_csrf(response.data)
 
             parms.update({'username': 'admin',
                           'password': 'admin',
                           '_csrf': csrf_token})
             response = c.post('/', data=parms)
-            self.assertEquals(302, response.status_code, response.data)
+            self.assertEqual(302, response.status_code, response.data)
             location = response.headers['Location']
             path, qs = location.split('?', 1)
-            self.assertEquals('https://someservice.org/sso_login', path)
+            self.assertEqual('https://someservice.org/sso_login', path)
             ticket = self._check_ticket(
                 qs, 'https://someservice.org/dest', 'someservice.org/',
                 'testnonce')
-            self.assertEquals('admin', ticket.user())
-            self.assertEquals('testnonce', ticket.nonce())
+            self.assertEqual('admin', ticket.user())
+            self.assertEqual('testnonce', ticket.nonce())
 
     def test_login_fail_auth(self):
         # Test authentication failure on the login form.
@@ -236,14 +236,14 @@ class SSOServerTest(SSOServerTestBase):
             parms = {'s': 'someservice.org/',
                      'd': 'https://someservice.org/dest'}
             response = c.get('/', query_string=parms)
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
             csrf_token = self._extract_csrf(response.data)
             
             parms.update({'username': 'admin',
                           'password': 'not_admin',
                           '_csrf': csrf_token})
             response = c.post('/', data=parms)
-            self.assertEquals(200, response.status_code, response.data)
+            self.assertEqual(200, response.status_code, response.data)
             self.assertTrue('Authentication failed' in response.data)
 
     def test_login_fail_csrf(self):
@@ -252,13 +252,13 @@ class SSOServerTest(SSOServerTestBase):
             parms = {'s': 'someservice.org/',
                      'd': 'https://someservice.org/dest'}
             response = c.get('/', query_string=parms)
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
 
             parms.update({'username': 'admin',
                           'password': 'admin',
                           '_csrf': 'blah'})
             response = c.post('/', data=parms)
-            self.assertEquals(200, response.status_code, response.data)
+            self.assertEqual(200, response.status_code, response.data)
             self.assertTrue('Invalid session' in response.data)
 
     def test_login_params_validation(self):
@@ -276,12 +276,12 @@ class SSOServerTest(SSOServerTestBase):
         for s, d in sdvars:
             with self.get_auth_client(ticketstr=localtkt) as c:
                 response = c.get('/', query_string={'s': s, 'd': d})
-                self.assertEquals(302, response.status_code,
+                self.assertEqual(302, response.status_code,
                                   'sso failure for s=%s, d=%s: status=%d, expected=302' % (
                         s, d, response.status_code))
                 location = response.headers['Location'].split('?')[0]
                 location_exp = 'https://%ssso_login' % s
-                self.assertEquals(location_exp, location,
+                self.assertEqual(location_exp, location,
                                   'redirect failure for s=%s, d=%s: location=%s, expected=%s' % (
                         s, d, location, location_exp))
 
@@ -303,7 +303,7 @@ class SSOServerTest(SSOServerTestBase):
         for s, d, exp_status in sdvars:
             with self.get_auth_client(ticketstr=localtkt) as c:
                 response = c.get('/', query_string={'s': s, 'd': d})
-                self.assertEquals(exp_status, response.status_code, 
+                self.assertEqual(exp_status, response.status_code, 
                                   'bad request returned %d (exp. %d): s=%s, d=%s' % (
                         response.status_code, exp_status, s, d))
 
@@ -318,7 +318,7 @@ class SSOServerTest(SSOServerTestBase):
         for s, d, exp_status in sdvars:
             with self.get_auth_client(ticketstr=localtkt) as c:
                 response = c.get('/', query_string={'s': s, 'd': d})
-                self.assertEquals(exp_status, response.status_code, 
+                self.assertEqual(exp_status, response.status_code, 
                                   'bad request returned %d (exp. %d): s=%s, d=%s' % (
                         response.status_code, exp_status, s, d))
 
@@ -329,32 +329,32 @@ class SSOServerTest(SSOServerTestBase):
             parms = {'s': 'someservice.org/',
                      'd': 'https://someservice.org/dest'}
             response = c.get('/', query_string=parms)
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
             csrf_token = self._extract_csrf(response.data)
 
             parms.update({'username': 'error',
                           'password': 'error',
                           '_csrf': csrf_token})
             response = c.post('/', data=parms)
-            self.assertEquals(200, response.status_code, response.data)
+            self.assertEqual(200, response.status_code, response.data)
             self.assertTrue('Authentication failed' in response.data)
 
     def test_logout_nop(self):
         # Test logging out without having logged in.
         with self.app.test_client() as c:
             response = c.get('/logout')
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
 
     def test_logout_ok(self):
         # Test logging out from multiple services.
         with self.get_auth_client() as c:
             response = c.get('/', query_string={'s': 'svc1.com/', 'd': 'https://svc1.com/'})
-            self.assertEquals(302, response.status_code)
+            self.assertEqual(302, response.status_code)
             response = c.get('/', query_string={'s': 'svc2.com/', 'd': 'https://svc2.com/'})
-            self.assertEquals(302, response.status_code)
+            self.assertEqual(302, response.status_code)
 
             response = c.get('/logout')
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
 
             # Verify that cookies have been wiped.
             cookies = self._get_cookies(response)
@@ -367,25 +367,25 @@ class SSOServerTest(SSOServerTestBase):
     def test_static_data(self):
         with self.app.test_client() as c:
             response = c.get('/static/pure.min.css')
-            self.assertEquals(200, response.status_code)
+            self.assertEqual(200, response.status_code)
             self.assertTrue(response.headers['Content-Type'].startswith('text/css'))
 
     def test_notfound(self):
         with self.app.test_client() as c:
             response = c.get('/notfound')
-            self.assertEquals(404, response.status_code)
+            self.assertEqual(404, response.status_code)
 
     def test_cache_headers(self):
         with self.app.test_client() as c:
             response = c.get('/')
-            self.assertEquals('-1', response.headers['Expires'])
-            self.assertEquals('no-cache', response.headers['Cache-Control'])
+            self.assertEqual('-1', response.headers['Expires'])
+            self.assertEqual('no-cache', response.headers['Cache-Control'])
 
     def test_xss_headers(self):
         with self.app.test_client() as c:
             response = c.get('/')
-            self.assertEquals('SAMEORIGIN', response.headers['X-Frame-Options'])
-            self.assertEquals('1; mode=block', response.headers['X-XSS-Protection'])
+            self.assertEqual('SAMEORIGIN', response.headers['X-Frame-Options'])
+            self.assertEqual('1; mode=block', response.headers['X-XSS-Protection'])
 
 
 if __name__ == "__main__":
-- 
GitLab