Skip to content

Commit 85a2129

Browse files
committed
Break test order dependencies in security-rules integration tests.
Previously, this would work: yarn test:integration --updateRules --grep 'admin.securityRules' but this would not: yarn test:integration --updateRules --grep 'admin.securityRules.getRuleset\(\).rejects with not-found' because that test relied on side effects from earier tests, making this test suite difficult to debug.
1 parent 6ea4a9f commit 85a2129

File tree

1 file changed

+47
-27
lines changed

1 file changed

+47
-27
lines changed

test/integration/security-rules.spec.ts

Lines changed: 47 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ const RULESET_NAME_PATTERN = /[0-9a-zA-Z-]+/;
4545

4646
describe('admin.securityRules', () => {
4747

48-
let testRuleset: admin.securityRules.Ruleset = null;
4948
const rulesetsToDelete: string[] = [];
5049

5150
function scheduleForDelete(ruleset: admin.securityRules.Ruleset) {
@@ -65,7 +64,7 @@ describe('admin.securityRules', () => {
6564
return Promise.all(promises);
6665
}
6766

68-
after(() => {
67+
afterEach(() => {
6968
return deleteTempRulesets();
7069
});
7170

@@ -91,7 +90,6 @@ describe('admin.securityRules', () => {
9190
RULES_FILE_NAME, SAMPLE_FIRESTORE_RULES);
9291
return admin.securityRules().createRuleset(rulesFile)
9392
.then((ruleset) => {
94-
testRuleset = ruleset;
9593
scheduleForDelete(ruleset);
9694
verifyFirestoreRuleset(ruleset);
9795
});
@@ -105,23 +103,40 @@ describe('admin.securityRules', () => {
105103
});
106104
});
107105

106+
function getRandomInt(max: number) {
107+
return Math.floor(Math.random() * Math.floor(max));
108+
}
109+
110+
function createTemporaryRuleset(): Promise<admin.securityRules.Ruleset> {
111+
const name = "random_name_" + getRandomInt(100000) + ".rules";
112+
const rulesFile = admin.securityRules().createRulesFileFromSource(name, SAMPLE_FIRESTORE_RULES);
113+
return admin.securityRules().createRuleset(rulesFile)
114+
.then((ruleset) => {
115+
scheduleForDelete(ruleset);
116+
return ruleset;
117+
});
118+
}
119+
108120
describe('getRuleset()', () => {
109121
it('rejects with not-found when the Ruleset does not exist', () => {
110-
const name = 'e1212' + testRuleset.name.substring(5);
111-
return admin.securityRules().getRuleset(name)
122+
const uuid = '00000000-1111-2222-3333-444444444444';
123+
return admin.securityRules().getRuleset(uuid)
112124
.should.eventually.be.rejected.and.have.property('code', 'security-rules/not-found');
113125
});
114126

115127
it('rejects with invalid-argument when the Ruleset name is invalid', () => {
116-
return admin.securityRules().getRuleset('invalid')
128+
return admin.securityRules().getRuleset('invalid uuid')
117129
.should.eventually.be.rejected.and.have.property('code', 'security-rules/invalid-argument');
118130
});
119131

120132
it('resolves with existing Ruleset', () => {
121-
return admin.securityRules().getRuleset(testRuleset.name)
122-
.then((ruleset) => {
123-
verifyFirestoreRuleset(ruleset);
124-
});
133+
return createTemporaryRuleset()
134+
.then((expectedRuleset) =>
135+
admin.securityRules().getRuleset(expectedRuleset.name)
136+
.then((actualRuleset) => {
137+
expect(actualRuleset).to.deep.equal(expectedRuleset);
138+
})
139+
);
125140
});
126141
});
127142

@@ -137,7 +152,7 @@ describe('admin.securityRules', () => {
137152
return admin.securityRules().releaseFirestoreRuleset(oldRuleset);
138153
}
139154

140-
after(() => {
155+
afterEach(() => {
141156
return revertFirestoreRuleset();
142157
});
143158

@@ -185,7 +200,7 @@ describe('admin.securityRules', () => {
185200
return admin.securityRules().releaseStorageRuleset(oldRuleset);
186201
}
187202

188-
after(() => {
203+
afterEach(() => {
189204
return revertStorageRuleset();
190205
});
191206

@@ -240,9 +255,13 @@ describe('admin.securityRules', () => {
240255
});
241256
}
242257

243-
return listAllRulesets()
244-
.then((rulesets) => {
245-
expect(rulesets.some((rs) => rs.name === testRuleset.name)).to.be.true;
258+
return Promise.all([createTemporaryRuleset(), createTemporaryRuleset()])
259+
.then((expectedRulesets) => {
260+
return listAllRulesets().then((actualRulesets) => {
261+
expectedRulesets.forEach((expectedRuleset) => {
262+
expect(actualRulesets.map(r => r.name)).to.deep.include(expectedRuleset.name);
263+
});
264+
});
246265
});
247266
});
248267

@@ -257,26 +276,27 @@ describe('admin.securityRules', () => {
257276

258277
describe('deleteRuleset()', () => {
259278
it('rejects with not-found when the Ruleset does not exist', () => {
260-
const name = 'e1212' + testRuleset.name.substring(5);
261-
return admin.securityRules().deleteRuleset(name)
279+
const uuid = '00000000-1111-2222-3333-444444444444'
280+
return admin.securityRules().deleteRuleset(uuid)
262281
.should.eventually.be.rejected.and.have.property('code', 'security-rules/not-found');
263282
});
264283

265284
it('rejects with invalid-argument when the Ruleset name is invalid', () => {
266-
return admin.securityRules().deleteRuleset('invalid')
285+
return admin.securityRules().deleteRuleset('invalid uuid')
267286
.should.eventually.be.rejected.and.have.property('code', 'security-rules/invalid-argument');
268287
});
269288

270289
it('deletes existing Ruleset', () => {
271-
return admin.securityRules().deleteRuleset(testRuleset.name)
272-
.then(() => {
273-
return admin.securityRules().getRuleset(testRuleset.name)
274-
.should.eventually.be.rejected.and.have.property('code', 'security-rules/not-found');
275-
})
276-
.then(() => {
277-
unscheduleForDelete(testRuleset); // Already deleted.
278-
testRuleset = null;
279-
});
290+
return createTemporaryRuleset().then((ruleset) => {
291+
return admin.securityRules().deleteRuleset(ruleset.name)
292+
.then(() => {
293+
return admin.securityRules().getRuleset(ruleset.name)
294+
.should.eventually.be.rejected.and.have.property('code', 'security-rules/not-found');
295+
})
296+
.then(() => {
297+
unscheduleForDelete(ruleset); // Already deleted.
298+
});
299+
});
280300
});
281301
});
282302

0 commit comments

Comments
 (0)