mirror of
https://github.com/shishantbiswas/bknd.git
synced 2026-03-15 20:17:22 +00:00
97 lines
3.6 KiB
TypeScript
97 lines
3.6 KiB
TypeScript
import { afterAll, expect as bunExpect, describe, test } from "bun:test";
|
|
import { stripMark } from "../../src/core/utils";
|
|
import { Entity, EntityManager, PolymorphicRelation, TextField } from "../../src/data";
|
|
import { getDummyConnection } from "./helper";
|
|
|
|
const { dummyConnection, afterAllCleanup } = getDummyConnection();
|
|
afterAll(afterAllCleanup);
|
|
|
|
const expect = (value: any) => bunExpect(stripMark(value));
|
|
|
|
describe("Polymorphic", async () => {
|
|
test("Simple", async () => {
|
|
const categories = new Entity("categories", [new TextField("name")]);
|
|
const media = new Entity("media", [new TextField("path")]);
|
|
|
|
const entities = [media, categories];
|
|
const relation = new PolymorphicRelation(categories, media, { mappedBy: "image" });
|
|
|
|
const em = new EntityManager(entities, dummyConnection, [relation]);
|
|
|
|
expect(em.relationsOf(categories.name).map((r) => r.toJSON())[0]).toEqual({
|
|
type: "poly",
|
|
source: "categories",
|
|
target: "media",
|
|
config: {
|
|
mappedBy: "image"
|
|
}
|
|
});
|
|
// media should not see categories
|
|
expect(em.relationsOf(media.name).map((r) => r.toJSON())).toEqual([]);
|
|
|
|
// it's important that media cannot access categories
|
|
expect(em.relations.targetRelationsOf(categories).map((r) => r.source.entity.name)).toEqual(
|
|
[]
|
|
);
|
|
expect(em.relations.targetRelationsOf(media).map((r) => r.source.entity.name)).toEqual([]);
|
|
|
|
expect(em.relations.sourceRelationsOf(categories).map((r) => r.target.entity.name)).toEqual([
|
|
"media"
|
|
]);
|
|
expect(em.relations.sourceRelationsOf(categories).map((r) => r.target.reference)).toEqual([
|
|
"image"
|
|
]);
|
|
expect(em.relations.sourceRelationsOf(media).map((r) => r.target.entity.name)).toEqual([]);
|
|
|
|
// expect that polymorphic fields are added to media
|
|
expect(media.getFields().map((f) => f.name)).toEqual([
|
|
"id",
|
|
"path",
|
|
"reference",
|
|
"entity_id"
|
|
]);
|
|
expect(media.getSelect()).toEqual(["id", "path"]);
|
|
});
|
|
|
|
test("Multiple to the same", async () => {
|
|
const categories = new Entity("categories", [new TextField("name")]);
|
|
const media = new Entity("media", [new TextField("path")]);
|
|
|
|
const entities = [media, categories];
|
|
const single = new PolymorphicRelation(categories, media, {
|
|
mappedBy: "single",
|
|
targetCardinality: 1
|
|
});
|
|
const multiple = new PolymorphicRelation(categories, media, { mappedBy: "multiple" });
|
|
|
|
const em = new EntityManager(entities, dummyConnection, [single, multiple]);
|
|
|
|
// media should not see categories
|
|
expect(em.relationsOf(media.name).map((r) => r.toJSON())).toEqual([]);
|
|
|
|
// it's important that media cannot access categories
|
|
expect(em.relations.targetRelationsOf(categories).map((r) => r.source.entity.name)).toEqual(
|
|
[]
|
|
);
|
|
expect(em.relations.targetRelationsOf(media).map((r) => r.source.entity.name)).toEqual([]);
|
|
|
|
expect(em.relations.sourceRelationsOf(categories).map((r) => r.target.entity.name)).toEqual([
|
|
"media",
|
|
"media"
|
|
]);
|
|
expect(em.relations.sourceRelationsOf(categories).map((r) => r.target.reference)).toEqual([
|
|
"single",
|
|
"multiple"
|
|
]);
|
|
expect(em.relations.sourceRelationsOf(media).map((r) => r.target.entity.name)).toEqual([]);
|
|
|
|
// expect that polymorphic fields are added to media
|
|
expect(media.getFields().map((f) => f.name)).toEqual([
|
|
"id",
|
|
"path",
|
|
"reference",
|
|
"entity_id"
|
|
]);
|
|
});
|
|
});
|