Skip to content

Commit c1b99a9

Browse files
committed
feat: define and test PersistenceProvider#get
1 parent 4e63845 commit c1b99a9

File tree

2 files changed

+141
-93
lines changed

2 files changed

+141
-93
lines changed

src/persistence/PersistenceProvider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ export interface PersistenceProvider {
66
recordName: string,
77
updater: (record: PersistenceRecord) => PersistenceRecord,
88
): Promise<PersistenceRecord>;
9+
get(collectionName: string, recordName: string): Promise<PersistenceRecord>;
910
setDebugFn(debugFn: (msg: string) => void): void;
1011
}

src/persistence/PersistenceProviders.integration.test.ts

Lines changed: 140 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -5,103 +5,150 @@ import { _, expect, sinon, uuid } from "../_test/test_environment";
55

66
import { FirestorePersistenceProvider } from "./FirestorePersistenceProvider";
77
import { PersistenceProvider } from "./PersistenceProvider";
8+
import { PersistenceProviderMock } from "./PersistenceProviderMock";
89
import { PersistenceRecord } from "./PersistenceRecord";
910
import { RealtimeDbPersistenceProvider } from "./RealtimeDbPersistenceProvider";
10-
chaiUse(chaiAsPromised);
11-
12-
function mock() {
13-
const app = firebase.initializeTestApp({ projectId: "unit-testing-" + Date.now(), databaseName: "db" });
14-
const uniqueCollectionName = uuid();
15-
const uniqueDocName = uuid();
16-
const firestore = app.firestore();
17-
const database = app.database();
18-
const provider: PersistenceProvider = undefined as any;
19-
const emptyPersistenceRecord: PersistenceRecord = { u: [] };
20-
const nonModifyingUpdater = (pr: PersistenceRecord) => pr;
21-
return {
22-
app,
23-
firestore,
24-
database,
25-
uniqueCollectionName,
26-
uniqueDocName,
27-
provider,
28-
emptyPersistenceRecord,
29-
nonModifyingUpdater,
30-
};
31-
}
32-
33-
const mockFirestoreProvider: typeof mock = () => {
34-
const mockResult = mock();
35-
const provider = new FirestorePersistenceProvider(mockResult.firestore);
36-
return { ...mockResult, provider };
37-
};
38-
39-
const mockRealtimeProvider: typeof mock = () => {
40-
const mockResult = mock();
41-
const provider = new RealtimeDbPersistenceProvider(mockResult.database);
42-
return { ...mockResult, provider };
43-
};
44-
45-
afterEach(async () => {
46-
await Promise.all(firebase.apps().map(app => app.delete()));
47-
});
4811

49-
before("startup", async function() {
12+
describe("PersistenceProviders", function() {
5013
this.timeout(4000);
51-
const { firestore, database } = mock();
52-
await firestore
53-
.collection("a")
54-
.doc("a")
55-
.get();
56-
await database.ref("a").set({ a: "a" });
57-
});
5814

59-
[
60-
{ name: "FirestorePersistenceProvider", mockFactory: mockFirestoreProvider },
61-
{ name: "RealtimeDbPersistenceProvider", mockFactory: mockRealtimeProvider },
62-
].forEach(test =>
63-
describe(test.name, () => {
64-
it("Runs transaction code", async () => {
65-
const { provider, uniqueCollectionName, uniqueDocName, emptyPersistenceRecord } = test.mockFactory();
66-
const spy = sinon.spy();
67-
await provider.updateAndGet(uniqueCollectionName, uniqueDocName, record => {
68-
spy();
69-
return emptyPersistenceRecord;
15+
function mock() {
16+
const app = firebase.initializeTestApp({ projectId: "unit-testing-" + Date.now(), databaseName: "db" });
17+
const uniqueCollectionName = uuid();
18+
const uniqueDocName = uuid();
19+
const firestore = app.firestore();
20+
const database = app.database();
21+
const provider: PersistenceProvider = undefined as any;
22+
const emptyPersistenceRecord: PersistenceRecord = { u: [] };
23+
const nonModifyingUpdater = (pr: PersistenceRecord) => pr;
24+
return {
25+
app,
26+
firestore,
27+
database,
28+
uniqueCollectionName,
29+
uniqueDocName,
30+
provider,
31+
emptyPersistenceRecord,
32+
nonModifyingUpdater,
33+
};
34+
}
35+
36+
const mockFirestoreProvider: typeof mock = () => {
37+
const mockResult = mock();
38+
const provider = new FirestorePersistenceProvider(mockResult.firestore);
39+
return { ...mockResult, provider };
40+
};
41+
42+
const mockRealtimeProvider: typeof mock = () => {
43+
const mockResult = mock();
44+
const provider = new RealtimeDbPersistenceProvider(mockResult.database);
45+
return { ...mockResult, provider };
46+
};
47+
48+
const mockMockProvider: typeof mock = () => {
49+
const mockResult = mock();
50+
const provider = new PersistenceProviderMock();
51+
return { ...mockResult, provider };
52+
};
53+
54+
afterEach(async () => {
55+
await Promise.all(firebase.apps().map(app => app.delete()));
56+
});
57+
58+
before("startup", async function() {
59+
this.timeout(4000);
60+
const { firestore, database } = mock();
61+
await firestore
62+
.collection("a")
63+
.doc("a")
64+
.get();
65+
await database.ref("a").set({ a: "a" });
66+
});
67+
68+
[
69+
{ name: "FirestorePersistenceProvider", mockFactory: mockFirestoreProvider },
70+
{ name: "RealtimeDbPersistenceProvider", mockFactory: mockRealtimeProvider },
71+
{ name: "PersistenceProviderMock", mockFactory: mockMockProvider },
72+
].forEach(test =>
73+
describe(test.name, () => {
74+
describe("#updateAndGet", () => {
75+
it("Runs transaction code", async () => {
76+
const {
77+
provider,
78+
uniqueCollectionName,
79+
uniqueDocName,
80+
emptyPersistenceRecord,
81+
} = test.mockFactory();
82+
const spy = sinon.spy();
83+
await provider.updateAndGet(uniqueCollectionName, uniqueDocName, record => {
84+
spy();
85+
return emptyPersistenceRecord;
86+
});
87+
expect(spy.callCount).to.be.equal(1);
88+
});
89+
90+
it("Resolves when transaction callback is finshed", async () => {
91+
const { provider, uniqueCollectionName, uniqueDocName } = test.mockFactory();
92+
const spy = sinon.spy();
93+
await provider.updateAndGet(uniqueCollectionName, uniqueDocName, record => {
94+
spy();
95+
return { u: [] };
96+
});
97+
expect(spy.callCount).to.be.equal(1);
98+
});
99+
100+
it("Returns empty record when no data", async () => {
101+
const { provider, uniqueCollectionName, uniqueDocName, nonModifyingUpdater } = test.mockFactory();
102+
const rec = await provider.updateAndGet(uniqueCollectionName, uniqueDocName, nonModifyingUpdater);
103+
expect(rec.u)
104+
.to.be.an("array")
105+
.with.length(0);
106+
});
107+
108+
it("Saves record properly", async () => {
109+
const { provider, uniqueCollectionName, uniqueDocName, nonModifyingUpdater } = test.mockFactory();
110+
111+
const recToBeSaved: PersistenceRecord = {
112+
u: [1, 2, 3],
113+
};
114+
await provider.updateAndGet(uniqueCollectionName, uniqueDocName, r => recToBeSaved);
115+
116+
const recRetrived = await provider.updateAndGet(
117+
uniqueCollectionName,
118+
uniqueDocName,
119+
nonModifyingUpdater,
120+
);
121+
expect(recRetrived.u)
122+
.to.be.an("array")
123+
.with.length(recToBeSaved.u.length)
124+
.that.have.members(recToBeSaved.u);
125+
});
70126
});
71-
expect(spy.callCount).to.be.equal(1);
72-
});
73-
74-
it("Resolves when transaction callback is finshed", async () => {
75-
const { provider, uniqueCollectionName, uniqueDocName } = test.mockFactory();
76-
const spy = sinon.spy();
77-
await provider.updateAndGet(uniqueCollectionName, uniqueDocName, record => {
78-
spy();
79-
return { u: [] };
127+
128+
describe("#get", () => {
129+
it("Returns empty record when no data", async () => {
130+
const { provider, uniqueCollectionName, uniqueDocName } = test.mockFactory();
131+
const rec = await provider.get(uniqueCollectionName, uniqueDocName);
132+
expect(rec.u)
133+
.to.be.an("array")
134+
.with.length(0);
135+
});
136+
137+
it("Returns previously saved record", async () => {
138+
const { provider, uniqueCollectionName, uniqueDocName } = test.mockFactory();
139+
140+
const recToBeSaved: PersistenceRecord = {
141+
u: [1, 2, 3],
142+
};
143+
await provider.updateAndGet(uniqueCollectionName, uniqueDocName, r => recToBeSaved);
144+
145+
const recRetrived = await provider.get(uniqueCollectionName, uniqueDocName);
146+
expect(recRetrived.u)
147+
.to.be.an("array")
148+
.with.length(recToBeSaved.u.length)
149+
.that.have.members(recToBeSaved.u);
150+
});
80151
});
81-
expect(spy.callCount).to.be.equal(1);
82-
});
83-
84-
it("Returns empty record when no data", async () => {
85-
const { provider, uniqueCollectionName, uniqueDocName, nonModifyingUpdater } = test.mockFactory();
86-
const rec = await provider.updateAndGet(uniqueCollectionName, uniqueDocName, nonModifyingUpdater);
87-
expect(rec.u)
88-
.to.be.an("array")
89-
.with.length(0);
90-
});
91-
92-
it("Saves record properly", async () => {
93-
const { provider, uniqueCollectionName, uniqueDocName, nonModifyingUpdater } = test.mockFactory();
94-
95-
const recToBeSaved: PersistenceRecord = {
96-
u: [1, 2, 3],
97-
};
98-
await provider.updateAndGet(uniqueCollectionName, uniqueDocName, r => recToBeSaved);
99-
100-
const recRetrived = await provider.updateAndGet(uniqueCollectionName, uniqueDocName, nonModifyingUpdater);
101-
expect(recRetrived.u)
102-
.to.be.an("array")
103-
.with.length(recToBeSaved.u.length)
104-
.that.have.members(recToBeSaved.u);
105-
});
106-
}),
107-
);
152+
}),
153+
);
154+
});

0 commit comments

Comments
 (0)