runOn:
    -
        minServerVersion: "4.0"
        topology: ["replicaset"]
    -
        minServerVersion: "4.1.8"
        topology: ["sharded"]

database_name: &database_name "transaction-tests"
collection_name: &collection_name "test"

data: []

tests:
  - description: run command with default read preference

    operations:
      - name: startTransaction
        object: session0
      - name: runCommand
        object: database
        command_name: insert
        arguments:
          session: session0
          command:
            insert: *collection_name
            documents:
              - _id : 1
        result:
          n: 1
      - name: commitTransaction
        object: session0

    expectations:
      - command_started_event:
          command:
            insert: *collection_name
            documents:
              - _id : 1
            readConcern:
            lsid: session0
            txnNumber:
              $numberLong: "1"
            startTransaction: true
            autocommit: false
            writeConcern:
          command_name: insert
          database_name: *database_name
      - command_started_event:
          command:
            commitTransaction: 1
            lsid: session0
            txnNumber:
              $numberLong: "1"
            startTransaction:
            autocommit: false
            writeConcern:
          command_name: commitTransaction
          database_name: admin

  - description: run command with secondary read preference in client option and primary read preference in transaction options

    clientOptions:
      readPreference: secondary

    operations:
      - name: startTransaction
        object: session0
        arguments:
          options:
            readPreference:
              mode: Primary
      - name: runCommand
        object: database
        command_name: insert
        arguments:
          session: session0
          command:
            insert: *collection_name
            documents:
              - _id : 1
        result:
          n: 1
      - name: commitTransaction
        object: session0

    expectations:
      - command_started_event:
          command:
            insert: *collection_name
            documents:
              - _id : 1
            readConcern:
            lsid: session0
            txnNumber:
              $numberLong: "1"
            startTransaction: true
            autocommit: false
            writeConcern:
          command_name: insert
          database_name: *database_name
      - command_started_event:
          command:
            commitTransaction: 1
            lsid: session0
            txnNumber:
              $numberLong: "1"
            startTransaction:
            autocommit: false
            writeConcern:
          command_name: commitTransaction
          database_name: admin

  - description: run command with explicit primary read preference

    operations:
      - name: startTransaction
        object: session0
      - name: runCommand
        object: database
        command_name: insert
        arguments:
          session: session0
          command:
            insert: *collection_name
            documents:
              - _id : 1
          readPreference:
            mode: Primary
        result:
          n: 1
      - name: commitTransaction
        object: session0

    expectations:
      - command_started_event:
          command:
            insert: *collection_name
            documents:
              - _id : 1
            readConcern:
            lsid: session0
            txnNumber:
              $numberLong: "1"
            startTransaction: true
            autocommit: false
            writeConcern:
          command_name: insert
          database_name: *database_name
      - command_started_event:
          command:
            commitTransaction: 1
            lsid: session0
            txnNumber:
              $numberLong: "1"
            startTransaction:
            autocommit: false
            writeConcern:
          command_name: commitTransaction
          database_name: admin

  - description: run command fails with explicit secondary read preference

    operations:
      - name: startTransaction
        object: session0
      - name: runCommand
        object: database
        command_name: find
        arguments:
          session: session0
          command:
            find: *collection_name
          readPreference:
            mode: Secondary
        result:
          errorContains: read preference in a transaction must be primary

  - description: run command fails with secondary read preference from transaction options

    operations:
      - name: startTransaction
        object: session0
        arguments:
          options:
            readPreference:
              mode: Secondary
      - name: runCommand
        object: database
        command_name: find
        arguments:
          session: session0
          command:
            find: *collection_name
        result:
          errorContains: read preference in a transaction must be primary