mirror of
https://github.com/kristoferssolo/telescope-frecency.nvim.git
synced 2025-10-21 20:10:38 +00:00
Now it uses realpath for registering and validating DB. This means, if you have entries that has filenames differing only for case, it can deal with them as they exist. Before this, it has miscalculated scores for such cases. For example, in case you have `/path/to/foo.lua` and `/path/to/Foo.lua`, it registers entries for each file. Now it detects accurate filename for the specified one, and removes it in validation. * test: separate logic for utils * fix!: register realpath for consistency * refactor: convert fs module from class * refactor: move db initialization phase to start() * fix: run database:start() truly asynchronously * fix: call each functions with async wrapping * refactor: add types for args in command * fix: run register() synchronously Because vim.api.nvim_* cannot be used in asynchronous functions. * docs: add note for calling setup() twice * fix: run non-fast logic on next tick
259 lines
11 KiB
Lua
259 lines
11 KiB
Lua
local util = require "frecency.tests.util"
|
|
local async = require "plenary.async"
|
|
|
|
local filepath = util.filepath
|
|
local make_epoch = util.make_epoch
|
|
local make_register = util.make_register
|
|
local with_fake_vim_ui_select = util.with_fake_vim_ui_select
|
|
local with_files = util.with_files
|
|
|
|
-- HACK: avoid error:
|
|
-- E5560: nvim_echo must not be called in a lua loop callback
|
|
vim.notify = function(_, _) end
|
|
|
|
describe("frecency", function()
|
|
describe("validate_database", function()
|
|
describe("when no files are unlinked", function()
|
|
with_files({ "hoge1.txt", "hoge2.txt" }, function(frecency, finder, dir)
|
|
local register = make_register(frecency, dir)
|
|
local epoch1 = make_epoch "2023-07-29T00:00:00+09:00"
|
|
local epoch2 = make_epoch "2023-07-29T00:01:00+09:00"
|
|
register("hoge1.txt", epoch1)
|
|
register("hoge2.txt", epoch2)
|
|
|
|
it("removes no entries", function()
|
|
local results = finder:get_results(nil, make_epoch "2023-07-29T02:00:00+09:00")
|
|
assert.are.same({
|
|
{ count = 1, path = filepath(dir, "hoge2.txt"), score = 10, timestamps = { epoch2 } },
|
|
{ count = 1, path = filepath(dir, "hoge1.txt"), score = 10, timestamps = { epoch1 } },
|
|
}, results)
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
describe("when with not force", function()
|
|
describe("when files are unlinked but it is less than threshold", function()
|
|
with_files(
|
|
{ "hoge1.txt", "hoge2.txt", "hoge3.txt", "hoge4.txt", "hoge5.txt" },
|
|
{ db_validate_threshold = 3 },
|
|
function(frecency, finder, dir)
|
|
local register = make_register(frecency, dir)
|
|
local epoch1 = make_epoch "2023-07-29T00:00:00+09:00"
|
|
local epoch2 = make_epoch "2023-07-29T00:01:00+09:00"
|
|
local epoch3 = make_epoch "2023-07-29T00:02:00+09:00"
|
|
local epoch4 = make_epoch "2023-07-29T00:03:00+09:00"
|
|
local epoch5 = make_epoch "2023-07-29T00:04:00+09:00"
|
|
register("hoge1.txt", epoch1)
|
|
register("hoge2.txt", epoch2)
|
|
register("hoge3.txt", epoch3)
|
|
register("hoge4.txt", epoch4)
|
|
register("hoge5.txt", epoch5)
|
|
dir:joinpath("hoge1.txt"):rm()
|
|
dir:joinpath("hoge2.txt"):rm()
|
|
async.util.block_on(function()
|
|
frecency:validate_database()
|
|
end)
|
|
|
|
it("removes no entries", function()
|
|
local results = finder:get_results(nil, make_epoch "2023-07-29T02:00:00+09:00")
|
|
table.sort(results, function(a, b)
|
|
return a.path < b.path
|
|
end)
|
|
assert.are.same({
|
|
{ count = 1, path = filepath(dir, "hoge1.txt"), score = 10, timestamps = { epoch1 } },
|
|
{ count = 1, path = filepath(dir, "hoge2.txt"), score = 10, timestamps = { epoch2 } },
|
|
{ count = 1, path = filepath(dir, "hoge3.txt"), score = 10, timestamps = { epoch3 } },
|
|
{ count = 1, path = filepath(dir, "hoge4.txt"), score = 10, timestamps = { epoch4 } },
|
|
{ count = 1, path = filepath(dir, "hoge5.txt"), score = 10, timestamps = { epoch5 } },
|
|
}, results)
|
|
end)
|
|
end
|
|
)
|
|
end)
|
|
|
|
describe("when files are unlinked and it is more than threshold", function()
|
|
describe('when the user response "yes"', function()
|
|
with_files(
|
|
{ "hoge1.txt", "hoge2.txt", "hoge3.txt", "hoge4.txt", "hoge5.txt" },
|
|
{ db_validate_threshold = 3 },
|
|
function(frecency, finder, dir)
|
|
local register = make_register(frecency, dir)
|
|
local epoch1 = make_epoch "2023-07-29T00:00:00+09:00"
|
|
local epoch2 = make_epoch "2023-07-29T00:01:00+09:00"
|
|
local epoch3 = make_epoch "2023-07-29T00:02:00+09:00"
|
|
local epoch4 = make_epoch "2023-07-29T00:03:00+09:00"
|
|
local epoch5 = make_epoch "2023-07-29T00:04:00+09:00"
|
|
register("hoge1.txt", epoch1)
|
|
register("hoge2.txt", epoch2)
|
|
register("hoge3.txt", epoch3)
|
|
register("hoge4.txt", epoch4)
|
|
register("hoge5.txt", epoch5)
|
|
dir:joinpath("hoge1.txt"):rm()
|
|
dir:joinpath("hoge2.txt"):rm()
|
|
dir:joinpath("hoge3.txt"):rm()
|
|
|
|
with_fake_vim_ui_select("y", function(called)
|
|
async.util.block_on(function()
|
|
frecency:validate_database()
|
|
end)
|
|
|
|
it("called vim.ui.select()", function()
|
|
assert.are.same(1, called())
|
|
end)
|
|
end)
|
|
|
|
it("removes entries", function()
|
|
local results = finder:get_results(nil, make_epoch "2023-07-29T02:00:00+09:00")
|
|
table.sort(results, function(a, b)
|
|
return a.path < b.path
|
|
end)
|
|
assert.are.same({
|
|
{ count = 1, path = filepath(dir, "hoge4.txt"), score = 10, timestamps = { epoch4 } },
|
|
{ count = 1, path = filepath(dir, "hoge5.txt"), score = 10, timestamps = { epoch5 } },
|
|
}, results)
|
|
end)
|
|
end
|
|
)
|
|
end)
|
|
|
|
describe('when the user response "no"', function()
|
|
with_files(
|
|
{ "hoge1.txt", "hoge2.txt", "hoge3.txt", "hoge4.txt", "hoge5.txt" },
|
|
{ db_validate_threshold = 3 },
|
|
function(frecency, finder, dir)
|
|
local register = make_register(frecency, dir)
|
|
local epoch1 = make_epoch "2023-07-29T00:00:00+09:00"
|
|
local epoch2 = make_epoch "2023-07-29T00:01:00+09:00"
|
|
local epoch3 = make_epoch "2023-07-29T00:02:00+09:00"
|
|
local epoch4 = make_epoch "2023-07-29T00:03:00+09:00"
|
|
local epoch5 = make_epoch "2023-07-29T00:04:00+09:00"
|
|
register("hoge1.txt", epoch1)
|
|
register("hoge2.txt", epoch2)
|
|
register("hoge3.txt", epoch3)
|
|
register("hoge4.txt", epoch4)
|
|
register("hoge5.txt", epoch5)
|
|
dir:joinpath("hoge1.txt"):rm()
|
|
dir:joinpath("hoge2.txt"):rm()
|
|
dir:joinpath("hoge3.txt"):rm()
|
|
|
|
with_fake_vim_ui_select("n", function(called)
|
|
async.util.block_on(function()
|
|
frecency:validate_database()
|
|
end)
|
|
|
|
it("called vim.ui.select()", function()
|
|
assert.are.same(1, called())
|
|
end)
|
|
end)
|
|
|
|
it("removes no entries", function()
|
|
local results = finder:get_results(nil, make_epoch "2023-07-29T02:00:00+09:00")
|
|
table.sort(results, function(a, b)
|
|
return a.path < b.path
|
|
end)
|
|
assert.are.same({
|
|
{ count = 1, path = filepath(dir, "hoge1.txt"), score = 10, timestamps = { epoch1 } },
|
|
{ count = 1, path = filepath(dir, "hoge2.txt"), score = 10, timestamps = { epoch2 } },
|
|
{ count = 1, path = filepath(dir, "hoge3.txt"), score = 10, timestamps = { epoch3 } },
|
|
{ count = 1, path = filepath(dir, "hoge4.txt"), score = 10, timestamps = { epoch4 } },
|
|
{ count = 1, path = filepath(dir, "hoge5.txt"), score = 10, timestamps = { epoch5 } },
|
|
}, results)
|
|
end)
|
|
end
|
|
)
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
describe("when with force", function()
|
|
describe("when db_safe_mode is true", function()
|
|
with_files({ "hoge1.txt", "hoge2.txt" }, function(frecency, finder, dir)
|
|
local register = make_register(frecency, dir)
|
|
local epoch1 = make_epoch "2023-07-29T00:00:00+09:00"
|
|
local epoch2 = make_epoch "2023-07-29T00:01:00+09:00"
|
|
register("hoge1.txt", epoch1)
|
|
register("hoge2.txt", epoch2)
|
|
dir:joinpath("hoge1.txt"):rm()
|
|
|
|
with_fake_vim_ui_select("y", function(called)
|
|
async.util.block_on(function()
|
|
frecency:validate_database(true)
|
|
end)
|
|
|
|
it("called vim.ui.select()", function()
|
|
assert.are.same(1, called())
|
|
end)
|
|
end)
|
|
|
|
it("needs confirmation for removing entries", function()
|
|
local results = finder:get_results(nil, make_epoch "2023-07-29T02:00:00+09:00")
|
|
assert.are.same({
|
|
{ count = 1, path = filepath(dir, "hoge2.txt"), score = 10, timestamps = { epoch2 } },
|
|
}, results)
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
describe("when db_safe_mode is false", function()
|
|
with_files({ "hoge1.txt", "hoge2.txt" }, { db_safe_mode = false }, function(frecency, finder, dir)
|
|
local register = make_register(frecency, dir)
|
|
local epoch1 = make_epoch "2023-07-29T00:00:00+09:00"
|
|
local epoch2 = make_epoch "2023-07-29T00:01:00+09:00"
|
|
register("hoge1.txt", epoch1)
|
|
register("hoge2.txt", epoch2)
|
|
dir:joinpath("hoge1.txt"):rm()
|
|
|
|
with_fake_vim_ui_select("y", function(called)
|
|
async.util.block_on(function()
|
|
frecency:validate_database(true)
|
|
end)
|
|
|
|
it("did not call vim.ui.select()", function()
|
|
assert.are.same(0, called())
|
|
end)
|
|
end)
|
|
|
|
it("needs no confirmation for removing entries", function()
|
|
local results = finder:get_results(nil, make_epoch "2023-07-29T02:00:00+09:00")
|
|
assert.are.same({
|
|
{ count = 1, path = filepath(dir, "hoge2.txt"), score = 10, timestamps = { epoch2 } },
|
|
}, results)
|
|
end)
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
describe("when case sensive filename", function()
|
|
with_files({ "hoge1.txt", "hoge2.txt" }, function(frecency, finder, dir)
|
|
local register = make_register(frecency, dir)
|
|
local epoch1 = make_epoch "2023-07-29T00:00:00+09:00"
|
|
local epoch2 = make_epoch "2023-07-29T00:01:00+09:00"
|
|
local epoch3 = make_epoch "2023-07-29T00:02:00+09:00"
|
|
register("hoge1.txt", epoch1)
|
|
register("hoge2.txt", epoch2, nil, true)
|
|
dir:joinpath("hoge1.txt"):rm()
|
|
dir:joinpath("hoge2.txt"):rename { new_name = dir:joinpath("_hoge2.txt").filename }
|
|
dir:joinpath("_hoge2.txt"):rename { new_name = dir:joinpath("Hoge2.txt").filename }
|
|
register("Hoge2.txt", epoch3)
|
|
|
|
with_fake_vim_ui_select("y", function(called)
|
|
async.util.block_on(function()
|
|
frecency:validate_database(true)
|
|
end)
|
|
|
|
it("calls vim.ui.select()", function()
|
|
assert.are.same(1, called())
|
|
end)
|
|
end)
|
|
|
|
it("removes duplicated case sensitive filenames", function()
|
|
local results = finder:get_results(nil, make_epoch "2023-07-29T03:00:00+09:00")
|
|
assert.are.same({
|
|
{ count = 1, path = filepath(dir, "Hoge2.txt"), score = 10, timestamps = { epoch3 } },
|
|
}, results)
|
|
end)
|
|
end)
|
|
end)
|
|
end)
|
|
end)
|