# This test doesn't check contents of command-started events.
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: default readPreference

    operations:
      - name: startTransaction
        object: session0
      - name: insertMany
        object: collection
        arguments:
          documents: &insertedDocs
            - _id: 1
            - _id: 2
            - _id: 3
            - _id: 4
          session: session0
        result:
          insertedIds: {0: 1, 1: 2, 2: 3, 3: 4}
      - name: aggregate
        object: collection
        collectionOptions:
          # The driver overrides the collection's read pref with the
          # transaction's so count runs with Primary and succeeds.
          readPreference:
            mode: Secondary
        arguments:
          session: session0
          pipeline:
            - $match:
                _id: 1
            - $count: count
        result:
          - count: 1
      - name: find
        object: collection
        collectionOptions:
          readPreference:
            mode: Secondary
        arguments:
          session: session0
          batchSize: 3
        result: *insertedDocs
      - name: aggregate
        object: collection
        collectionOptions:
          readPreference:
            mode: Secondary
        arguments:
          pipeline:
            - $project:
                _id: 1
          batchSize: 3
          session: session0
        result: *insertedDocs
      - name: commitTransaction
        object: session0

    outcome:
      collection:
        data: *insertedDocs

  - description: primary readPreference

    operations:
      - name: startTransaction
        object: session0
        arguments:
          options:
            readPreference:
              mode: Primary
      - name: insertMany
        object: collection
        arguments:
          documents: &insertedDocs
            - _id: 1
            - _id: 2
            - _id: 3
            - _id: 4
          session: session0
        result:
          insertedIds: {0: 1, 1: 2, 2: 3, 3: 4}
      - name: aggregate
        object: collection
        collectionOptions:
          readPreference:
            mode: Secondary
        arguments:
          session: session0
          pipeline:
            - $match:
                _id: 1
            - $count: count
        result:
          - count: 1
      - name: find
        object: collection
        collectionOptions:
          readPreference:
            mode: Secondary
        arguments:
          session: session0
          batchSize: 3
        result: *insertedDocs
      - name: aggregate
        object: collection
        collectionOptions:
          readPreference:
            mode: Secondary
        arguments:
          pipeline:
            - $project:
                _id: 1
          batchSize: 3
          session: session0
        result: *insertedDocs
      - name: commitTransaction
        object: session0

    outcome:
      collection:
        data: *insertedDocs

  - description: secondary readPreference

    operations:
      - name: startTransaction
        object: session0
        arguments:
          options:
            readPreference:
              mode: Secondary
      - name: insertMany
        object: collection
        arguments:
          documents: &insertedDocs
            - _id: 1
            - _id: 2
            - _id: 3
            - _id: 4
          session: session0
        result:
          insertedIds: {0: 1, 1: 2, 2: 3, 3: 4}
      - name: aggregate
        object: collection
        collectionOptions:
          readPreference:
            mode: Primary
        arguments:
          session: session0
          pipeline:
            - $match:
                _id: 1
            - $count: count
        result:
          errorContains: read preference in a transaction must be primary
      - name: find
        object: collection
        collectionOptions:
          readPreference:
            mode: Primary
        arguments:
          session: session0
          batchSize: 3
        result:
          errorContains: read preference in a transaction must be primary
      - name: aggregate
        object: collection
        collectionOptions:
          readPreference:
            mode: Primary
        arguments:
          pipeline:
            - $project:
                _id: 1
          batchSize: 3
          session: session0
        result:
          errorContains: read preference in a transaction must be primary
      - name: abortTransaction
        object: session0

    outcome:
      collection:
        data: []

  - description: primaryPreferred readPreference

    operations:
      - name: startTransaction
        object: session0
        arguments:
          options:
            readPreference:
              mode: PrimaryPreferred
      - name: insertMany
        object: collection
        arguments:
          documents: &insertedDocs
            - _id: 1
            - _id: 2
            - _id: 3
            - _id: 4
          session: session0
        result:
          insertedIds: {0: 1, 1: 2, 2: 3, 3: 4}
      - name: aggregate
        object: collection
        collectionOptions:
          readPreference:
            mode: Primary
        arguments:
          session: session0
          pipeline:
            - $match:
                _id: 1
            - $count: count
        result:
          errorContains: read preference in a transaction must be primary
      - name: find
        object: collection
        collectionOptions:
          readPreference:
            mode: Primary
        arguments:
          session: session0
          batchSize: 3
        result:
          errorContains: read preference in a transaction must be primary
      - name: aggregate
        object: collection
        collectionOptions:
          readPreference:
            mode: Primary
        arguments:
          pipeline:
            - $project:
                _id: 1
          batchSize: 3
          session: session0
        result:
          errorContains: read preference in a transaction must be primary
      - name: abortTransaction
        object: session0

    outcome:
      collection:
        data: []

  - description: nearest readPreference

    operations:
      - name: startTransaction
        object: session0
        arguments:
          options:
            readPreference:
              mode: Nearest
      - name: insertMany
        object: collection
        arguments:
          documents: &insertedDocs
            - _id: 1
            - _id: 2
            - _id: 3
            - _id: 4
          session: session0
        result:
          insertedIds: {0: 1, 1: 2, 2: 3, 3: 4}
      - name: aggregate
        object: collection
        collectionOptions:
          readPreference:
            mode: Primary
        arguments:
          session: session0
          pipeline:
            - $match:
                _id: 1
            - $count: count
        result:
          errorContains: read preference in a transaction must be primary
      - name: find
        object: collection
        collectionOptions:
          readPreference:
            mode: Primary
        arguments:
          session: session0
          batchSize: 3
        result:
          errorContains: read preference in a transaction must be primary
      - name: aggregate
        object: collection
        collectionOptions:
          readPreference:
            mode: Primary
        arguments:
          pipeline:
            - $project:
                _id: 1
          batchSize: 3
          session: session0
        result:
          errorContains: read preference in a transaction must be primary
      - name: abortTransaction
        object: session0

    outcome:
      collection:
        data: []

  - description: secondary write only

    operations:
      - name: startTransaction
        object: session0
        arguments:
          options:
            readPreference:
              mode: Secondary
      - name: insertOne
        object: collection
        arguments:
          session: session0
          document:
            _id: 1
        result:
          insertedId: 1
      - name: commitTransaction
        object: session0

    outcome:
      collection:
        data:
          - _id: 1