Skip to content

Commit 5059ce9

Browse files
committed
test: improve coverage for init database
### Description\nImplement unit tests for init database feature using nock.\n\n### Scenarios Tested\n- Defaults without project ID\n- Downloading rules with project ID\n- Actuate writing rules
1 parent e28281f commit 5059ce9

1 file changed

Lines changed: 132 additions & 0 deletions

File tree

src/init/features/database.spec.ts

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
import { expect } from "chai";
2+
import * as sinon from "sinon";
3+
import * as nock from "nock";
4+
import { askQuestions, actuate, DEFAULT_RULES } from "./database";
5+
import * as prompt from "../../prompt";
6+
import * as getDefaultDatabaseInstanceModule from "../../getDefaultDatabaseInstance";
7+
import * as databaseManagement from "../../management/database";
8+
import * as ensureApiEnabled from "../../ensureApiEnabled";
9+
import { Config } from "../../config";
10+
import { FirebaseError } from "../../error";
11+
12+
describe("init/features/database", () => {
13+
let confirmStub: sinon.SinonStub;
14+
let inputStub: sinon.SinonStub;
15+
let selectStub: sinon.SinonStub;
16+
let getDefaultInstanceStub: sinon.SinonStub;
17+
let getDatabaseInstanceDetailsStub: sinon.SinonStub;
18+
let ensureStub: sinon.SinonStub;
19+
let configWriteStub: sinon.SinonStub;
20+
let configConfirmWriteStub: sinon.SinonStub;
21+
22+
beforeEach(() => {
23+
confirmStub = sinon.stub(prompt, "confirm");
24+
inputStub = sinon.stub(prompt, "input");
25+
selectStub = sinon.stub(prompt, "select");
26+
getDefaultInstanceStub = sinon.stub(getDefaultDatabaseInstanceModule, "getDefaultDatabaseInstance");
27+
getDatabaseInstanceDetailsStub = sinon.stub(databaseManagement, "getDatabaseInstanceDetails");
28+
ensureStub = sinon.stub(ensureApiEnabled, "ensure").resolves();
29+
configWriteStub = sinon.stub(Config.prototype, "writeProjectFile");
30+
configConfirmWriteStub = sinon.stub(Config.prototype, "confirmWriteProjectFile");
31+
});
32+
33+
afterEach(() => {
34+
sinon.restore();
35+
nock.cleanAll();
36+
});
37+
38+
describe("askQuestions", () => {
39+
it("should setup defaults when no project ID is present", async () => {
40+
inputStub.resolves("database.rules.json");
41+
configConfirmWriteStub.resolves(true);
42+
const setup: any = { config: {} };
43+
const config = new Config({}, {});
44+
45+
await askQuestions(setup, config);
46+
47+
expect(setup.featureInfo.database.rulesFilename).to.equal("database.rules.json");
48+
expect(setup.featureInfo.database.rules).to.equal(DEFAULT_RULES);
49+
});
50+
51+
it("should download rules from existing instance if project ID is present", async () => {
52+
inputStub.resolves("database.rules.json");
53+
configConfirmWriteStub.resolves(true);
54+
getDefaultInstanceStub.resolves("my-instance");
55+
getDatabaseInstanceDetailsStub.resolves({
56+
name: "my-instance",
57+
databaseUrl: "https://my-instance.firebaseio.com",
58+
});
59+
60+
const mockRules = '{ "rules": { ".read": true } }';
61+
nock("https://my-instance.firebaseio.com")
62+
.get("/.settings/rules.json")
63+
.reply(200, mockRules);
64+
65+
const setup: any = { projectId: "my-project", config: {} };
66+
const config = new Config({}, {});
67+
68+
await askQuestions(setup, config);
69+
70+
expect(setup.featureInfo.database.rules).to.equal(mockRules);
71+
});
72+
73+
it("should throw if rules fetch fails", async () => {
74+
inputStub.resolves("database.rules.json");
75+
getDefaultInstanceStub.resolves("my-instance");
76+
getDatabaseInstanceDetailsStub.resolves({
77+
name: "my-instance",
78+
databaseUrl: "https://my-instance.firebaseio.com",
79+
});
80+
81+
nock("https://my-instance.firebaseio.com")
82+
.get("/.settings/rules.json")
83+
.reply(500);
84+
85+
const setup: any = { projectId: "my-project", config: {} };
86+
const config = new Config({}, {});
87+
88+
await expect(askQuestions(setup, config)).to.be.rejectedWith(
89+
FirebaseError,
90+
/Failed to fetch current rules/
91+
);
92+
});
93+
});
94+
95+
describe("actuate", () => {
96+
it("should write rules to file if writeRules is true", async () => {
97+
const setup: any = {
98+
config: {},
99+
featureInfo: {
100+
database: {
101+
rulesFilename: "database.rules.json",
102+
rules: DEFAULT_RULES,
103+
writeRules: true,
104+
},
105+
},
106+
};
107+
const config = new Config({}, {});
108+
109+
await actuate(setup, config);
110+
111+
expect(configWriteStub).to.have.been.calledWith("database.rules.json", DEFAULT_RULES);
112+
});
113+
114+
it("should skip writing rules if writeRules is false", async () => {
115+
const setup: any = {
116+
config: {},
117+
featureInfo: {
118+
database: {
119+
rulesFilename: "database.rules.json",
120+
rules: DEFAULT_RULES,
121+
writeRules: false,
122+
},
123+
},
124+
};
125+
const config = new Config({}, {});
126+
127+
await actuate(setup, config);
128+
129+
expect(configWriteStub).to.not.have.been.called;
130+
});
131+
});
132+
});

0 commit comments

Comments
 (0)