|
2 | 2 |
|
3 | 3 | namespace MongoDB\Tests\UnifiedSpecTests;
|
4 | 4 |
|
| 5 | +use MongoDB\ChangeStream; |
| 6 | +use MongoDB\Client; |
| 7 | +use MongoDB\Collection; |
| 8 | +use MongoDB\Database; |
| 9 | +use MongoDB\Driver\Cursor; |
5 | 10 | use MongoDB\Driver\ReadConcern;
|
6 | 11 | use MongoDB\Driver\ReadPreference;
|
| 12 | +use MongoDB\Driver\Session; |
7 | 13 | use MongoDB\Driver\WriteConcern;
|
| 14 | +use MongoDB\GridFS\Bucket; |
8 | 15 | use stdClass;
|
9 | 16 |
|
10 | 17 | use function array_diff_key;
|
|
26 | 33 |
|
27 | 34 | final class Util
|
28 | 35 | {
|
| 36 | + /** |
| 37 | + * Array to fill, which contains the schema of allowed attributes for operations. |
| 38 | + */ |
| 39 | + private static $args = [ |
| 40 | + Operation::OBJECT_TEST_RUNNER => [ |
| 41 | + 'assertCollectionExists' => ['databaseName', 'collectionName'], |
| 42 | + 'assertCollectionNotExists' => ['databaseName', 'collectionName'], |
| 43 | + 'assertIndexExists' => ['databaseName', 'collectionName', 'indexName'], |
| 44 | + 'assertIndexNotExists' => ['databaseName', 'collectionName', 'indexName'], |
| 45 | + 'assertSameLsidOnLastTwoCommands' => ['client'], |
| 46 | + 'assertDifferentLsidOnLastTwoCommands' => ['client'], |
| 47 | + 'assertNumberConnectionsCheckedOut' => ['connections'], |
| 48 | + 'assertSessionDirty' => ['session'], |
| 49 | + 'assertSessionNotDirty' => ['session'], |
| 50 | + 'assertSessionPinned' => ['session'], |
| 51 | + 'assertSessionTransactionState' => ['session', 'state'], |
| 52 | + 'assertSessionUnpinned' => ['session'], |
| 53 | + 'failPoint' => ['client', 'failPoint'], |
| 54 | + 'targetedFailPoint' => ['session', 'failPoint'], |
| 55 | + 'loop' => ['operations', 'storeErrorsAsEntity', 'storeFailuresAsEntity', 'storeSuccessesAsEntity', 'storeIterationsAsEntity'], |
| 56 | + ], |
| 57 | + Client::class => [ |
| 58 | + 'createChangeStream' => ['pipeline', 'session', 'fullDocument', 'resumeAfter', 'startAfter', 'startAtOperationTime', 'batchSize', 'collation', 'maxAwaitTimeMS'], |
| 59 | + 'listDatabaseNames' => ['authorizedDatabases', 'filter', 'maxTimeMS', 'session'], |
| 60 | + 'listDatabases' => ['authorizedDatabases', 'filter', 'maxTimeMS', 'session'], |
| 61 | + ], |
| 62 | + Database::class => [ |
| 63 | + 'aggregate' => ['pipeline', 'session', 'useCursor', 'allowDiskUse', 'batchSize', 'bypassDocumentValidation', 'collation', 'comment', 'explain', 'hint', 'let', 'maxAwaitTimeMS', 'maxTimeMS'], |
| 64 | + 'createChangeStream' => ['pipeline', 'session', 'fullDocument', 'resumeAfter', 'startAfter', 'startAtOperationTime', 'batchSize', 'collation', 'maxAwaitTimeMS'], |
| 65 | + 'createCollection' => ['collection', 'session', 'autoIndexId', 'capped', 'collation', 'expireAfterSeconds', 'flags', 'indexOptionDefaults', 'max', 'maxTimeMS', 'size', 'storageEngine', 'timeseries', 'validationAction', 'validationLevel', 'validator'], |
| 66 | + 'dropCollection' => ['collection', 'session'], |
| 67 | + 'listCollectionNames' => ['authorizedCollections', 'filter', 'maxTimeMS', 'session'], |
| 68 | + 'listCollections' => ['authorizedCollections', 'filter', 'maxTimeMS', 'session'], |
| 69 | + // Note: commandName is not used by PHP |
| 70 | + 'runCommand' => ['command', 'session', 'commandName'], |
| 71 | + ], |
| 72 | + Collection::class => [ |
| 73 | + 'aggregate' => ['pipeline', 'session', 'useCursor', 'allowDiskUse', 'batchSize', 'bypassDocumentValidation', 'collation', 'comment', 'explain', 'hint', 'let', 'maxAwaitTimeMS', 'maxTimeMS'], |
| 74 | + 'bulkWrite' => ['requests', 'session', 'ordered', 'bypassDocumentValidation'], |
| 75 | + 'createChangeStream' => ['pipeline', 'session', 'fullDocument', 'resumeAfter', 'startAfter', 'startAtOperationTime', 'batchSize', 'collation', 'maxAwaitTimeMS'], |
| 76 | + 'createFindCursor' => ['filter', 'session', 'allowDiskUse', 'allowPartialResults', 'batchSize', 'collation', 'comment', 'cursorType', 'hint', 'limit', 'max', 'maxAwaitTimeMS', 'maxScan', 'maxTimeMS', 'min', 'modifiers', 'noCursorTimeout', 'oplogReplay', 'projection', 'returnKey', 'showRecordId', 'skip', 'snapshot', 'sort'], |
| 77 | + 'createIndex' => ['keys', 'commitQuorum', 'maxTimeMS', 'name', 'session'], |
| 78 | + 'dropIndex' => ['name', 'session', 'maxTimeMS'], |
| 79 | + 'count' => ['filter', 'session', 'collation', 'hint', 'limit', 'maxTimeMS', 'skip'], |
| 80 | + 'countDocuments' => ['filter', 'session', 'limit', 'skip', 'collation', 'hint', 'maxTimeMS'], |
| 81 | + 'estimatedDocumentCount' => ['session', 'maxTimeMS'], |
| 82 | + 'deleteMany' => ['filter', 'session', 'collation', 'hint'], |
| 83 | + 'deleteOne' => ['filter', 'session', 'collation', 'hint'], |
| 84 | + 'findOneAndDelete' => ['filter', 'session', 'projection', 'arrayFilters', 'bypassDocumentValidation', 'collation', 'hint', 'maxTimeMS', 'new', 'sort', 'update', 'upsert'], |
| 85 | + 'distinct' => ['fieldName', 'filter', 'session', 'collation', 'maxTimeMS'], |
| 86 | + 'drop' => ['session'], |
| 87 | + 'find' => ['filter', 'session', 'allowDiskUse', 'allowPartialResults', 'batchSize', 'collation', 'comment', 'cursorType', 'hint', 'limit', 'max', 'maxAwaitTimeMS', 'maxScan', 'maxTimeMS', 'min', 'modifiers', 'noCursorTimeout', 'oplogReplay', 'projection', 'returnKey', 'showRecordId', 'skip', 'snapshot', 'sort'], |
| 88 | + 'findOne' => ['filter', 'session', 'allowDiskUse', 'allowPartialResults', 'batchSize', 'collation', 'comment', 'cursorType', 'hint', 'max', 'maxAwaitTimeMS', 'maxScan', 'maxTimeMS', 'min', 'modifiers', 'noCursorTimeout', 'oplogReplay', 'projection', 'returnKey', 'showRecordId', 'skip', 'snapshot', 'sort'], |
| 89 | + 'findOneAndReplace' => ['returnDocument', 'filter', 'replacement', 'session', 'projection', 'returnDocument', 'upsert', 'arrayFilters', 'bypassDocumentValidation', 'collation', 'hint', 'maxTimeMS', 'new', 'remove', 'sort'], |
| 90 | + 'replaceOne' => ['filter', 'replacement', 'session', 'upsert', 'arrayFilters', 'bypassDocumentValidation', 'collation', 'hint'], |
| 91 | + 'findOneAndUpdate' => ['returnDocument', 'filter', 'update', 'session', 'upsert', 'projection', 'remove', 'arrayFilters', 'bypassDocumentValidation', 'collation', 'hint', 'maxTimeMS', 'sort'], |
| 92 | + 'updateMany' => ['filter', 'update', 'session', 'upsert', 'arrayFilters', 'bypassDocumentValidation', 'collation', 'hint'], |
| 93 | + 'updateOne' => ['filter', 'update', 'session', 'upsert', 'arrayFilters', 'bypassDocumentValidation', 'collation', 'hint'], |
| 94 | + 'insertMany' => ['options', 'documents', 'session', 'ordered', 'bypassDocumentValidation'], |
| 95 | + 'insertOne' => ['document', 'session', 'bypassDocumentValidation'], |
| 96 | + 'listIndexes' => ['session', 'maxTimeMS'], |
| 97 | + 'mapReduce' => ['map', 'reduce', 'out', 'session', 'bypassDocumentValidation', 'collation', 'finalize', 'jsMode', 'limit', 'maxTimeMS', 'query', 'scope', 'sort', 'verbose'], |
| 98 | + ], |
| 99 | + ChangeStream::class => [ |
| 100 | + 'iterateUntilDocumentOrError' => [], |
| 101 | + ], |
| 102 | + Cursor::class => [ |
| 103 | + 'close' => [], |
| 104 | + 'iterateUntilDocumentOrError' => [], |
| 105 | + ], |
| 106 | + Session::class => [ |
| 107 | + 'abortTransaction' => [], |
| 108 | + 'commitTransaction' => [], |
| 109 | + 'endSession' => [], |
| 110 | + 'startTransaction' => ['maxCommitTimeMS', 'readConcern', 'readPreference', 'writeConcern'], |
| 111 | + 'withTransaction' => ['callback', 'maxCommitTimeMS', 'readConcern', 'readPreference', 'writeConcern'], |
| 112 | + ], |
| 113 | + Bucket::class => [ |
| 114 | + 'delete' => ['id'], |
| 115 | + 'downloadByName' => ['filename', 'revision'], |
| 116 | + 'download' => ['id'], |
| 117 | + 'uploadWithId' => ['id', 'filename', 'source', 'chunkSizeBytes', 'disableMD5', 'contentType', 'metadata'], |
| 118 | + 'upload' => ['filename', 'source', 'chunkSizeBytes', 'disableMD5', 'contentType', 'metadata'], |
| 119 | + ], |
| 120 | + ]; |
| 121 | + |
29 | 122 | public static function assertHasOnlyKeys($arrayOrObject, array $keys): void
|
30 | 123 | {
|
31 | 124 | assertThat($arrayOrObject, logicalOr(isType('array'), isInstanceOf(stdClass::class)));
|
32 | 125 | $diff = array_diff_key((array) $arrayOrObject, array_fill_keys($keys, 1));
|
33 | 126 | assertEmpty($diff, 'Unsupported keys: ' . implode(',', array_keys($diff)));
|
34 | 127 | }
|
35 | 128 |
|
| 129 | + public static function assertArgumentsBySchema(string $executingObjectName, string $operation, array $args): void |
| 130 | + { |
| 131 | + self::assertHasOnlyKeys($args, self::$args[$executingObjectName][$operation]); |
| 132 | + } |
| 133 | + |
36 | 134 | public static function createReadConcern(stdClass $o): ReadConcern
|
37 | 135 | {
|
38 | 136 | self::assertHasOnlyKeys($o, ['level']);
|
|
0 commit comments