from services.ocpi_validation import validate_payloads


def _errors(issues):
    return [issue for issue in issues if issue.level == "error"]


def _fields(issues, code):
    return {issue.field for issue in issues if issue.code == code}


def test_location_schema_includes_nested_paths():
    issues = validate_payloads(
        "locations",
        "2.2",
        [
            {
                "id": "LOC-1",
                "last_updated": "2024-01-01T00:00:00Z",
                "evses": [
                    {
                        "uid": "EVSE-1",
                        "status": "AVAILABLE",
                        "connectors": [
                            {
                                "standard": "IEC_62196_T2",
                                "format": "SOCKET",
                                "max_voltage": 400,
                            }
                        ],
                    }
                ],
            }
        ],
    )
    required_fields = _fields(_errors(issues), "missing_field")
    # Connector ID is required and the missing path is recorded
    assert "evses[0].connectors[0].id" in required_fields
    assert any(issue.code == "validated_version" for issue in issues)


def test_session_validation_supports_schema_and_status():
    issues = validate_payloads(
        "sessions",
        "2.3",
        [
            {
                "id": "SESSION-1",
                "start_date_time": "2024-03-04T10:00:00Z",
                "last_updated": "2024-03-04T10:05:00Z",
                "status": "BROKEN",
            }
        ],
    )
    warnings = [issue for issue in issues if issue.level == "warning"]
    assert any(issue.code == "unknown_status" for issue in warnings)
    assert all(issue.version == "2.3" for issue in issues if issue.version)
