{
  "collection_name": "test",
  "database_name": "change-stream-tests",
  "collection2_name": "test2",
  "database2_name": "change-stream-tests-2",
  "tests": [
    {
      "description": "$changeStream must be the first stage in a change stream pipeline sent to the server",
      "minServerVersion": "3.6.0",
      "target": "collection",
      "topology": [
        "replicaset"
      ],
      "changeStreamPipeline": [],
      "changeStreamOptions": {},
      "operations": [
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "x": 1
            }
          }
        }
      ],
      "expectations": [
        {
          "command_started_event": {
            "command": {
              "aggregate": "test",
              "cursor": {},
              "pipeline": [
                {
                  "$changeStream": {
                    "fullDocument": "default"
                  }
                }
              ]
            },
            "command_name": "aggregate",
            "database_name": "change-stream-tests"
          }
        }
      ],
      "result": {
        "success": [
          {
            "_id": "42",
            "documentKey": "42",
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "fullDocument": {
              "x": {
                "$numberInt": "1"
              }
            }
          }
        ]
      }
    },
    {
      "description": "The server returns change stream responses in the specified server response format",
      "minServerVersion": "3.6.0",
      "target": "collection",
      "topology": [
        "replicaset"
      ],
      "changeStreamPipeline": [],
      "changeStreamOptions": {},
      "operations": [
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "x": 1
            }
          }
        }
      ],
      "expectations": [],
      "result": {
        "success": [
          {
            "_id": "42",
            "documentKey": "42",
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "fullDocument": {
              "x": {
                "$numberInt": "1"
              }
            }
          }
        ]
      }
    },
    {
      "description": "Executing a watch helper on a Collection results in notifications for changes to the specified collection",
      "minServerVersion": "3.6.0",
      "target": "collection",
      "topology": [
        "replicaset"
      ],
      "changeStreamPipeline": [],
      "changeStreamOptions": {},
      "operations": [
        {
          "database": "change-stream-tests",
          "collection": "test2",
          "name": "insertOne",
          "arguments": {
            "document": {
              "x": 1
            }
          }
        },
        {
          "database": "change-stream-tests-2",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "y": 2
            }
          }
        },
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "z": 3
            }
          }
        }
      ],
      "expectations": [
        {
          "command_started_event": {
            "command": {
              "aggregate": "test",
              "cursor": {},
              "pipeline": [
                {
                  "$changeStream": {
                    "fullDocument": "default"
                  }
                }
              ]
            },
            "command_name": "aggregate",
            "database_name": "change-stream-tests"
          }
        }
      ],
      "result": {
        "success": [
          {
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "fullDocument": {
              "z": {
                "$numberInt": "3"
              }
            }
          }
        ]
      }
    },
    {
      "description": "Change Stream should allow valid aggregate pipeline stages",
      "minServerVersion": "3.6.0",
      "target": "collection",
      "topology": [
        "replicaset"
      ],
      "changeStreamPipeline": [
        {
          "$match": {
            "fullDocument.z": 3
          }
        }
      ],
      "changeStreamOptions": {},
      "operations": [
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "y": 2
            }
          }
        },
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "z": 3
            }
          }
        }
      ],
      "expectations": [
        {
          "command_started_event": {
            "command": {
              "aggregate": "test",
              "cursor": {},
              "pipeline": [
                {
                  "$changeStream": {
                    "fullDocument": "default"
                  }
                },
                {
                  "$match": {
                    "fullDocument.z": {
                      "$numberInt": "3"
                    }
                  }
                }
              ]
            },
            "command_name": "aggregate",
            "database_name": "change-stream-tests"
          }
        }
      ],
      "result": {
        "success": [
          {
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "fullDocument": {
              "z": {
                "$numberInt": "3"
              }
            }
          }
        ]
      }
    },
    {
      "description": "Executing a watch helper on a Database results in notifications for changes to all collections in the specified database.",
      "minServerVersion": "3.8.0",
      "target": "database",
      "topology": [
        "replicaset"
      ],
      "changeStreamPipeline": [],
      "changeStreamOptions": {},
      "operations": [
        {
          "database": "change-stream-tests",
          "collection": "test2",
          "name": "insertOne",
          "arguments": {
            "document": {
              "x": 1
            }
          }
        },
        {
          "database": "change-stream-tests-2",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "y": 2
            }
          }
        },
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "z": 3
            }
          }
        }
      ],
      "expectations": [
        {
          "command_started_event": {
            "command": {
              "aggregate": {
                "$numberInt": "1"
              },
              "cursor": {},
              "pipeline": [
                {
                  "$changeStream": {
                    "fullDocument": "default"
                  }
                }
              ]
            },
            "command_name": "aggregate",
            "database_name": "change-stream-tests"
          }
        }
      ],
      "result": {
        "success": [
          {
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test2"
            },
            "fullDocument": {
              "x": {
                "$numberInt": "1"
              }
            }
          },
          {
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "fullDocument": {
              "z": {
                "$numberInt": "3"
              }
            }
          }
        ]
      }
    },
    {
      "description": "Executing a watch helper on a MongoClient results in notifications for changes to all collections in all databases in the cluster.",
      "minServerVersion": "3.8.0",
      "target": "client",
      "topology": [
        "replicaset"
      ],
      "changeStreamPipeline": [],
      "changeStreamOptions": {},
      "operations": [
        {
          "database": "change-stream-tests",
          "collection": "test2",
          "name": "insertOne",
          "arguments": {
            "document": {
              "x": 1
            }
          }
        },
        {
          "database": "change-stream-tests-2",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "y": 2
            }
          }
        },
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "z": 3
            }
          }
        }
      ],
      "expectations": [
        {
          "command_started_event": {
            "command": {
              "aggregate": {
                "$numberInt": "1"
              },
              "cursor": {},
              "pipeline": [
                {
                  "$changeStream": {
                    "fullDocument": "default",
                    "allChangesForCluster": true
                  }
                }
              ]
            },
            "command_name": "aggregate",
            "database_name": "admin"
          }
        }
      ],
      "result": {
        "success": [
          {
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test2"
            },
            "fullDocument": {
              "x": {
                "$numberInt": "1"
              }
            }
          },
          {
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests-2",
              "coll": "test"
            },
            "fullDocument": {
              "y": {
                "$numberInt": "2"
              }
            }
          },
          {
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "fullDocument": {
              "z": {
                "$numberInt": "3"
              }
            }
          }
        ]
      }
    },
    {
      "description": "Test insert, update, replace, and delete event types",
      "minServerVersion": "3.6.0",
      "target": "collection",
      "topology": [
        "replicaset"
      ],
      "changeStreamPipeline": [],
      "changeStreamOptions": {},
      "operations": [
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "x": 1
            }
          }
        },
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "updateOne",
          "arguments": {
            "filter": {
              "x": 1
            },
            "update": {
              "$set": {
                "x": 2
              }
            }
          }
        },
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "replaceOne",
          "arguments": {
            "filter": {
              "x": 2
            },
            "replacement": {
              "x": 3
            }
          }
        },
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "deleteOne",
          "arguments": {
            "filter": {
              "x": 3
            }
          }
        }
      ],
      "expectations": [
        {
          "command_started_event": {
            "command": {
              "aggregate": "test",
              "cursor": {},
              "pipeline": [
                {
                  "$changeStream": {
                    "fullDocument": "default"
                  }
                }
              ]
            },
            "command_name": "aggregate",
            "database_name": "change-stream-tests"
          }
        }
      ],
      "result": {
        "success": [
          {
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "fullDocument": {
              "x": {
                "$numberInt": "1"
              }
            }
          },
          {
            "operationType": "update",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "updateDescription": {
              "updatedFields": {
                "x": {
                  "$numberInt": "2"
                }
              }
            }
          },
          {
            "operationType": "replace",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "fullDocument": {
              "x": {
                "$numberInt": "3"
              }
            }
          },
          {
            "operationType": "delete",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            }
          }
        ]
      }
    },
    {
      "description": "Test rename and invalidate event types",
      "minServerVersion": "4.0.1",
      "target": "collection",
      "topology": [
        "replicaset"
      ],
      "changeStreamPipeline": [],
      "changeStreamOptions": {},
      "operations": [
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "rename",
          "arguments": {
            "to": "test2"
          }
        }
      ],
      "expectations": [
        {
          "command_started_event": {
            "command": {
              "aggregate": "test",
              "cursor": {},
              "pipeline": [
                {
                  "$changeStream": {
                    "fullDocument": "default"
                  }
                }
              ]
            },
            "command_name": "aggregate",
            "database_name": "change-stream-tests"
          }
        }
      ],
      "result": {
        "success": [
          {
            "operationType": "rename",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "to": {
              "db": "change-stream-tests",
              "coll": "test2"
            }
          },
          {
            "operationType": "invalidate"
          }
        ]
      }
    },
    {
      "description": "Test drop and invalidate event types",
      "minServerVersion": "4.0.1",
      "target": "collection",
      "topology": [
        "replicaset"
      ],
      "changeStreamPipeline": [],
      "changeStreamOptions": {},
      "operations": [
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "drop"
        }
      ],
      "expectations": [
        {
          "command_started_event": {
            "command": {
              "aggregate": "test",
              "cursor": {},
              "pipeline": [
                {
                  "$changeStream": {
                    "fullDocument": "default"
                  }
                }
              ]
            },
            "command_name": "aggregate",
            "database_name": "change-stream-tests"
          }
        }
      ],
      "result": {
        "success": [
          {
            "operationType": "drop",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            }
          },
          {
            "operationType": "invalidate"
          }
        ]
      }
    },
    {
      "description": "Test consecutive resume",
      "minServerVersion": "4.1.7",
      "target": "collection",
      "topology": [
        "replicaset"
      ],
      "changeStreamPipeline": [],
      "changeStreamOptions": {
        "batchSize": 1
      },
      "failPoint": {
        "configureFailPoint": "failCommand",
        "mode": {
          "times": 2
        },
        "data": {
          "failCommands": [
            "getMore"
          ],
          "closeConnection": true
        }
      },
      "operations": [
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "x": 1
            }
          }
        },
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "x": 2
            }
          }
        },
        {
          "database": "change-stream-tests",
          "collection": "test",
          "name": "insertOne",
          "arguments": {
            "document": {
              "x": 3
            }
          }
        }
      ],
      "expectations": [
        {
          "command_started_event": {
            "command": {
              "aggregate": "test",
              "cursor": {
                "batchSize": 1
              },
              "pipeline": [
                {
                  "$changeStream": {
                    "fullDocument": "default"
                  }
                }
              ]
            },
            "command_name": "aggregate",
            "database_name": "change-stream-tests"
          }
        }
      ],
      "result": {
        "success": [
          {
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "fullDocument": {
              "x": {
                "$numberInt": "1"
              }
            }
          },
          {
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "fullDocument": {
              "x": {
                "$numberInt": "2"
              }
            }
          },
          {
            "operationType": "insert",
            "ns": {
              "db": "change-stream-tests",
              "coll": "test"
            },
            "fullDocument": {
              "x": {
                "$numberInt": "3"
              }
            }
          }
        ]
      }
    }
  ]
}
