Skip to content

Commit e1234a7

Browse files
authored
feat(NODE-3728): Allow to pass authorizedCollections option to the db.listCollections method (#3021)
1 parent 33886a7 commit e1234a7

File tree

2 files changed

+86
-10
lines changed

2 files changed

+86
-10
lines changed

src/operations/list_collections.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ const LIST_COLLECTIONS_WIRE_VERSION = 3;
1515
export interface ListCollectionsOptions extends CommandOperationOptions {
1616
/** Since 4.0: If true, will only return the collection name in the response, and will omit additional info */
1717
nameOnly?: boolean;
18+
/** Since 4.0: If true and nameOnly is true, allows a user without the required privilege (i.e. listCollections action on the database) to run the command when access control is enforced. */
19+
authorizedCollections?: boolean;
1820
/** The batchSize for the returned command cursor or if pre 2.8 the systems batch collection */
1921
batchSize?: number;
2022
}
@@ -25,6 +27,7 @@ export class ListCollectionsOperation extends CommandOperation<string[]> {
2527
db: Db;
2628
filter: Document;
2729
nameOnly: boolean;
30+
authorizedCollections: boolean;
2831
batchSize?: number;
2932

3033
constructor(db: Db, filter: Document, options?: ListCollectionsOptions) {
@@ -34,6 +37,7 @@ export class ListCollectionsOperation extends CommandOperation<string[]> {
3437
this.db = db;
3538
this.filter = filter;
3639
this.nameOnly = !!this.options.nameOnly;
40+
this.authorizedCollections = !!this.options.authorizedCollections;
3741

3842
if (typeof this.options.batchSize === 'number') {
3943
this.batchSize = this.options.batchSize;
@@ -99,7 +103,8 @@ export class ListCollectionsOperation extends CommandOperation<string[]> {
99103
listCollections: 1,
100104
filter: this.filter,
101105
cursor: this.batchSize ? { batchSize: this.batchSize } : {},
102-
nameOnly: this.nameOnly
106+
nameOnly: this.nameOnly,
107+
authorizedCollections: this.authorizedCollections
103108
};
104109
}
105110
}

test/unit/operations/list_collections.test.js

+80-9
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,54 @@ describe('ListCollectionsOperation', function () {
1212
const operation = new ListCollectionsOperation(db, {}, { nameOnly: true, dbName: db });
1313

1414
it('sets nameOnly to true', function () {
15-
expect(operation.nameOnly).to.be.true;
15+
expect(operation).to.have.property('nameOnly', true);
1616
});
1717
});
1818

1919
context('when nameOnly is false', function () {
2020
const operation = new ListCollectionsOperation(db, {}, { nameOnly: false, dbName: db });
2121

2222
it('sets nameOnly to false', function () {
23-
expect(operation.nameOnly).to.be.false;
23+
expect(operation).to.have.property('nameOnly', false);
2424
});
2525
});
2626
});
2727

28-
context('when nameOnly is not provided', function () {
28+
context('when authorizedCollections is provided', function () {
29+
context('when authorizedCollections is true', function () {
30+
const operation = new ListCollectionsOperation(
31+
db,
32+
{},
33+
{ authorizedCollections: true, dbName: db }
34+
);
35+
36+
it('sets authorizedCollections to true', function () {
37+
expect(operation).to.have.property('authorizedCollections', true);
38+
});
39+
});
40+
41+
context('when authorizedCollections is false', function () {
42+
const operation = new ListCollectionsOperation(
43+
db,
44+
{},
45+
{ authorizedCollections: false, dbName: db }
46+
);
47+
48+
it('sets authorizedCollections to false', function () {
49+
expect(operation).to.have.property('authorizedCollections', false);
50+
});
51+
});
52+
});
53+
54+
context('when no options are provided', function () {
2955
const operation = new ListCollectionsOperation(db, {}, { dbName: db });
3056

3157
it('sets nameOnly to false', function () {
32-
expect(operation.nameOnly).to.be.false;
58+
expect(operation).to.have.property('nameOnly', false);
59+
});
60+
61+
it('sets authorizedCollections to false', function () {
62+
expect(operation).to.have.property('authorizedCollections', false);
3363
});
3464
});
3565
});
@@ -44,7 +74,8 @@ describe('ListCollectionsOperation', function () {
4474
listCollections: 1,
4575
cursor: {},
4676
filter: {},
47-
nameOnly: true
77+
nameOnly: true,
78+
authorizedCollections: false
4879
});
4980
});
5081
});
@@ -57,21 +88,61 @@ describe('ListCollectionsOperation', function () {
5788
listCollections: 1,
5889
cursor: {},
5990
filter: {},
60-
nameOnly: false
91+
nameOnly: false,
92+
authorizedCollections: false
6193
});
6294
});
6395
});
6496
});
6597

66-
context('when nameOnly is not provided', function () {
98+
context('when authorizedCollections is provided', function () {
99+
context('when authorizedCollections is true', function () {
100+
const operation = new ListCollectionsOperation(
101+
db,
102+
{},
103+
{ authorizedCollections: true, dbName: db }
104+
);
105+
106+
it('sets authorizedCollections to true', function () {
107+
expect(operation.generateCommand()).to.deep.equal({
108+
listCollections: 1,
109+
cursor: {},
110+
filter: {},
111+
nameOnly: false,
112+
authorizedCollections: true
113+
});
114+
});
115+
});
116+
117+
context('when authorizedCollections is false', function () {
118+
const operation = new ListCollectionsOperation(
119+
db,
120+
{},
121+
{ authorizedCollections: false, dbName: db }
122+
);
123+
124+
it('sets authorizedCollections to false', function () {
125+
expect(operation.generateCommand()).to.deep.equal({
126+
listCollections: 1,
127+
cursor: {},
128+
filter: {},
129+
nameOnly: false,
130+
authorizedCollections: false
131+
});
132+
});
133+
});
134+
});
135+
136+
context('when no options are provided', function () {
67137
const operation = new ListCollectionsOperation(db, {}, { dbName: db });
68138

69-
it('sets nameOnly to false', function () {
139+
it('sets nameOnly and authorizedCollections properties to false', function () {
70140
expect(operation.generateCommand()).to.deep.equal({
71141
listCollections: 1,
72142
cursor: {},
73143
filter: {},
74-
nameOnly: false
144+
nameOnly: false,
145+
authorizedCollections: false
75146
});
76147
});
77148
});

0 commit comments

Comments
 (0)