diff test/test_cgi.py @ 5973:fe334430ca07

issue2550919 - Anti-bot signup using 4 second delay Took the code by erik forsberg and massaged it into the core. So this is no longer needed in the tracker. Updated devel and responsive trackers to remove timestamp.py and update input field name. Docs, changes and tests complete. Hopefully these tracker changes won't cause an issue for other tests.
author John Rouillard <rouilj@ieee.org>
date Sat, 09 Nov 2019 00:30:37 -0500
parents b40059d7036f
children 71c68961d9f4
line wrap: on
line diff
--- a/test/test_cgi.py	Thu Nov 07 21:09:02 2019 -0500
+++ b/test/test_cgi.py	Sat Nov 09 00:30:37 2019 -0500
@@ -14,7 +14,7 @@
 import pytest
 
 from roundup.cgi import client, actions, exceptions
-from roundup.cgi.exceptions import FormError, NotFound
+from roundup.cgi.exceptions import FormError, NotFound, Redirect
 from roundup.exceptions import UsageError
 from roundup.cgi.templating import HTMLItem, HTMLRequest, NoTemplate
 from roundup.cgi.templating import HTMLProperty, _HTMLItem, anti_csrf_nonce
@@ -22,6 +22,8 @@
 from roundup import init, instance, password, hyperdb, date
 from roundup.anypy.strings import StringIO, u2s, b2s
 
+from time import sleep
+
 # For testing very simple rendering
 from roundup.cgi.engine_zopetal import RoundupPageTemplate
 
@@ -1540,6 +1542,72 @@
         k = self.db.keyword.getnode('2')
         self.assertEqual(k.name, 'newkey2')
 
+    def testRegisterAction(self):
+        from roundup.cgi.timestamp import pack_timestamp
+
+        # need to set SENDMAILDEBUG to prevent
+        # downstream issue when email is sent on successful
+        # issue creation. Also delete the file afterwards
+        # just tomake sure that someother test looking for
+        # SENDMAILDEBUG won't trip over ours.
+        if 'SENDMAILDEBUG' not in os.environ:
+            os.environ['SENDMAILDEBUG'] = 'mail-test1.log'
+        SENDMAILDEBUG = os.environ['SENDMAILDEBUG']
+
+        
+        # missing opaqueregister
+        cl = self._make_client({'username':'new_user1', 'password':'secret',
+                 '@confirm@password':'secret', 'address':'new_user@bork.bork'},
+                                nodeid=None, userid='2')
+        with self.assertRaises(FormError) as cm:
+            actions.RegisterAction(cl).handle()
+        self.assertEqual(cm.exception.args,
+                    ('Form is corrupted, missing: opaqueregister.',))
+
+        # broken/invalid opaqueregister
+        # strings chosen to generate:
+        #   binascii.Error Incorrect padding
+        #   struct.error requires a string argument of length 4
+        cl = self._make_client({'username':'new_user1',
+                                'password':'secret',
+                                '@confirm@password':'secret',
+                                'address':'new_user@bork.bork',
+                                'opaqueregister': 'zzz' },
+                               nodeid=None, userid='2')
+        with self.assertRaises(FormError) as cm:
+            actions.RegisterAction(cl).handle()
+        self.assertEqual(cm.exception.args, ('Form is corrupted.',))
+
+        cl = self._make_client({'username':'new_user1',
+                                'password':'secret',
+                                '@confirm@password':'secret',
+                                'address':'new_user@bork.bork',
+                                'opaqueregister': 'xyzzyzl=' },
+                               nodeid=None, userid='2')
+        with self.assertRaises(FormError) as cm:
+            actions.RegisterAction(cl).handle()
+        self.assertEqual(cm.exception.args, ('Form is corrupted.',))
+
+        # valid opaqueregister
+        cl = self._make_client({'username':'new_user1', 'password':'secret',
+                 '@confirm@password':'secret', 'address':'new_user@bork.bork',
+                                'opaqueregister': pack_timestamp() },
+                               nodeid=None, userid='2')
+        # submitted too fast, so raises error
+        with self.assertRaises(FormError) as cm:
+            actions.RegisterAction(cl).handle()
+        self.assertEqual(cm.exception.args,
+                    ('Responding to form too quickly.',))
+
+        sleep(4.1) # sleep as requested so submit will take long enough
+        self.assertRaises(Redirect, actions.RegisterAction(cl).handle)
+
+        # FIXME check that email output makes sense at some point
+        
+        # clean up from email log
+        if os.path.exists(SENDMAILDEBUG):
+            os.remove(SENDMAILDEBUG)
+
     def testserve_static_files(self):
         # make a client instance
         cl = self._make_client({})

Roundup Issue Tracker: http://roundup-tracker.org/