Skip to content

Commit

Permalink
fix(store): resolve to the current state of singleton model for draft…
Browse files Browse the repository at this point in the history
… mode
  • Loading branch information
smalluban committed Mar 8, 2024
1 parent 4232ad7 commit e8bebf2
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 10 deletions.
38 changes: 32 additions & 6 deletions src/store.js
Original file line number Diff line number Diff line change
Expand Up @@ -1028,6 +1028,15 @@ function get(Model, id) {
try {
let result = config.storage.get(id);

if (
!(result instanceof Promise) &&
(result === undefined || typeof result !== "object")
) {
throw TypeError(
`Storage 'get' method must return a Promise, an instance, or null: ${result}`,
);
}

if (typeof result !== "object" || result === null) {
if (offline) offline.set(stringId, null);
throw notFoundError(Model, stringId);
Expand Down Expand Up @@ -1192,9 +1201,22 @@ function set(model, values = {}) {

id = localModel ? localModel.id : model.id;

const result = Promise.resolve(
config.storage.set(isInstance ? id : undefined, localModel, keys),
)
let result = config.storage.set(
isInstance ? id : undefined,
localModel,
keys,
);

if (
!(result instanceof Promise) &&
(result === undefined || typeof result !== "object")
) {
throw TypeError(
`Storage 'set' method must return a Promise, an instance, or null: ${result}`,
);
}

result = Promise.resolve(result)
.then((data) => {
const resultModel =
data === localModel ? localModel : config.create(data);
Expand Down Expand Up @@ -1529,10 +1551,14 @@ function store(Model, options = {}) {
let id = resolveId(host, value) || (value ? value.id : undefined);

if (!id && (value === undefined || value === null)) {
const draftModel = draft.create({});
id = draftModel.id;
if (config.enumerable) {
const draftModel = draft.create({});
id = draftModel.id;

syncCache(draft, draftModel.id, draftModel, false);
syncCache(draft, draftModel.id, draftModel, false);
} else {
clear(draft.model);
}
}

return get(Model, id);
Expand Down
38 changes: 34 additions & 4 deletions test/spec/store.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ describe("store:", () => {
store.get(Model, "1");
expect(() => store.get(Model.nestedArrayOfObjects)).toThrow();
});

it("does not throw when nested array is used as other nested listing", () => {
store.get(Model, "1");
expect(() =>
Expand All @@ -96,6 +95,18 @@ describe("store:", () => {
expect(() => store.get({ nested: [() => {}] })).toThrow();
});

it("set to an error state when get method returning undefined", () => {
Model = {
value: "test",
[store.connect]: {
get: () => undefined,
},
};

const model = store.get(Model);
expect(store.error(model)).toBeInstanceOf(Error);
});

it("returns a placeholder in error state for not defined model", () => {
const model = store.get({ id: true }, "1");
expect(model).toBeInstanceOf(Object);
Expand Down Expand Up @@ -389,6 +400,22 @@ describe("store:", () => {
)
.catch((e) => expect(e).toBeInstanceOf(Error)));

fit("rejects an error when set method returning undefined", () => {
Model = {
value: "test",
[store.connect]: {
get: () => ({}),
set: () => {
return undefined;
},
},
};

return store.set(Model).catch((e) => {
expect(e).toBeInstanceOf(Error);
});
});

it("returns a placeholder in error state for not found singleton model", () => {
Model = {
value: "test",
Expand Down Expand Up @@ -1432,7 +1459,9 @@ describe("store:", () => {
Model = {
value: "test",
[store.connect]: {
get: () => {},
get: () => {
return { value: "test 2" };
},
set: (id, values) => values,
},
};
Expand All @@ -1442,12 +1471,13 @@ describe("store:", () => {
draft: store(Model, { draft: true }),
});
el = document.createElement("test-store-factory-singleton-draft");
expect(el.draft).toEqual({ value: "test" });

expect(el.draft).toEqual({ value: "test 2" });

return store.set(el.draft, { value: "other" }).then(() => {
expect(el.draft).toEqual({ value: "other" });
el.draft = undefined;
expect(el.draft).toEqual({ value: "test" });
expect(el.draft).toEqual({ value: "test 2" });
});
});
});
Expand Down

0 comments on commit e8bebf2

Please sign in to comment.