AI_Career_Advisor__ / test_openenv.py
JUNAID0990
Prepare OpenEnv career advisor
30ac8e9
import argparse
import sys
import requests
DEFAULT_BASE_URL = "https://junaid12kh.hf.space/openenv/reset"
TIMEOUT_SECONDS = 10
def print_result(name: str, passed: bool) -> None:
status = "PASS" if passed else "FAIL"
print(f"{status} - {name}")
def request_json(method: str, url: str, **kwargs):
try:
response = requests.request(method, url, timeout=TIMEOUT_SECONDS, **kwargs)
print(f"Status Code: {response.status_code}")
try:
data = response.json()
print("Response JSON:", data)
except ValueError:
data = None
print("Response JSON: <invalid JSON>")
print("Raw Response:", response.text)
return response, data
except requests.RequestException as exc:
print(f"Request error: {exc}")
return None, None
def has_required_keys(data) -> bool:
return isinstance(data, dict) and all(key in data for key in ("observation", "reward", "done"))
def test_reset(base_url: str) -> bool:
print("\nTesting POST /reset")
response, data = request_json("POST", f"{base_url}/reset", json={})
if response is None:
print_result("POST /reset", False)
return False
passed = response.status_code == 200 and isinstance(data, dict) and "state" in data
if response.status_code == 405:
print("Expected 200 but received 405 Method Not Allowed.")
elif response.status_code != 200:
print(f"Expected 200 but received {response.status_code}.")
elif "state" not in data:
print("Response JSON is missing the required key: state.")
print_result("POST /reset", passed)
return passed
def test_step(base_url: str) -> bool:
print("\nTesting POST /step")
payload = {"action": {"type": "choose_career", "target": "AI Engineer"}}
response, data = request_json("POST", f"{base_url}/step", json=payload)
if response is None:
print_result("POST /step", False)
return False
passed = response.status_code == 200 and isinstance(data, dict) and all(
key in data for key in ("next_state", "reward", "done", "info")
)
if response.status_code != 200:
print(f"Expected 200 but received {response.status_code}.")
elif not isinstance(data, dict) or not all(key in data for key in ("next_state", "reward", "done", "info")):
print("Response JSON is missing one or more required keys: next_state, reward, done, info.")
print_result("POST /step", passed)
return passed
def test_state(base_url: str) -> bool:
print("\nTesting GET /state")
response, data = request_json("GET", f"{base_url}/state")
if response is None:
print_result("GET /state", False)
return False
passed = response.status_code == 200 and isinstance(data, dict) and "state" in data
if response.status_code != 200:
print(f"Expected 200 but received {response.status_code}.")
elif "state" not in data:
print("Response JSON is missing the required key: state.")
print_result("GET /state", passed)
return passed
def main() -> int:
parser = argparse.ArgumentParser(description="Validate OpenEnv FastAPI endpoints.")
parser.add_argument("--base-url", default=DEFAULT_BASE_URL, help=f"Base URL for the API (default: {DEFAULT_BASE_URL})")
args = parser.parse_args()
base_url = args.base_url.rstrip("/")
print(f"Using base URL: {base_url}")
results = [
test_reset(base_url),
test_step(base_url),
test_state(base_url),
]
overall = all(results)
print_result("Overall OpenEnv validation", overall)
return 0 if overall else 1
if __name__ == "__main__":
sys.exit(main())