| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- import importlib.util
- import io
- import unittest
- from pathlib import Path
- from PIL import Image
- spec = importlib.util.spec_from_file_location('product_images', Path(__file__).with_name('import-product-images.py'))
- media = importlib.util.module_from_spec(spec)
- spec.loader.exec_module(media)
- class ProductImageTests(unittest.TestCase):
- def test_only_matching_product_and_safe_fields(self):
- payload = {'id': 'jd.search_item_list_v1', 'result': {'products': [
- {'id': '12', 'imageUrl': 'jfs/a.jpg', 'tagUrl': '//m.360buyimg.com/logo.png'},
- {'id': '13', 'imageUrl': 'jfs/b.jpg'}]}}
- images = media.candidates(payload, {'jd:12'})
- self.assertEqual([(r['productId'], r['sourceUrl']) for r in images], [('jd:12', 'https://img14.360buyimg.com/n1/jfs/a.jpg')])
- payload['id'] = 'jd.get_item_comments_v1'
- self.assertEqual(media.candidates(payload, {'jd:12'}), [])
- def test_detail_main_image_does_not_capture_service_icons_or_related_products(self):
- payload = {'id': 'jd.get_item_detail_v1', 'params': {'itemId': '12'}, 'result': {'data': {
- 'product': {'imageurl': 'jfs/a.jpg'},
- 'stock': {'ir': [{'picUrl': '//static.360buyimg.com/icon.png'}]},
- 'recommendations': [{'id': '13', 'imageUrl': 'jfs/b.jpg'}]}}}
- images = media.candidates(payload, {'jd:12', 'jd:13'})
- self.assertEqual(len(images), 1)
- self.assertEqual(images[0]['productId'], 'jd:12')
- def test_platform_scoping_and_host_validation(self):
- payload = {'id': 'taobao.get_shop_item_list_v4', 'result': {'itemId': '12', 'itemPic': '//img.alicdn.com/a.jpg'}}
- self.assertEqual(media.candidates(payload, {'jd:12'}), [])
- self.assertEqual(media.candidates(payload, {'taobao:12'})[0]['productId'], 'taobao:12')
- for url in ('http://127.0.0.1/a.jpg', 'https://img.alicdn.com.evil.test/a.jpg', 'https://x@img.alicdn.com/a.jpg', 'file:///a.jpg'):
- self.assertIsNone(media.image_url(url, 'taobao'))
- def test_image_decode_resize_and_small_icon_rejection(self):
- def raw(size):
- buffer = io.BytesIO()
- Image.new('RGB', size, 'white').save(buffer, 'PNG')
- return buffer.getvalue()
- body, width, height = media.image_bytes(raw((1000, 600)), 256)
- self.assertEqual((width, height), (256, 154))
- self.assertEqual(Image.open(io.BytesIO(body)).format, 'JPEG')
- with self.assertRaises(ValueError):
- media.image_bytes(raw((20, 20)), 256)
- def test_public_page_requires_exact_product_identity(self):
- html = 'window._itemOnly = ({"item":{"skuId":"12","image":["jfs/a.jpg"]}});'
- self.assertEqual(media.page_images(html, 'jd:12'), ['https://img14.360buyimg.com/n1/jfs/a.jpg'])
- self.assertEqual(media.page_images(html, 'jd:13'), [])
- self.assertEqual(media.page_images('<html>请验证</html>', 'jd:12'), [])
- if __name__ == '__main__':
- unittest.main()
|