mirror of
https://github.com/kristoferssolo/telescope-frecency.nvim.git
synced 2025-10-21 20:10:38 +00:00
* refactor: make logic for Database be abstract * feat: add logic for DB by string.dump * fix: run with async.void to run synchronously * test: add tests for native feature * feat!: sort candidates by path when score is same This is needed because candidates from SQLite is sorted by id, but ones from native is sorted by path. * chore: clean up types * feat: add lock/unlock feature to access DB * test: use async version of busted And disable benchmark tests (fix later) * test: add tests for file_lock * chore: use more explicit names * chore: use plenary.log instead * fix: wait async functions definitely * feat: add migrator * chore: fix logging * fix: detect emptiness of the table * fix: deal with buffer with no names * test: loosen the condition temporarily * test: add tests for migrator * fix: return true when the table is not empty * feat: load sqlite lazily not to require in start * chore: add logging to calculate time for fetching * feat: add converter from native code to SQLite * feat: warn when sqlite.lua is not available * feat: add FrecencyMigrateDB to migrate DB * docs: add note for native code logic * test: ignore type bug
136 lines
4.0 KiB
Lua
136 lines
4.0 KiB
Lua
local FileLock = require "frecency.file_lock"
|
|
local util = require "frecency.tests.util"
|
|
local async = require "plenary.async" --[[@as PlenaryAsync]]
|
|
require("plenary.async").tests.add_to_env()
|
|
|
|
local function with_dir(f)
|
|
local dir, close = util.make_tree {}
|
|
local filename = (dir / "file_lock_test").filename
|
|
f(filename)
|
|
close()
|
|
end
|
|
|
|
a.describe("file_lock", function()
|
|
a.describe("get()", function()
|
|
a.describe("when no lock file", function()
|
|
with_dir(function(filename)
|
|
local fl = FileLock.new(filename, { retry = 1, interval = 10 })
|
|
a.it("gets successfully", function()
|
|
assert.is.Nil(fl:get())
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
a.describe("when with a lock file", function()
|
|
with_dir(function(filename)
|
|
local fl = FileLock.new(filename, { retry = 1, interval = 10 })
|
|
a.it("fails to get", function()
|
|
assert.is.Nil(async.uv.fs_open(fl.filename, "wx", tonumber("600", 8)))
|
|
assert.are.same("failed to get lock", fl:get())
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
a.describe("when getting twice", function()
|
|
with_dir(function(filename)
|
|
local fl = FileLock.new(filename, { retry = 1, interval = 10 })
|
|
a.it("fails to get", function()
|
|
assert.is.Nil(fl:get())
|
|
assert.are.same("failed to get lock", fl:get())
|
|
end)
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
a.describe("release()", function()
|
|
a.describe("when no lock file", function()
|
|
with_dir(function(filename)
|
|
local fl = FileLock.new(filename, { retry = 1, interval = 10 })
|
|
a.it("fails to release", function()
|
|
assert.are.same("lock not found", fl:release())
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
a.describe("when with a lock file", function()
|
|
with_dir(function(filename)
|
|
local fl = FileLock.new(filename, { retry = 1, interval = 10 })
|
|
a.it("releases successfully", function()
|
|
assert.is.Nil(fl:get())
|
|
assert.is.Nil(fl:release())
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
a.describe("when releasing twice", function()
|
|
with_dir(function(filename)
|
|
local fl = FileLock.new(filename, { retry = 1, interval = 10 })
|
|
a.it("fails to release", function()
|
|
assert.is.Nil(fl:get())
|
|
assert.is.Nil(fl:release())
|
|
assert.are.same("lock not found", fl:release())
|
|
end)
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
a.describe("with()", function()
|
|
a.describe("when get() fails", function()
|
|
with_dir(function(filename)
|
|
local fl = FileLock.new(filename, { retry = 1, interval = 10 })
|
|
a.it("fails with a valid err", function()
|
|
assert.is.Nil(fl:get())
|
|
assert.are.same(
|
|
"failed to get lock",
|
|
fl:with(function()
|
|
return nil
|
|
end)
|
|
)
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
a.describe("when release() fails", function()
|
|
with_dir(function(filename)
|
|
local fl = FileLock.new(filename, { retry = 1, interval = 10 })
|
|
a.it("fails with a valid err", function()
|
|
assert.are.same(
|
|
"lock not found",
|
|
fl:with(function()
|
|
assert.is.Nil(async.uv.fs_unlink(fl.filename))
|
|
return nil
|
|
end)
|
|
)
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
a.describe("when f() fails", function()
|
|
with_dir(function(filename)
|
|
local fl = FileLock.new(filename, { retry = 1, interval = 10 })
|
|
a.it("fails with a valid err", function()
|
|
assert.has.match(
|
|
": error in hoge function$",
|
|
fl:with(function()
|
|
error "error in hoge function"
|
|
end)
|
|
)
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
a.describe("when no errors", function()
|
|
with_dir(function(filename)
|
|
local fl = FileLock.new(filename, { retry = 1, interval = 10 })
|
|
a.it("run successfully and returns valid results", function()
|
|
local err, result = fl:with(function()
|
|
return "hogehogeo"
|
|
end)
|
|
assert.is.Nil(err)
|
|
assert.are.same("hogehogeo", result)
|
|
end)
|
|
end)
|
|
end)
|
|
end)
|
|
end)
|