{
  "protocolVersion": "v1",
  "fixtureSet": "version",
  "fixture": "negotiation-vectors",
  "description": "Protocol version decisions. A rejected version fails closed: nothing in the payload is processed, stored, or echoed.",
  "vectors": [
    {
      "name": "supported major version",
      "request": {
        "protocolVersion": "v1",
        "agentVersion": "1.4.0",
        "capabilities": ["heartbeat", "inventory"]
      },
      "expected": {
        "decision": "ACCEPT",
        "negotiatedProtocolVersion": "v1",
        "reason": null,
        "httpStatus": null
      }
    },
    {
      "name": "supported major version reported by an agent that sends nothing else",
      "request": {
        "protocolVersion": "v1"
      },
      "expected": {
        "decision": "ACCEPT",
        "negotiatedProtocolVersion": "v1",
        "reason": null,
        "httpStatus": null
      }
    },
    {
      "name": "next major version from a future agent",
      "request": {
        "protocolVersion": "v2",
        "agentVersion": "2.0.0",
        "capabilities": ["heartbeat"]
      },
      "expected": {
        "decision": "REJECT",
        "negotiatedProtocolVersion": null,
        "reason": "UNSUPPORTED_PROTOCOL",
        "httpStatus": 400
      }
    },
    {
      "name": "far future major version",
      "request": {
        "protocolVersion": "v9999"
      },
      "expected": {
        "decision": "REJECT",
        "negotiatedProtocolVersion": null,
        "reason": "UNSUPPORTED_PROTOCOL",
        "httpStatus": 400
      }
    },
    {
      "name": "missing protocol version",
      "request": {
        "agentVersion": "1.4.0"
      },
      "expected": {
        "decision": "REJECT",
        "negotiatedProtocolVersion": null,
        "reason": "UNSUPPORTED_PROTOCOL",
        "httpStatus": 400
      }
    },
    {
      "name": "version without its prefix",
      "request": {
        "protocolVersion": "1"
      },
      "expected": {
        "decision": "REJECT",
        "negotiatedProtocolVersion": null,
        "reason": "UNSUPPORTED_PROTOCOL",
        "httpStatus": 400
      }
    },
    {
      "name": "uppercase prefix",
      "request": {
        "protocolVersion": "V1"
      },
      "expected": {
        "decision": "REJECT",
        "negotiatedProtocolVersion": null,
        "reason": "UNSUPPORTED_PROTOCOL",
        "httpStatus": 400
      }
    },
    {
      "name": "dotted version",
      "request": {
        "protocolVersion": "v1.2"
      },
      "expected": {
        "decision": "REJECT",
        "negotiatedProtocolVersion": null,
        "reason": "UNSUPPORTED_PROTOCOL",
        "httpStatus": 400
      }
    },
    {
      "name": "zero major version",
      "request": {
        "protocolVersion": "v0"
      },
      "expected": {
        "decision": "REJECT",
        "negotiatedProtocolVersion": null,
        "reason": "UNSUPPORTED_PROTOCOL",
        "httpStatus": 400
      }
    },
    {
      "name": "empty protocol version",
      "request": {
        "protocolVersion": ""
      },
      "expected": {
        "decision": "REJECT",
        "negotiatedProtocolVersion": null,
        "reason": "UNSUPPORTED_PROTOCOL",
        "httpStatus": 400
      }
    }
  ]
}
