Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

test: connection leak test test_discovery_http_is_closed is shadowed and syntactically invalid

未关闭 适合新手
#2,757 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
75/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
冷清
技术栈
python
领域
testing-qa

调研方向

从 tests/test_discovery.py 开始,比较两个 Discovery 类定义并定位 test_discovery_http_is_closed。使用 pytest 运行聚焦的 Discovery 测试,然后验证修正后的测试能够观察到临时 HTTP 客户端的关闭,且不会出现 shadowing 或 AttributeError。

由索引模型根据 Issue 内容生成。

描述

Environment details
  • OS type and version: Linux (gLinux / Debian based)
  • Python version: 3.13.12 (also affects all supported Python versions 3.10+)
  • pip version: 26.0.1
  • google-api-python-client version: 2.197.0 (at commit 6e471c075039dfef24e28d11658e03d5c949c7c3)

Steps to reproduce
  1. Look at tests/test_discovery.py on main. Note that there are two separate definitions for class Discovery(unittest.TestCase) (one at line 498 and one at line 1566).
  2. In Python, defining a class twice in the same module causes the second definition to silently overwrite the first. This means the first Discovery class—which contains the test case test_discovery_http_is_closed—is completely dead code and is never executed by pytest.
  3. Attempting to manually extract and execute this test case crashes immediately because HttpMock.close() is a regular function, but the test tries to call assert_called_once() on it.

Code example

The shadowed class in tests/test_discovery.py contains this test definition:

class Discovery(unittest.TestCase):
    def test_discovery_http_is_closed(self):
        http = HttpMock(datafile("malformed.json"), {"status": "200"})
        # build() is called without passing the 'http' mock client!
        service = build("plus", "v1", credentials=mock.sentinel.credentials)
        # Fails: HttpMock.close is a standard method, not a mock object
        http.close.assert_called_once()
Historical Context

This bug was introduced in September 2020 by commit 98888dadf ("fix: add method to close httplib2 connections (#1038)").
That commit added test_discovery_http_is_closed by declaring a new class Discovery(unittest.TestCase) block near the top of the file, without realizing that a class Discovery(unittest.TestCase) block was already defined and active near the bottom of the file (which immediately shadowed the new test).

The Proposed Solution
  1. Delete the duplicate class definition at line 498.
  2. Restore test_discovery_http_is_closed inside the active Discovery class (at line 1566).
  3. Correct the test case to use standard unittest.mock.patch on httplib2.Http to verify that the temporary HTTP client created by build() to fetch the discovery document is safely closed after initialization completes, preventing connection/socket leaks.
    @mock.patch("httplib2.Http")
    def test_discovery_http_is_closed(self, mock_http_class):
        mock_http = mock_http_class.return_value
        mock_http.request.return_value = (
            httplib2.Response({"status": "200"}),
            read_datafile("plus.json"),
        )
        service = build("plus", "v1", static_discovery=False)
        mock_http.close.assert_called_once()

Stack trace

If you isolate the legacy test case and run it, it crashes immediately with an AttributeError:

AttributeError: 'function' object has no attribute 'assert_called_once'
主要语言
Python
星标
8.9k
派生
2.6k
平均合并
2 天 2 小时
30 天内合并 PR
15

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

googleapis/google-api-python-client 的其他 Issue

查看 googleapis/google-api-python-client 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。