firestore-vitest
Version:
Vitest helper for mocking Google Cloud Firestore
123 lines (105 loc) • 4.1 kB
JavaScript
import { FakeFirestore } from '../index.js';
import {
mockCollection,
mockDoc,
mockDelete,
mockWhere,
mockLimit,
mockOrderBy,
mockStartAfter,
mockStartAt,
} from '../mocks/firestore.js';
describe('Reference Sentinels', () => {
beforeEach(() => {
vi.resetModules();
vi.clearAllMocks();
});
const db = new FakeFirestore({
characters: [
{ id: 'homer', name: 'Homer', occupation: 'technician' },
{ id: 'krusty', name: 'Krusty', occupation: 'clown' },
{
id: 'bob',
name: 'Bob',
occupation: 'repairman',
_collections: {
family: [
{ id: 'thing1', name: 'Thing 1', relation: 'pet' },
{ id: 'thing2', name: 'Thing 2', relation: 'pet' },
{ id: 'deborah', name: 'Deborah', relation: 'wife' },
],
},
},
],
});
describe('Collection Reference', () => {
test('it returns a collection reference', () => {
const charactersRef = db.collection('characters');
expect(charactersRef).toBeInstanceOf(FakeFirestore.CollectionReference);
expect(charactersRef.parent).toBeNull();
expect(mockCollection).toHaveBeenCalledWith('characters');
expect(db.collection('non-existent')).toBeInstanceOf(FakeFirestore.CollectionReference);
expect(mockCollection).toHaveBeenCalledWith('non-existent');
});
test('it compares collection references', () => {
const collectionRef = db.collection('characters');
expect(collectionRef.firestore).toBe(db);
expect(collectionRef).toHaveProperty('id', 'characters');
expect(collectionRef).toHaveProperty('path', 'characters');
const other = db.collection('characters');
expect(collectionRef.isEqual(collectionRef)).toBe(true);
expect(collectionRef.isEqual(other)).toBe(true);
expect(collectionRef.isEqual({})).toBe(false);
});
const collectionRef = db.collection('characters');
test('it calls mockWhere', () => {
collectionRef.where('occupation', '==', 'technician');
expect(mockWhere).toHaveBeenCalledWith('occupation', '==', 'technician');
});
test('it calls mockLimit', () => {
collectionRef.limit(2);
expect(mockLimit).toHaveBeenCalledWith(2);
});
test('it calls mockOrderBy', () => {
collectionRef.orderBy('name');
expect(mockOrderBy).toHaveBeenCalledWith('name');
});
test('it calls mockStartAfter', () => {
collectionRef.startAfter(null);
expect(mockStartAfter).toHaveBeenCalledWith(null);
});
test('it calls mockStartAt', () => {
collectionRef.startAt(null);
expect(mockStartAt).toHaveBeenCalledWith(null);
});
});
describe('Document Reference', () => {
test('it returns a document reference', () => {
const homerRef = db.collection('characters').doc('homer');
expect(homerRef).toBeInstanceOf(FakeFirestore.DocumentReference);
expect(homerRef).toHaveProperty('parent', expect.any(FakeFirestore.CollectionReference));
expect(mockCollection).toHaveBeenCalledWith('characters');
expect(mockDoc).toHaveBeenCalledWith('homer');
expect(db.collection('non-existent').doc('need-I-say-more')).toBeInstanceOf(
FakeFirestore.DocumentReference,
);
expect(mockCollection).toHaveBeenCalledWith('non-existent');
expect(mockDoc).toHaveBeenCalledWith('need-I-say-more');
});
test('it compares document references', () => {
const docRef = db.collection('characters').doc('homer');
expect(docRef.firestore).toBe(db);
expect(docRef).toHaveProperty('id', 'homer');
expect(docRef).toHaveProperty('path', 'characters/homer');
const other = db.collection('characters').doc('homer');
expect(docRef.isEqual(docRef)).toBe(true);
expect(docRef.isEqual(other)).toBe(true);
expect(docRef.isEqual({})).toBe(false);
});
test('it calls delete() mock', () => {
const docRef = db.collection('characters').doc('homer');
docRef.delete();
expect(mockDelete).toHaveBeenCalled();
});
});
});