Files
bknd/app/__test__/data/polymorphic.test.ts
T
dswbx ca55503e66 refactor/imports (#217)
* refactored core and core/utils imports

* refactored core and core/utils imports

* refactored media imports

* refactored auth imports

* refactored data imports

* updated package json exports, fixed mm config

* fix tests
2025-07-22 20:17:11 +02:00

99 lines
3.6 KiB
TypeScript

import { afterAll, expect as bunExpect, describe, test } from "bun:test";
import { stripMark } from "core/utils/schema";
import { Entity, EntityManager } from "data/entities";
import { TextField } from "data/fields";
import { PolymorphicRelation } from "data/relations";
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",
]);
});
});