Files

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")