def test_failure_reset(): """Image fails if no valid extension (=no image). """ counter = image_hook_counter() ADDINS = [feed_image_restrict_extensions(('png', 'gif')), counter] class ValidExtensionImage(feedev.File): url = 'http://images/image.png' class InvalidExtensionImage(feedev.File): url = 'http://images/image.jpeg' class TestFeed(feedev.Feed): def content(p): if p == 1: image = ValidExtensionImage elif p == 2: image = InvalidExtensionImage return FeedWithImage % saxutils.escape(image.url) def pass1(feed): assert counter.failure == 0 def pass2(feed): # invalid extension cause the image to fail completely assert counter.failure == 1 feedev.testcaller()
def test_restrict_extensions(): """Test file extension validation. """ counter = image_hook_counter() ADDINS = [feed_image_restrict_extensions(('png', 'gif')), counter] class JpegImage(feedev.File): url = 'http://images/image.jpeg' class NonImageFile(feedev.File): url = 'http://documents/stuff.xml' class PngImage(feedev.File): url = 'http://images/image.png' class ImageWithQueryString(feedev.File): url = 'http://images/image.png?q=x&r=3' class ImageWitoutExtension(feedev.File): url = 'http://images/image' class ImageWithExtensionInQuery(feedev.File): url = 'http://images/image?x=66&filename=.png' class ImageWithoutExtensionButValidContent(feedev.File): url = 'http://images/validimage' content = ValidPNGImage class TestFeed(feedev.Feed): def content(p): if p == 1: image = JpegImage elif p == 2: image = NonImageFile elif p == 3: image = PngImage elif p == 4: image = ImageWithQueryString elif p == 5: image = ImageWitoutExtension elif p == 6: image = ImageWithExtensionInQuery elif p == 7: image = ImageWithoutExtensionButValidContent return FeedWithImage % saxutils.escape(image.url) def pass1(feed): assert counter.success == 0 def pass2(feed): assert counter.success == 0 def pass3(feed): assert counter.success == 1 def pass4(feed): assert counter.success == 2 def pass5(feed): # Image has no extension in URL, and extension cannot be # determined via content type or content (since the former # is missing and the latter is invalid). In this case, # we fail, the image is not handled. assert counter.success == 2 def pass6(feed): # As in pass5, no extension is available. The extension # from the querystring is currently ignored. assert counter.success == 2 def pass7(feed): # the image is once again lacking an extension, but this # time the content is valid and the extension can be # deferred from it. assert counter.success == 3 feedev.testcaller()