require("../../../tests/utilities/TestConfiguration")
const { Writethrough } = require("../writethrough")
const { dangerousGetDB } = require("../../db")
const tk = require("timekeeper")

const START_DATE = Date.now()
tk.freeze(START_DATE)

const DELAY = 5000

const db = dangerousGetDB("test")
const db2 = dangerousGetDB("test2")
const writethrough = new Writethrough(db, DELAY), writethrough2 = new Writethrough(db2, DELAY)

describe("writethrough", () => {
  describe("put", () => {
    let first
    it("should be able to store, will go to DB", async () => {
      const response = await writethrough.put({ _id: "test", value: 1 })
      const output = await db.get(response.id)
      first = output
      expect(output.value).toBe(1)
    })

    it("second put shouldn't update DB", async () => {
      const response = await writethrough.put({ ...first, value: 2 })
      const output = await db.get(response.id)
      expect(first._rev).toBe(output._rev)
      expect(output.value).toBe(1)
    })

    it("should put it again after delay period", async () => {
      tk.freeze(START_DATE + DELAY + 1)
      const response = await writethrough.put({ ...first, value: 3 })
      const output = await db.get(response.id)
      expect(response.rev).not.toBe(first._rev)
      expect(output.value).toBe(3)
    })
  })

  describe("get", () => {
    it("should be able to retrieve", async () => {
      const response = await writethrough.get("test")
      expect(response.value).toBe(3)
    })
  })

  describe("same doc, different databases (tenancy)", () => {
    it("should be able to two different databases", async () => {
      const resp1 = await writethrough.put({ _id: "db1", value: "first" })
      const resp2 = await writethrough2.put({ _id: "db1", value: "second" })
      expect(resp1.rev).toBeDefined()
      expect(resp2.rev).toBeDefined()
      expect((await db.get("db1")).value).toBe("first")
      expect((await db2.get("db1")).value).toBe("second")
    })
  })
})

