import sys import unittest from pathlib import Path ROOT = Path(__file__).resolve().parents[1] if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) from titan_odds import ( build_titan_odds_items, parse_titan_odds_script, parse_titan_schedule_script, ) SCHEDULE_SCRIPT = r""" var arrCup = [75,'世界杯','世界盃','World Cup','世界杯','世界盃','World Cup','2026']; jh["G27976"] = [[2907402,75,0,'2026-07-12 05:00',640,744,'','','19','4',-0.5,-0.25,'2.5','1']]; var arrTeam = [ [640,'挪威','挪威','Norway','','images/norway.png'], [744,'英格兰','英格蘭','England','','images/england.png'] ]; var lastUpdateTime = '2026-07-11 10:00:12'; """ ODDS_SCRIPT = """ oddsData["O_2907402"]=[[545,3.5,3.6,2.01],[16,3.3,3.55,2.13]]; oddsData["L_2907402"]=[[3,0.88,-0.5,0.94],[16,0.86,-0.5,0.98]]; oddsData["T_2907402"]=[[3,0.92,2.5,0.88],[16,0.93,2.5,0.87]]; """ class TitanOddsTest(unittest.TestCase): def test_parse_schedule_and_odds_builds_normalized_item(self): schedule = parse_titan_schedule_script(SCHEDULE_SCRIPT) odds = parse_titan_odds_script(ODDS_SCRIPT) items = build_titan_odds_items( schedule, odds, source_url="https://zq.titan007.com/cn/CupMatch/75.html", company_id=3, euro_company_id=545, company_name="Crown", ) self.assertEqual(len(items), 1) item = items[0] self.assertEqual(item["source_site"], "titan007") self.assertEqual(item["source_match_id"], "2907402") self.assertEqual(item["league_name"], "世界杯") self.assertEqual(item["home_team"], "挪威") self.assertEqual(item["away_team"], "英格兰") self.assertEqual(item["show_type"], "early") self.assertEqual(item["strong_side"], "C") self.assertEqual(item["handicap_line"], "0.5") self.assertEqual(item["handicap_home_odds"], "0.88") self.assertEqual(item["handicap_away_odds"], "0.94") self.assertEqual(item["total_line"], "2.5") self.assertEqual(item["home_win_odds"], "3.5") self.assertEqual(item["draw_odds"], "3.6") self.assertEqual(item["away_win_odds"], "2.01") self.assertEqual(item["raw_data"]["selected_company_id"], 3) self.assertEqual(item["raw_data"]["selected_euro_company_id"], 545) def test_sparse_schedule_rows_are_parsed_without_eval(self): script = r""" var arrCup = [75,'世界杯','','','','','','2026']; jh["G27977"] = [[2907405,75,0,'2026-07-16 03:00',77068,77069,'','','','',,,'','']]; var arrTeam = [[77068,'99胜者'],[77069,'100胜者']]; """ parsed = parse_titan_schedule_script(script) self.assertIn("2907405", parsed["matches"]) self.assertEqual(parsed["matches"]["2907405"]["home_team"], "99胜者") if __name__ == "__main__": unittest.main()