- 新增常驻调度器 daily/scheduler.py + run-scheduler.ps1(定时生成/推送) - 新增 daily/bridge_manager.py:Windows 兼容的 Cursor SDK 桥接 - 新增 skills/daily-featured-pick 首推 Skill 与叙事轴/去重逻辑 - 新闻抓取窗口、GitHub 搜索、企微 delta 模式等多项改进 - 补充设计文档与 superpowers 计划/规范 - 新增对应测试(scheduler、featured_pick、github_search、news_fetch_window 等) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
133 lines
4.6 KiB
Python
133 lines
4.6 KiB
Python
# tests/test_featured_resolve.py
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import random
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
from daily.featured_pick import (
|
|
featured_identity_key,
|
|
featured_resolve,
|
|
load_recent_featured_keys,
|
|
load_yesterday_featured_key,
|
|
)
|
|
|
|
|
|
class FeaturedResolveTests(unittest.TestCase):
|
|
def test_same_as_yesterday_picks_from_pool_a(self):
|
|
yesterday_key = "headroomlabs-ai/headroom"
|
|
pool_a = [
|
|
{"repo": "headroomlabs-ai/headroom", "board": "github_topic"},
|
|
{"repo": "ollama/ollama", "board": "github_trending"},
|
|
]
|
|
rng = random.Random(0)
|
|
resolved, key = featured_resolve(
|
|
date_str="2026-07-14",
|
|
candidate={
|
|
"type": "github",
|
|
"url": "https://github.com/headroomlabs-ai/headroom",
|
|
"title": "headroom",
|
|
},
|
|
pool_a=pool_a,
|
|
pool_b=[],
|
|
recent_featured={yesterday_key},
|
|
yesterday_key=yesterday_key,
|
|
rng=rng,
|
|
)
|
|
self.assertNotEqual(key, yesterday_key)
|
|
self.assertEqual(key, "ollama/ollama")
|
|
self.assertIsNotNone(resolved)
|
|
assert resolved is not None
|
|
self.assertEqual(resolved.get("repo"), "ollama/ollama")
|
|
|
|
def test_pool_a_before_pool_b(self):
|
|
yesterday_key = "blocked/one"
|
|
pool_a = [{"repo": "pool-a/repo", "board": "github_trending"}]
|
|
pool_b = [{"repo": "pool-b/repo", "board": "github_emerging"}]
|
|
resolved, key = featured_resolve(
|
|
date_str="2026-07-14",
|
|
candidate={"type": "github", "repo": "blocked/one", "title": "one"},
|
|
pool_a=pool_a,
|
|
pool_b=pool_b,
|
|
recent_featured={yesterday_key},
|
|
yesterday_key=yesterday_key,
|
|
rng=random.Random(1),
|
|
)
|
|
self.assertEqual(key, "pool-a/repo")
|
|
assert resolved is not None
|
|
self.assertEqual(resolved.get("repo"), "pool-a/repo")
|
|
|
|
def test_exhausted_keeps_original(self):
|
|
yesterday_key = "only/one"
|
|
candidate = {"type": "github", "repo": "only/one", "title": "one"}
|
|
resolved, key = featured_resolve(
|
|
date_str="2026-07-14",
|
|
candidate=candidate,
|
|
pool_a=[{"repo": "only/one", "board": "github_trending"}],
|
|
pool_b=[],
|
|
recent_featured={yesterday_key},
|
|
yesterday_key=yesterday_key,
|
|
rng=random.Random(2),
|
|
)
|
|
self.assertEqual(key, yesterday_key)
|
|
self.assertEqual(resolved, candidate)
|
|
|
|
def test_identity_key_skill_and_github(self):
|
|
self.assertEqual(
|
|
featured_identity_key({"type": "skill", "id": "a/b/c"}),
|
|
"a/b/c",
|
|
)
|
|
self.assertEqual(
|
|
featured_identity_key(
|
|
{"type": "github", "url": "https://github.com/foo/bar"}
|
|
),
|
|
"foo/bar",
|
|
)
|
|
|
|
def test_load_yesterday_falls_back_to_featured_pick(self):
|
|
"""缺 featured_pick_key 时从 featured_pick.url 推导身份,避免连日重复首推。"""
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
out = Path(tmp)
|
|
payload = {
|
|
"data": {
|
|
"date": "2026-07-13",
|
|
"featured_pick": {
|
|
"type": "github",
|
|
"title": "headroom",
|
|
"url": "https://github.com/headroomlabs-ai/headroom",
|
|
},
|
|
}
|
|
}
|
|
(out / "2026-07-13.data.json").write_text(
|
|
json.dumps(payload, ensure_ascii=False), encoding="utf-8"
|
|
)
|
|
with patch("daily.featured_pick.OUTPUT_DIR", out):
|
|
key = load_yesterday_featured_key("2026-07-14")
|
|
self.assertEqual(key, "headroomlabs-ai/headroom")
|
|
|
|
def test_load_recent_falls_back_to_featured_pick(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
out = Path(tmp)
|
|
payload = {
|
|
"data": {
|
|
"date": "2026-07-13",
|
|
"featured_pick": {
|
|
"type": "github",
|
|
"url": "https://github.com/headroomlabs-ai/headroom",
|
|
},
|
|
}
|
|
}
|
|
(out / "2026-07-13.data.json").write_text(
|
|
json.dumps(payload, ensure_ascii=False), encoding="utf-8"
|
|
)
|
|
with patch("daily.featured_pick.OUTPUT_DIR", out):
|
|
keys = load_recent_featured_keys("2026-07-14", days=7)
|
|
self.assertIn("headroomlabs-ai/headroom", keys)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|