# This file was created automatically using mongodb-spec-converter.
# Please review the generated file, then remove this notice.

description: updateWithPipelines
schemaVersion: '1.0'
runOnRequirements:
  -
    minServerVersion: 4.1.11
createEntities:
  -
    client:
      id: &client0 client0
      observeEvents:
        - commandStartedEvent
  -
    database:
      id: &database0 database0
      client: client0
      databaseName: &database_name crud-tests
  -
    collection:
      id: &collection0 collection0
      database: database0
      collectionName: &collection_name test
initialData:
  -
    collectionName: *collection_name
    databaseName: *database_name
    documents:
      -
        _id: 1
        x: 1
        'y': 1
        t:
          u:
            v: 1
      -
        _id: 2
        x: 2
        'y': 1
tests:
  -
    description: 'UpdateOne using pipelines'
    operations:
      -
        object: *collection0
        name: updateOne
        arguments:
          filter:
            _id: 1
          update:
            -
              $replaceRoot:
                newRoot: $t
            -
              $addFields:
                foo: 1
        expectResult:
          matchedCount: 1
          modifiedCount: 1
          upsertedCount: 0
    expectEvents:
      -
        client: *client0
        events:
          -
            commandStartedEvent:
              command:
                update: *collection_name
                updates:
                  -
                    q:
                      _id: 1
                    u:
                      - { $replaceRoot: { newRoot: $t } }
                      - { $addFields: { foo: 1 } }
                    multi: { $$unsetOrMatches: false }
                    upsert: { $$unsetOrMatches: false }
              commandName: update
              databaseName: *database_name
    outcome:
      -
        collectionName: *collection_name
        databaseName: *database_name
        documents:
          -
            _id: 1
            u:
              v: 1
            foo: 1
          -
            _id: 2
            x: 2
            'y': 1
  -
    description: 'UpdateMany using pipelines'
    operations:
      -
        object: *collection0
        name: updateMany
        arguments:
          filter: {  }
          update:
            -
              $project:
                x: 1
            -
              $addFields:
                foo: 1
        expectResult:
          matchedCount: 2
          modifiedCount: 2
          upsertedCount: 0
    expectEvents:
      -
        client: *client0
        events:
          -
            commandStartedEvent:
              command:
                update: *collection_name
                updates:
                  -
                    q: {  }
                    u:
                      - { $project: { x: 1 } }
                      - { $addFields: { foo: 1 } }
                    multi: true
                    upsert: { $$unsetOrMatches: false }
              commandName: update
              databaseName: *database_name
    outcome:
      -
        collectionName: *collection_name
        databaseName: *database_name
        documents:
          -
            _id: 1
            x: 1
            foo: 1
          -
            _id: 2
            x: 2
            foo: 1
  -
    description: 'FindOneAndUpdate using pipelines'
    operations:
      -
        object: *collection0
        name: findOneAndUpdate
        arguments:
          filter:
            _id: 1
          update:
            -
              $project:
                x: 1
            -
              $addFields:
                foo: 1
    expectEvents:
      -
        client: *client0
        events:
          -
            commandStartedEvent:
              command:
                findAndModify: *collection_name
                update:
                  -
                    $project:
                      x: 1
                  -
                    $addFields:
                      foo: 1
              commandName: findAndModify
              databaseName: *database_name
    outcome:
      -
        collectionName: *collection_name
        databaseName: *database_name
        documents:
          -
            _id: 1
            x: 1
            foo: 1
          -
            _id: 2
            x: 2
            'y': 1
  -
    description: 'UpdateOne in bulk write using pipelines'
    operations:
      -
        object: *collection0
        name: bulkWrite
        arguments:
          requests:
            -
              updateOne:
                filter:
                  _id: 1
                update:
                  -
                    $replaceRoot:
                      newRoot: $t
                  -
                    $addFields:
                      foo: 1
        expectResult:
          matchedCount: 1
          modifiedCount: 1
          upsertedCount: 0
    expectEvents:
      -
        client: *client0
        events:
          -
            commandStartedEvent:
              command:
                update: *collection_name
                updates:
                  -
                    q:
                      _id: 1
                    u:
                      - { $replaceRoot: { newRoot: $t } }
                      - { $addFields: { foo: 1 } }
                    multi: { $$unsetOrMatches: false }
                    upsert: { $$unsetOrMatches: false }
              commandName: update
              databaseName: *database_name
    outcome:
      -
        collectionName: *collection_name
        databaseName: *database_name
        documents:
          -
            _id: 1
            u:
              v: 1
            foo: 1
          -
            _id: 2
            x: 2
            'y': 1
  -
    description: 'UpdateMany in bulk write using pipelines'
    operations:
      -
        object: *collection0
        name: bulkWrite
        arguments:
          requests:
            -
              updateMany:
                filter: {  }
                update:
                  -
                    $project:
                      x: 1
                  -
                    $addFields:
                      foo: 1
        expectResult:
          matchedCount: 2
          modifiedCount: 2
          upsertedCount: 0
    expectEvents:
      -
        client: *client0
        events:
          -
            commandStartedEvent:
              command:
                update: *collection_name
                updates:
                  -
                    q: {  }
                    u:
                      - { $project: { x: 1 } }
                      - { $addFields: { foo: 1 } }
                    multi: true
                    upsert: { $$unsetOrMatches: false }
              commandName: update
              databaseName: *database_name
    outcome:
      -
        collectionName: *collection_name
        databaseName: *database_name
        documents:
          -
            _id: 1
            x: 1
            foo: 1
          -
            _id: 2
            x: 2
            foo: 1
