DataStoreSerializer.spec.ts 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. const full = await ser.serialize();
  37. 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"}]`);
  38. const partial = await ser.serializePartial(["dss-test-1"]);
  39. expect(partial).toEqual(`[{"id":"dss-test-1","data":"{\\"a\\":1,\\"b\\":2}","formatVersion":1,"encoded":false,"checksum":"43258cff783fe7036d8a43033f830adfc60ec037382473548ac742b888292777"}]`);
  40. const unencoded = await ser.serializePartial(["dss-test-2"], false);
  41. expect(unencoded).toEqual(`[{"id":"dss-test-2","data":"{\\"c\\":1,\\"d\\":2}","formatVersion":1,"encoded":false,"checksum":"86cada6157f4b726bf413e0371a2f461a82d2809e6eb3c095ec796fcfd8d72ee"}]`);
  42. const notStringified = await ser.serializePartial(["dss-test-2"], false, false);
  43. expect(DataStoreSerializer.isSerializedDataStoreObjArray(notStringified)).toBe(true);
  44. expect(DataStoreSerializer.isSerializedDataStoreObj(notStringified?.[0])).toBe(true);
  45. expect(notStringified).toEqual([
  46. {
  47. id: "dss-test-2",
  48. data: "{\"c\":1,\"d\":2}",
  49. encoded: false,
  50. formatVersion: 1,
  51. checksum: "86cada6157f4b726bf413e0371a2f461a82d2809e6eb3c095ec796fcfd8d72ee",
  52. },
  53. ]);
  54. });
  55. it("Deserialization", async () => {
  56. const stores = getStores();
  57. const ser = new DataStoreSerializer(stores);
  58. await ser.deserialize(`[{"id":"dss-test-2","data":"{\\"c\\":420,\\"d\\":420}","formatVersion":1,"encoded":false}]`);
  59. expect(store2.getData().c).toBe(420);
  60. await ser.resetStoresData();
  61. expect(store1.getData().a).toBe(1);
  62. expect(store2.getData().c).toBe(1);
  63. await ser.resetStoresData();
  64. await ser.deserializePartial(["dss-test-1"], `[{"id":"dss-test-1","data":"{\\"a\\":421,\\"b\\":421}","formatVersion":1,"encoded":false}, {"id":"dss-test-2","data":"{\\"c\\":421,\\"d\\":421}","formatVersion":1,"encoded":false}]`);
  65. expect(store1.getData().a).toBe(421);
  66. expect(store2.getData().c).toBe(1);
  67. await ser.resetStoresData();
  68. 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}","formatVersion":1,"encoded":false}]`);
  69. expect(store1.getData().a).toBe(1);
  70. expect(store2.getData().c).toBe(422);
  71. await ser.resetStoresData(() => false);
  72. expect(store1.getData().a).toBe(1);
  73. expect(store2.getData().c).toBe(422);
  74. });
  75. });