{
    "description": "MONGODB-OIDC authentication with retry disabled",
    "schemaVersion": "1.19",
    "runOnRequirements": [
        {
            "minServerVersion": "7.0",
            "auth": true,
            "authMechanism": "MONGODB-OIDC",
            "serverless": "forbid"
        }
    ],
    "createEntities": [
        {
            "client": {
                "id": "failPointClient",
                "useMultipleMongoses": false
            }
        },
        {
            "client": {
                "id": "client0",
                "uriOptions": {
                    "authMechanism": "MONGODB-OIDC",
                    "authMechanismProperties": {
                        "$$placeholder": 1
                    },
                    "retryReads": false,
                    "retryWrites": false,
                    "appName": "mongodb-oidc-no-retry"
                },
                "observeEvents": [
                    "commandStartedEvent",
                    "commandSucceededEvent",
                    "commandFailedEvent"
                ]
            }
        },
        {
            "database": {
                "id": "database0",
                "client": "client0",
                "databaseName": "test"
            }
        },
        {
            "collection": {
                "id": "collection0",
                "database": "database0",
                "collectionName": "collName"
            }
        }
    ],
    "initialData": [
        {
            "collectionName": "collName",
            "databaseName": "test",
            "documents": []
        }
    ],
    "tests": [
        {
            "description": "A read operation should succeed",
            "operations": [
                {
                    "name": "find",
                    "object": "collection0",
                    "arguments": {
                        "filter": {}
                    },
                    "expectResult": []
                }
            ],
            "expectEvents": [
                {
                    "client": "client0",
                    "events": [
                        {
                            "commandStartedEvent": {
                                "command": {
                                    "find": "collName",
                                    "filter": {}
                                }
                            }
                        },
                        {
                            "commandSucceededEvent": {
                                "commandName": "find"
                            }
                        }
                    ]
                }
            ]
        },
        {
            "description": "A write operation should succeed",
            "operations": [
                {
                    "name": "insertOne",
                    "object": "collection0",
                    "arguments": {
                        "document": {
                            "_id": 1,
                            "x": 1
                        }
                    }
                }
            ],
            "expectEvents": [
                {
                    "client": "client0",
                    "events": [
                        {
                            "commandStartedEvent": {
                                "command": {
                                    "insert": "collName",
                                    "documents": [
                                        {
                                            "_id": 1,
                                            "x": 1
                                        }
                                    ]
                                }
                            }
                        },
                        {
                            "commandSucceededEvent": {
                                "commandName": "insert"
                            }
                        }
                    ]
                }
            ]
        },
        {
            "description": "Read commands should reauthenticate and retry when a ReauthenticationRequired error happens",
            "operations": [
                {
                    "name": "failPoint",
                    "object": "testRunner",
                    "arguments": {
                        "client": "failPointClient",
                        "failPoint": {
                            "configureFailPoint": "failCommand",
                            "mode": {
                                "times": 1
                            },
                            "data": {
                                "failCommands": [
                                    "find"
                                ],
                                "errorCode": 391,
                                "appName": "mongodb-oidc-no-retry"
                            }
                        }
                    }
                },
                {
                    "name": "find",
                    "object": "collection0",
                    "arguments": {
                        "filter": {}
                    },
                    "expectResult": []
                }
            ],
            "expectEvents": [
                {
                    "client": "client0",
                    "events": [
                        {
                            "commandStartedEvent": {
                                "command": {
                                    "find": "collName",
                                    "filter": {}
                                }
                            }
                        },
                        {
                            "commandFailedEvent": {
                                "commandName": "find"
                            }
                        },
                        {
                            "commandStartedEvent": {
                                "command": {
                                    "find": "collName",
                                    "filter": {}
                                }
                            }
                        },
                        {
                            "commandSucceededEvent": {
                                "commandName": "find"
                            }
                        }
                    ]
                }
            ]
        },
        {
            "description": "Write commands should reauthenticate and retry when a ReauthenticationRequired error happens",
            "operations": [
                {
                    "name": "failPoint",
                    "object": "testRunner",
                    "arguments": {
                        "client": "failPointClient",
                        "failPoint": {
                            "configureFailPoint": "failCommand",
                            "mode": {
                                "times": 1
                            },
                            "data": {
                                "failCommands": [
                                    "insert"
                                ],
                                "errorCode": 391,
                                "appName": "mongodb-oidc-no-retry"
                            }
                        }
                    }
                },
                {
                    "name": "insertOne",
                    "object": "collection0",
                    "arguments": {
                        "document": {
                            "_id": 1,
                            "x": 1
                        }
                    }
                }
            ],
            "expectEvents": [
                {
                    "client": "client0",
                    "events": [
                        {
                            "commandStartedEvent": {
                                "command": {
                                    "insert": "collName",
                                    "documents": [
                                        {
                                            "_id": 1,
                                            "x": 1
                                        }
                                    ]
                                }
                            }
                        },
                        {
                            "commandFailedEvent": {
                                "commandName": "insert"
                            }
                        },
                        {
                            "commandStartedEvent": {
                                "command": {
                                    "insert": "collName",
                                    "documents": [
                                        {
                                            "_id": 1,
                                            "x": 1
                                        }
                                    ]
                                }
                            }
                        },
                        {
                            "commandSucceededEvent": {
                                "commandName": "insert"
                            }
                        }
                    ]
                }
            ]
        },
        {
            "description": "Handshake with cached token should use speculative authentication",
            "operations": [
                {
                    "name": "failPoint",
                    "object": "testRunner",
                    "arguments": {
                        "client": "failPointClient",
                        "failPoint": {
                            "configureFailPoint": "failCommand",
                            "mode": {
                                "times": 1
                            },
                            "data": {
                                "failCommands": [
                                    "insert"
                                ],
                                "closeConnection": true,
                                "appName": "mongodb-oidc-no-retry"
                            }
                        }
                    }
                },
                {
                    "name": "insertOne",
                    "object": "collection0",
                    "arguments": {
                        "document": {
                            "_id": 1,
                            "x": 1
                        }
                    },
                    "expectError": {
                        "isClientError": true
                    }
                },
                {
                    "name": "failPoint",
                    "object": "testRunner",
                    "arguments": {
                        "client": "failPointClient",
                        "failPoint": {
                            "configureFailPoint": "failCommand",
                            "mode": {
                                "times": 1
                            },
                            "data": {
                                "failCommands": [
                                    "saslStart"
                                ],
                                "errorCode": 18,
                                "appName": "mongodb-oidc-no-retry"
                            }
                        }
                    }
                },
                {
                    "name": "insertOne",
                    "object": "collection0",
                    "arguments": {
                        "document": {
                            "_id": 1,
                            "x": 1
                        }
                    }
                }
            ],
            "expectEvents": [
                {
                    "client": "client0",
                    "events": [
                        {
                            "commandStartedEvent": {
                                "command": {
                                    "insert": "collName",
                                    "documents": [
                                        {
                                            "_id": 1,
                                            "x": 1
                                        }
                                    ]
                                }
                            }
                        },
                        {
                            "commandFailedEvent": {
                                "commandName": "insert"
                            }
                        },
                        {
                            "commandStartedEvent": {
                                "command": {
                                    "insert": "collName",
                                    "documents": [
                                        {
                                            "_id": 1,
                                            "x": 1
                                        }
                                    ]
                                }
                            }
                        },
                        {
                            "commandSucceededEvent": {
                                "commandName": "insert"
                            }
                        }
                    ]
                }
            ]
        },
        {
            "description": "Handshake without cached token should not use speculative authentication",
            "operations": [
                {
                    "name": "failPoint",
                    "object": "testRunner",
                    "arguments": {
                        "client": "failPointClient",
                        "failPoint": {
                            "configureFailPoint": "failCommand",
                            "mode": {
                                "times": 1
                            },
                            "data": {
                                "failCommands": [
                                    "saslStart"
                                ],
                                "errorCode": 18,
                                "appName": "mongodb-oidc-no-retry"
                            }
                        }
                    }
                },
                {
                    "name": "insertOne",
                    "object": "collection0",
                    "arguments": {
                        "document": {
                            "_id": 1,
                            "x": 1
                        }
                    },
                    "expectError": {
                        "errorCode": 18
                    }
                }
            ]
        }
    ]
}
