def test_ident_regex_blocks_based_on_ident(self, mock_responses, ident_regex, ident, expected_resolvable): config = { 'cache_root': '/var/cache/loris', 'source_prefix': 'http://sample.sample/', 'ident_regex': ident_regex, } resolver = SimpleHTTPResolver(config=config) assert resolver.is_resolvable(ident=ident) == expected_resolvable
def test_request_options_self(self, config, expected_options): # Uninteresting for this test, but required so we have a # valid config set config['cache_root'] = '/var/cache/loris' config['uri_resolvable'] = True resolver = SimpleHTTPResolver(config) assert resolver.request_options() == expected_options
def test_non_http_rejected_as_not_resolvable(self, head_resolvable): config = { 'cache_root': '/var/cache/loris', 'source_prefix': 'irc://example.irc/loris/', 'uri_resolvable': True, 'head_resolvable': head_resolvable, } resolver = SimpleHTTPResolver(config=config) assert not resolver.is_resolvable(ident='example.png')
def test_is_resolvable(self, mock_responses, head_resolvable, ident, expected_resolvable): config = { 'cache_root': '/var/cache/loris', 'source_prefix': 'http://sample.sample/', 'uri_resolvable': True, 'head_resolvable': head_resolvable, } resolver = SimpleHTTPResolver(config=config) assert resolver.is_resolvable(ident=ident) == expected_resolvable
def setUp(self): super(SimpleHTTPResolverTest, self).setUp() tests_dir = os.path.dirname(os.path.realpath(__file__)) self.cache_dir = os.path.join(tests_dir, 'cache') prefix_url = 'http://sample.sample/' config = { 'cache_root': self.cache_dir, 'source_prefix': prefix_url, 'source_suffix': '', 'head_resolvable': True, 'uri_resolvable': True } self.resolver = SimpleHTTPResolver(config) self.not_identifier = 'DOES_NOT_EXIST' self.not_identifier_url = ''.join( [ prefix_url, self.not_identifier ] ) self.identifier = '0001' self.identifier_url = ''.join( [ prefix_url, self.identifier ] ) self.expected_format = 'tif' expected_filepath_list = [ self.cache_dir, '25', 'bbd', 'cd0', '6c3', '2d4', '77f', '7fa', '1c3', 'e4a', '91b', '032', '0001', #identifier ] self.expected_filedir = os.path.join(*expected_filepath_list) self.expected_filepath = os.path.join(self.expected_filedir, 'loris_cache.tif') self.set_responses()
def test_missing_required_config(self): config = { 'cache_root': self.cache_dir } self.assertRaises( ResolverException, lambda: SimpleHTTPResolver(config) )
def test_barebones_config(self): config = {'cache_root': self.cache_dir, 'uri_resolvable': True} resolver = SimpleHTTPResolver(config) self.assertEqual(resolver.cache_root, self.cache_dir) self.assertEqual(resolver.source_prefix, '') self.assertEqual(resolver.source_suffix, '') self.assertEqual(resolver.default_format, None) self.assertEqual(resolver.head_resolvable, False) self.assertEqual(resolver.uri_resolvable, True) self.assertEqual(resolver.user, None) self.assertEqual(resolver.pw, None)
def test_is_resolvable_uses_cached_result(self): self._mock_urls() config = { 'cache_root' : self.SRC_IMAGE_CACHE, 'source_prefix' : 'http://sample.sample/', 'source_suffix' : '', 'default_format' : 'tif', 'head_resolvable' : True, 'uri_resolvable' : True } self.app.resolver = SimpleHTTPResolver(config) assert self.app.resolver.resolve(self.app, ident='0001', base_uri='') assert self.app.resolver.is_resolvable(ident='0001')
def test_with_default_format(self): self._mock_urls() config = { 'cache_root' : self.SRC_IMAGE_CACHE, 'source_prefix' : 'http://sample.sample/', 'source_suffix' : '', 'default_format' : 'tif', 'head_resolvable' : True, 'uri_resolvable' : True } self.app.resolver = SimpleHTTPResolver(config) ident = '0002' ii = self.app.resolver.resolve(self.app, ident, "") self.assertIsNotNone(ii.src_img_fp) self.assertEqual(ii.src_format, 'tif') self.assertTrue(isfile(ii.src_img_fp))
def test_config_assigned_to_resolver(self): config = { 'cache_root': self.cache_dir, 'source_prefix': 'http://www.mysite/', 'source_suffix': '/accessMaster', 'default_format': 'jp2', 'head_resolvable': True, 'uri_resolvable': True, 'user': '******', 'pw': 'TestPW', } resolver = SimpleHTTPResolver(config) self.assertEqual(resolver.cache_root, self.cache_dir) self.assertEqual(resolver.source_prefix, 'http://www.mysite/') self.assertEqual(resolver.source_suffix, '/accessMaster') self.assertEqual(resolver.default_format, 'jp2') self.assertEqual(resolver.head_resolvable, True) self.assertEqual(resolver.uri_resolvable, True) self.assertEqual(resolver.user, 'TestUser') self.assertEqual(resolver.pw, 'TestPW')
def test_no_config(self): config = {} self.assertRaises(ConfigError, lambda: SimpleHTTPResolver(config))
def test_no_config(self): config = {} self.assertRaises( ResolverException, lambda: SimpleHTTPResolver(config) )
def test_simple_http_resolver(self): self._mock_urls() # First we test with no config... config = {} self.assertRaises(ResolverException, lambda: SimpleHTTPResolver(config)) # Then we test missing source_prefix and uri_resolvable config = {'cache_root': self.SRC_IMAGE_CACHE} self.assertRaises(ResolverException, lambda: SimpleHTTPResolver(config)) # Then we test with the full config... #TODO: More granular testing of these settings... config = { 'cache_root': self.SRC_IMAGE_CACHE, 'source_prefix': 'http://www.mysite/', 'source_suffix': '/accessMaster', 'default_format': 'jp2', 'head_resolvable': True, 'uri_resolvable': True, 'user': '******', 'pw': 'TestPW', } self.app.resolver = SimpleHTTPResolver(config) self.assertEqual(self.app.resolver.source_prefix, 'http://www.mysite/') self.assertEqual(self.app.resolver.source_suffix, '/accessMaster') self.assertEqual(self.app.resolver.default_format, 'jp2') self.assertEqual(self.app.resolver.head_resolvable, True) self.assertEqual(self.app.resolver.uri_resolvable, True) self.assertEqual(self.app.resolver.user, 'TestUser') self.assertEqual(self.app.resolver.pw, 'TestPW') # Then we test with a barebones default config... config = {'cache_root': self.SRC_IMAGE_CACHE, 'uri_resolvable': True} self.app.resolver = SimpleHTTPResolver(config) self.assertEqual(self.app.resolver.source_prefix, '') self.assertEqual(self.app.resolver.source_suffix, '') self.assertEqual(self.app.resolver.default_format, None) self.assertEqual(self.app.resolver.head_resolvable, False) self.assertEqual(self.app.resolver.uri_resolvable, True) self.assertEqual(self.app.resolver.user, None) self.assertEqual(self.app.resolver.pw, None) # Finally with the test config for now.... config = { 'cache_root': self.SRC_IMAGE_CACHE, 'source_prefix': 'http://sample.sample/', 'source_suffix': '', 'head_resolvable': True, 'uri_resolvable': True } self.app.resolver = SimpleHTTPResolver(config) self.assertEqual(self.app.resolver.source_prefix, 'http://sample.sample/') self.assertEqual(self.app.resolver.source_suffix, '') self.assertEqual(self.app.resolver.default_format, None) self.assertEqual(self.app.resolver.head_resolvable, True) self.assertEqual(self.app.resolver.uri_resolvable, True) #Test with identifier only ident = '0001' expected_path = join(self.app.resolver.cache_root, '25') expected_path = join(expected_path, 'bbd') expected_path = join(expected_path, 'cd0') expected_path = join(expected_path, '6c3') expected_path = join(expected_path, '2d4') expected_path = join(expected_path, '77f') expected_path = join(expected_path, '7fa') expected_path = join(expected_path, '1c3') expected_path = join(expected_path, 'e4a') expected_path = join(expected_path, '91b') expected_path = join(expected_path, '032') expected_path = join(expected_path, 'loris_cache.tif') ii = self.app.resolver.resolve(self.app, ident, "") self.assertEqual(expected_path, ii.src_img_fp) self.assertEqual(ii.src_format, 'tif') self.assertTrue(isfile(ii.src_img_fp)) #Test with a full uri #Note: This seems weird but idents resolve wrong and removes a slash from // ident = quote_plus('http://sample.sample/0001') expected_path = join(self.app.resolver.cache_root, 'http') expected_path = join(expected_path, '32') expected_path = join(expected_path, '3a5') expected_path = join(expected_path, '353') expected_path = join(expected_path, '8f5') expected_path = join(expected_path, '0de') expected_path = join(expected_path, '1d3') expected_path = join(expected_path, '011') expected_path = join(expected_path, '675') expected_path = join(expected_path, 'ebc') expected_path = join(expected_path, 'c75') expected_path = join(expected_path, '083') expected_path = join(expected_path, 'loris_cache.tif') self.assertFalse(exists(expected_path)) ii = self.app.resolver.resolve(self.app, ident, "") self.assertEqual(expected_path, ii.src_img_fp) self.assertEqual(ii.src_format, 'tif') self.assertTrue(isfile(ii.src_img_fp)) #Test with a bad identifier ident = 'DOESNOTEXIST' self.assertRaises( ResolverException, lambda: self.app.resolver.resolve(self.app, ident, "")) #Test with a bad url ident = quote_plus('http://sample.sample/DOESNOTEXIST') self.assertRaises( ResolverException, lambda: self.app.resolver.resolve(self.app, ident, "")) #Test with no content-type or extension or default format ident = '0002' self.assertRaises( ResolverException, lambda: self.app.resolver.resolve(self.app, ident, "")) #Test with invalid content-type ident = '0003' self.assertRaises( ResolverException, lambda: self.app.resolver.resolve(self.app, ident, ""))
class SimpleHTTPResolverTest(unittest.TestCase): def setUp(self): super(SimpleHTTPResolverTest, self).setUp() tests_dir = os.path.dirname(os.path.realpath(__file__)) self.cache_dir = os.path.join(tests_dir, 'cache') prefix_url = 'http://sample.sample/' config = { 'cache_root': self.cache_dir, 'source_prefix': prefix_url, 'source_suffix': '', 'head_resolvable': True, 'uri_resolvable': True } self.resolver = SimpleHTTPResolver(config) self.not_identifier = 'DOES_NOT_EXIST' self.not_identifier_url = ''.join( [ prefix_url, self.not_identifier ] ) self.identifier = '0001' self.identifier_url = ''.join( [ prefix_url, self.identifier ] ) self.expected_format = 'tif' expected_filepath_list = [ self.cache_dir, '25', 'bbd', 'cd0', '6c3', '2d4', '77f', '7fa', '1c3', 'e4a', '91b', '032', '0001', #identifier ] self.expected_filedir = os.path.join(*expected_filepath_list) self.expected_filepath = os.path.join(self.expected_filedir, 'loris_cache.tif') self.set_responses() def set_responses(self): responses.add( responses.HEAD, self.identifier_url, status=200, content_type='image/tiff' ) responses.add( responses.GET, self.identifier_url, body='II*\x00\x0c\x00\x00\x00\x80\x00 \x0e\x00\x00\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\x01\x03\x00\x01\x00\x00\x00\x08\x00\x00\x00\x03\x01\x03\x00\x01\x00\x00\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x03\x00\x00\x00\x11\x01\x04\x00\x01\x00\x00\x00\x08\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00\x08\x00\x00\x00\x17\x01\x04\x00\x01\x00\x00\x00\x04\x00\x00\x00\x1a\x01\x05\x00\x01\x00\x00\x00\xba\x00\x00\x00\x1b\x01\x05\x00\x01\x00\x00\x00\xc2\x00\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00@\x01\x03\x00\x00\x03\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00\xff`\xe6q\x19\x08\x00\x00\x80\t\x00\x00\x80\n\x00\x00\x80\x0b\x00\x00\x80\x0c\x00\x00\x80\r', status=200, content_type='image/tiff' ) responses.add( responses.HEAD, self.not_identifier_url, status=404, content_type='application/html' ) responses.add( responses.GET, self.not_identifier_url, body='Does Not Exist', status=404, content_type='application/html' ) def test_get_format(self): self.resolver.default_format = 'tif' self.assertEqual(self.resolver.get_format('0001.jp2', None), 'tif') self.resolver.default_format = None self.assertEqual(self.resolver.get_format('0001.jp2', 'tif'), 'tif') self.assertEqual(self.resolver.get_format('0001.jp2', None), 'jp2') @responses.activate def test_bad_url(self): self.assertRaises( ResolverException, lambda: self.resolver.resolve(None, self.not_identifier_url, "") ) @responses.activate def test_does_not_exist(self): self.assertRaises( ResolverException, lambda: self.resolver.resolve(None, self.not_identifier, "") ) @responses.activate def test_cached_file_for_ident(self): self.resolver.copy_to_cache(self.identifier) self.assertTrue(os.path.isfile(self.expected_filepath)) self.assertEqual(self.resolver.cached_file_for_ident(self.identifier), self.expected_filepath) @responses.activate def test_resolve_001(self): expected_resolved = self.expected_filepath ii = self.resolver.resolve(None, self.identifier, "") self.assertEqual(ii.src_img_fp, expected_resolved) # Make sure the file exists in the cache self.assertTrue(os.path.isfile(self.expected_filepath)) @responses.activate def test_is_resolvable_001(self): self.assertTrue( self.resolver.is_resolvable(self.identifier) ) # Make sure the file DOES NOT exists in the cache self.assertFalse(os.path.isfile(self.expected_filepath)) @responses.activate def test_is_not_resolvable(self): self.assertFalse( self.resolver.is_resolvable(self.not_identifier) ) def tearDown(self): # Clean Up the cache directory if os.path.exists(self.cache_dir): shutil.rmtree(self.cache_dir)
def test_simple_http_resolver(self): # Mock out some urls for testing.... responses.add(responses.GET, 'http://sample.sample/0001', body='II*\x00\x0c\x00\x00\x00\x80\x00 \x0e\x00\x00\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\x01\x03\x00\x01\x00\x00\x00\x08\x00\x00\x00\x03\x01\x03\x00\x01\x00\x00\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x03\x00\x00\x00\x11\x01\x04\x00\x01\x00\x00\x00\x08\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00\x08\x00\x00\x00\x17\x01\x04\x00\x01\x00\x00\x00\x04\x00\x00\x00\x1a\x01\x05\x00\x01\x00\x00\x00\xba\x00\x00\x00\x1b\x01\x05\x00\x01\x00\x00\x00\xc2\x00\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00@\x01\x03\x00\x00\x03\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00\xff`\xe6q\x19\x08\x00\x00\x80\t\x00\x00\x80\n\x00\x00\x80\x0b\x00\x00\x80\x0c\x00\x00\x80\r', status=200, content_type='image/tiff') responses.add(responses.GET, 'http://sample.sample/0002', body='II*\x00\x0c\x00\x00\x00\x80\x00 \x0e\x00\x00\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\x01\x03\x00\x01\x00\x00\x00\x08\x00\x00\x00\x03\x01\x03\x00\x01\x00\x00\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x03\x00\x00\x00\x11\x01\x04\x00\x01\x00\x00\x00\x08\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00\x08\x00\x00\x00\x17\x01\x04\x00\x01\x00\x00\x00\x04\x00\x00\x00\x1a\x01\x05\x00\x01\x00\x00\x00\xba\x00\x00\x00\x1b\x01\x05\x00\x01\x00\x00\x00\xc2\x00\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00@\x01\x03\x00\x00\x03\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00\xff`\xe6q\x19\x08\x00\x00\x80\t\x00\x00\x80\n\x00\x00\x80\x0b\x00\x00\x80\x0c\x00\x00\x80\r', status=200) responses.add(responses.GET, 'http://sample.sample/0003', body='II*\x00\x0c\x00\x00\x00\x80\x00 \x0e\x00\x00\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\x01\x03\x00\x01\x00\x00\x00\x08\x00\x00\x00\x03\x01\x03\x00\x01\x00\x00\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x03\x00\x00\x00\x11\x01\x04\x00\x01\x00\x00\x00\x08\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00\x08\x00\x00\x00\x17\x01\x04\x00\x01\x00\x00\x00\x04\x00\x00\x00\x1a\x01\x05\x00\x01\x00\x00\x00\xba\x00\x00\x00\x1b\x01\x05\x00\x01\x00\x00\x00\xc2\x00\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00@\x01\x03\x00\x00\x03\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00\xff`\xe6q\x19\x08\x00\x00\x80\t\x00\x00\x80\n\x00\x00\x80\x0b\x00\x00\x80\x0c\x00\x00\x80\r', status=200, content_type='image/invalidformat') responses.add(responses.GET, 'http://sample.sample/DOESNOTEXIST', body='Does Not Exist', status=404, content_type='application/html') # First we test with no config... config = { } self.assertRaises(ResolverException, lambda: SimpleHTTPResolver(config)) # Then we test missing source_prefix and uri_resolvable config = { 'cache_root' : self.app.img_cache.cache_root } self.assertRaises(ResolverException, lambda: SimpleHTTPResolver(config)) # Then we test with the full config... #TODO: More granular testing of these settings... config = { 'cache_root' : self.app.img_cache.cache_root, 'source_prefix' : 'http://www.mysite/', 'source_suffix' : '/accessMaster', 'default_format' : 'jp2', 'head_resolvable' : True, 'uri_resolvable' : True, 'user' : 'TestUser', 'pw' : 'TestPW', } self.app.resolver = SimpleHTTPResolver(config) self.assertEqual(self.app.resolver.cache_root, self.app.img_cache.cache_root) self.assertEqual(self.app.resolver.source_prefix, 'http://www.mysite/') self.assertEqual(self.app.resolver.source_suffix, '/accessMaster') self.assertEqual(self.app.resolver.default_format, 'jp2') self.assertEqual(self.app.resolver.head_resolvable, True) self.assertEqual(self.app.resolver.uri_resolvable, True) self.assertEqual(self.app.resolver.user, 'TestUser') self.assertEqual(self.app.resolver.pw, 'TestPW') # Then we test with a barebones default config... config = { 'cache_root' : self.app.img_cache.cache_root, 'uri_resolvable' : True } self.app.resolver = SimpleHTTPResolver(config) self.assertEqual(self.app.resolver.cache_root, self.app.img_cache.cache_root) self.assertEqual(self.app.resolver.source_prefix, '') self.assertEqual(self.app.resolver.source_suffix, '') self.assertEqual(self.app.resolver.default_format, None) self.assertEqual(self.app.resolver.head_resolvable, False) self.assertEqual(self.app.resolver.uri_resolvable, True) self.assertEqual(self.app.resolver.user, None) self.assertEqual(self.app.resolver.pw, None) # Finally with the test config for now.... config = { 'cache_root' : self.app.img_cache.cache_root, 'source_prefix' : 'http://sample.sample/', 'source_suffix' : '', 'head_resolvable' : True, 'uri_resolvable' : True } self.app.resolver = SimpleHTTPResolver(config) self.assertEqual(self.app.resolver.cache_root, self.app.img_cache.cache_root) self.assertEqual(self.app.resolver.source_prefix, 'http://sample.sample/') self.assertEqual(self.app.resolver.source_suffix, '') self.assertEqual(self.app.resolver.default_format, None) self.assertEqual(self.app.resolver.head_resolvable, True) self.assertEqual(self.app.resolver.uri_resolvable, True) #Test with identifier only ident = '0001' resolved_path, fmt = self.app.resolver.resolve(ident) expected_path = join(self.app.img_cache.cache_root, '25') expected_path = join(expected_path, 'bbd') expected_path = join(expected_path, 'cd0') expected_path = join(expected_path, '6c3') expected_path = join(expected_path, '2d4') expected_path = join(expected_path, '77f') expected_path = join(expected_path, '7fa') expected_path = join(expected_path, '1c3') expected_path = join(expected_path, 'e4a') expected_path = join(expected_path, '91b') expected_path = join(expected_path, '032') expected_path = join(expected_path, 'loris_cache.tif') self.assertEqual(expected_path, resolved_path) self.assertEqual(fmt, 'tif') self.assertTrue(isfile(resolved_path)) #Test with a full uri #Note: This seems weird but idents resolve wrong and removes a slash from // ident = quote_plus('http:/sample.sample/0001') resolved_path, fmt = self.app.resolver.resolve(ident) expected_path = join(self.app.img_cache.cache_root, 'http') expected_path = join(expected_path, '9d') expected_path = join(expected_path, '423') expected_path = join(expected_path, 'a05') expected_path = join(expected_path, '863') expected_path = join(expected_path, 'f9f') expected_path = join(expected_path, '89d') expected_path = join(expected_path, '06e') expected_path = join(expected_path, '282') expected_path = join(expected_path, 'e84') expected_path = join(expected_path, '26c') expected_path = join(expected_path, 'b78') expected_path = join(expected_path, 'loris_cache.tif') self.assertEqual(expected_path, resolved_path) self.assertEqual(fmt, 'tif') self.assertTrue(isfile(resolved_path)) #Test with a bad identifier ident = 'DOESNOTEXIST' self.assertRaises(ResolverException, lambda: self.app.resolver.resolve(ident)) #Test with a bad url ident = quote_plus('http:/sample.sample/DOESNOTEXIST') self.assertRaises(ResolverException, lambda: self.app.resolver.resolve(ident)) #Test with no content-type or extension or default format ident = '0002' self.assertRaises(ResolverException, lambda: self.app.resolver.resolve(ident)) #Test with invalid content-type ident = '0003' self.assertRaises(ResolverException, lambda: self.app.resolver.resolve(ident)) #Tests with a default format... config = { 'cache_root' : self.app.img_cache.cache_root, 'source_prefix' : 'http://sample.sample/', 'source_suffix' : '', 'default_format' : 'tif', 'head_resolvable' : True, 'uri_resolvable' : True } self.app.resolver = SimpleHTTPResolver(config) ident = '0002' resolved_path, fmt = self.app.resolver.resolve(ident) self.assertIsNotNone(resolved_path) self.assertEqual(fmt, 'tif') self.assertTrue(isfile(resolved_path)) ident = '0003' resolved_path, fmt = self.app.resolver.resolve(ident) self.assertIsNotNone(resolved_path) self.assertEqual(fmt, 'tif') self.assertTrue(isfile(resolved_path))
def test_simple_http_resolver(self): self._mock_urls() # First we test with no config... config = { } self.assertRaises(ResolverException, lambda: SimpleHTTPResolver(config)) # Then we test missing source_prefix and uri_resolvable config = { 'cache_root' : self.SRC_IMAGE_CACHE } self.assertRaises(ResolverException, lambda: SimpleHTTPResolver(config)) # Then we test with the full config... #TODO: More granular testing of these settings... config = { 'cache_root' : self.SRC_IMAGE_CACHE, 'source_prefix' : 'http://www.mysite/', 'source_suffix' : '/accessMaster', 'default_format' : 'jp2', 'head_resolvable' : True, 'uri_resolvable' : True, 'user' : 'TestUser', 'pw' : 'TestPW', } self.app.resolver = SimpleHTTPResolver(config) self.assertEqual(self.app.resolver.source_prefix, 'http://www.mysite/') self.assertEqual(self.app.resolver.source_suffix, '/accessMaster') self.assertEqual(self.app.resolver.default_format, 'jp2') self.assertEqual(self.app.resolver.head_resolvable, True) self.assertEqual(self.app.resolver.uri_resolvable, True) self.assertEqual(self.app.resolver.user, 'TestUser') self.assertEqual(self.app.resolver.pw, 'TestPW') # Then we test with a barebones default config... config = { 'cache_root' : self.SRC_IMAGE_CACHE, 'uri_resolvable' : True } self.app.resolver = SimpleHTTPResolver(config) self.assertEqual(self.app.resolver.source_prefix, '') self.assertEqual(self.app.resolver.source_suffix, '') self.assertEqual(self.app.resolver.default_format, None) self.assertEqual(self.app.resolver.head_resolvable, False) self.assertEqual(self.app.resolver.uri_resolvable, True) self.assertEqual(self.app.resolver.user, None) self.assertEqual(self.app.resolver.pw, None) # Finally with the test config for now.... config = { 'cache_root' : self.SRC_IMAGE_CACHE, 'source_prefix' : 'http://sample.sample/', 'source_suffix' : '', 'head_resolvable' : True, 'uri_resolvable' : True } self.app.resolver = SimpleHTTPResolver(config) self.assertEqual(self.app.resolver.source_prefix, 'http://sample.sample/') self.assertEqual(self.app.resolver.source_suffix, '') self.assertEqual(self.app.resolver.default_format, None) self.assertEqual(self.app.resolver.head_resolvable, True) self.assertEqual(self.app.resolver.uri_resolvable, True) #Test with identifier only ident = '0001' expected_path = join(self.app.resolver.cache_root, '25') expected_path = join(expected_path, 'bbd') expected_path = join(expected_path, 'cd0') expected_path = join(expected_path, '6c3') expected_path = join(expected_path, '2d4') expected_path = join(expected_path, '77f') expected_path = join(expected_path, '7fa') expected_path = join(expected_path, '1c3') expected_path = join(expected_path, 'e4a') expected_path = join(expected_path, '91b') expected_path = join(expected_path, '032') expected_path = join(expected_path, '0001') #add identifier to the path expected_path = join(expected_path, 'loris_cache.tif') ii = self.app.resolver.resolve(self.app, ident, "") self.assertEqual(expected_path, ii.src_img_fp) self.assertEqual(ii.src_format, 'tif') self.assertTrue(isfile(ii.src_img_fp)) # Store the number of HTTP requests made after the first resolution # so that we can check whether one get (erroneously) made rather than # the cache being used. calls_after_resolved = len(responses.calls) # Now we resolve the same identifier a second time, when the cache # is warm. ii = self.app.resolver.resolve(self.app, ident, base_uri="") assert ii.src_img_fp == expected_path assert ii.src_format == "tif" assert os.path.isfile(ii.src_img_fp) assert len(responses.calls) == calls_after_resolved #Test with a full uri ident = quote_plus('http://sample.sample/0001') expected_path = join(self.app.resolver.cache_root, 'http') expected_path = join(expected_path, '32') expected_path = join(expected_path, '3a5') expected_path = join(expected_path, '353') expected_path = join(expected_path, '8f5') expected_path = join(expected_path, '0de') expected_path = join(expected_path, '1d3') expected_path = join(expected_path, '011') expected_path = join(expected_path, '675') expected_path = join(expected_path, 'ebc') expected_path = join(expected_path, 'c75') expected_path = join(expected_path, '083') expected_path = join(expected_path, unquote(ident)) expected_path = join(expected_path, 'loris_cache.tif') self.assertFalse(exists(expected_path)) ii = self.app.resolver.resolve(self.app, ident, "") self.assertEqual(expected_path, ii.src_img_fp) self.assertEqual(ii.src_format, 'tif') self.assertTrue(isfile(ii.src_img_fp)) # Test with an identifier including url-encodable characters ident = '01/02/0003' expected_path = join(self.app.resolver.cache_root, '7e') expected_path = join(expected_path, 'b5c') expected_path = join(expected_path, '9cf') expected_path = join(expected_path, '404') expected_path = join(expected_path, 'c6d') expected_path = join(expected_path, 'c34') expected_path = join(expected_path, 'f5c') expected_path = join(expected_path, '657') expected_path = join(expected_path, '9c9') expected_path = join(expected_path, '016') expected_path = join(expected_path, '315') expected_path = join(expected_path, ident) #add identifier to the path expected_path = join(expected_path, 'loris_cache.tif') encoded_ident = quote_plus(ident) ii = self.app.resolver.resolve(self.app, encoded_ident, "") self.assertEqual(expected_path, ii.src_img_fp) self.assertEqual(ii.src_format, 'tif') self.assertTrue(isfile(ii.src_img_fp)) # Store the number of HTTP requests made after the first resolution # so that we can check whether one get (erroneously) made rather than # the cache being used. calls_after_resolved = len(responses.calls) # Now we resolve the same identifier a second time, when the cache # is warm. ii = self.app.resolver.resolve(self.app, encoded_ident, base_uri="") assert ii.src_img_fp == expected_path assert ii.src_format == "tif" assert os.path.isfile(ii.src_img_fp) assert len(responses.calls) == calls_after_resolved #Test with a bad identifier ident = 'DOESNOTEXIST' self.assertRaises(ResolverException, lambda: self.app.resolver.resolve(self.app, ident, "")) #Test with a bad url ident = quote_plus('http://sample.sample/DOESNOTEXIST') self.assertRaises(ResolverException, lambda: self.app.resolver.resolve(self.app, ident, "")) #Test with no content-type or extension or default format ident = '0002' self.assertRaises(ResolverException, lambda: self.app.resolver.resolve(self.app, ident, "")) #Test with invalid content-type ident = '0003' self.assertRaises(ResolverException, lambda: self.app.resolver.resolve(self.app, ident, ""))
def cache_dir_path(self, ident): ident = unquote(ident) return join(self.cache_root, SimpleHTTPResolver._cache_subroot(ident))