@osdk/client 2.2.0-beta.3 → 2.2.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/build/browser/Logger.js.map +1 -1
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/internal/ActionApplication.js +102 -0
- package/build/browser/observable/internal/ActionApplication.js.map +1 -0
- package/build/browser/observable/internal/CacheKey.js +38 -1
- package/build/browser/observable/internal/CacheKey.js.map +1 -1
- package/build/browser/observable/internal/CacheKeys.js +4 -4
- package/build/browser/observable/internal/CacheKeys.js.map +1 -1
- package/build/browser/observable/internal/ChangedObjects.js +24 -1
- package/build/browser/observable/internal/ChangedObjects.js.map +1 -1
- package/build/browser/observable/internal/Layer.js +3 -3
- package/build/browser/observable/internal/Layer.js.map +1 -1
- package/build/browser/observable/internal/ListQuery.js +188 -66
- package/build/browser/observable/internal/ListQuery.js.map +1 -1
- package/build/browser/observable/internal/ObjectQuery.js +16 -3
- package/build/browser/observable/internal/ObjectQuery.js.map +1 -1
- package/build/browser/observable/internal/ObservableClientImpl.js +2 -2
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/OptimisticJob.js +30 -29
- package/build/browser/observable/internal/OptimisticJob.js.map +1 -1
- package/build/browser/observable/internal/Query.js +42 -2
- package/build/browser/observable/internal/Query.js.map +1 -1
- package/build/browser/observable/internal/Store.js +259 -126
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/Store.test.js +416 -76
- package/build/browser/observable/internal/Store.test.js.map +1 -1
- package/build/browser/observable/internal/testUtils.js +142 -6
- package/build/browser/observable/internal/testUtils.js.map +1 -1
- package/build/browser/util/UserAgent.js +1 -1
- package/build/cjs/index.cjs +1 -1
- package/build/cjs/public/unstable-do-not-use.cjs +657 -268
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +13 -4
- package/build/esm/Logger.js.map +1 -1
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/internal/ActionApplication.js +102 -0
- package/build/esm/observable/internal/ActionApplication.js.map +1 -0
- package/build/esm/observable/internal/CacheKey.js +38 -1
- package/build/esm/observable/internal/CacheKey.js.map +1 -1
- package/build/esm/observable/internal/CacheKeys.js +4 -4
- package/build/esm/observable/internal/CacheKeys.js.map +1 -1
- package/build/esm/observable/internal/ChangedObjects.js +24 -1
- package/build/esm/observable/internal/ChangedObjects.js.map +1 -1
- package/build/esm/observable/internal/Layer.js +3 -3
- package/build/esm/observable/internal/Layer.js.map +1 -1
- package/build/esm/observable/internal/ListQuery.js +188 -66
- package/build/esm/observable/internal/ListQuery.js.map +1 -1
- package/build/esm/observable/internal/ObjectQuery.js +16 -3
- package/build/esm/observable/internal/ObjectQuery.js.map +1 -1
- package/build/esm/observable/internal/ObservableClientImpl.js +2 -2
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/OptimisticJob.js +30 -29
- package/build/esm/observable/internal/OptimisticJob.js.map +1 -1
- package/build/esm/observable/internal/Query.js +42 -2
- package/build/esm/observable/internal/Query.js.map +1 -1
- package/build/esm/observable/internal/Store.js +259 -126
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/Store.test.js +416 -76
- package/build/esm/observable/internal/Store.test.js.map +1 -1
- package/build/esm/observable/internal/testUtils.js +142 -6
- package/build/esm/observable/internal/testUtils.js.map +1 -1
- package/build/esm/util/UserAgent.js +1 -1
- package/build/types/Logger.d.ts +1 -2
- package/build/types/Logger.d.ts.map +1 -1
- package/build/types/observable/ObservableClient.d.ts +10 -3
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/internal/ActionApplication.d.ts +9 -0
- package/build/types/observable/internal/ActionApplication.d.ts.map +1 -0
- package/build/types/observable/internal/CacheKeys.d.ts +2 -1
- package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
- package/build/types/observable/internal/ChangedObjects.d.ts +6 -2
- package/build/types/observable/internal/ChangedObjects.d.ts.map +1 -1
- package/build/types/observable/internal/Layer.d.ts +1 -1
- package/build/types/observable/internal/Layer.d.ts.map +1 -1
- package/build/types/observable/internal/ListQuery.d.ts +18 -17
- package/build/types/observable/internal/ListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/ObjectQuery.d.ts +3 -3
- package/build/types/observable/internal/ObjectQuery.d.ts.map +1 -1
- package/build/types/observable/internal/OptimisticJob.d.ts +2 -2
- package/build/types/observable/internal/OptimisticJob.d.ts.map +1 -1
- package/build/types/observable/internal/Query.d.ts +6 -5
- package/build/types/observable/internal/Query.d.ts.map +1 -1
- package/build/types/observable/internal/Store.d.ts +47 -19
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/testUtils.d.ts +13 -3
- package/build/types/observable/internal/testUtils.d.ts.map +1 -1
- package/package.json +8 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.test.js","names":["$ontologyRid","createOffice","Employee","Todo","apiServer","afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","vitest","createClient","createOptimisticId","Store","applyCustomMatchers","createClientMockHelper","createDefer","expectSingleListCallAndClear","expectSingleObjectCallAndClear","listPayloadContaining","mockListSubCallback","mockSingleSubCallback","objectPayloadContaining","waitForCall","defer","setConfig","fakeTimers","toFake","resetConfig","ANY_INIT_ENTRY","object","undefined","lastUpdated","status","client","cache","employeesAsServerReturns","mutatedEmployees","listen","fetchPage","data","$clone","fullName","slice","close","emp","getObject","$primaryKey","toBeUndefined","result","updateObject","toBe","toEqual","updatedEmpFromCache","not","subFn","observeObject","mode","optimisticId","removeLayer","useFakeTimers","updateList","empSubFn","listSubFn","observeList","optimisticEmployee","truthUpdatedEmployee","toHaveBeenCalled","useRealTimers","toHaveBeenCalledExactlyOnceWith","mockClear","staleEmp","invalidateObject","waitFor","subListFn","resolvedList","invalidateList","invalidateObjectType","subFn1","subFn2","likeEmployee50030","objectContaining","isOptimistic","firstLoad","mock","lastCall","s","toBeGreaterThan","sub","unsubscribe","toHaveBeenCalledTimes","calls","listSub1","mockReset","runOnlyPendingTimers","employeeId","$gt","listSub","pageSize","fetchMore","toHaveBeenCalledWith","mockClient","mockFetchOneOnce","resolve","$apiName","todoSubFn","expectLoadingAndLoaded","loading","loaded","mockApplyActionOnce","addedObjects","objectType","primaryKey","text","actionPromise","applyAction","officeId","fauxObject","$objectType","$title","applyActionResult","optimisticUpdate","ctx","someValue","reject","rejects","toThrow","store","baseObjects","map","i","cacheKeys","obj","getCacheKey","layerIds","batch","write"],"sources":["Store.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Osdk } from \"@osdk/api\";\nimport {\n $ontologyRid,\n createOffice,\n Employee,\n Todo,\n} from \"@osdk/client.test.ontology\";\nimport { apiServer } from \"@osdk/shared.test\";\nimport type { Mock } from \"vitest\";\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n vitest,\n} from \"vitest\";\nimport type { Client } from \"../../Client.js\";\nimport { createClient } from \"../../createClient.js\";\nimport type { Unsubscribable } from \"../ObservableClient.js\";\nimport { createOptimisticId } from \"./OptimisticId.js\";\nimport { Store } from \"./Store.js\";\nimport type { MockClientHelper } from \"./testUtils.js\";\nimport {\n applyCustomMatchers,\n createClientMockHelper,\n createDefer,\n expectSingleListCallAndClear,\n expectSingleObjectCallAndClear,\n listPayloadContaining,\n mockListSubCallback,\n mockSingleSubCallback,\n objectPayloadContaining,\n waitForCall,\n} from \"./testUtils.js\";\n\nconst defer = createDefer();\n\nbeforeAll(() => {\n vi.setConfig({\n fakeTimers: {\n toFake: [\n \"setTimeout\",\n \"clearTimeout\",\n \"Date\",\n \"setInterval\",\n \"clearInterval\",\n ],\n },\n });\n});\nafterAll(() => {\n vi.resetConfig();\n});\n\nconst ANY_INIT_ENTRY = {\n // cacheKey: expect.any(Object),\n object: undefined,\n lastUpdated: 0,\n status: \"init\",\n};\n\napplyCustomMatchers();\n\ndescribe(Store, () => {\n describe(\"with mock server\", () => {\n let client: Client;\n let cache: Store;\n\n let employeesAsServerReturns: Osdk.Instance<Employee>[];\n let mutatedEmployees: Osdk.Instance<Employee>[];\n\n beforeAll(async () => {\n apiServer.listen();\n client = createClient(\n \"https://stack.palantir.com\",\n $ontologyRid,\n async () => \"myAccessToken\",\n );\n\n employeesAsServerReturns = (await client(Employee).fetchPage()).data;\n mutatedEmployees = [\n employeesAsServerReturns[0],\n employeesAsServerReturns[1].$clone({\n fullName: \"foo\",\n }),\n ...employeesAsServerReturns.slice(2),\n ];\n });\n\n afterAll(() => {\n apiServer.close();\n });\n\n beforeEach(() => {\n cache = new Store(client);\n });\n\n afterEach(() => {\n cache = undefined!;\n });\n\n it(\"basic single object works\", async () => {\n const emp = employeesAsServerReturns[0];\n\n // starts empty\n expect(\n cache.getObject(Employee, emp.$primaryKey),\n ).toBeUndefined();\n\n const result = cache.updateObject(Employee, emp);\n expect(emp).toBe(result);\n\n // getting the object now matches the result\n expect(cache.getObject(Employee, emp.$primaryKey)).toEqual(\n result,\n );\n\n const updatedEmpFromCache = cache.updateObject(\n Employee,\n emp.$clone({ fullName: \"new name\" }),\n );\n expect(updatedEmpFromCache).not.toBe(emp);\n\n // getting it again is the updated object\n expect(cache.getObject(Employee, emp.$primaryKey)).toEqual(\n updatedEmpFromCache,\n );\n });\n\n describe(\"optimistic updates\", () => {\n it(\"rolls back objects\", async () => {\n const emp = employeesAsServerReturns[0];\n cache.updateObject(Employee, emp); // pre-seed the cache with the \"real\" value\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n\n const optimisticId = createOptimisticId();\n // update with an optimistic write\n cache.updateObject(Employee, emp.$clone({ fullName: \"new name\" }), {\n optimisticId,\n });\n expectSingleObjectCallAndClear(\n subFn,\n emp.$clone({ fullName: \"new name\" }),\n \"loaded\",\n );\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n });\n\n it(\"rolls back to an updated real value\", async () => {\n vi.useFakeTimers();\n\n // pre-seed the cache with the \"real\" value\n cache.updateList(Employee, {}, employeesAsServerReturns);\n\n const emp = employeesAsServerReturns[0];\n\n const empSubFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n empSubFn,\n ),\n );\n\n expectSingleObjectCallAndClear(empSubFn, emp, \"loaded\");\n\n const listSubFn = mockListSubCallback();\n defer(\n cache.observeList(Employee, {}, { mode: \"offline\" }, listSubFn),\n );\n\n expectSingleListCallAndClear(listSubFn, employeesAsServerReturns);\n\n const optimisticEmployee = emp.$clone({ fullName: \"new name\" });\n\n const optimisticId = createOptimisticId();\n\n // update with an optimistic write\n cache.updateObject(Employee, optimisticEmployee, {\n optimisticId,\n });\n\n // expect optimistic write\n expectSingleObjectCallAndClear(empSubFn, optimisticEmployee);\n\n // expect optimistic write to the list\n expectSingleListCallAndClear(\n listSubFn,\n [\n optimisticEmployee,\n ...employeesAsServerReturns.slice(1),\n ],\n );\n\n // write the real update, via the earlier list definition\n const truthUpdatedEmployee = emp.$clone({\n fullName: \"real update\",\n });\n cache.updateList(Employee, {}, [truthUpdatedEmployee]);\n\n // we shouldn't expect an update because the top layer has a value\n expect(empSubFn).not.toHaveBeenCalled();\n\n // we do get an update to the list but we still see the optimistic value\n // for the object\n expectSingleListCallAndClear(listSubFn, [optimisticEmployee]);\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n // see the object observation get updated\n expectSingleObjectCallAndClear(empSubFn, truthUpdatedEmployee);\n\n // see the list get updated\n expectSingleListCallAndClear(listSubFn, [truthUpdatedEmployee]);\n\n vi.useRealTimers();\n });\n\n it(\"rolls back to an updated real value via list\", async () => {\n const emp = employeesAsServerReturns[0];\n cache.updateObject(Employee, emp); // pre-seed the cache with the \"real\" value\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: emp,\n status: \"loaded\",\n }),\n );\n subFn.mockClear();\n\n const optimisticEmployee = emp.$clone({ fullName: \"new name\" });\n\n // update with an optimistic write\n const optimisticId = createOptimisticId();\n cache.updateObject(Employee, optimisticEmployee, {\n optimisticId,\n });\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: optimisticEmployee,\n }),\n );\n subFn.mockClear();\n\n const truthUpdatedEmployee = emp.$clone({\n fullName: \"real update\",\n });\n cache.updateObject(Employee, truthUpdatedEmployee);\n\n // we shouldn't expect an update because the top layer has a value\n expect(subFn).not.toHaveBeenCalled();\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: truthUpdatedEmployee,\n }),\n );\n });\n });\n\n describe(\".invalidateObject\", () => {\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n cache.updateObject(Employee, staleEmp);\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: staleEmp,\n status: \"loaded\",\n }),\n );\n subFn.mockClear();\n\n // invalidate\n void cache.invalidateObject(Employee, staleEmp.$primaryKey);\n\n await vi.waitFor(() => expect(subFn).toHaveBeenCalled());\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: staleEmp,\n status: \"loading\",\n }),\n );\n subFn.mockClear();\n\n await vi.waitFor(() => expect(subFn).toHaveBeenCalled());\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: emp,\n }),\n );\n });\n });\n\n describe(\".invalidateList\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n cache.updateList(Employee, {}, [staleEmp]);\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expectSingleObjectCallAndClear(subFn, staleEmp);\n\n const subListFn = mockListSubCallback();\n defer(cache.observeList(Employee, {}, { mode: \"offline\" }, subListFn));\n\n await vi.waitFor(() => expect(subListFn).toHaveBeenCalled());\n expect(subListFn).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: [staleEmp],\n status: \"loaded\",\n }),\n );\n subListFn.mockClear();\n\n cache.invalidateList(Employee, {});\n\n await vi.waitFor(() => expect(subListFn).toHaveBeenCalled());\n expect(subListFn).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: [staleEmp],\n status: \"loading\",\n }),\n );\n subListFn.mockClear();\n\n await vi.waitFor(() => expect(subListFn).toHaveBeenCalled());\n expect(subListFn).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns,\n }),\n );\n subListFn.mockClear();\n\n await vi.waitFor(() => expect(subFn).toHaveBeenCalled());\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n status: \"loaded\",\n object: emp,\n }),\n );\n });\n });\n\n describe(\".invalidateObjectType\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n cache.updateList(Employee, {}, [staleEmp]);\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expectSingleObjectCallAndClear(subFn, staleEmp);\n\n const subListFn = mockListSubCallback();\n defer(cache.observeList(Employee, {}, { mode: \"offline\" }, subListFn));\n\n await vi.waitFor(() => expect(subListFn).toHaveBeenCalled());\n expect(subListFn).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: [staleEmp],\n status: \"loaded\",\n }),\n );\n subListFn.mockClear();\n\n cache.invalidateObjectType(Employee);\n\n await vi.waitFor(() => expect(subListFn).toHaveBeenCalled());\n expect(subListFn).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: [staleEmp],\n status: \"loading\",\n }),\n );\n subListFn.mockClear();\n\n await vi.waitFor(() => expect(subListFn).toHaveBeenCalled());\n expect(subListFn).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns,\n }),\n );\n subListFn.mockClear();\n\n await vi.waitFor(() => expect(subFn).toHaveBeenCalled());\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n status: \"loaded\",\n object: emp,\n }),\n );\n });\n });\n\n describe(\".observeObject (force)\", () => {\n const subFn1 = mockSingleSubCallback();\n const subFn2 = mockSingleSubCallback();\n\n beforeEach(async () => {\n subFn1.mockClear();\n subFn2.mockClear();\n });\n\n const likeEmployee50030 = expect.objectContaining({\n $primaryKey: 50030,\n fullName: \"John Doe\",\n });\n\n it(\"fetches and updates twice\", async () => {\n defer(\n cache.observeObject(Employee, 50030, { mode: \"force\" }, subFn1),\n );\n expect(subFn1).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n isOptimistic: false,\n }),\n );\n\n subFn1.mockClear();\n\n await vi.waitFor(() => expect(subFn1).toHaveBeenCalled());\n expect(subFn1).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: likeEmployee50030,\n isOptimistic: false,\n }),\n );\n\n const firstLoad = subFn1.mock.lastCall?.[0]!;\n\n subFn1.mockClear();\n\n defer(\n cache.observeObject(Employee, 50030, { mode: \"force\" }, subFn2),\n );\n expect(subFn1).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({ status: \"loading\" }),\n );\n subFn1.mockClear();\n\n // should be the earlier results\n expect(subFn2).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({ status: \"loading\" }),\n );\n subFn2.mockClear();\n\n // both will be updated\n for (const s of [subFn1, subFn2]) {\n // wait for the result to come in\n await vi.waitFor(() => expect(s).toHaveBeenCalled());\n\n expect(s).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n ...firstLoad,\n lastUpdated: expect.toBeGreaterThan(firstLoad.lastUpdated),\n }),\n );\n\n s.mockClear();\n }\n });\n });\n\n describe(\".observeObject (offline)\", () => {\n const subFn = mockSingleSubCallback();\n let sub: Unsubscribable;\n\n beforeEach(() => {\n subFn.mockClear();\n\n sub = defer(\n cache.observeObject(Employee, 50030, { mode: \"offline\" }, subFn),\n );\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(objectPayloadContaining({\n status: \"init\",\n object: undefined,\n }));\n subFn.mockClear();\n });\n\n it(\"does basic observation and unsubscribe\", async () => {\n const emp = employeesAsServerReturns[0];\n\n // force an update\n cache.updateObject(Employee, emp);\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({ object: emp }),\n );\n subFn.mockClear();\n\n // force again\n cache.updateObject(Employee, emp.$clone({ fullName: \"new name\" }));\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: expect.objectContaining({ fullName: \"new name\" }),\n }),\n );\n subFn.mockClear();\n\n sub.unsubscribe();\n\n // force again but no subscription update\n cache.updateObject(\n Employee,\n emp.$clone({ fullName: \"new name 2\" }),\n );\n expect(subFn).not.toHaveBeenCalled();\n });\n\n it(\"observes with list update\", async () => {\n const emp = employeesAsServerReturns[0];\n\n // force an update\n cache.updateObject(Employee, emp.$clone({ fullName: \"not the name\" }));\n expect(subFn).toHaveBeenCalledTimes(1);\n\n cache.updateList(Employee, {}, employeesAsServerReturns);\n expect(subFn).toHaveBeenCalledTimes(2);\n\n expect(subFn.mock.calls[1][0]).toEqual(\n objectPayloadContaining({ object: emp }),\n );\n });\n });\n\n describe(\".observeList\", () => {\n const listSub1 = mockListSubCallback();\n\n beforeEach(() => {\n vi.useFakeTimers({});\n listSub1.mockReset();\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n describe(\"mode=force\", () => {\n it(\"initial load\", async () => {\n defer(\n cache.observeList(Employee, {}, { mode: \"force\" }, listSub1),\n );\n vitest.runOnlyPendingTimers();\n await vi.waitFor(() => expect(listSub1).toHaveBeenCalled());\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n status: \"loading\",\n resolvedList: [],\n }),\n );\n listSub1.mockClear();\n\n await vi.waitFor(() => expect(listSub1).toHaveBeenCalled());\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns,\n status: \"loaded\",\n }),\n );\n });\n\n it(\"subsequent load\", async () => {\n // Pre-seed with data the server doesn't return\n cache.updateList(Employee, {}, mutatedEmployees);\n\n defer(\n cache.observeList(Employee, {}, { mode: \"force\" }, listSub1),\n );\n\n await vi.waitFor(() => expect(listSub1).toHaveBeenCalled());\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: mutatedEmployees,\n status: \"loading\",\n }),\n );\n const firstLoad = listSub1.mock.calls[0][0]!;\n listSub1.mockClear();\n\n await vi.waitFor(() => expect(listSub1).toHaveBeenCalled());\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns,\n status: \"loaded\",\n lastUpdated: expect.toBeGreaterThan(\n firstLoad.lastUpdated,\n ),\n }),\n );\n listSub1.mockClear();\n });\n });\n\n describe(\"mode = offline\", () => {\n it(\"updates with list updates\", async () => {\n defer(\n cache.observeList(Employee, {}, { mode: \"offline\" }, listSub1),\n );\n expect(listSub1).toHaveBeenCalledTimes(0);\n\n cache.updateList(Employee, {}, employeesAsServerReturns);\n vitest.runOnlyPendingTimers();\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({ resolvedList: employeesAsServerReturns }),\n );\n listSub1.mockClear();\n\n // list is just now one object\n cache.updateList(Employee, {}, [employeesAsServerReturns[0]]);\n vitest.runOnlyPendingTimers();\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: [employeesAsServerReturns[0]],\n }),\n );\n });\n\n it(\"updates with different list updates\", async () => {\n defer(\n cache.observeList(Employee, {}, { mode: \"offline\" }, listSub1),\n );\n\n expect(listSub1).toHaveBeenCalledTimes(0);\n\n cache.updateList(Employee, {}, employeesAsServerReturns);\n vitest.runOnlyPendingTimers();\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({ resolvedList: employeesAsServerReturns }),\n );\n listSub1.mockClear();\n\n // new where === different list\n cache.updateList(\n Employee,\n { employeeId: { $gt: 0 } },\n mutatedEmployees,\n );\n vitest.runOnlyPendingTimers();\n\n // original list updates still\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: mutatedEmployees,\n }),\n );\n });\n });\n });\n\n describe(\".fetchMore\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"works in the solo case\", async () => {\n const listSub = mockListSubCallback();\n defer(cache.observeList(\n Employee,\n {},\n { mode: \"force\", pageSize: 1 },\n listSub,\n ));\n\n expect(listSub).not.toHaveBeenCalled();\n await vi.waitFor(() => expect(listSub).toHaveBeenCalled());\n\n expect(listSub).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n status: \"loading\",\n }),\n );\n listSub.mockClear();\n await vi.waitFor(() => expect(listSub).toHaveBeenCalled());\n\n expect(listSub).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns.slice(0, 1),\n status: \"loaded\",\n }),\n );\n const { fetchMore } = listSub.mock.calls[0][0]!;\n listSub.mockClear();\n\n void fetchMore();\n\n await vi.waitFor(() => expect(listSub).toHaveBeenCalledTimes(1));\n expect(listSub).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns.slice(0, 1),\n status: \"loading\",\n }),\n );\n listSub.mockClear();\n\n await vi.waitFor(() => expect(listSub).toHaveBeenCalledTimes(1));\n expect(listSub).toHaveBeenCalledWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns.slice(0, 2),\n status: \"loaded\",\n }),\n );\n });\n });\n });\n\n describe(\"with mock client\", () => {\n let client: Mock<Client> & Client;\n let mockClient: MockClientHelper;\n let cache: Store;\n\n let employeesAsServerReturns: Osdk.Instance<Employee>[];\n let mutatedEmployees: Osdk.Instance<Employee>[];\n\n beforeEach(async () => {\n mockClient = createClientMockHelper();\n client = mockClient.client;\n cache = new Store(client);\n });\n\n describe(\"actions\", () => {\n it(\"properly invalidates objects\", async () => {\n // after the below `observeObject`, the cache will need to load from the server\n mockClient.mockFetchOneOnce().resolve({\n $apiName: \"Todo\",\n });\n\n const todoSubFn = mockSingleSubCallback();\n defer(cache.observeObject(Todo, 0, {}, todoSubFn));\n\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n }),\n loaded: objectPayloadContaining({\n object: expect.objectContaining({\n $primaryKey: 0,\n }),\n }),\n });\n\n // at this point we have an observation properly set up\n mockClient.mockApplyActionOnce().resolve({\n addedObjects: [{\n objectType: \"Todo\",\n primaryKey: 0,\n }],\n });\n\n // after we apply the action, the object is invalidated and gets re-requested\n\n mockClient.mockFetchOneOnce<Todo>().resolve({\n $apiName: \"Todo\",\n text: \"hello there kind sir\",\n });\n\n const actionPromise = cache.applyAction(createOffice, {\n officeId: \"whatever\",\n });\n\n await actionPromise;\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n }),\n loaded: objectPayloadContaining({\n object: expect.objectContaining({\n text: \"hello there kind sir\",\n }),\n }),\n });\n });\n\n it(\"rolls back optimistic updates on error\", async () => {\n const fauxObject = {\n $apiName: \"Todo\",\n $objectType: \"Todo\",\n $primaryKey: 0,\n $title: \"does not matter\",\n } as Osdk.Instance<Todo>;\n\n // after the below `observeObject`, the cache will need to load from the server\n mockClient.mockFetchOneOnce<Todo>()\n .resolve(fauxObject);\n\n const todoSubFn = mockSingleSubCallback();\n defer(\n cache.observeObject(Todo, 0, {}, todoSubFn),\n );\n\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n isOptimistic: false,\n }),\n loaded: objectPayloadContaining({\n object: fauxObject,\n status: \"loaded\",\n isOptimistic: false,\n }),\n });\n\n // at this point we have an observation properly set up\n const applyActionResult = mockClient.mockApplyActionOnce();\n\n const actionPromise = cache.applyAction(createOffice, {\n officeId: \"whatever\",\n }, {\n optimisticUpdate: (ctx) => {\n ctx.updateObject({ ...fauxObject, someValue: \"optimistic\" });\n },\n });\n\n await waitForCall(todoSubFn, 1);\n expect(todoSubFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: {\n ...fauxObject,\n someValue: \"optimistic\",\n },\n status: \"loading\",\n isOptimistic: true,\n }),\n );\n todoSubFn.mockClear();\n\n // let the action error out\n applyActionResult.reject(\"an error thrown\");\n await expect(actionPromise).rejects.toThrow(\"an error thrown\");\n\n // back to the original object\n await waitForCall(todoSubFn, 1);\n expect(todoSubFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: fauxObject,\n status: \"loaded\",\n isOptimistic: false,\n }),\n );\n });\n });\n });\n\n describe(\"layers\", () => {\n it(\"properly remove\", () => {\n const store = new Store({} as any);\n\n const baseObjects = [1, 2].map((i) => ({\n $primaryKey: i,\n $objectType: \"Employee\",\n $apiName: \"Employee\",\n $title: `truth ${i}`,\n } as Osdk.Instance<Employee>));\n\n const cacheKeys = baseObjects.map((obj) =>\n store.getCacheKey(\"object\", \"Employee\", obj.$primaryKey)\n );\n\n // set the truth\n for (const obj of baseObjects) {\n store.updateObject(\"Employee\", obj);\n }\n\n // expect the truth\n for (const obj of baseObjects) {\n expect(store.getObject(\"Employee\", obj.$primaryKey)).toEqual(\n expect.objectContaining({ $title: `truth ${obj.$primaryKey}` }),\n );\n }\n\n const layerIds = [1, 2].map(createOptimisticId);\n\n // optimistically set the objects in their own layers\n for (let i = 0; i < 2; i++) {\n store.batch({ optimisticId: layerIds[i] }, (batch) => {\n batch.write(\n cacheKeys[i],\n {\n ...baseObjects[i],\n $title: `optimistic ${baseObjects[i].$primaryKey}`,\n },\n \"loading\",\n );\n });\n }\n\n // expect the optimistic values\n for (let i = 0; i < 2; i++) {\n expect(store.getObject(\"Employee\", baseObjects[i].$primaryKey)).toEqual(\n expect.objectContaining({\n $title: `optimistic ${baseObjects[i].$primaryKey}`,\n }),\n );\n }\n\n // remove the first layer\n store.removeLayer(layerIds[0]);\n\n // should have truth object 1 and optimistic object 2\n expect(store.getObject(\"Employee\", 1)).toEqual(\n expect.objectContaining({ $title: \"truth 1\" }),\n );\n expect(store.getObject(\"Employee\", 2)).toEqual(\n expect.objectContaining({ $title: \"optimistic 2\" }),\n );\n\n // remove the second layer\n store.removeLayer(layerIds[1]);\n\n // should have truth objects\n for (const obj of baseObjects) {\n expect(store.getObject(\"Employee\", obj.$primaryKey)).toEqual(\n expect.objectContaining({ $title: `truth ${obj.$primaryKey}` }),\n );\n }\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Store.test.js","names":["$ontologyRid","createOffice","Employee","Todo","apiServer","chalk","afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","vitest","createClient","createOptimisticId","runOptimisticJob","Store","applyCustomMatchers","createClientMockHelper","createDefer","createTestLogger","expectSingleListCallAndClear","expectSingleObjectCallAndClear","listPayloadContaining","mockListSubCallback","mockSingleSubCallback","objectPayloadContaining","waitForCall","defer","setConfig","fakeTimers","toFake","resetConfig","ANY_INIT_ENTRY","object","undefined","lastUpdated","status","fullTaskName","task","suite","name","x","console","log","bgRed","white","testStage","s","bgYellow","client","cache","employeesAsServerReturns","mutatedEmployees","listen","logger","fetchPage","data","$clone","fullName","slice","close","emp","getObject","$primaryKey","toBeUndefined","result","updateObject","toBe","toEqual","updatedEmpFromCache","not","subFn","observeObject","mode","optimisticId","removeLayer","updateList","objectType","where","orderBy","empSubFn","listSubFn","observeList","optimisticEmployee","toHaveBeenCalled","isOptimistic","truthUpdatedEmployee","useRealTimers","toHaveBeenCalledExactlyOnceWith","mockClear","staleEmp","invalidateObject","waitFor","useFakeTimers","subListFn","invalidateList","pInvalidateComplete","invalidateObjectType","resolvedList","subFn1","subFn2","likeEmployee50030","objectContaining","firstLoad","mock","lastCall","toBeGreaterThan","sub","unsubscribe","toHaveBeenCalledTimes","calls","listSub1","mockReset","runOnlyPendingTimers","employeeId","$gt","listSub","pageSize","fetchMore","toHaveBeenCalledWith","mockClient","store","mockFetchOneOnce","resolve","$apiName","todoSubFn","expectLoadingAndLoaded","loading","loaded","mockApplyActionOnce","addedObjects","primaryKey","text","actionPromise","applyAction","officeId","fauxObject","$objectType","$title","applyActionResult","optimisticUpdate","ctx","someValue","reject","rejects","toThrow","nextPk","fauxObjectA","fauxObjectB","fauxObjectC","noWhereNoOrderBy","noWhereOrderByText","subListUnordered","subListOrdered","optimisticallyMutatedA","pkForOptimistic","optimisticallyCreatedObjectD","id","mockObjectFactory2Once","removeOptimisticResult","b","createObject","createdObjectD","mockedApplyAction","modifiedObjectA","modifiedObjects","clientHelper","baseObjects","map","i","cacheKeys","obj","getCacheKey","layerIds","batch","write"],"sources":["Store.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Osdk } from \"@osdk/api\";\nimport {\n $ontologyRid,\n createOffice,\n Employee,\n Todo,\n} from \"@osdk/client.test.ontology\";\nimport { apiServer } from \"@osdk/shared.test\";\nimport chalk from \"chalk\";\nimport type { Mock, Task } from \"vitest\";\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n vitest,\n} from \"vitest\";\nimport { type Client } from \"../../Client.js\";\nimport { createClient } from \"../../createClient.js\";\nimport type { Unsubscribable } from \"../ObservableClient.js\";\nimport { createOptimisticId } from \"./OptimisticId.js\";\nimport { runOptimisticJob } from \"./OptimisticJob.js\";\nimport { Store } from \"./Store.js\";\nimport type { MockClientHelper } from \"./testUtils.js\";\nimport {\n applyCustomMatchers,\n createClientMockHelper,\n createDefer,\n createTestLogger,\n expectSingleListCallAndClear,\n expectSingleObjectCallAndClear,\n listPayloadContaining,\n mockListSubCallback,\n mockSingleSubCallback,\n objectPayloadContaining,\n waitForCall,\n} from \"./testUtils.js\";\n\nconst defer = createDefer();\n\nbeforeAll(() => {\n vi.setConfig({\n fakeTimers: {\n toFake: [\n \"setTimeout\",\n \"clearTimeout\",\n \"Date\",\n \"setInterval\",\n \"clearInterval\",\n ],\n },\n });\n});\nafterAll(() => {\n vi.resetConfig();\n});\n\nconst ANY_INIT_ENTRY = {\n // cacheKey: expect.any(Object),\n object: undefined,\n lastUpdated: 0,\n status: \"init\",\n};\n\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nfunction fullTaskName(task?: Task): string {\n return task ? `${fullTaskName(task.suite)} > ${task.name}` : \"\";\n}\n\nbeforeEach((x) => {\n console.log(\n chalk.bgRed(chalk.white(fullTaskName(x.task))),\n );\n});\n\n// helper method to make debugging tests easier\nfunction testStage(s: string) {\n console.log(chalk.bgYellow(`Test Stage: ${s}`));\n}\n\napplyCustomMatchers();\n\ndescribe(Store, () => {\n describe(\"with mock server\", () => {\n let client: Client;\n let cache: Store;\n\n let employeesAsServerReturns: Osdk.Instance<Employee>[];\n let mutatedEmployees: Osdk.Instance<Employee>[];\n\n beforeAll(async () => {\n apiServer.listen();\n client = createClient(\n \"https://stack.palantir.com\",\n $ontologyRid,\n async () => \"myAccessToken\",\n { logger: createTestLogger({}) },\n );\n\n employeesAsServerReturns = (await client(Employee).fetchPage()).data;\n mutatedEmployees = [\n employeesAsServerReturns[0],\n employeesAsServerReturns[1].$clone({\n fullName: \"foo\",\n }),\n ...employeesAsServerReturns.slice(2),\n ];\n });\n\n afterAll(() => {\n apiServer.close();\n });\n\n beforeEach(() => {\n cache = new Store(client);\n });\n\n afterEach(() => {\n cache = undefined!;\n });\n\n it(\"basic single object works\", async () => {\n const emp = employeesAsServerReturns[0];\n\n // starts empty\n expect(\n cache.getObject(Employee, emp.$primaryKey),\n ).toBeUndefined();\n\n const result = cache.updateObject(Employee, emp);\n expect(emp).toBe(result);\n\n // getting the object now matches the result\n expect(cache.getObject(Employee, emp.$primaryKey)).toEqual(\n result,\n );\n\n const updatedEmpFromCache = cache.updateObject(\n Employee,\n emp.$clone({ fullName: \"new name\" }),\n );\n expect(updatedEmpFromCache).not.toBe(emp);\n\n // getting it again is the updated object\n expect(cache.getObject(Employee, emp.$primaryKey)).toEqual(\n updatedEmpFromCache,\n );\n });\n\n describe(\"optimistic updates\", () => {\n it(\"rolls back objects\", async () => {\n const emp = employeesAsServerReturns[0];\n cache.updateObject(Employee, emp); // pre-seed the cache with the \"real\" value\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n\n const optimisticId = createOptimisticId();\n // update with an optimistic write\n cache.updateObject(Employee, emp.$clone({ fullName: \"new name\" }), {\n optimisticId,\n });\n expectSingleObjectCallAndClear(\n subFn,\n emp.$clone({ fullName: \"new name\" }),\n \"loaded\",\n );\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n });\n\n it(\"rolls back to an updated real value\", async () => {\n // pre-seed the cache with the \"real\" value\n cache.updateList({\n objectType: Employee,\n where: {},\n orderBy: {},\n }, employeesAsServerReturns);\n\n const emp = employeesAsServerReturns[0];\n\n const empSubFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n empSubFn,\n ),\n );\n\n expectSingleObjectCallAndClear(empSubFn, emp, \"loaded\");\n\n const listSubFn = mockListSubCallback();\n defer(\n cache.observeList({\n objectType: Employee,\n mode: \"offline\",\n }, listSubFn),\n );\n\n await waitForCall(listSubFn, 1);\n expectSingleListCallAndClear(listSubFn, employeesAsServerReturns);\n\n const optimisticEmployee = emp.$clone({ fullName: \"new name\" });\n\n const optimisticId = createOptimisticId();\n\n testStage(\"optimistic update\");\n expect(listSubFn).not.toHaveBeenCalled();\n\n // update with an optimistic write\n cache.updateObject(Employee, optimisticEmployee, {\n optimisticId,\n });\n\n testStage(\"after optimistic update\");\n\n // expect optimistic write\n expectSingleObjectCallAndClear(empSubFn, optimisticEmployee);\n\n // expect optimistic write to the list\n await waitForCall(listSubFn, 1);\n expectSingleListCallAndClear(\n listSubFn,\n [\n optimisticEmployee,\n ...employeesAsServerReturns.slice(1),\n ],\n {\n isOptimistic: true,\n status: \"loading\",\n },\n );\n\n // write the real update, via the earlier list definition\n const truthUpdatedEmployee = emp.$clone({\n fullName: \"real update\",\n });\n\n testStage(\"write real update\");\n\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n [truthUpdatedEmployee],\n );\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n // see the object observation get updated\n expectSingleObjectCallAndClear(\n empSubFn,\n truthUpdatedEmployee,\n \"loaded\",\n );\n\n // see the list get updated\n await waitForCall(listSubFn, 1);\n expectSingleListCallAndClear(listSubFn, [truthUpdatedEmployee], {\n status: \"loaded\",\n isOptimistic: false,\n });\n\n vi.useRealTimers();\n });\n\n it(\"rolls back to an updated real value via list\", async () => {\n const emp = employeesAsServerReturns[0];\n cache.updateObject(Employee, emp); // pre-seed the cache with the \"real\" value\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: emp,\n status: \"loaded\",\n }),\n );\n subFn.mockClear();\n\n const optimisticEmployee = emp.$clone({ fullName: \"new name\" });\n\n // update with an optimistic write\n const optimisticId = createOptimisticId();\n cache.updateObject(Employee, optimisticEmployee, {\n optimisticId,\n });\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: optimisticEmployee,\n }),\n );\n subFn.mockClear();\n\n const truthUpdatedEmployee = emp.$clone({\n fullName: \"real update\",\n });\n cache.updateObject(Employee, truthUpdatedEmployee);\n\n // we shouldn't expect an update because the top layer has a value\n expect(subFn).not.toHaveBeenCalled();\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: truthUpdatedEmployee,\n }),\n );\n });\n });\n\n describe(\".invalidateObject\", () => {\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n cache.updateObject(Employee, staleEmp);\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: staleEmp,\n status: \"loaded\",\n }),\n );\n subFn.mockClear();\n\n // invalidate\n void cache.invalidateObject(Employee, staleEmp.$primaryKey);\n\n await vi.waitFor(() => expect(subFn).toHaveBeenCalled());\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: staleEmp,\n status: \"loading\",\n }),\n );\n subFn.mockClear();\n\n await vi.waitFor(() => expect(subFn).toHaveBeenCalled());\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: emp,\n }),\n );\n });\n });\n\n describe(\".invalidateList\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n [staleEmp],\n );\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expectSingleObjectCallAndClear(subFn, staleEmp);\n\n const subListFn = mockListSubCallback();\n defer(\n cache.observeList({\n objectType: Employee,\n mode: \"offline\",\n }, subListFn),\n );\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n [staleEmp],\n { status: \"loaded\" },\n );\n\n testStage(\"invalidate\");\n\n cache.invalidateList({ objectType: Employee });\n testStage(\"check invalidate\");\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n [staleEmp],\n { status: \"loading\" },\n );\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n employeesAsServerReturns,\n { status: \"loaded\" },\n );\n\n await waitForCall(subFn, 1);\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n });\n });\n\n describe(\".invalidateObjectType\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n [staleEmp],\n );\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expectSingleObjectCallAndClear(subFn, staleEmp);\n\n const subListFn = mockListSubCallback();\n defer(\n cache.observeList({\n objectType: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, subListFn),\n );\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n [staleEmp],\n { status: \"loaded\" },\n );\n\n testStage(\"invalidate\");\n\n const pInvalidateComplete = cache.invalidateObjectType(\n Employee,\n undefined,\n );\n\n await waitForCall(subListFn, 1);\n expect(subListFn).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: [staleEmp],\n status: \"loading\",\n }),\n );\n subListFn.mockClear();\n\n await vi.waitFor(() => expect(subListFn).toHaveBeenCalled());\n expect(subListFn).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns,\n }),\n );\n subListFn.mockClear();\n\n await vi.waitFor(() => expect(subFn).toHaveBeenCalled());\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n status: \"loaded\",\n object: emp,\n }),\n );\n\n // we don't need this value to control the test but we want to make sure we don't have\n // any unhandled exceptions upon test completion\n await pInvalidateComplete;\n });\n });\n\n describe(\".observeObject (force)\", () => {\n const subFn1 = mockSingleSubCallback();\n const subFn2 = mockSingleSubCallback();\n\n beforeEach(async () => {\n subFn1.mockClear();\n subFn2.mockClear();\n });\n\n const likeEmployee50030 = expect.objectContaining({\n $primaryKey: 50030,\n fullName: \"John Doe\",\n });\n\n it(\"fetches and updates twice\", async () => {\n defer(\n cache.observeObject(Employee, 50030, { mode: \"force\" }, subFn1),\n );\n expect(subFn1).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n isOptimistic: false,\n }),\n );\n\n subFn1.mockClear();\n\n await vi.waitFor(() => expect(subFn1).toHaveBeenCalled());\n expect(subFn1).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: likeEmployee50030,\n isOptimistic: false,\n }),\n );\n\n const firstLoad = subFn1.mock.lastCall?.[0]!;\n\n subFn1.mockClear();\n\n defer(\n cache.observeObject(Employee, 50030, { mode: \"force\" }, subFn2),\n );\n expect(subFn1).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({ status: \"loading\" }),\n );\n subFn1.mockClear();\n\n // should be the earlier results\n expect(subFn2).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({ status: \"loading\" }),\n );\n subFn2.mockClear();\n\n // both will be updated\n for (const s of [subFn1, subFn2]) {\n // wait for the result to come in\n await vi.waitFor(() => expect(s).toHaveBeenCalled());\n\n expect(s).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n ...firstLoad,\n lastUpdated: expect.toBeGreaterThan(firstLoad.lastUpdated),\n }),\n );\n\n s.mockClear();\n }\n });\n });\n\n describe(\".observeObject (offline)\", () => {\n const subFn = mockSingleSubCallback();\n let sub: Unsubscribable;\n\n beforeEach(() => {\n subFn.mockClear();\n\n sub = defer(\n cache.observeObject(Employee, 50030, { mode: \"offline\" }, subFn),\n );\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(objectPayloadContaining({\n status: \"init\",\n object: undefined,\n }));\n subFn.mockClear();\n });\n\n it(\"does basic observation and unsubscribe\", async () => {\n const emp = employeesAsServerReturns[0];\n\n // force an update\n cache.updateObject(Employee, emp);\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({ object: emp }),\n );\n subFn.mockClear();\n\n // force again\n cache.updateObject(Employee, emp.$clone({ fullName: \"new name\" }));\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: expect.objectContaining({ fullName: \"new name\" }),\n }),\n );\n subFn.mockClear();\n\n sub.unsubscribe();\n\n // force again but no subscription update\n cache.updateObject(\n Employee,\n emp.$clone({ fullName: \"new name 2\" }),\n );\n expect(subFn).not.toHaveBeenCalled();\n });\n\n it(\"observes with list update\", async () => {\n const emp = employeesAsServerReturns[0];\n\n // force an update\n cache.updateObject(Employee, emp.$clone({ fullName: \"not the name\" }));\n expect(subFn).toHaveBeenCalledTimes(1);\n\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n employeesAsServerReturns,\n );\n expect(subFn).toHaveBeenCalledTimes(2);\n\n expect(subFn.mock.calls[1][0]).toEqual(\n objectPayloadContaining({ object: emp }),\n );\n });\n });\n\n describe(\".observeList\", () => {\n const listSub1 = mockListSubCallback();\n\n beforeEach(() => {\n vi.useFakeTimers({});\n listSub1.mockReset();\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n describe(\"mode=force\", () => {\n it(\"initial load\", async () => {\n defer(\n cache.observeList(\n { objectType: Employee, where: {}, orderBy: {}, mode: \"force\" },\n listSub1,\n ),\n );\n vitest.runOnlyPendingTimers();\n await vi.waitFor(() => expect(listSub1).toHaveBeenCalled());\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n status: \"loading\",\n resolvedList: [],\n }),\n );\n listSub1.mockClear();\n\n await vi.waitFor(() => expect(listSub1).toHaveBeenCalled());\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns,\n status: \"loaded\",\n }),\n );\n });\n\n it(\"subsequent load\", async () => {\n // Pre-seed with data the server doesn't return\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n mutatedEmployees,\n );\n\n defer(\n cache.observeList({\n objectType: Employee,\n mode: \"force\",\n }, listSub1),\n );\n\n await waitForCall(listSub1, 1);\n const firstLoad = listSub1.mock.calls[0][0]!;\n expectSingleListCallAndClear(listSub1, mutatedEmployees, {\n status: \"loading\",\n });\n\n await vi.waitFor(() => expect(listSub1).toHaveBeenCalled());\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns,\n status: \"loaded\",\n lastUpdated: expect.toBeGreaterThan(\n firstLoad.lastUpdated,\n ),\n }),\n );\n listSub1.mockClear();\n });\n });\n\n describe(\"mode = offline\", () => {\n it(\"updates with list updates\", async () => {\n defer(\n cache.observeList({\n objectType: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, listSub1),\n );\n expect(listSub1).toHaveBeenCalledTimes(0);\n\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n employeesAsServerReturns,\n );\n vitest.runOnlyPendingTimers();\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({ resolvedList: employeesAsServerReturns }),\n );\n listSub1.mockClear();\n\n // list is just now one object\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n [employeesAsServerReturns[0]],\n );\n vitest.runOnlyPendingTimers();\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: [employeesAsServerReturns[0]],\n }),\n );\n });\n\n it(\"updates with different list updates\", async () => {\n defer(\n cache.observeList({\n objectType: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, listSub1),\n );\n\n expect(listSub1).toHaveBeenCalledTimes(0);\n\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n employeesAsServerReturns,\n );\n vitest.runOnlyPendingTimers();\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({ resolvedList: employeesAsServerReturns }),\n );\n listSub1.mockClear();\n\n // new where === different list\n cache.updateList(\n {\n objectType: Employee,\n where: { employeeId: { $gt: 0 } },\n orderBy: {},\n },\n mutatedEmployees,\n );\n vitest.runOnlyPendingTimers();\n\n // original list updates still\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: mutatedEmployees,\n }),\n );\n });\n });\n });\n\n describe(\".fetchMore\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"works in the solo case\", async () => {\n const listSub = mockListSubCallback();\n defer(cache.observeList(\n {\n objectType: Employee,\n where: {},\n orderBy: {},\n mode: \"force\",\n pageSize: 1,\n },\n listSub,\n ));\n\n expect(listSub).not.toHaveBeenCalled();\n await vi.waitFor(() => expect(listSub).toHaveBeenCalled());\n\n expect(listSub).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n status: \"loading\",\n }),\n );\n listSub.mockClear();\n await vi.waitFor(() => expect(listSub).toHaveBeenCalled());\n\n expect(listSub).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns.slice(0, 1),\n status: \"loaded\",\n }),\n );\n const { fetchMore } = listSub.mock.calls[0][0]!;\n listSub.mockClear();\n\n void fetchMore();\n\n await vi.waitFor(() => expect(listSub).toHaveBeenCalledTimes(1));\n expect(listSub).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns.slice(0, 1),\n status: \"loading\",\n }),\n );\n listSub.mockClear();\n\n await vi.waitFor(() => expect(listSub).toHaveBeenCalledTimes(1));\n expect(listSub).toHaveBeenCalledWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns.slice(0, 2),\n status: \"loaded\",\n }),\n );\n });\n });\n });\n\n describe(\"with mock client\", () => {\n let client: Mock<Client> & Client;\n let mockClient: MockClientHelper;\n let store: Store;\n\n beforeEach(async () => {\n mockClient = createClientMockHelper();\n client = mockClient.client;\n store = new Store(client);\n });\n\n describe(\"actions\", () => {\n it(\"properly invalidates objects\", async () => {\n // after the below `observeObject`, the cache will need to load from the server\n mockClient.mockFetchOneOnce().resolve({\n $apiName: \"Todo\",\n });\n\n const todoSubFn = mockSingleSubCallback();\n defer(store.observeObject(Todo, 0, {}, todoSubFn));\n\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n }),\n loaded: objectPayloadContaining({\n object: expect.objectContaining({\n $primaryKey: 0,\n }),\n }),\n });\n\n // at this point we have an observation properly set up\n mockClient.mockApplyActionOnce().resolve({\n addedObjects: [{\n objectType: \"Todo\",\n primaryKey: 0,\n }],\n });\n\n // after we apply the action, the object is invalidated and gets re-requested\n\n mockClient.mockFetchOneOnce<Todo>().resolve({\n $apiName: \"Todo\",\n text: \"hello there kind sir\",\n });\n\n const actionPromise = store.applyAction(createOffice, {\n officeId: \"whatever\",\n });\n\n await actionPromise;\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n }),\n loaded: objectPayloadContaining({\n object: expect.objectContaining({\n text: \"hello there kind sir\",\n }),\n }),\n });\n });\n\n it(\"rolls back optimistic updates on error\", async () => {\n const fauxObject = {\n $apiName: \"Todo\",\n $objectType: \"Todo\",\n $primaryKey: 0,\n $title: \"does not matter\",\n } as Osdk.Instance<Todo>;\n\n // after the below `observeObject`, the cache will need to load from the server\n mockClient.mockFetchOneOnce<Todo>()\n .resolve(fauxObject);\n\n const todoSubFn = mockSingleSubCallback();\n defer(\n store.observeObject(Todo, 0, {}, todoSubFn),\n );\n\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n isOptimistic: false,\n }),\n loaded: objectPayloadContaining({\n object: fauxObject,\n status: \"loaded\",\n isOptimistic: false,\n }),\n });\n\n // at this point we have an observation properly set up\n const applyActionResult = mockClient.mockApplyActionOnce();\n\n const actionPromise = store.applyAction(createOffice, {\n officeId: \"whatever\",\n }, {\n optimisticUpdate: (ctx) => {\n ctx.updateObject({ ...fauxObject, someValue: \"optimistic\" });\n },\n });\n\n await waitForCall(todoSubFn, 1);\n expect(todoSubFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: {\n ...fauxObject,\n someValue: \"optimistic\",\n },\n status: \"loading\",\n isOptimistic: true,\n }),\n );\n todoSubFn.mockClear();\n\n // let the action error out\n applyActionResult.reject(\"an error thrown\");\n await expect(actionPromise).rejects.toThrow(\"an error thrown\");\n\n // back to the original object\n await waitForCall(todoSubFn, 1);\n expect(todoSubFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: fauxObject,\n status: \"loaded\",\n isOptimistic: false,\n }),\n );\n });\n });\n\n describe(\"orderBy\", () => {\n let nextPk = 0;\n const fauxObjectA = {\n $apiName: \"Todo\",\n $objectType: \"Todo\",\n $primaryKey: nextPk++,\n $title: \"a\",\n text: \"a\",\n } as Osdk.Instance<Todo>;\n\n const fauxObjectB = {\n $apiName: \"Todo\",\n $objectType: \"Todo\",\n $primaryKey: nextPk++,\n $title: \"b\",\n text: \"b\",\n } as Osdk.Instance<Todo>;\n\n const fauxObjectC = {\n $apiName: \"Todo\",\n $objectType: \"Todo\",\n $primaryKey: nextPk++,\n $title: \"c\",\n text: \"c\",\n } as Osdk.Instance<Todo>;\n\n const noWhereNoOrderBy = {\n objectType: Todo,\n where: {},\n orderBy: {},\n } as const;\n\n const noWhereOrderByText = {\n objectType: Todo,\n where: {},\n orderBy: {\n text: \"asc\",\n },\n } as const;\n\n const subListUnordered = mockListSubCallback();\n const subListOrdered = mockListSubCallback();\n\n beforeEach(() => {\n defer(\n store.observeList({\n ...noWhereNoOrderBy,\n mode: \"offline\",\n }, subListUnordered),\n );\n expect(subListUnordered).toHaveBeenCalledTimes(0);\n\n defer(\n store.observeList({\n ...noWhereOrderByText,\n mode: \"offline\",\n }, subListOrdered),\n );\n expect(subListOrdered).toHaveBeenCalledTimes(0);\n });\n\n it(\"invalidates the correct lists\", async () => {\n // for whatever reason, the first list is loaded as [B, A]\n store.updateList(\n noWhereNoOrderBy,\n [fauxObjectB, fauxObjectA],\n );\n\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectB, fauxObjectA],\n );\n\n // The other list definitely matches on the where clause and we can insert\n // orderBy properly. So this is [A, B]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB],\n );\n\n // For whatever reason, object B is no longer in the first set (use your imagination)\n // but we have added a C before A. So the first list is [C, A]\n store.updateList(\n { objectType: Todo, where: {}, orderBy: {} },\n [fauxObjectC, fauxObjectA],\n );\n\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectC, fauxObjectA],\n );\n\n // Nothing told the system that B was deleted so we can presume it still exists\n // and therefore the second list is now [A, B, C]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB, fauxObjectC],\n );\n });\n\n it(\"produces proper results with optimistic updates and successful action\", async () => {\n const optimisticallyMutatedA = {\n ...fauxObjectA,\n text: \"optimistic\",\n };\n const pkForOptimistic = nextPk++;\n const optimisticallyCreatedObjectD = {\n \"$apiName\": \"Todo\",\n \"$objectType\": \"Todo\",\n \"$primaryKey\": pkForOptimistic,\n \"$title\": \"d\",\n \"text\": \"d\",\n id: pkForOptimistic,\n } as Osdk.Instance<Todo>;\n\n // for whatever reason, the first list is loaded as [B, A]\n store.updateList(\n noWhereNoOrderBy,\n [fauxObjectB, fauxObjectA],\n );\n\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectB, fauxObjectA],\n );\n\n // The other list definitely matches on the where clause and we can insert\n // orderBy properly. So this is [A, B]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB],\n );\n\n testStage(\"Start\");\n\n // the optimistic job will call createObject which triggers the `objectFactory2` of the\n // cache context.\n mockClient.mockObjectFactory2Once().resolve([\n optimisticallyCreatedObjectD,\n ]);\n\n // Perform something optimistic.\n const removeOptimisticResult = runOptimisticJob(store, (b) => {\n b.createObject(Todo, pkForOptimistic, {\n id: pkForOptimistic,\n text: \"d\",\n });\n b.updateObject(optimisticallyMutatedA);\n });\n\n // The first list is now [B, A, optimistic]\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [\n fauxObjectB,\n optimisticallyMutatedA, // same position, new values\n optimisticallyCreatedObjectD,\n ],\n { isOptimistic: true },\n );\n\n // the second list is now [A, B, optimistic]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [\n fauxObjectB,\n optimisticallyCreatedObjectD,\n optimisticallyMutatedA,\n ],\n { isOptimistic: true },\n );\n\n // Roll back the optimistic update\n await removeOptimisticResult();\n\n // The first list is now [B, A]\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectB, fauxObjectA],\n { isOptimistic: false },\n );\n\n // the second list is now [A, B]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB],\n { isOptimistic: false },\n );\n });\n // I think these are named backwards\n it(\"produces proper results with optimistic updates and rollback\", async () => {\n const pkForOptimistic = nextPk++;\n const optimisticallyCreatedObjectD = {\n \"$apiName\": \"Todo\",\n \"$objectType\": \"Todo\",\n \"$primaryKey\": pkForOptimistic,\n \"$title\": \"d\",\n \"text\": \"d\",\n id: pkForOptimistic,\n } as Osdk.Instance<Todo>;\n\n const optimisticallyMutatedA = {\n ...fauxObjectA,\n text: \"optimistic\",\n };\n\n testStage(\"Initial Setup\");\n\n // later we will \"create\" this object\n const createdObjectD = {\n \"$apiName\": \"Todo\",\n \"$objectType\": \"Todo\",\n \"$primaryKey\": 9000,\n \"$title\": \"d prime\",\n \"text\": \"d prime\",\n id: 9000,\n } as Osdk.Instance<Todo>;\n\n // for whatever reason, the first list is loaded as [B, A]\n store.updateList(\n noWhereNoOrderBy,\n [fauxObjectB, fauxObjectA],\n );\n\n await waitForCall(subListUnordered, 1);\n\n expectSingleListCallAndClear(subListUnordered, [\n fauxObjectB,\n fauxObjectA,\n ]);\n\n // The other list definitely matches on the where clause and we can insert\n // orderBy properly. So this is [A, B]\n expectSingleListCallAndClear(subListOrdered, [\n fauxObjectA,\n fauxObjectB,\n ]);\n\n testStage(\"Optimistic Creation\");\n\n // the optimistic job will call createObject which triggers the `objectFactory2` of the\n // cache context.\n\n mockClient.mockObjectFactory2Once().resolve([\n optimisticallyCreatedObjectD,\n ]);\n\n const mockedApplyAction = mockClient.mockApplyActionOnce();\n\n testStage(\"Apply Action\");\n\n const actionPromise = store.applyAction(\n createOffice,\n { officeId: \"5\" },\n {\n optimisticUpdate: (b) => {\n b.createObject(Todo, pkForOptimistic, {\n id: pkForOptimistic,\n text: \"d\",\n });\n b.updateObject(optimisticallyMutatedA);\n },\n },\n );\n\n testStage(\"Optimistic Updates\");\n\n // The first list is now [B, A, optimistic]\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(subListUnordered, [\n fauxObjectB,\n optimisticallyMutatedA, // same position, new values\n optimisticallyCreatedObjectD,\n ], { isOptimistic: true });\n\n // the second list is now [A, B, optimistic]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(subListOrdered, [\n fauxObjectB,\n optimisticallyCreatedObjectD,\n optimisticallyMutatedA,\n ], { isOptimistic: true });\n\n testStage(\"Resolve Action\");\n\n const modifiedObjectA = {\n ...fauxObjectA,\n text: \"a prime\",\n };\n\n // The action will complete and then revalidate in order...\n mockClient.mockFetchOneOnce<Todo>(modifiedObjectA.$primaryKey)\n .resolve(modifiedObjectA);\n\n mockClient.mockFetchOneOnce<Todo>(createdObjectD.$primaryKey)\n .resolve(createdObjectD);\n\n // this order matters!\n // but now we don't need them because we just update lists instead of revalidate when we can\n // const plainList = mockClient.mockFetchPageOnce<Todo>();\n // const orderedList = mockClient.mockFetchPageOnce<Todo>();\n\n mockedApplyAction.resolve({\n addedObjects: [\n {\n objectType: \"Todo\",\n primaryKey: createdObjectD.id,\n },\n ],\n modifiedObjects: [\n {\n objectType: \"Todo\",\n primaryKey: fauxObjectA.$primaryKey,\n },\n ],\n });\n\n // plainList.resolve({\n // nextPageToken: undefined,\n // totalCount: \"4\",\n // data: [fauxObjectB, fauxObjectC, modifiedObjectA, createdObjectD],\n // });\n\n // orderedList.resolve({\n // nextPageToken: undefined,\n // totalCount: \"4\",\n // data: [modifiedObjectA, fauxObjectC, createdObjectD],\n // });\n\n await actionPromise;\n\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(subListUnordered, [\n fauxObjectB,\n // fauxObjectC,\n modifiedObjectA,\n createdObjectD,\n ], { isOptimistic: false });\n\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [modifiedObjectA, fauxObjectB, createdObjectD],\n { isOptimistic: false },\n );\n });\n });\n });\n\n describe(\"layers\", () => {\n it(\"properly remove\", () => {\n const clientHelper = createClientMockHelper();\n const store = new Store(clientHelper.client);\n\n const baseObjects = [1, 2].map((i) => ({\n $primaryKey: i,\n $objectType: \"Employee\",\n $apiName: \"Employee\",\n $title: `truth ${i}`,\n } as Osdk.Instance<Employee>));\n\n const cacheKeys = baseObjects.map((obj) =>\n store.getCacheKey(\"object\", \"Employee\", obj.$primaryKey)\n );\n\n // set the truth\n for (const obj of baseObjects) {\n store.updateObject(\"Employee\", obj);\n }\n\n // expect the truth\n for (const obj of baseObjects) {\n expect(store.getObject(\"Employee\", obj.$primaryKey)).toEqual(\n expect.objectContaining({ $title: `truth ${obj.$primaryKey}` }),\n );\n }\n\n const layerIds = [1, 2].map(createOptimisticId);\n\n // optimistically set the objects in their own layers\n for (let i = 0; i < 2; i++) {\n store.batch({ optimisticId: layerIds[i] }, (batch) => {\n batch.write(\n cacheKeys[i],\n {\n ...baseObjects[i],\n $title: `optimistic ${baseObjects[i].$primaryKey}`,\n },\n \"loading\",\n );\n });\n }\n\n // expect the optimistic values\n for (let i = 0; i < 2; i++) {\n expect(store.getObject(\"Employee\", baseObjects[i].$primaryKey)).toEqual(\n expect.objectContaining({\n $title: `optimistic ${baseObjects[i].$primaryKey}`,\n }),\n );\n }\n\n // remove the first layer\n store.removeLayer(layerIds[0]);\n\n // should have truth object 1 and optimistic object 2\n expect(store.getObject(\"Employee\", 1)).toEqual(\n expect.objectContaining({ $title: \"truth 1\" }),\n );\n expect(store.getObject(\"Employee\", 2)).toEqual(\n expect.objectContaining({ $title: \"optimistic 2\" }),\n );\n\n // remove the second layer\n store.removeLayer(layerIds[1]);\n\n // should have truth objects\n for (const obj of baseObjects) {\n expect(store.getObject(\"Employee\", obj.$primaryKey)).toEqual(\n expect.objectContaining({ $title: `truth ${obj.$primaryKey}` }),\n );\n }\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,10 +14,112 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { Chalk } from "chalk";
|
|
17
18
|
import pDefer from "p-defer";
|
|
19
|
+
import invariant from "tiny-invariant";
|
|
18
20
|
import { afterEach, beforeEach, expect, vi, vitest } from "vitest";
|
|
21
|
+
import { additionalContext } from "../../Client.js";
|
|
22
|
+
const chalk = new Chalk(); // new Chalk({ level: 3 });
|
|
23
|
+
|
|
24
|
+
function mockLog(...args) {
|
|
25
|
+
// eslint-disable-next-line no-console
|
|
26
|
+
console.log(chalk.yellow("mockClient"), ...args);
|
|
27
|
+
}
|
|
28
|
+
// interface LogFn {
|
|
29
|
+
// (obj: unknown, msg?: string, ...args: any[]): void;
|
|
30
|
+
// (msg: string, ...args: any[]): void;
|
|
31
|
+
// }
|
|
32
|
+
|
|
33
|
+
export function createTestLogger(bindings, options) {
|
|
34
|
+
const colors = {
|
|
35
|
+
debug: [chalk.cyan, chalk.bgCyan],
|
|
36
|
+
info: [chalk.green, chalk.bgGreen],
|
|
37
|
+
trace: [chalk.gray, chalk.bgGray],
|
|
38
|
+
error: [chalk.red, chalk.bgRed],
|
|
39
|
+
warn: [chalk.yellow, chalk.bgYellow],
|
|
40
|
+
fatal: [chalk.redBright, chalk.bgRedBright]
|
|
41
|
+
};
|
|
42
|
+
function createLogMethod(name) {
|
|
43
|
+
return vi.fn((...args) => {
|
|
44
|
+
const hasData = typeof args[0] !== "string";
|
|
45
|
+
const obj = hasData ? args[0] : {};
|
|
46
|
+
const more = hasData ? args.slice(1) : args.slice(0);
|
|
47
|
+
|
|
48
|
+
// eslint-disable-next-line no-console
|
|
49
|
+
console.log(`${colors[name][1](name)}${options?.msgPrefix ? " " + colors[name][0](options.msgPrefix) : ""}${obj.methodName ? ` .${chalk.magenta(obj.methodName)}()` : ""}`, ...more);
|
|
50
|
+
if (bindings && Object.keys(bindings).length > 0) {
|
|
51
|
+
// eslint-disable-next-line no-console
|
|
52
|
+
console.log(bindings);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
debug: createLogMethod("debug"),
|
|
58
|
+
error: createLogMethod("error"),
|
|
59
|
+
info: createLogMethod("info"),
|
|
60
|
+
warn: createLogMethod("warn"),
|
|
61
|
+
fatal: createLogMethod("fatal"),
|
|
62
|
+
child: vi.fn((theseBindings, theseOptions) => createTestLogger({
|
|
63
|
+
...bindings,
|
|
64
|
+
...theseBindings
|
|
65
|
+
}, {
|
|
66
|
+
level: (theseOptions ?? options)?.level,
|
|
67
|
+
msgPrefix: options?.msgPrefix || theseOptions?.msgPrefix ? `${options?.msgPrefix ? `${options.msgPrefix} ` : ""}${theseOptions?.msgPrefix || ""}` : undefined
|
|
68
|
+
})),
|
|
69
|
+
trace: createLogMethod("trace"),
|
|
70
|
+
isLevelEnabled: vi.fn(() => true)
|
|
71
|
+
};
|
|
72
|
+
}
|
|
19
73
|
export function createClientMockHelper() {
|
|
20
74
|
const client = vitest.fn();
|
|
75
|
+
const logger = createTestLogger({});
|
|
76
|
+
|
|
77
|
+
// this is just a fallback for when there is nothing set so we can track whats up
|
|
78
|
+
client.mockImplementation((...args) => {
|
|
79
|
+
const localLogger = logger.child({}, {
|
|
80
|
+
msgPrefix: "fallback mock client"
|
|
81
|
+
});
|
|
82
|
+
try {
|
|
83
|
+
throw new Error("IN THE FALLBACK MOCK CLIENT IMPLEMENTATION");
|
|
84
|
+
} catch (e) {
|
|
85
|
+
localLogger.error("Just for the stack trace", e);
|
|
86
|
+
}
|
|
87
|
+
let where;
|
|
88
|
+
const deadObjectSet = {
|
|
89
|
+
where: (...whereArgs) => {
|
|
90
|
+
localLogger.trace("where", whereArgs);
|
|
91
|
+
where = whereArgs;
|
|
92
|
+
return deadObjectSet;
|
|
93
|
+
},
|
|
94
|
+
fetchPage: (...fetchArgs) => {
|
|
95
|
+
localLogger.trace("etchPage", where, fetchArgs);
|
|
96
|
+
throw new Error("NO");
|
|
97
|
+
},
|
|
98
|
+
fetchOne: (...fetchArgs) => {
|
|
99
|
+
localLogger.trace("fetchOne", fetchArgs);
|
|
100
|
+
throw new Error("NO");
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
return deadObjectSet;
|
|
104
|
+
});
|
|
105
|
+
client[additionalContext] = {
|
|
106
|
+
baseUrl: "http://localhost:8080",
|
|
107
|
+
ontologyRid: "ri.something",
|
|
108
|
+
objectFactory: vitest.fn(),
|
|
109
|
+
objectFactory2: vitest.fn(),
|
|
110
|
+
ontologyProvider: {
|
|
111
|
+
getActionDefinition: vitest.fn(),
|
|
112
|
+
getInterfaceDefinition: vitest.fn(),
|
|
113
|
+
getObjectDefinition: vitest.fn(),
|
|
114
|
+
getQueryDefinition: vitest.fn()
|
|
115
|
+
},
|
|
116
|
+
tokenProvider: vitest.fn(),
|
|
117
|
+
objectSetFactory: vitest.fn(),
|
|
118
|
+
fetch: vitest.fn(),
|
|
119
|
+
clientCacheKey: {},
|
|
120
|
+
requestContext: {},
|
|
121
|
+
logger
|
|
122
|
+
};
|
|
21
123
|
return {
|
|
22
124
|
client,
|
|
23
125
|
mockApplyActionOnce: function () {
|
|
@@ -38,10 +140,12 @@ export function createClientMockHelper() {
|
|
|
38
140
|
});
|
|
39
141
|
return d;
|
|
40
142
|
},
|
|
41
|
-
mockFetchOneOnce: function () {
|
|
143
|
+
mockFetchOneOnce: function (expectedId) {
|
|
42
144
|
const d = pDefer();
|
|
43
145
|
client.mockReturnValueOnce({
|
|
44
146
|
fetchOne: async a => {
|
|
147
|
+
mockLog("fetchOne", a);
|
|
148
|
+
!(expectedId === undefined || a === expectedId) ? process.env.NODE_ENV !== "production" ? invariant(false, "expected id to match") : invariant(false) : void 0;
|
|
45
149
|
const r = await d.promise;
|
|
46
150
|
return {
|
|
47
151
|
...r,
|
|
@@ -50,6 +154,30 @@ export function createClientMockHelper() {
|
|
|
50
154
|
}
|
|
51
155
|
});
|
|
52
156
|
return d;
|
|
157
|
+
},
|
|
158
|
+
mockObjectFactory2Once: function () {
|
|
159
|
+
const d = pDefer();
|
|
160
|
+
vi.mocked(client[additionalContext].objectFactory2).mockReturnValueOnce(d.promise);
|
|
161
|
+
return d;
|
|
162
|
+
},
|
|
163
|
+
mockFetchPageOnce: function () {
|
|
164
|
+
const d = pDefer();
|
|
165
|
+
const objectSet = {
|
|
166
|
+
fetchPage: async fetchPageArgs => {
|
|
167
|
+
mockLog("fetchPage", fetchPageArgs);
|
|
168
|
+
const r = await d.promise;
|
|
169
|
+
return {
|
|
170
|
+
...r,
|
|
171
|
+
$primaryKey: fetchPageArgs
|
|
172
|
+
};
|
|
173
|
+
},
|
|
174
|
+
where: clause => {
|
|
175
|
+
mockLog("where", clause);
|
|
176
|
+
return objectSet;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
client.mockReturnValueOnce(objectSet);
|
|
180
|
+
return d;
|
|
53
181
|
}
|
|
54
182
|
};
|
|
55
183
|
}
|
|
@@ -69,11 +197,12 @@ export function createDefer() {
|
|
|
69
197
|
return x;
|
|
70
198
|
};
|
|
71
199
|
}
|
|
72
|
-
export function expectSingleListCallAndClear(subFn, resolvedList) {
|
|
200
|
+
export function expectSingleListCallAndClear(subFn, resolvedList, payloadOptions = {}) {
|
|
73
201
|
if (vitest.isFakeTimers()) {
|
|
74
202
|
vitest.runOnlyPendingTimers();
|
|
75
203
|
}
|
|
76
|
-
expect(subFn).toHaveBeenCalledExactlyOnceWith(
|
|
204
|
+
expect(subFn).toHaveBeenCalledExactlyOnceWith(listPayloadContaining({
|
|
205
|
+
...payloadOptions,
|
|
77
206
|
resolvedList
|
|
78
207
|
}));
|
|
79
208
|
subFn.mockClear();
|
|
@@ -86,9 +215,16 @@ export function expectSingleObjectCallAndClear(subFn, object, status) {
|
|
|
86
215
|
subFn.mockClear();
|
|
87
216
|
}
|
|
88
217
|
export async function waitForCall(subFn, times = 1) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
218
|
+
try {
|
|
219
|
+
await vi.waitFor(() => {
|
|
220
|
+
expect(subFn).toHaveBeenCalledTimes(times);
|
|
221
|
+
});
|
|
222
|
+
} catch (e) {
|
|
223
|
+
// we don't need the error, it will retrigger on the next line
|
|
224
|
+
// and that provides better behavior in the vitest vscode
|
|
225
|
+
// plugin. This places the error in the test itself instead of
|
|
226
|
+
// only in this file
|
|
227
|
+
}
|
|
92
228
|
expect(subFn).toHaveBeenCalledTimes(times);
|
|
93
229
|
}
|
|
94
230
|
function createSubscriptionHelper() {}
|