data:
    - {_id: 1, x: 11}
    - {_id: 2, x: 22}

minServerVersion: '2.6'

tests:
    -
        description: "BulkWrite with deleteOne operations"
        operation:
            name: "bulkWrite"
            arguments:
                # Note: as in the "DeleteOne when many documents match" test in
                # deleteOne.yml, we omit a deleteOne operation that might match
                # multiple documents as that would hinder our ability to assert
                # the final state of the collection under test.
                requests:
                    -
                        # does not match an existing document
                        name: "deleteOne"
                        arguments:
                            filter: { _id: 3 }
                    -
                        # deletes the matched document
                        name: "deleteOne"
                        arguments:
                            filter: { _id: 2 }
                options: { ordered: true }
        outcome:
            result:
                deletedCount: 1
                insertedCount: 0
                insertedIds: {}
                matchedCount: 0
                modifiedCount: 0
                upsertedCount: 0
                upsertedIds: {}
            collection:
                data:
                    - {_id: 1, x: 11 }
    -
        description: "BulkWrite with deleteMany operations"
        operation:
            name: "bulkWrite"
            arguments:
                requests:
                    -
                        # does not match any existing documents
                        name: "deleteMany"
                        arguments:
                            filter: { x: { $lt: 11 } }
                    -
                        # deletes the matched documents
                        name: "deleteMany"
                        arguments:
                            filter: { x: { $lte: 22 } }
                options: { ordered: true }
        outcome:
            result:
                deletedCount: 2
                insertedCount: 0
                insertedIds: {}
                matchedCount: 0
                modifiedCount: 0
                upsertedCount: 0
                upsertedIds: {}
            collection:
                data: []
    -
        description: "BulkWrite with insertOne operations"
        operation:
            name: "bulkWrite"
            arguments:
                requests:
                    -
                        name: "insertOne"
                        arguments:
                            document: { _id: 3, x: 33 }
                    -
                        name: "insertOne"
                        arguments:
                            document: { _id: 4, x: 44 }
                options: { ordered: true }
        outcome:
            result:
                deletedCount: 0
                insertedCount: 2
                insertedIds: { 0: 3, 1: 4 }
                matchedCount: 0
                modifiedCount: 0
                upsertedCount: 0
                upsertedIds: {}
            collection:
                data:
                    - {_id: 1, x: 11 }
                    - {_id: 2, x: 22 }
                    - {_id: 3, x: 33 }
                    - {_id: 4, x: 44 }
    -
        description: "BulkWrite with replaceOne operations"
        operation:
            name: "bulkWrite"
            arguments:
                # Note: as in the "ReplaceOne when many documents match" test in
                # replaceOne.yml, we omit a replaceOne operation that might
                # match multiple documents as that would hinder our ability to
                # assert the final state of the collection under test.
                requests:
                    -
                        # does not match an existing document
                        name: "replaceOne"
                        arguments:
                            filter: { _id: 3 }
                            replacement: { x: 33 }
                    -
                        # modifies the matched document
                        name: "replaceOne"
                        arguments:
                            filter: { _id: 1 }
                            replacement: { x: 12 }
                    -
                        # does not match an existing document and upserts
                        name: "replaceOne"
                        arguments:
                            filter: { _id: 3 }
                            replacement: { x: 33 }
                            upsert: true
                options: { ordered: true }
        outcome:
            result:
                deletedCount: 0
                insertedCount: 0
                insertedIds: {}
                matchedCount: 1
                modifiedCount: 1
                upsertedCount: 1
                upsertedIds: { 2: 3 }
            collection:
                data:
                    - {_id: 1, x: 12 }
                    - {_id: 2, x: 22 }
                    - {_id: 3, x: 33 }
    -
        description: "BulkWrite with updateOne operations"
        operation:
            name: "bulkWrite"
            arguments:
                # Note: as in the "UpdateOne when many documents match" test in
                # updateOne.yml, we omit an updateOne operation that might match
                # multiple documents as that would hinder our ability to assert
                # the final state of the collection under test.
                requests:
                    -
                        # does not match an existing document
                        name: "updateOne"
                        arguments:
                            filter: { _id: 0 }
                            update: { $set: { x: 0 } }
                    -
                        # does not modify the matched document
                        name: "updateOne"
                        arguments:
                            filter: { _id: 1 }
                            update: { $set: { x: 11 } }
                    -
                        # modifies the matched document
                        name: "updateOne"
                        arguments:
                            filter: { _id: 2 }
                            update: { $inc: { x: 1 } }
                    -
                        # does not match an existing document and upserts
                        name: "updateOne"
                        arguments:
                            filter: { _id: 3 }
                            update: { $set: { x: 33 } }
                            upsert: true
                options: { ordered: true }
        outcome:
            result:
                deletedCount: 0
                insertedCount: 0
                insertedIds: {}
                matchedCount: 2
                modifiedCount: 1
                upsertedCount: 1
                upsertedIds: { 3: 3 }
            collection:
                data:
                    - {_id: 1, x: 11 }
                    - {_id: 2, x: 23 }
                    - {_id: 3, x: 33 }
    -
        description: "BulkWrite with updateMany operations"
        operation:
            name: "bulkWrite"
            arguments:
                requests:
                    -
                        # does not match any existing documents
                        name: "updateMany"
                        arguments:
                            filter: { x: { $lt: 11 } }
                            update: { $set: { x: 0 } }
                    -
                        # does not modify the matched documents
                        name: "updateMany"
                        arguments:
                            filter: { x: { $lte: 22 } }
                            update: { $unset: { y: 1 } }
                    -
                        # modifies the matched documents
                        name: "updateMany"
                        arguments:
                            filter: { x: { $lte: 22 } }
                            update: { $inc: { x: 1 } }
                    -
                        # does not match any existing documents and upserts
                        name: "updateMany"
                        arguments:
                            filter: { _id: 3 }
                            update: { $set: { x: 33 } }
                            upsert: true
                options: { ordered: true }
        outcome:
            result:
                deletedCount: 0
                insertedCount: 0
                insertedIds: {}
                matchedCount: 4
                modifiedCount: 2
                upsertedCount: 1
                upsertedIds: { 3: 3 }
            collection:
                data:
                    - {_id: 1, x: 12 }
                    - {_id: 2, x: 23 }
                    - {_id: 3, x: 33 }
    -
        description: "BulkWrite with mixed ordered operations"
        operation:
            name: "bulkWrite"
            arguments:
                requests:
                    -
                        name: "insertOne"
                        arguments:
                            document: { _id: 3, x: 33 }
                    -
                        name: "updateOne"
                        arguments:
                            filter: { _id: 2 }
                            update: { $inc: { x: 1 } }
                    -
                        name: "updateMany"
                        arguments:
                            filter: { _id: { $gt: 1 } }
                            update: { $inc: { x: 1 } }
                    -
                        name: "insertOne"
                        arguments:
                            document: { _id: 4, x: 44 }
                    -
                        name: "deleteMany"
                        arguments:
                            filter: { x: { $nin: [ 24, 34 ] } }
                    -
                        name: "replaceOne"
                        arguments:
                            filter: { _id: 4 }
                            replacement: { _id: 4, x: 44 }
                            upsert: true
                options: { ordered: true }
        outcome:
            result:
                deletedCount: 2
                insertedCount: 2
                insertedIds: { 0: 3, 3: 4 }
                matchedCount: 3
                modifiedCount: 3
                upsertedCount: 1
                upsertedIds: { 5: 4 }
            collection:
                data:
                    - {_id: 2, x: 24 }
                    - {_id: 3, x: 34 }
                    - {_id: 4, x: 44 }
    -
        description: "BulkWrite with mixed unordered operations"
        operation:
            name: "bulkWrite"
            arguments:
                # We omit inserting multiple documents and updating documents
                # that may not exist at the start of this test as we cannot
                # assume the order in which the operations will execute.
                requests:
                    -
                        name: "replaceOne"
                        arguments:
                            filter: { _id: 3 }
                            replacement: { _id: 3, x: 33 }
                            upsert: true
                    -
                        name: "deleteOne"
                        arguments:
                            filter: { _id: 1 }
                    -
                        name: "updateOne"
                        arguments:
                            filter: { _id: 2 }
                            update: { $inc: { x: 1 } }
                options: { ordered: false }
        outcome:
            result:
                deletedCount: 1
                insertedCount: 0
                insertedIds: {}
                matchedCount: 1
                modifiedCount: 1
                upsertedCount: 1
                upsertedIds: { 0: 3 }
            collection:
                data:
                    - {_id: 2, x: 23 }
                    - {_id: 3, x: 33 }
    -
        description: "BulkWrite continue-on-error behavior with unordered (preexisting duplicate key)"
        operation:
            name: "bulkWrite"
            arguments:
                requests:
                    -
                        name: "insertOne"
                        arguments:
                            document: { _id: 2, x: 22 }
                    -
                        name: "insertOne"
                        arguments:
                            document: { _id: 3, x: 33 }
                    -
                        name: "insertOne"
                        arguments:
                            document: { _id: 4, x: 44 }
                options: { ordered: false }
        outcome:
            error: true
            result:
                deletedCount: 0
                insertedCount: 2
                # Since the map of insertedIds is generated before execution it
                # could indicate inserts that did not actually succeed. We omit
                # this field rather than expect drivers to provide an accurate
                # map filtered by write errors.
                matchedCount: 0
                modifiedCount: 0
                upsertedCount: 0
                upsertedIds: { }
            collection:
                data:
                    - { _id: 1, x: 11 }
                    - { _id: 2, x: 22 }
                    - { _id: 3, x: 33 }
                    - { _id: 4, x: 44 }
    -
        description: "BulkWrite continue-on-error behavior with unordered (duplicate key in requests)"
        operation:
            name: "bulkWrite"
            arguments:
                requests:
                    -
                        name: "insertOne"
                        arguments:
                            document: { _id: 3, x: 33 }
                    -
                        name: "insertOne"
                        arguments:
                            document: { _id: 3, x: 33 }
                    -
                        name: "insertOne"
                        arguments:
                            document: { _id: 4, x: 44 }
                options: { ordered: false }
        outcome:
            error: true
            result:
                deletedCount: 0
                insertedCount: 2
                # Since the map of insertedIds is generated before execution it
                # could indicate inserts that did not actually succeed. We omit
                # this field rather than expect drivers to provide an accurate
                # map filtered by write errors.
                matchedCount: 0
                modifiedCount: 0
                upsertedCount: 0
                upsertedIds: { }
            collection:
                data:
                    - { _id: 1, x: 11 }
                    - { _id: 2, x: 22 }
                    - { _id: 3, x: 33 }
                    - { _id: 4, x: 44 }