183 lines
5.5 KiB
Lua
183 lines
5.5 KiB
Lua
-- Smoke test for mason-conform.nvim with stubbed mason/conform.
|
|
-- Run from the repository root: nvim -l tests/smoke_test.lua
|
|
local script = (arg and arg[0]) or "tests/smoke_test.lua"
|
|
local root = script:match("^(.*)/tests/") or "."
|
|
package.path = ("%s/lua/?.lua;%s/lua/?/init.lua;"):format(root, root) .. package.path
|
|
|
|
local failures = {}
|
|
local function check(cond, msg)
|
|
if not cond then
|
|
failures[#failures + 1] = msg
|
|
print("FAIL: " .. msg)
|
|
else
|
|
print("ok: " .. msg)
|
|
end
|
|
end
|
|
|
|
-- ---- stubs -------------------------------------------------------------
|
|
local notifications = {}
|
|
local install_calls = {}
|
|
local installed = {}
|
|
local installing = {}
|
|
|
|
package.preload["conform"] = function()
|
|
return {
|
|
formatters_by_ft = {
|
|
lua = { "stylua" },
|
|
python = { "autopep8", lsp_format = "fallback", stop_after_first = true },
|
|
markdown = { { "prettierd", "prettier" }, "cbfmt" },
|
|
javascript = function()
|
|
error("needs a buffer")
|
|
end,
|
|
go = function()
|
|
return { "gofumpt" }
|
|
end,
|
|
},
|
|
}
|
|
end
|
|
|
|
package.preload["mason-registry"] = function()
|
|
local registry = {}
|
|
function registry.refresh(cb)
|
|
if cb then
|
|
cb(true, {})
|
|
end
|
|
end
|
|
function registry.get_package(name)
|
|
if name == "not-in-registry" then
|
|
error(('Cannot find package "%q".'):format(name))
|
|
end
|
|
local pkg = { name = name }
|
|
function pkg:is_installed()
|
|
return installed[name] or false
|
|
end
|
|
function pkg:is_installing()
|
|
return installing[name] or false
|
|
end
|
|
function pkg:install(opts)
|
|
install_calls[#install_calls + 1] = { name = name, version = opts and opts.version }
|
|
local handle = {}
|
|
function handle:once(event, cb2)
|
|
assert(event == "closed")
|
|
installed[name] = true
|
|
cb2()
|
|
end
|
|
return handle
|
|
end
|
|
return pkg
|
|
end
|
|
return registry
|
|
end
|
|
|
|
package.preload["mason-core.package"] = function()
|
|
local Package = {}
|
|
function Package.Parse(identifier)
|
|
local name, version = identifier:match("^([^@]+)@?(.*)$")
|
|
if version == "" then
|
|
version = nil
|
|
end
|
|
return name, version
|
|
end
|
|
return Package
|
|
end
|
|
|
|
package.preload["mason.version"] = function()
|
|
return { MAJOR_VERSION = 2, MINOR_VERSION = 3 }
|
|
end
|
|
|
|
local original_notify = vim.notify
|
|
vim.notify = function(msg, level)
|
|
notifications[#notifications + 1] = { msg = msg, level = level or vim.log.levels.INFO }
|
|
end
|
|
|
|
-- ---- tests -------------------------------------------------------------
|
|
|
|
-- setup() with defaults
|
|
local mc = require("mason-conform")
|
|
mc.setup()
|
|
vim.wait(200)
|
|
check(vim.deep_equal(mc.config, { ignore_install = {} }), "setup() without opts keeps defaults")
|
|
|
|
local function installed_names()
|
|
local names = {}
|
|
for _, call in ipairs(install_calls) do
|
|
names[#names + 1] = call.name
|
|
end
|
|
table.sort(names)
|
|
return names
|
|
end
|
|
|
|
check(
|
|
vim.deep_equal(installed_names(), { "autopep8", "cbfmt", "gofumpt", "prettier", "prettierd", "stylua" }),
|
|
"installs mapped formatters from every formatters_by_ft shape; skips broken function: "
|
|
.. table.concat(installed_names(), ",")
|
|
)
|
|
|
|
-- setup() again with ignore_install
|
|
install_calls = {}
|
|
notifications = {}
|
|
installed = {}
|
|
mc.setup({ ignore_install = { "prettierd" } })
|
|
vim.wait(200)
|
|
check(
|
|
vim.deep_equal(installed_names(), { "autopep8", "cbfmt", "gofumpt", "prettier", "stylua" }),
|
|
"ignore_install is respected: " .. table.concat(installed_names(), ",")
|
|
)
|
|
check(vim.deep_equal(mc.config.ignore_install, { "prettierd" }), "ignore_install stored")
|
|
|
|
-- installed / installing packages are skipped
|
|
install_calls = {}
|
|
installed = {}
|
|
installing = {}
|
|
installed["stylua"] = true
|
|
installing["autopep8"] = true
|
|
mc.setup({ ignore_install = {} })
|
|
vim.wait(200)
|
|
check(
|
|
vim.deep_equal(installed_names(), { "cbfmt", "gofumpt", "prettier", "prettierd" }),
|
|
"already installed/installing packages are skipped: " .. table.concat(installed_names(), ",")
|
|
)
|
|
|
|
-- unknown mason package -> warning, no error
|
|
local install = require("mason-conform.install")
|
|
notifications = {}
|
|
local ok = pcall(install.try_install, "not-in-registry")
|
|
check(ok, "try_install on unknown package does not raise")
|
|
check(#notifications == 1 and notifications[1].level == vim.log.levels.WARN, "unknown package emits a warning")
|
|
check(
|
|
notifications[1] and notifications[1].msg:find("not%-in%-registry", 1, false) ~= nil,
|
|
"warning names the formatter"
|
|
)
|
|
|
|
-- version pinning passes through Package.Parse
|
|
installed = {}
|
|
install_calls = {}
|
|
install.try_install("stylua@1.2.0")
|
|
check(install_calls[1] and install_calls[1].version == "1.2.0", "version suffix forwarded to mason")
|
|
|
|
-- setup() validates its argument
|
|
ok = pcall(mc.setup, "not a table")
|
|
check(not ok, "setup() rejects non-table opts")
|
|
|
|
-- health check runs
|
|
local health_ok, err = pcall(function()
|
|
require("mason-conform.health").check()
|
|
end)
|
|
check(health_ok, "health check runs without error" .. (health_ok and "" or (": " .. tostring(err))))
|
|
|
|
-- formatters module
|
|
local formatters = require("mason-conform.formatters").configured()
|
|
check(
|
|
vim.deep_equal(formatters, { "autopep8", "cbfmt", "gofumpt", "prettier", "prettierd", "stylua" }),
|
|
"formatters.configured() returns sorted unique names"
|
|
)
|
|
|
|
vim.notify = original_notify
|
|
|
|
print(("-"):rep(60))
|
|
if #failures > 0 then
|
|
print(("%d FAILURE(S)"):format(#failures))
|
|
os.exit(1)
|
|
end
|
|
print("all tests passed")
|