test_prepare_voc_handoff.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. """Regression checks for the exact adapter's risky mapping boundaries."""
  2. import importlib.util
  3. from pathlib import Path
  4. import unittest
  5. spec = importlib.util.spec_from_file_location('handoff', Path(__file__).with_name('prepare-voc-handoff.py'))
  6. h = importlib.util.module_from_spec(spec)
  7. spec.loader.exec_module(h)
  8. class HandoffTests(unittest.TestCase):
  9. def test_masked_range_and_sentinel_prices_are_not_numeric_prices(self):
  10. for value in ('7?', '登录查看价格', '0', 0, False, None, '7-9', '-1', '19.999', 'NaN'):
  11. self.assertFalse(h.valid_price(value), repr(value))
  12. for value in ('66.90', 14.4, '29.3'):
  13. self.assertTrue(h.valid_price(value))
  14. def test_large_identifiers_are_lossless_and_float_ids_are_rejected(self):
  15. self.assertEqual(h.decimal_id(123456789012345678901), '123456789012345678901')
  16. for value in (0, False, 1.0, '', '1e9', ' 123'):
  17. with self.assertRaises(ValueError):
  18. h.decimal_id(value)
  19. def test_actual_originals_do_not_repeat_the_review_misreadings(self):
  20. root = h.ROOT / 'work/voc-handoff-20261106-r1/original'
  21. if not root.exists():
  22. self.skipTest('Private handoff originals are not installed')
  23. files = {p.relative_to(root).as_posix(): p.read_bytes() for p in root.rglob('*') if p.is_file()}
  24. m = h.Mapping(files)
  25. products = m.normalize()
  26. self.assertEqual(len(products), 100)
  27. self.assertEqual(m.payload['h1']['data']['data']['totalResults'], 165)
  28. self.assertEqual(m.payload['h1']['data']['data']['TotalPage'], 7)
  29. jd = [r for name in ('c1', 'c2') for r in m.docs[name]['records']['reviews']]
  30. self.assertEqual(len({r['values']['reviewId'] for r in jd}), 19)
  31. self.assertTrue(all(r['values']['itemId'] == '100005702440' for r in jd))
  32. tb = m.docs['tc1']['records']['reviews']
  33. self.assertEqual(len({r['values']['reviewId'] for r in tb}), 20)
  34. self.assertTrue(all(r['values']['reviewId'] != '0' and r['values']['purchasedSku'] for r in tb))
  35. self.assertTrue(all('isDefault' not in r['values'] for r in jd + tb))
  36. self.assertTrue(all('shopId' not in r['values'] for r in m.docs['t1']['records']['products']))
  37. self.assertEqual(len(m.docs['s1b']['records']['prices']), 40)
  38. self.assertEqual(len(m.docs['d1']['records']['rankings']), 1)
  39. self.assertEqual(m.docs['d1']['records']['rankings'][0]['values']['scope'], 'detail_page_badge_not_complete_ranking')
  40. for r in m.docs['d1']['records']['specs']:
  41. self.assertNotIn('netWeightG', r['values'])
  42. self.assertFalse(m.docs['d1']['records'].get('prices'))
  43. for name, doc in m.docs.items():
  44. self.assertIsNotNone(doc['sourceTimeRaw'])
  45. for rows in doc['records'].values():
  46. for row in rows:
  47. for field, origin in row['fieldOrigins'].items():
  48. if 'pointer' not in origin:
  49. self.assertEqual(origin['kind'], 'adapter-policy-not-upstream-field')
  50. continue
  51. expected = h.agent_batch.pointer(m.payload[name], origin['pointer'])
  52. if origin['transform'] == 'lossless-decimal-string':
  53. expected = h.decimal_id(expected)
  54. self.assertEqual(row['values'][field], expected)
  55. if __name__ == '__main__':
  56. unittest.main()