UNPKG

@scorpionknifes/fireo

Version:

Fork of Fireo, Google Cloud Firestore modern and simplest convenient ORM package in NodeJs. FireO is specifically designed for the Google's Firestore

138 lines (117 loc) 4.41 kB
const chai = require("chai"); const Model = require("../../../src/model/Model"); const Field = require("../../../src/fields/Field"); const { RequiredField } = require("../../../errors"); const firestore = require("../../../Firestore"); const { DocumentReference } = require("@google-cloud/firestore"); const { Fireo } = require("../../../index"); const expect = chai.expect; describe("ReferenceField", () => { before(() => { Fireo.connection.setting({ projectId: "fs-test-project" }); }); describe("ReferenceField() set value", () => { let refField; beforeEach(() => { refField = Field.Reference(); }); it("can be able to set value", async () => { refField.setValue("User/custom-id"); expect(refField.getValue).to.deep.equal( firestore.conn.doc("User/custom-id") ); }); it("should only accept key value", () => { expect(() => refField.setValue("User/custom-id")).to.not.throw(); }); it("should not accept value which are not key", () => { expect(() => refField.setValue("asd")).to.throw(); }); }); describe("ReferenceField supported options", () => { it("should not throw error if required and value set", () => { const textField = Field.Reference({ required: true }); textField.setValue("User/custom-id"); expect(() => textField.getValue).to.not.throw(); }); it("should throw error if required and no value set", () => { const textField = Field.Reference({ required: true }); expect(() => textField.getValue).to.throw(RequiredField); }); it("name can be change", () => { const textField = Field.Reference({ name: "custom_name" }); expect(textField.name).to.equal("custom_name"); }); it("has a default value", () => { const textField = Field.Reference({ default: "User/custom-id" }); expect(textField.getValue).to.equal("User/custom-id"); }); }); describe("Custom Options", () => { it("should return doc ref", async () => { class Company extends Model { department = Field.Text(); } class Employee extends Model { name = Field.Text(); company = Field.Reference(); } const com = Company.init(); com.department = "dept"; await com.save(); const emp = Employee.init(); emp.name = "emp-name"; emp.company = com.key; await emp.save(); const doc = await Employee.collection.get({ key: emp.key }); expect(doc.name).to.equal("emp-name"); expect(doc.company instanceof DocumentReference); const c = await doc.company.get(); expect(c.department).to.equal("dept"); }); it("should support `autoLoad`", async () => { class Company extends Model { department = Field.Text(); } class Employee extends Model { name = Field.Text(); company = Field.Reference({ autoLoad: true }); } const com = Company.init(); com.department = "dept"; await com.save(); const emp = Employee.init(); emp.name = "emp-name"; emp.company = com.key; await emp.save(); const doc = await Employee.collection.get({ key: emp.key }); // console.log(doc.company); expect(doc.name).to.equal("emp-name"); expect(doc.company.department).to.equal("dept"); }); // it("should support `onLoad`", async () => { // class Company extends Model { // department = Field.Text(); // } // class Employee extends Model { // name = Field.Text(); // company = Field.Reference({ onLoad: "doSomething" }); // doSomething(company) { // this.modifyDepart = company.department + "-mod"; // } // } // const com = Company.init(); // com.department = "dept"; // await com.save(); // const emp = Employee.init(); // emp.name = "emp-name"; // emp.company = com.key; // await emp.save(); // const doc = await Employee.collection.get({ key: emp.key }); // const c = await doc.company.get(); // expect(doc.name).to.equal("emp-name"); // expect(c.department).to.equal("dept"); // expect(doc.modifyDepart).to.equal("dept-mod"); // }); }); });