Mercurial > p > roundup > code
view test/test_mailsplit.py @ 8177:2967f37e73e4
refactor: issue2551289. invalid REST Accept header stops request
Sending a POST, PUT (maybe PATCH) with an accept header that is not
application/json or xml (if enabled) used to complete the request
before throwing a 406 error. This was wrong.
Now it reports an error without dispatching/processing the requested
transaction. This is the first of a series of refactors of the
dispatch method to make it faster and more readable by using return
early pattern and extracting methods from the code.
changes:
The following now return 406 errors not 400 errors
invalid version specified with @apiver in URL.
invalid version specified with @apiver in payload body
invalid version specified in accept headers as
application/vnd.roundup.test-vz+json or version property
Parsing the accept header returns a 400 when presented with a
parameter without an = sign or other parse error. They used to
return a 406 which is wrong since the header is malformed rather
than having a value I can't respond to.
Some error messages were made clearer.
Results in the case of an error are proper json error object rather
than text/plain strings.
New test added for testdetermine_output_formatBadAccept that test the
new method using the same test cases as for
testDispatchBadAccept. I intend to extend the test coverage for
determine_output_format to cover more cases. This should be a faster
unit test than for dispatch.
Removed .lower() calls for accept_mime_type as the input values are
taken from the values in the __accepted_content_type dict which
only has lower case values.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Sun, 08 Dec 2024 01:09:34 -0500 |
| parents | 55f09ca366c4 |
| children |
line wrap: on
line source
# # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/) # This module is free software, and you may redistribute it and/or modify # under the same terms as Python, so long as this copyright message and # disclaimer are retained in their original form. # # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. import unittest from roundup.mailgw import parseContent class MailsplitTestCase(unittest.TestCase): def testPreComment(self): s = ''' blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah blah blah blah blah blah blah blah blah blah blah blah! issue_tracker@foo.com wrote: > blah blah blah blahblah blahblah blahblah blah blah blah blah blah blah > blah blah blah blah blah blah blah blah blah? blah blah blah blah blah > blah blah blah blah blah blah blah... blah blah blah blah. blah blah > blah blah blah blah? blah blah blah blah blah blah! blah blah! > > ------- > nosy: userfoo, userken > _________________________________________________ > Roundup issue tracker > issue_tracker@foo.com > http://foo.com/cgi-bin/roundup.cgi/issue_tracker/ -- blah blah blah signature userfoo@foo.com ''' summary, content = parseContent(s, 0, 0) self.assertEqual(summary, 'blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah') self.assertEqual(content, 'blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah\nblah blah blah blah blah blah blah blah blah blah blah!') def testPostComment(self): s = ''' issue_tracker@foo.com wrote: > blah blah blah blahblah blahblah blahblah blah blah blah blah blah > blah > blah blah blah blah blah blah blah blah blah? blah blah blah blah > blah > blah blah blah blah blah blah blah... blah blah blah blah. blah > blah > blah blah blah blah? blah blah blah blah blah blah! blah blah! > > ------- > nosy: userfoo, userken > _________________________________________________ > Roundup issue tracker > issue_tracker@foo.com > http://foo.com/cgi-bin/roundup.cgi/issue_tracker/ blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah blah blah blah blah blah blah blah blah blah blah blah! -- blah blah blah signature userfoo@foo.com ''' summary, content = parseContent(s, 0, 0) self.assertEqual(summary, 'blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah') self.assertEqual(content, 'blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah\nblah blah blah blah blah blah blah blah blah blah blah!') def testKeepCitation(self): s = ''' blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah blah blah blah blah blah blah blah blah blah blah blah! issue_tracker@foo.com wrote: > blah blah blah blahblah blahblah blahblah blah blah blah blah blah blah > blah blah blah blah blah blah blah blah blah? blah blah blah blah blah > blah blah blah blah blah blah blah... blah blah blah blah. blah blah > blah blah blah blah? blah blah blah blah blah blah! blah blah! > > ------- > nosy: userfoo, userken > _________________________________________________ > Roundup issue tracker > issue_tracker@foo.com > http://foo.com/cgi-bin/roundup.cgi/issue_tracker/ -- blah blah blah signature userfoo@foo.com ''' summary, content = parseContent(s, 1, 0) self.assertEqual(summary, 'blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah') self.assertEqual(content, '''\ blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah blah blah blah blah blah blah blah blah blah blah blah! issue_tracker@foo.com wrote: > blah blah blah blahblah blahblah blahblah blah blah blah blah blah blah > blah blah blah blah blah blah blah blah blah? blah blah blah blah blah > blah blah blah blah blah blah blah... blah blah blah blah. blah blah > blah blah blah blah? blah blah blah blah blah blah! blah blah! > > ------- > nosy: userfoo, userken > _________________________________________________ > Roundup issue tracker > issue_tracker@foo.com > http://foo.com/cgi-bin/roundup.cgi/issue_tracker/''') def testKeepBody(self): s = ''' blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah blah blah blah blah blah blah blah blah blah blah blah! issue_tracker@foo.com wrote: > blah blah blah blahblah blahblah blahblah blah blah blah blah blah blah > blah blah blah blah blah blah blah blah blah? blah blah blah blah blah > blah blah blah blah blah blah blah... blah blah blah blah. blah blah > blah blah blah blah? blah blah blah blah blah blah! blah blah! > > ------- > nosy: userfoo, userken > _________________________________________________ > Roundup issue tracker > issue_tracker@foo.com > http://foo.com/cgi-bin/roundup.cgi/issue_tracker/ -- blah blah blah signature userfoo@foo.com ''' summary, content = parseContent(s, 0, 1) self.assertEqual(summary, 'blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah') self.assertEqual(content, ''' blah blah blah blah... blah blah? blah blah blah blah blah. blah blah blah blah blah blah blah blah blah blah blah blah blah blah! issue_tracker@foo.com wrote: > blah blah blah blahblah blahblah blahblah blah blah blah blah blah blah > blah blah blah blah blah blah blah blah blah? blah blah blah blah blah > blah blah blah blah blah blah blah... blah blah blah blah. blah blah > blah blah blah blah? blah blah blah blah blah blah! blah blah! > > ------- > nosy: userfoo, userken > _________________________________________________ > Roundup issue tracker > issue_tracker@foo.com > http://foo.com/cgi-bin/roundup.cgi/issue_tracker/ -- blah blah blah signature userfoo@foo.com ''') def testAllQuoted(self): s = '\nissue_tracker@foo.com wrote:\n> testing\n' summary, content = parseContent(s, 0, 1) self.assertEqual(summary, '') self.assertEqual(content, s) def testSimple(self): s = '''testing''' summary, content = parseContent(s, 0, 0) self.assertEqual(summary, 'testing') self.assertEqual(content, 'testing') def testParagraphs(self): s = '''testing\n\ntesting\n\ntesting''' summary, content = parseContent(s, 0, 0) self.assertEqual(summary, 'testing') self.assertEqual(content, 'testing\n\ntesting\n\ntesting') def testSimpleFollowup(self): s = '''>hello\ntesting''' summary, content = parseContent(s, 0, 0) self.assertEqual(summary, 'testing') self.assertEqual(content, 'testing') def testSimpleFollowupParas(self): s = '''>hello\ntesting\n\ntesting\n\ntesting''' summary, content = parseContent(s, 0, 0) self.assertEqual(summary, 'testing') self.assertEqual(content, 'testing\n\ntesting\n\ntesting') def testEmpty(self): s = '' summary, content = parseContent(s, 0, 0) self.assertEqual(summary, '') self.assertEqual(content, '') def testIndentationSummary(self): s = ' Four space indent.\n\n Four space indent.\nNo indent.' summary, content = parseContent(s, 0, 0) self.assertEqual(summary, ' Four space indent.') def testIndentationContent(self): s = ' Four space indent.\n\n Four space indent.\nNo indent.' summary, content = parseContent(s, 0, 0) self.assertEqual(content, s) def testMultilineSummary(self): s = 'This is a long sentence that would normally\nbe split. More words.' summary, content = parseContent(s, 0, 0) self.assertEqual(summary, 'This is a long sentence that would ' 'normally\nbe split.') def testKeepMultipleHyphens(self): body = '''Testing, testing. ---- Testing, testing.''' summary, content = parseContent(body, 1, 0) self.assertEqual(body, content) # vim: set filetype=python ts=4 sw=4 et si
