Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,4 @@ package-lock.json
.vite-custom
docs/superpowers
pnpm-lock.yaml
.worktrees
103 changes: 100 additions & 3 deletions packages/core/src/stores/store.spec.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { test } from "@webda/test";
import { suite, test } from "@webda/test";
import * as assert from "assert";
import { stub } from "sinon";
import { randomUUID } from "crypto";
import { TestIdent } from "../test/objects.js";
import { Ident, OperationContext, Store, User } from "../index.js";
import { Ident, MemoryStore, OperationContext, Store, User } from "../index.js";
import { CoreModel } from "../models/coremodel.js";
import { WebdaApplicationTest } from "../test/application.js";
import { StoreEvents, StoreNotFoundError, UpdateConditionFailError } from "./store.js";
import { StoreEvents, StoreNotFoundError, StoreParameters, UpdateConditionFailError } from "./store.js";
import { UuidModel } from "@webda/models";

/**
Expand Down Expand Up @@ -653,4 +653,101 @@ abstract class StoreTest<T extends Store<any>> extends WebdaApplicationTest {
}
}

@suite
class StoreParametersTest {
@test
acceptsModelsArrayOnly() {
const p = new StoreParameters().load({ models: ["MyApp/User", "MyApp/Task"] });
assert.deepStrictEqual(p.models, ["MyApp/User", "MyApp/Task"]);
}

@test
mapsLegacyModelToModelsArray() {
const p = new StoreParameters().load({ model: "MyApp/User" });
assert.deepStrictEqual(p.models, ["MyApp/User"]);
}

@test
mapsModelPlusAdditionalToFlatArray() {
const p = new StoreParameters().load({
model: "MyApp/User",
additionalModels: ["MyApp/Task", "MyApp/Order"]
});
assert.deepStrictEqual(p.models, ["MyApp/User", "MyApp/Task", "MyApp/Order"]);
}

@test
throwsWhenBothModelAndModelsSet() {
assert.throws(
() => new StoreParameters().load({ model: "MyApp/User", models: ["MyApp/User"] }),
/ambiguous/i
);
}

@test
defaultsToRegistryEntryWhenNeitherSet() {
const p = new StoreParameters().load({});
assert.deepStrictEqual(p.models, ["Webda/RegistryEntry"]);
}

@test
mapsAdditionalModelsAloneToRegistryFallback() {
const p = new StoreParameters().load({ additionalModels: ["MyApp/Task"] });
assert.deepStrictEqual(p.models, ["Webda/RegistryEntry", "MyApp/Task"]);
}

@test
throwsWhenModelsCombinedWithEmptyAdditionalModels() {
assert.throws(
() => new StoreParameters().load({ models: ["X"], additionalModels: [] }),
/ambiguous/i
);
}
}

@suite
class StoreFieldsMigrationTest extends WebdaApplicationTest {
@test
async populatesModelsArrayAndMetadatas() {
const store = new MemoryStore("multi", { models: ["Webda/Ident", "Webda/User"] });
// filterParameters strips unknown fields from the pre-schema-regen module; set models directly
// to exercise computeParameters() via the canonical models[] path (not the legacy shim).
store.getParameters().models = ["Webda/Ident", "Webda/User"];
store.resolve();
assert.strictEqual((store as any)._models.length, 2);
assert.strictEqual((store as any)._modelMetadatas.size, 2);
assert.strictEqual((store as any)._modelsHierarchy["Webda/Ident"], 0);
assert.strictEqual((store as any)._modelsHierarchy["Webda/User"], 0);
assert.strictEqual(store.getModels().length, 2);
}

@test
async getModelReturnsFirstForBackCompat() {
const store = new MemoryStore("primaryModel", { model: "Webda/User" });
store.resolve();
assert.strictEqual(store.getModel()?.name, "User");
}

@test
async walksSubclassHierarchyForNonStrictStore() {
// Webda/User has Webda/SimpleUser as a subclass (verified via webda.module.json).
// In non-strict mode the recursive walk should add the subclass at depth 1.
const store = new MemoryStore("hierarchical", { models: ["Webda/User"] });
store.getParameters().models = ["Webda/User"];
store.resolve();
assert.strictEqual((store as any)._modelsHierarchy["Webda/User"], 0);
assert.strictEqual((store as any)._modelsHierarchy["Webda/SimpleUser"], 1);
}

@test
async strictStoreSkipsSubclassWalk() {
// Same Webda/User parent, but strict: true should not add SimpleUser.
const store = new MemoryStore("strict", { models: ["Webda/User"], strict: true });
store.getParameters().models = ["Webda/User"];
store.resolve();
assert.strictEqual((store as any)._modelsHierarchy["Webda/User"], 0);
assert.strictEqual((store as any)._modelsHierarchy["Webda/SimpleUser"], undefined);
}
}

export { StoreTest };
Loading
Loading