description: connection establishment if loadBalanced is specified for non-load balanced clusters

schemaVersion: '1.3'

runOnRequirements:
  # Don't run on replica sets because the URI used to configure the clients will contain multiple hosts and the
  # replicaSet option, which will cause an error when constructing the lbTrueClient entity.
  - topologies: [ single, sharded ]

createEntities:
  - client:
      id: &lbTrueClient lbTrueClient
      # Restrict to a single mongos to ensure there are not multiple hosts in the URI, which would conflict with
      # loadBalanced=true.
      useMultipleMongoses: false
      uriOptions:
        loadBalanced: true
  - database:
      id: &lbTrueDatabase lbTrueDatabase
      client: *lbTrueClient
      databaseName: &lbTrueDatabaseName lbTrueDb
  - client:
      id: &lbFalseClient lbFalseClient
      uriOptions:
        loadBalanced: false
  - database:
      id: &lbFalseDatabase lbFalseDatabase
      client: *lbFalseClient
      databaseName: &lbFalseDatabaseName lbFalseDb

_yamlAnchors:
  runCommandArguments:
    - &pingArguments
      arguments:
        commandName: ping
        command: { ping: 1 }

tests:
  # These tests assert that drivers behave correctly if loadBalanced=true/false for non-load balanced clusters. Existing
  # spec tests should cover the case where loadBalanced is unset.

  # If the server is not configured to be behind a load balancer and the URI contains loadBalanced=true, the driver
  # should error during the connection handshake because the server's hello response does not contain a serviceId field.
  - description: operations against non-load balanced clusters fail if URI contains loadBalanced=true
    operations:
      - name: runCommand
        object: *lbTrueDatabase
        <<: *pingArguments
        expectError:
          errorContains: Driver attempted to initialize in load balancing mode, but the server does not support this mode

  - description: operations against non-load balanced clusters succeed if URI contains loadBalanced=false
    operations:
      - name: runCommand
        object: *lbFalseDatabase
        <<: *pingArguments
