2025-03-17 20:58:26 +01:00

242 lines
7.4 KiB
YAML

description: "poc-change-streams"
schemaVersion: "1.4"
runOnRequirements:
- serverless: forbid
createEntities:
# Entities for creating changeStreams
- client:
id: &client0 client0
useMultipleMongoses: false
observeEvents: [ commandStartedEvent ]
# Original tests do not observe getMore commands but only because event
# assertions ignore extra events. killCursors is explicitly ignored.
ignoreCommandMonitoringEvents: [ getMore, killCursors ]
- database:
id: &database0 database0
client: *client0
databaseName: &database0Name change-stream-tests
- collection:
id: &collection0 collection0
database: *database0
collectionName: &collection0Name test
# Entities for executing insert operations
- client:
id: &client1 client1
useMultipleMongoses: false
- database:
id: &database1 database1
client: *client1
databaseName: &database1Name change-stream-tests
- database:
id: &database2 database2
client: *client1
databaseName: &database2Name change-stream-tests-2
- collection:
id: &collection1 collection1
database: *database1
collectionName: &collection1Name test
- collection:
id: &collection2 collection2
database: *database1
collectionName: &collection2Name test2
- collection:
id: &collection3 collection3
database: *database2
collectionName: &collection3Name test
initialData:
- collectionName: *collection1Name
databaseName: *database1Name
documents: []
- collectionName: *collection2Name
databaseName: *database1Name
documents: []
- collectionName: *collection3Name
databaseName: *database2Name
documents: []
tests:
- description: "saveResultAsEntity is optional for createChangeStream"
runOnRequirements:
- minServerVersion: "3.8.0"
topologies: [ replicaset ]
operations:
- name: createChangeStream
object: *client0
arguments:
pipeline: []
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
aggregate: 1
commandName: aggregate
databaseName: admin
- description: "Executing a watch helper on a MongoClient results in notifications for changes to all collections in all databases in the cluster."
runOnRequirements:
- minServerVersion: "3.8.0"
topologies: [ replicaset ]
operations:
- name: createChangeStream
object: *client0
arguments:
pipeline: []
saveResultAsEntity: &changeStream0 changeStream0
- name: insertOne
object: *collection2
arguments:
document: { x: 1 }
- name: insertOne
object: *collection3
arguments:
document: { y: 1 }
- name: insertOne
object: *collection1
arguments:
document: { z: 1 }
- name: iterateUntilDocumentOrError
object: *changeStream0
expectResult:
operationType: insert
ns:
db: *database1Name
coll: *collection2Name
fullDocument:
_id: { $$type: objectId }
x: 1
- name: iterateUntilDocumentOrError
object: *changeStream0
expectResult:
operationType: insert
ns:
db: *database2Name
coll: *collection3Name
fullDocument:
# Original tests did not include _id, but matching now only permits
# extra keys for root-level documents.
_id: { $$type: objectId }
y: 1
- name: iterateUntilDocumentOrError
object: *changeStream0
expectResult:
operationType: insert
ns:
db: *database1Name
coll: *collection1Name
fullDocument:
_id: { $$type: objectId }
z: 1
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
aggregate: 1
cursor: {}
pipeline:
- $changeStream:
allChangesForCluster: true
# Some drivers may send a default value for fullDocument
# or omit it entirely (see: SPEC-1350).
fullDocument: { $$unsetOrMatches: default }
commandName: aggregate
databaseName: admin
- description: "Test consecutive resume"
runOnRequirements:
- minServerVersion: "4.1.7"
topologies: [ replicaset ]
operations:
- name: failPoint
object: testRunner
arguments:
client: *client0
failPoint:
configureFailPoint: failCommand
mode: { times: 2 }
data:
failCommands: [ getMore ]
closeConnection: true
- name: createChangeStream
object: *collection0
arguments:
batchSize: 1
pipeline: []
saveResultAsEntity: *changeStream0
- name: insertOne
object: *collection1
arguments:
document: { x: 1 }
- name: insertOne
object: *collection1
arguments:
document: { x: 2 }
- name: insertOne
object: *collection1
arguments:
document: { x: 3 }
- name: iterateUntilDocumentOrError
object: *changeStream0
expectResult:
operationType: insert
ns:
db: *database1Name
coll: *collection1Name
fullDocument:
_id: { $$type: objectId }
x: 1
- name: iterateUntilDocumentOrError
object: *changeStream0
expectResult:
operationType: insert
ns:
db: *database1Name
coll: *collection1Name
fullDocument:
_id: { $$type: objectId }
x: 2
- name: iterateUntilDocumentOrError
object: *changeStream0
expectResult:
operationType: insert
ns:
db: *database1Name
coll: *collection1Name
fullDocument:
_id: { $$type: objectId }
x: 3
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
aggregate: *collection1Name
cursor: { batchSize: 1 }
pipeline:
- $changeStream:
fullDocument: { $$unsetOrMatches: default }
commandName: aggregate
databaseName: *database1Name
# The original test only asserted the first command, since expected
# events were only an ordered subset. This file does ignore getMore
# commands but we must expect the subsequent aggregate commands, since
# each failed getMore will resume. While doing so we can also assert
# that those commands include a resume token.
- &resumingAggregate
commandStartedEvent:
command:
aggregate: *collection1Name
cursor: { batchSize: 1 }
pipeline:
- $changeStream:
fullDocument: { $$unsetOrMatches: default }
resumeAfter: { $$exists: true }
commandName: aggregate
databaseName: *database0Name
- *resumingAggregate