test_import_product_images.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import importlib.util
  2. import io
  3. import unittest
  4. from pathlib import Path
  5. from PIL import Image
  6. spec = importlib.util.spec_from_file_location('product_images', Path(__file__).with_name('import-product-images.py'))
  7. media = importlib.util.module_from_spec(spec)
  8. spec.loader.exec_module(media)
  9. class ProductImageTests(unittest.TestCase):
  10. def test_only_matching_product_and_safe_fields(self):
  11. payload = {'id': 'jd.search_item_list_v1', 'result': {'products': [
  12. {'id': '12', 'imageUrl': 'jfs/a.jpg', 'tagUrl': '//m.360buyimg.com/logo.png'},
  13. {'id': '13', 'imageUrl': 'jfs/b.jpg'}]}}
  14. images = media.candidates(payload, {'jd:12'})
  15. self.assertEqual([(r['productId'], r['sourceUrl']) for r in images], [('jd:12', 'https://img14.360buyimg.com/n1/jfs/a.jpg')])
  16. payload['id'] = 'jd.get_item_comments_v1'
  17. self.assertEqual(media.candidates(payload, {'jd:12'}), [])
  18. def test_detail_main_image_does_not_capture_service_icons_or_related_products(self):
  19. payload = {'id': 'jd.get_item_detail_v1', 'params': {'itemId': '12'}, 'result': {'data': {
  20. 'product': {'imageurl': 'jfs/a.jpg'},
  21. 'stock': {'ir': [{'picUrl': '//static.360buyimg.com/icon.png'}]},
  22. 'recommendations': [{'id': '13', 'imageUrl': 'jfs/b.jpg'}]}}}
  23. images = media.candidates(payload, {'jd:12', 'jd:13'})
  24. self.assertEqual(len(images), 1)
  25. self.assertEqual(images[0]['productId'], 'jd:12')
  26. def test_platform_scoping_and_host_validation(self):
  27. payload = {'id': 'taobao.get_shop_item_list_v4', 'result': {'itemId': '12', 'itemPic': '//img.alicdn.com/a.jpg'}}
  28. self.assertEqual(media.candidates(payload, {'jd:12'}), [])
  29. self.assertEqual(media.candidates(payload, {'taobao:12'})[0]['productId'], 'taobao:12')
  30. 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'):
  31. self.assertIsNone(media.image_url(url, 'taobao'))
  32. def test_image_decode_resize_and_small_icon_rejection(self):
  33. def raw(size):
  34. buffer = io.BytesIO()
  35. Image.new('RGB', size, 'white').save(buffer, 'PNG')
  36. return buffer.getvalue()
  37. body, width, height = media.image_bytes(raw((1000, 600)), 256)
  38. self.assertEqual((width, height), (256, 154))
  39. self.assertEqual(Image.open(io.BytesIO(body)).format, 'JPEG')
  40. with self.assertRaises(ValueError):
  41. media.image_bytes(raw((20, 20)), 256)
  42. def test_public_page_requires_exact_product_identity(self):
  43. html = 'window._itemOnly = ({"item":{"skuId":"12","image":["jfs/a.jpg"]}});'
  44. self.assertEqual(media.page_images(html, 'jd:12'), ['https://img14.360buyimg.com/n1/jfs/a.jpg'])
  45. self.assertEqual(media.page_images(html, 'jd:13'), [])
  46. self.assertEqual(media.page_images('<html>请验证</html>', 'jd:12'), [])
  47. if __name__ == '__main__':
  48. unittest.main()