1
0

DataStoreSerializer.spec.ts 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { afterAll, beforeAll, describe, expect, it } from "vitest";
  2. import { DataStoreSerializer } from "./DataStoreSerializer.js";
  3. import { DataStore } from "./DataStore.js";
  4. import { beforeEach } from "node:test";
  5. import { compress, decompress } from "./crypto.js";
  6. const store1 = new DataStore({
  7. id: "dss-test-1",
  8. defaultData: { a: 1, b: 2 },
  9. formatVersion: 1,
  10. storageMethod: "sessionStorage",
  11. });
  12. const store2 = new DataStore({
  13. id: "dss-test-2",
  14. defaultData: { c: 1, d: 2 },
  15. formatVersion: 1,
  16. storageMethod: "sessionStorage",
  17. encodeData: async (data) => await compress(data, "deflate-raw", "string"),
  18. decodeData: async (data) => await decompress(data, "deflate-raw", "string"),
  19. });
  20. const getStores = () => [
  21. store1,
  22. store2,
  23. ];
  24. describe("DataStoreSerializer", () => {
  25. beforeEach(async () => {
  26. const ser = new DataStoreSerializer(getStores());
  27. await ser.deleteStoresData();
  28. await ser.resetStoresData();
  29. await ser.loadStoresData();
  30. });
  31. afterAll(async () => {
  32. await new DataStoreSerializer(getStores()).deleteStoresData();
  33. });
  34. it("Serialization", async () => {
  35. const ser = new DataStoreSerializer(getStores());
  36. await ser.loadStoresData();
  37. const full = await ser.serialize();
  38. expect(full).toEqual(`[{"id":"dss-test-1","data":"{\\"a\\":1,\\"b\\":2}","formatVersion":1,"encoded":false,"checksum":"43258cff783fe7036d8a43033f830adfc60ec037382473548ac742b888292777"},{"id":"dss-test-2","data":"q1ZKVrIy1FFKUbIyqgUA","formatVersion":1,"encoded":true,"checksum":"b1020c3faac493009494fa622f701b831657c11ea53f8c8236f0689089c7e2d3"}]`);
  39. const partial = await ser.serializePartial(["dss-test-1"]);
  40. expect(partial).toEqual(`[{"id":"dss-test-1","data":"{\\"a\\":1,\\"b\\":2}","formatVersion":1,"encoded":false,"checksum":"43258cff783fe7036d8a43033f830adfc60ec037382473548ac742b888292777"}]`);
  41. const unencoded = await ser.serializePartial(["dss-test-2"], false);
  42. expect(unencoded).toEqual(`[{"id":"dss-test-2","data":"{\\"c\\":1,\\"d\\":2}","formatVersion":1,"encoded":false,"checksum":"86cada6157f4b726bf413e0371a2f461a82d2809e6eb3c095ec796fcfd8d72ee"}]`);
  43. const notStringified = await ser.serializePartial(["dss-test-2"], false, false);
  44. expect(DataStoreSerializer.isSerializedDataStoreObjArray(notStringified)).toBe(true);
  45. expect(DataStoreSerializer.isSerializedDataStoreObj(notStringified?.[0])).toBe(true);
  46. expect(notStringified).toEqual([
  47. {
  48. id: "dss-test-2",
  49. data: "{\"c\":1,\"d\":2}",
  50. encoded: false,
  51. formatVersion: 1,
  52. checksum: "86cada6157f4b726bf413e0371a2f461a82d2809e6eb3c095ec796fcfd8d72ee",
  53. },
  54. ]);
  55. });
  56. it("Deserialization", async () => {
  57. const stores = getStores();
  58. const ser = new DataStoreSerializer(stores);
  59. await ser.deserialize(`[{"id":"dss-test-2","data":"{\\"c\\":420,\\"d\\":420}","formatVersion":1,"encoded":false}]`);
  60. expect(store2.getData().c).toBe(420);
  61. await ser.resetStoresData();
  62. expect(store1.getData().a).toBe(1);
  63. expect(store2.getData().c).toBe(1);
  64. await ser.resetStoresData();
  65. await ser.deserializePartial(["dss-test-1"], `[{"id":"dss-test-1","data":"{\\"a\\":421,\\"b\\":421}","checksum":"ad33b8f6a1d18c781a80390496b1b7dfaf56d73cf25a9497cb156ba83214357d","formatVersion":1,"encoded":false}, {"id":"dss-test-2","data":"{\\"c\\":421,\\"d\\":421}","formatVersion":1,"encoded":false}]`);
  66. expect(store1.getData().a).toBe(421);
  67. expect(store2.getData().c).toBe(1);
  68. await ser.resetStoresData();
  69. await ser.deserializePartial(["dss-test-2"], `[{"id":"dss-test-1","data":"{\\"a\\":422,\\"b\\":422}","formatVersion":1,"encoded":false}, {"id":"dss-test-2","data":"{\\"c\\":422,\\"d\\":422}","checksum":"ab1d18cf13554369cea6bb517a9034e3d6548f19a40d176b16ac95c8e02d65bb","formatVersion":1,"encoded":false}]`);
  70. expect(store1.getData().a).toBe(1);
  71. expect(store2.getData().c).toBe(422);
  72. await ser.resetStoresData(() => false);
  73. expect(store1.getData().a).toBe(1);
  74. expect(store2.getData().c).toBe(422);
  75. });
  76. });