{"version":3,"file":"put_writes.cjs","names":["initialCheckpointTuple"],"sources":["../../src/spec/put_writes.ts"],"sourcesContent":["import {\n  Checkpoint,\n  CheckpointMetadata,\n  CheckpointTuple,\n  uuid6,\n  type BaseCheckpointSaver,\n} from \"@langchain/langgraph-checkpoint\";\nimport { RunnableConfig } from \"@langchain/core/runnables\";\nimport { CheckpointerTestInitializer } from \"../types.js\";\nimport { initialCheckpointTuple } from \"../test_utils.js\";\n\nexport function putWritesTests<T extends BaseCheckpointSaver>(\n  initializer: CheckpointerTestInitializer<T>\n) {\n  describe(`${initializer.checkpointerName}#putWrites`, () => {\n    let checkpointer: T;\n    let thread_id: string;\n    let checkpoint_id: string;\n\n    beforeEach(async () => {\n      thread_id = uuid6(3);\n      checkpoint_id = uuid6(3);\n\n      checkpointer = await initializer.createCheckpointer();\n    });\n\n    afterEach(async () => {\n      await initializer.destroyCheckpointer?.(checkpointer);\n    });\n\n    describe.each([\"root\", \"child\"])(\"namespace: %s\", (namespace) => {\n      const checkpoint_ns = namespace === \"root\" ? \"\" : namespace;\n      let checkpoint: Checkpoint;\n      let metadata: CheckpointMetadata | undefined;\n\n      describe(\"success cases\", () => {\n        let returnedConfig!: RunnableConfig;\n        let savedCheckpointTuple: CheckpointTuple | undefined;\n\n        beforeEach(async () => {\n          ({ checkpoint, metadata } = initialCheckpointTuple({\n            thread_id,\n            checkpoint_ns,\n            checkpoint_id,\n          }));\n\n          // ensure the test checkpoint does not already exist\n          const existingCheckpoint = await checkpointer.get({\n            configurable: {\n              thread_id,\n              checkpoint_ns,\n              checkpoint_id,\n            },\n          });\n          expect(existingCheckpoint).toBeUndefined(); // our test checkpoint should not exist yet\n\n          returnedConfig = await checkpointer.put(\n            {\n              configurable: {\n                thread_id,\n                checkpoint_ns,\n              },\n            },\n            checkpoint,\n            metadata!,\n            {} /* not sure what to do about newVersions, as it's unused */\n          );\n\n          await checkpointer.putWrites(\n            returnedConfig,\n            [[\"animals\", \"dog\"]],\n            \"pet_task\"\n          );\n\n          savedCheckpointTuple = await checkpointer.getTuple(returnedConfig);\n\n          // fail here if `put` or `getTuple` is broken so we don't get a bunch of noise from the actual test cases below\n          expect(savedCheckpointTuple).not.toBeUndefined();\n          expect(savedCheckpointTuple?.checkpoint).toEqual(checkpoint);\n          expect(savedCheckpointTuple?.metadata).toEqual(metadata);\n          expect(savedCheckpointTuple?.config).toEqual({\n            configurable: {\n              thread_id,\n              checkpoint_ns,\n              checkpoint_id,\n            },\n          });\n        });\n\n        it(\"should store writes to the checkpoint\", async () => {\n          expect(savedCheckpointTuple?.pendingWrites).toEqual([\n            [\"pet_task\", \"animals\", \"dog\"],\n          ]);\n        });\n      });\n\n      describe(\"failure cases\", () => {\n        it(\"should fail if the thread_id is missing\", async () => {\n          const missingThreadIdConfig = {\n            configurable: {\n              checkpoint_ns,\n              checkpoint_id,\n            },\n          };\n\n          await expect(\n            async () =>\n              await checkpointer.putWrites(\n                missingThreadIdConfig,\n                [[\"animals\", \"dog\"]],\n                \"pet_task\"\n              )\n          ).rejects.toThrow();\n        });\n\n        it(\"should fail if the checkpoint_id is missing\", async () => {\n          const missingCheckpointIdConfig: RunnableConfig = {\n            configurable: {\n              thread_id,\n              checkpoint_ns,\n            },\n          };\n\n          await expect(\n            async () =>\n              await checkpointer.putWrites(\n                missingCheckpointIdConfig,\n                [[\"animals\", \"dog\"]],\n                \"pet_task\"\n              )\n          ).rejects.toThrow();\n        });\n      });\n    });\n  });\n}\n"],"mappings":";;;;AAWA,SAAgB,eACd,aACA;AACA,UAAS,GAAG,YAAY,iBAAiB,mBAAmB;EAC1D,IAAI;EACJ,IAAI;EACJ,IAAI;AAEJ,aAAW,YAAY;AACrB,gBAAA,GAAA,gCAAA,OAAkB,EAAE;AACpB,oBAAA,GAAA,gCAAA,OAAsB,EAAE;AAExB,kBAAe,MAAM,YAAY,oBAAoB;IACrD;AAEF,YAAU,YAAY;AACpB,SAAM,YAAY,sBAAsB,aAAa;IACrD;AAEF,WAAS,KAAK,CAAC,QAAQ,QAAQ,CAAC,CAAC,kBAAkB,cAAc;GAC/D,MAAM,gBAAgB,cAAc,SAAS,KAAK;GAClD,IAAI;GACJ,IAAI;AAEJ,YAAS,uBAAuB;IAC9B,IAAI;IACJ,IAAI;AAEJ,eAAW,YAAY;AACrB,MAAC,CAAE,YAAY,YAAaA,mBAAAA,uBAAuB;MACjD;MACA;MACA;MACD,CAAC;KAGF,MAAM,qBAAqB,MAAM,aAAa,IAAI,EAChD,cAAc;MACZ;MACA;MACA;MACD,EACF,CAAC;AACF,YAAO,mBAAmB,CAAC,eAAe;AAE1C,sBAAiB,MAAM,aAAa,IAClC,EACE,cAAc;MACZ;MACA;MACD,EACF,EACD,YACA,UACA,EAAE,CACH;AAED,WAAM,aAAa,UACjB,gBACA,CAAC,CAAC,WAAW,MAAM,CAAC,EACpB,WACD;AAED,4BAAuB,MAAM,aAAa,SAAS,eAAe;AAGlE,YAAO,qBAAqB,CAAC,IAAI,eAAe;AAChD,YAAO,sBAAsB,WAAW,CAAC,QAAQ,WAAW;AAC5D,YAAO,sBAAsB,SAAS,CAAC,QAAQ,SAAS;AACxD,YAAO,sBAAsB,OAAO,CAAC,QAAQ,EAC3C,cAAc;MACZ;MACA;MACA;MACD,EACF,CAAC;MACF;AAEF,OAAG,yCAAyC,YAAY;AACtD,YAAO,sBAAsB,cAAc,CAAC,QAAQ,CAClD;MAAC;MAAY;MAAW;MAAM,CAC/B,CAAC;MACF;KACF;AAEF,YAAS,uBAAuB;AAC9B,OAAG,2CAA2C,YAAY;KACxD,MAAM,wBAAwB,EAC5B,cAAc;MACZ;MACA;MACD,EACF;AAED,WAAM,OACJ,YACE,MAAM,aAAa,UACjB,uBACA,CAAC,CAAC,WAAW,MAAM,CAAC,EACpB,WACD,CACJ,CAAC,QAAQ,SAAS;MACnB;AAEF,OAAG,+CAA+C,YAAY;KAC5D,MAAM,4BAA4C,EAChD,cAAc;MACZ;MACA;MACD,EACF;AAED,WAAM,OACJ,YACE,MAAM,aAAa,UACjB,2BACA,CAAC,CAAC,WAAW,MAAM,CAAC,EACpB,WACD,CACJ,CAAC,QAAQ,SAAS;MACnB;KACF;IACF;GACF"}