firestore-vitest
Version:
Vitest helper for mocking Google Cloud Firestore
115 lines (103 loc) • 3.59 kB
JavaScript
import { FakeFirestore } from '../index.js';
import { mockCollection, mockDoc } from '../mocks/firestore.js';
describe('database mutations', () => {
beforeEach(() => {
vi.resetModules();
vi.clearAllMocks();
});
// db is a fn, instead a shared variable to enforce sandboxing data on each test.
const db = () =>
new FakeFirestore(
{
characters: [
{
id: 'homer',
name: 'Homer',
occupation: 'technician',
address: { street: '742 Evergreen Terrace' },
},
{ id: 'krusty', name: 'Krusty', occupation: 'clown' },
{
id: 'bob',
name: 'Bob',
occupation: 'insurance agent',
_collections: {
family: [
{ id: 'violet', name: 'Violet', relation: 'daughter' },
{ id: 'dash', name: 'Dash', relation: 'son' },
{ id: 'jackjack', name: 'Jackjack', relation: 'son' },
{ id: 'helen', name: 'Helen', relation: 'wife' },
],
},
},
],
},
{ mutable: true },
);
test('it can set simple record data', async () => {
const mdb = db();
await mdb
.collection('animals')
.doc('fantasy')
.collection('dragons')
.doc('whisperingDeath')
.set({
age: 15,
food: 'omnivore',
special: 'tunneling',
});
expect(mockCollection).toHaveBeenCalledWith('dragons');
expect(mockDoc).toHaveBeenCalledWith('whisperingDeath');
const doc = await mdb.doc('animals/fantasy/dragons/whisperingDeath').get();
expect(doc.exists).toBe(true);
expect(doc.id).toBe('whisperingDeath');
});
test('it correctly merges data on update', async () => {
const mdb = db();
const homer = mdb.collection('characters').doc('homer');
await homer.set({ occupation: 'Astronaut' }, { merge: true });
const doc = await homer.get();
expect(doc.data().name).toBe('Homer');
expect(doc.data().occupation).toBe('Astronaut');
});
test('it correctly overwrites data on set', async () => {
const mdb = db();
const homer = mdb.collection('characters').doc('homer');
await homer.set({ occupation: 'Astronaut' });
const doc = await homer.get();
expect(doc.data().name).toBeUndefined();
expect(doc.data().occupation).toBe('Astronaut');
});
test('it can batch appropriately', async () => {
const mdb = db();
const homer = mdb.collection('characters').doc('homer');
const krusty = mdb.collection('characters').doc('krusty');
await mdb
.batch()
.update(homer, { drink: 'duff' })
.set(krusty, { causeOfDeath: 'Simian homicide' })
.commit();
const homerData = (await homer.get()).data();
expect(homerData.name).toBe('Homer');
expect(homerData.drink).toBe('duff');
const krustyData = (await krusty.get()).data();
expect(krustyData.name).toBeUndefined();
expect(krustyData.causeOfDeath).toBe('Simian homicide');
});
test('it can add to collection', async () => {
const col = db().collection('characters');
const newDoc1 = await col.add({
name: 'Lisa',
occupation: 'President-in-waiting',
address: { street: '742 Evergreen Terrace' },
});
const test = await newDoc1.get();
expect(test.exists).toBe(true);
const newDoc2 = await col.add({
name: 'Lisa',
occupation: 'President-in-waiting',
address: { street: '742 Evergreen Terrace' },
});
expect(newDoc2.id).not.toEqual(newDoc1.id);
});
});