Skip to content

快手/Instagram 的 by_url 兜底路径在生产中走不到,且被 monkeypatch 测试掩盖 #8

Description

@zj1123581321

现象

app/api/resolve.py 里的 URL_FALLBACK_PLATFORMS(含 kuaishouinstagram)本意是:
当 video_id 提取失败时放行,让 provider 链用原始 URL 兜底。

但这条路径在生产中永远走不到

机制

兜底分支要求 url_parser.parse_url() 返回 (platform, None)。而现有 parse_url 在 ID 提取
失败时,对这两个平台返回的是 (None, None)——平台名也一起丢了,兜底分支的条件匹配不上,
请求直接落到 400。

为什么测试没发现

现有相关测试用 monkeypatchparse_url 替换掉、直接喂 (platform, None) 进去,
绕过了真实的 parse_url。所以测试断言的是"兜底分支拿到正确入参后会怎样",
而不是"真实链路能不能产生这个入参"。测试绿,功能不通。

这是一个典型的假绿:桩替换点选在了被测缺陷的上游。

发现经过

接入微信视频号(PR #7)时发现。视频号需要同样的兜底能力,实现方核对现状时发现约定对不上,
在报告里显式提出。视频号本身已通过让 parse_url 返回 (wechat_channels, None) 走通,
未改动快手/Instagram 的行为,所以本 issue 描述的是存量缺陷,不是 PR #7 引入的。

修复方向(供参考,未拍板)

  1. parse_urlURL_FALLBACK_PLATFORMS 内的平台在 ID 提取失败时保留平台名,
    返回 (platform, None)——与视频号现在的做法一致。
  2. 把相关测试从 monkeypatch parse_url 改成走真实 parse_url,用真实的短链/无 ID URL 作输入。
    这一步是关键:不改测试的话,同样的假绿会再来一次。
  3. 回归验证:parse_url 是所有平台共用入口,改动需确认其余 6 个平台的识别结果零变化。

影响面

快手与 Instagram 在「短链展开失败」或「ID 提取失败」时,本应降级到按 URL 解析,
实际直接返回 400。影响程度取决于这两个平台的 URL 形态有多少落进提取失败分支。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions