def test_download_zip(self): att = Attachment(self.env, 'parent_realm', 'parent_id') att.description = 'Blah blah' att.insert('foo.txt', StringIO('foo'), 3, datetime(2016, 9, 23, 12, 34, 56, tzinfo=utc)) att = Attachment(self.env, 'parent_realm', 'parent_id') att.insert('bar.jpg', StringIO('bar'), 3, datetime(2016, 12, 14, 23, 56, 30, tzinfo=utc)) module = AttachmentModule(self.env) req = MockRequest(self.env, args={'format': 'zip'}, path_info='/attachment/parent_realm/parent_id/') self.assertTrue(module.match_request(req)) self.assertRaises(RequestDone, module.process_request, req) z = zipfile.ZipFile(req.response_sent, 'r') self.assertEqual(['bar.jpg', 'foo.txt'], sorted(i.filename for i in z.infolist())) zinfo = z.getinfo('foo.txt') self.assertEqual('foo', z.read('foo.txt')) self.assertEqual(3, zinfo.file_size) self.assertEqual((2016, 9, 23, 12, 34, 56), zinfo.date_time) self.assertEqual('Blah blah', zinfo.comment) zinfo = z.getinfo('bar.jpg') self.assertEqual('bar', z.read('bar.jpg')) self.assertEqual(3, zinfo.file_size) self.assertEqual((2016, 12, 14, 23, 56, 30), zinfo.date_time) self.assertEqual('', zinfo.comment)
def test_attachment_parent_realm_raises_exception(self): """TracError is raised when 'attachment' is the resource parent realm. """ path_info = '/attachment/attachment/parent_id/attachment_id' req = MockRequest(self.env, path_info=path_info) module = AttachmentModule(self.env) self.assertTrue(module.match_request(req)) self.assertRaises(TracError, module.process_request, req)
def test_post_request_without_attachment_raises_exception(self): """TracError is raised when a POST request is submitted without an attachment. """ path_info = '/attachment/parent_realm/parent_id' req = MockRequest(self.env, path_info=path_info, method='POST', args={'action': 'new'}) module = AttachmentModule(self.env) self.assertTrue(module.match_request(req)) self.assertRaises(TracError, module.process_request, req)
def test_invalid_post_request_raises_exception(self): path_info = '/attachment/parent_realm/parent_id/attachment_id' attachment = Attachment(self.env, 'parent_realm', 'parent_id') attachment.insert('attachment_id', io.BytesIO(), 0, 1) req = MockRequest(self.env, method='POST', action=None, path_info=path_info) module = AttachmentModule(self.env) self.assertTrue(module.match_request(req)) self.assertRaises(HTTPBadRequest, module.process_request, req)
def test_post_request_without_attachment_raises_exception(self): """TracError is raised for POST request with no file.""" path_info = '/attachment/parent_realm/parent_id' req = MockRequest(self.env, path_info=path_info, method='POST', args={'action': 'new'}) module = AttachmentModule(self.env) self.assertTrue(module.match_request(req)) with self.assertRaises(TracError) as cm: module.process_request(req) self.assertEqual("No file uploaded", unicode(cm.exception))
def test_post_request_with_empty_attachment_raises_exception(self): """TracError is raised for POST request with empty file.""" module = AttachmentModule(self.env) path_info = '/attachment/parent_realm/parent_id' with tempfile.NamedTemporaryFile('rb', dir=self.env.path) as file_: upload = Mock(filename=file_.name, file=file_) req = MockRequest(self.env, path_info=path_info, method='POST', args={'action': 'new', 'attachment': upload}) self.assertTrue(module.match_request(req)) with self.assertRaises(TracError) as cm: module.process_request(req) self.assertEqual("Can't upload empty file", unicode(cm.exception))
def test_post_request_exceeding_max_size_raises_exception(self): """TracError is raised for file exceeding max size""" self.env.config.set('attachment', 'max_size', 10) module = AttachmentModule(self.env) path_info = '/attachment/parent_realm/parent_id' with tempfile.NamedTemporaryFile('w+b', dir=self.env.path) as file_: file_.write(b' ' * (module.max_size + 1)) file_.flush() upload = Mock(filename=file_.name, file=file_) req = MockRequest(self.env, path_info=path_info, method='POST', args={'action': 'new', 'attachment': upload}) self.assertTrue(module.match_request(req)) with self.assertRaises(TracError) as cm: module.process_request(req) self.assertEqual("Maximum attachment size: 10 bytes", unicode(cm.exception))