code: def test_call_with_key_over_budget():
      # 5. Make a call with a key over budget, expect to fail
      setattr(
          litellm.proxy.proxy_server,
          "custom_db_client",
          custom_db_client,
      )
      setattr(litellm.proxy.proxy_server, "master_key", "sk-1234")
      try:
  
          async def test():
              request = NewUserRequest(max_budget=0.00001)
              key = await new_user(request)
              print(key)
  
              generated_key = key.key
              user_id = key.user_id
              bearer_token = "Bearer " + generated_key
  
              request = Request(scope={"type": "http"})
              request._url = URL(url="/chat/completions")
  
              # use generated key to auth in
              result = await user_api_key_auth(
                  request=request, api_key=bearer_token
              )
              print("result from user auth with new key", result)
  
              # update spend using track_cost callback, make 2nd request, it should fail
              from litellm.proxy.proxy_server import track_cost_callback
              from litellm import ModelResponse, Choices, Message, Usage
  
              resp = ModelResponse(
                  id="chatcmpl-e41836bb-bb8b-4df2-8e70-8f3e160155ac",
                  choices=[
                      Choices(
                          finish_reason=None,
                          index=0,
                          message=Message(
                              content=" Sure! Here is a short poem about the sky:\n\nA canvas of blue, a",
                              role="assistant",
                          ),
                      )
                  ],
                  model="gpt-35-turbo",  # azure always has model written like this
                  usage=Usage(
                      prompt_tokens=210,
                      completion_tokens=200,
                      total_tokens=410,
                  ),
              )
              await track_cost_callback(
                  kwargs={
                      "stream": False,
                      "litellm_params": {
                          "metadata": {
                              "user_api_key": generated_key,
                              "user_api_key_user_id": user_id,
                          }
                      },
                  },
                  completion_response=resp,
              )
  
              # use generated key to auth in
              result = await user_api_key_auth(
                  request=request, api_key=bearer_token
              )
              print("result from user auth with new key", result)
              pytest.fail(
                  f"This should have failed!. They key crossed it's budget"
              )
  
          asyncio.run(test())
      except Exception as e:
          error_detail = e.detail
          assert "Authentication Error, ExceededBudget:" in error_detail
          print(vars(e))
  
file_path: litellm/litellm/tests/test_key_generate_dynamodb.py
imports: import sys, os
  import traceback
  from dotenv import load_dotenv
  from fastapi import Request
  import os, io
  import pytest, logging, asyncio
  import litellm, asyncio
  from litellm.proxy.proxy_server import new_user, user_api_key_auth, user_update
  from litellm.proxy._types import NewUserRequest, DynamoDBArgs
  from litellm.proxy.utils import DBClient
  from starlette.datastructures import URL
label_desc: Use image node_id 5 for calling a global function with example usage: test_call_with_key_over_budget() without return types