{
  "filename": "database.py",
  "rule": "- name: request-db-cleanup\n  where: \"database.py\"\n  ensure: >-\n    close_db must close a database connection removed from g, and init_app must register close_db as teardown_appcontext.",
  "corrected": "import sqlite3\nfrom flask import current_app, g\n\ndef get_db():\n    if \"db\" not in g:\n        g.db = sqlite3.connect(current_app.config[\"DATABASE\"])\n        g.db.row_factory = sqlite3.Row\n    return g.db\n\ndef close_db(error=None):\n    connection = g.pop(\"db\", None)\n    if connection is not None:\n        connection.close()\n\ndef init_app(app):\n    app.teardown_appcontext(close_db)\n",
  "broken": "import sqlite3\nfrom flask import current_app, g\n\ndef get_db():\n    if \"db\" not in g:\n        g.db = sqlite3.connect(current_app.config[\"DATABASE\"])\n        g.db.row_factory = sqlite3.Row\n    return g.db\n\ndef close_db(error=None):\n    connection = g.pop(\"db\", None)\n    if connection is not None:\n        pass\n\ndef init_app(app):\n    app.teardown_appcontext(close_db)\n",
  "regression": [
    "        connection.close()",
    "        pass"
  ],
  "test_scenarios": [
    [
      "Two get_db calls in one context",
      "Same connection"
    ],
    [
      "Request raises after acquisition",
      "Connection closes at teardown"
    ],
    [
      "No database use",
      "Teardown does nothing"
    ],
    [
      "New application context",
      "New connection, no previous user state"
    ]
  ],
  "test_source": "from unittest.mock import Mock\nfrom flask import Flask, g\nfrom database import init_app\n\ndef test_error_path_closes_connection():\n    app = Flask(__name__)\n    init_app(app)\n    connection = Mock()\n    try:\n        with app.app_context():\n            g.db = connection\n            raise RuntimeError(\"request failed\")\n    except RuntimeError:\n        pass\n    connection.close.assert_called_once()\n",
  "test_command": "python -m pytest tests/test_database_lifecycle.py"
}