""" Test data catalog endpoint """ import pytest from fastapi.testclient import TestClient def test_get_catalog(client: TestClient): """Test data catalog endpoint""" response = client.get("/api/v1/metadata/catalog") assert response.status_code == 200 data = response.json() # Check response structure assert "categories" in data assert "last_updated" in data # Check categories structure categories = data["categories"] assert isinstance(categories, dict) # Check expected categories exist expected_categories = [ "Company Information", "Income Statement", "Balance Sheet", "Cash Flow Statement", "Valuation Ratios", "Profitability Metrics", "Growth Metrics", "Liquidity & Solvency", "Efficiency Metrics", "Market Data (Future)" ] for category in expected_categories: assert category in categories def test_catalog_category_structure(client: TestClient): """Test catalog category structure""" response = client.get("/api/v1/metadata/catalog") assert response.status_code == 200 data = response.json() categories = data["categories"] # Check each category has proper structure for category_name, items in categories.items(): assert isinstance(items, list) assert len(items) > 0 # Check each item structure for item in items: assert "field_name" in item assert "description" in item assert "data_type" in item assert "source" in item # Optional fields assert "unit" in item # Can be null assert "calculation" in item # Can be null # Check data types assert isinstance(item["field_name"], str) assert isinstance(item["description"], str) assert isinstance(item["data_type"], str) assert isinstance(item["source"], str) def test_catalog_specific_fields(client: TestClient): """Test specific fields in catalog""" response = client.get("/api/v1/metadata/catalog") assert response.status_code == 200 data = response.json() categories = data["categories"] # Check some specific fields exist company_info = categories["Company Information"] field_names = [item["field_name"] for item in company_info] assert "ticker" in field_names assert "name" in field_names assert "cik" in field_names assert "sector" in field_names assert "industry" in field_names # Check income statement fields income_statement = categories["Income Statement"] income_fields = [item["field_name"] for item in income_statement] assert "revenue" in income_fields assert "gross_profit" in income_fields assert "operating_income" in income_fields assert "net_income" in income_fields assert "eps" in income_fields def test_catalog_valuation_ratios(client: TestClient): """Test valuation ratios in catalog""" response = client.get("/api/v1/metadata/catalog") assert response.status_code == 200 data = response.json() categories = data["categories"] valuation_ratios = categories["Valuation Ratios"] ratio_names = [item["field_name"] for item in valuation_ratios] # Check key ratios exist assert "pe_ratio" in ratio_names assert "pb_ratio" in ratio_names assert "ps_ratio" in ratio_names assert "ev_ebitda" in ratio_names # Check they have calculations for item in valuation_ratios: if item["field_name"] in ["pe_ratio", "pb_ratio", "ps_ratio", "ev_ebitda"]: assert item["calculation"] is not None assert len(item["calculation"]) > 0 def test_catalog_profitability_metrics(client: TestClient): """Test profitability metrics in catalog""" response = client.get("/api/v1/metadata/catalog") assert response.status_code == 200 data = response.json() categories = data["categories"] profitability = categories["Profitability Metrics"] profit_names = [item["field_name"] for item in profitability] # Check key profitability metrics assert "roe" in profit_names assert "roa" in profit_names assert "gross_margin" in profit_names assert "operating_margin" in profit_names assert "net_margin" in profit_names # Check they have percentage units for item in profitability: if "margin" in item["field_name"] or item["field_name"] in ["roe", "roa"]: assert item["unit"] == "percentage" def test_catalog_market_data_future(client: TestClient): """Test future market data fields in catalog""" response = client.get("/api/v1/metadata/catalog") assert response.status_code == 200 data = response.json() categories = data["categories"] market_data = categories["Market Data (Future)"] market_names = [item["field_name"] for item in market_data] # Check future fields exist assert "market_cap" in market_names assert "forward_pe" in market_names assert "peg_ratio" in market_names assert "beta" in market_names # Check they indicate external data requirement for item in market_data: if item["field_name"] in ["forward_pe", "peg_ratio", "beta"]: assert "external" in item["source"].lower() or "required" in item["source"].lower() def test_catalog_response_format(client: TestClient): """Test catalog response format""" response = client.get("/api/v1/metadata/catalog") assert response.status_code == 200 assert response.headers["content-type"] == "application/json" data = response.json() # Check timestamp format assert "last_updated" in data assert isinstance(data["last_updated"], str) # Should be ISO format datetime from datetime import datetime try: datetime.fromisoformat(data["last_updated"].replace('Z', '+00:00')) except ValueError: pytest.fail("last_updated is not in valid ISO format")