summaryrefslogtreecommitdiff
path: root/jstests/core/views/views_creation.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/views/views_creation.js')
-rw-r--r--jstests/core/views/views_creation.js214
1 files changed, 106 insertions, 108 deletions
diff --git a/jstests/core/views/views_creation.js b/jstests/core/views/views_creation.js
index 2312b78e646..1765b9c4182 100644
--- a/jstests/core/views/views_creation.js
+++ b/jstests/core/views/views_creation.js
@@ -4,112 +4,110 @@
// ]
(function() {
- "use strict";
-
- // For arrayEq.
- load("jstests/aggregation/extras/utils.js");
-
- const viewsDBName = "views_creation";
-
- let viewsDB = db.getSiblingDB(viewsDBName);
- assert.commandWorked(viewsDB.dropDatabase());
-
- let collNames = viewsDB.getCollectionNames();
- assert.eq(0, collNames.length, tojson(collNames));
-
- // You cannot create a view that starts with 'system.'.
- assert.commandFailedWithCode(
- viewsDB.runCommand({create: "system.special", viewOn: "collection"}),
- ErrorCodes.InvalidNamespace,
- "Created an illegal view named 'system.views'");
-
- // Collections that start with 'system.' that are not special to MongoDB fail with a different
- // error code.
- assert.commandFailedWithCode(viewsDB.runCommand({create: "system.foo", viewOn: "collection"}),
- ErrorCodes.InvalidNamespace,
- "Created an illegal view named 'system.foo'");
-
- // Create a collection for test purposes.
- assert.commandWorked(viewsDB.runCommand({create: "collection"}));
-
- let pipe = [{$match: {}}];
-
- // Create a "regular" view on a collection.
- assert.commandWorked(
- viewsDB.runCommand({create: "view", viewOn: "collection", pipeline: pipe}));
-
- collNames = viewsDB.getCollectionNames().filter((function(coll) {
- return !coll.startsWith("system.");
- }));
- assert.eq(2, collNames.length, tojson(collNames));
- let res = viewsDB.runCommand({listCollections: 1, filter: {type: "view"}});
- assert.commandWorked(res);
-
- // Ensure that the output of listCollections has all the expected options for a view.
- let expectedListCollectionsOutput = [{
- name: "view",
- type: "view",
- options: {viewOn: "collection", pipeline: pipe},
- info: {readOnly: true}
- }];
- assert(arrayEq(res.cursor.firstBatch, expectedListCollectionsOutput), tojson({
- expectedListCollectionsOutput: expectedListCollectionsOutput,
- got: res.cursor.firstBatch
- }));
-
- // Create a view on a non-existent collection.
- assert.commandWorked(
- viewsDB.runCommand({create: "viewOnNonexistent", viewOn: "nonexistent", pipeline: pipe}));
-
- // Create a view but don't specify a pipeline; this should default to something sane.
- assert.commandWorked(
- viewsDB.runCommand({create: "viewWithDefaultPipeline", viewOn: "collection"}));
-
- // Specifying a pipeline but no view namespace must fail.
- assert.commandFailed(viewsDB.runCommand({create: "viewNoViewNamespace", pipeline: pipe}));
-
- // Create a view on another view.
- assert.commandWorked(
- viewsDB.runCommand({create: "viewOnView", viewOn: "view", pipeline: pipe}));
-
- // View names are constrained to the same limitations as collection names.
- assert.commandFailed(viewsDB.runCommand({create: "", viewOn: "collection", pipeline: pipe}));
- assert.commandFailedWithCode(
- viewsDB.runCommand({create: "system.local.new", viewOn: "collection", pipeline: pipe}),
- ErrorCodes.InvalidNamespace);
- assert.commandFailedWithCode(
- viewsDB.runCommand({create: "dollar$", viewOn: "collection", pipeline: pipe}),
- ErrorCodes.InvalidNamespace);
-
- // You cannot create a view with a $out stage, by itself or nested inside of a different stage.
- const ERROR_CODE_OUT_BANNED_IN_LOOKUP = 51047;
- const outStage = {$out: "nonExistentCollection"};
- assert.commandFailedWithCode(
- viewsDB.runCommand({create: "viewWithOut", viewOn: "collection", pipeline: [outStage]}),
- ErrorCodes.OptionNotSupportedOnView);
- assert.commandFailedWithCode(viewsDB.runCommand({
- create: "viewWithOutInLookup",
- viewOn: "collection",
- pipeline: [{$lookup: {from: "other", pipeline: [outStage], as: "result"}}]
- }),
- ERROR_CODE_OUT_BANNED_IN_LOOKUP);
- assert.commandFailedWithCode(viewsDB.runCommand({
- create: "viewWithOutInFacet",
- viewOn: "collection",
- pipeline: [{$facet: {output: [outStage]}}]
- }),
- 40600);
-
- // These test that, when an existing view in system.views is invalid because of a $out in the
- // pipeline, the database errors on creation of a new view.
- assert.commandWorked(viewsDB.system.views.insert({
- _id: `${viewsDBName}.invalidView`,
- viewOn: "collection",
- pipeline: [{$project: {_id: false}}, {$out: "notExistingCollection"}]
- }));
- assert.commandFailedWithCode(
- viewsDB.runCommand({create: "viewWithBadViewCatalog", viewOn: "collection", pipeline: []}),
- ErrorCodes.OptionNotSupportedOnView);
- assert.commandWorked(
- viewsDB.system.views.remove({_id: `${viewsDBName}.invalidView`}, {justOne: true}));
+"use strict";
+
+// For arrayEq.
+load("jstests/aggregation/extras/utils.js");
+
+const viewsDBName = "views_creation";
+
+let viewsDB = db.getSiblingDB(viewsDBName);
+assert.commandWorked(viewsDB.dropDatabase());
+
+let collNames = viewsDB.getCollectionNames();
+assert.eq(0, collNames.length, tojson(collNames));
+
+// You cannot create a view that starts with 'system.'.
+assert.commandFailedWithCode(viewsDB.runCommand({create: "system.special", viewOn: "collection"}),
+ ErrorCodes.InvalidNamespace,
+ "Created an illegal view named 'system.views'");
+
+// Collections that start with 'system.' that are not special to MongoDB fail with a different
+// error code.
+assert.commandFailedWithCode(viewsDB.runCommand({create: "system.foo", viewOn: "collection"}),
+ ErrorCodes.InvalidNamespace,
+ "Created an illegal view named 'system.foo'");
+
+// Create a collection for test purposes.
+assert.commandWorked(viewsDB.runCommand({create: "collection"}));
+
+let pipe = [{$match: {}}];
+
+// Create a "regular" view on a collection.
+assert.commandWorked(viewsDB.runCommand({create: "view", viewOn: "collection", pipeline: pipe}));
+
+collNames = viewsDB.getCollectionNames().filter((function(coll) {
+ return !coll.startsWith("system.");
+}));
+assert.eq(2, collNames.length, tojson(collNames));
+let res = viewsDB.runCommand({listCollections: 1, filter: {type: "view"}});
+assert.commandWorked(res);
+
+// Ensure that the output of listCollections has all the expected options for a view.
+let expectedListCollectionsOutput = [{
+ name: "view",
+ type: "view",
+ options: {viewOn: "collection", pipeline: pipe},
+ info: {readOnly: true}
+}];
+assert(arrayEq(res.cursor.firstBatch, expectedListCollectionsOutput), tojson({
+ expectedListCollectionsOutput: expectedListCollectionsOutput,
+ got: res.cursor.firstBatch
+ }));
+
+// Create a view on a non-existent collection.
+assert.commandWorked(
+ viewsDB.runCommand({create: "viewOnNonexistent", viewOn: "nonexistent", pipeline: pipe}));
+
+// Create a view but don't specify a pipeline; this should default to something sane.
+assert.commandWorked(viewsDB.runCommand({create: "viewWithDefaultPipeline", viewOn: "collection"}));
+
+// Specifying a pipeline but no view namespace must fail.
+assert.commandFailed(viewsDB.runCommand({create: "viewNoViewNamespace", pipeline: pipe}));
+
+// Create a view on another view.
+assert.commandWorked(viewsDB.runCommand({create: "viewOnView", viewOn: "view", pipeline: pipe}));
+
+// View names are constrained to the same limitations as collection names.
+assert.commandFailed(viewsDB.runCommand({create: "", viewOn: "collection", pipeline: pipe}));
+assert.commandFailedWithCode(
+ viewsDB.runCommand({create: "system.local.new", viewOn: "collection", pipeline: pipe}),
+ ErrorCodes.InvalidNamespace);
+assert.commandFailedWithCode(
+ viewsDB.runCommand({create: "dollar$", viewOn: "collection", pipeline: pipe}),
+ ErrorCodes.InvalidNamespace);
+
+// You cannot create a view with a $out stage, by itself or nested inside of a different stage.
+const ERROR_CODE_OUT_BANNED_IN_LOOKUP = 51047;
+const outStage = {
+ $out: "nonExistentCollection"
+};
+assert.commandFailedWithCode(
+ viewsDB.runCommand({create: "viewWithOut", viewOn: "collection", pipeline: [outStage]}),
+ ErrorCodes.OptionNotSupportedOnView);
+assert.commandFailedWithCode(viewsDB.runCommand({
+ create: "viewWithOutInLookup",
+ viewOn: "collection",
+ pipeline: [{$lookup: {from: "other", pipeline: [outStage], as: "result"}}]
+}),
+ ERROR_CODE_OUT_BANNED_IN_LOOKUP);
+assert.commandFailedWithCode(viewsDB.runCommand({
+ create: "viewWithOutInFacet",
+ viewOn: "collection",
+ pipeline: [{$facet: {output: [outStage]}}]
+}),
+ 40600);
+
+// These test that, when an existing view in system.views is invalid because of a $out in the
+// pipeline, the database errors on creation of a new view.
+assert.commandWorked(viewsDB.system.views.insert({
+ _id: `${viewsDBName}.invalidView`,
+ viewOn: "collection",
+ pipeline: [{$project: {_id: false}}, {$out: "notExistingCollection"}]
+}));
+assert.commandFailedWithCode(
+ viewsDB.runCommand({create: "viewWithBadViewCatalog", viewOn: "collection", pipeline: []}),
+ ErrorCodes.OptionNotSupportedOnView);
+assert.commandWorked(
+ viewsDB.system.views.remove({_id: `${viewsDBName}.invalidView`}, {justOne: true}));
}());