aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-10-05 20:33:21 +0200
committerGitHub <noreply@github.com>2022-10-05 20:33:21 +0200
commit738684097dfdd9a4a67cd217b0beda3e169bd85d (patch)
treed2eb8485dedcac66061b0d99ad7f810828911073 /tests
parenttest(cargo): stub crates.io http call (#508) (diff)
downloadmason-738684097dfdd9a4a67cd217b0beda3e169bd85d.tar
mason-738684097dfdd9a4a67cd217b0beda3e169bd85d.tar.gz
mason-738684097dfdd9a4a67cd217b0beda3e169bd85d.tar.bz2
mason-738684097dfdd9a4a67cd217b0beda3e169bd85d.tar.lz
mason-738684097dfdd9a4a67cd217b0beda3e169bd85d.tar.xz
mason-738684097dfdd9a4a67cd217b0beda3e169bd85d.tar.zst
mason-738684097dfdd9a4a67cd217b0beda3e169bd85d.zip
feat(cargo): improve handling of git-based crates (#512)
This is all pretty overkill, especially considering the small amount of packages based on git-based crates.
Diffstat (limited to 'tests')
-rw-r--r--tests/mason-core/managers/cargo_spec.lua172
-rw-r--r--tests/mason-core/managers/github_client_spec.lua21
-rw-r--r--tests/mason-core/optional_spec.lua17
-rw-r--r--tests/mason-core/result_spec.lua13
4 files changed, 194 insertions, 29 deletions
diff --git a/tests/mason-core/managers/cargo_spec.lua b/tests/mason-core/managers/cargo_spec.lua
index ddcb7300..27de7253 100644
--- a/tests/mason-core/managers/cargo_spec.lua
+++ b/tests/mason-core/managers/cargo_spec.lua
@@ -4,7 +4,9 @@ local match = require "luassert.match"
local mock = require "luassert.mock"
local installer = require "mason-core.installer"
local cargo = require "mason-core.managers.cargo"
-local client = require "mason-core.managers.cargo.client"
+local github = require "mason-core.managers.github"
+local cargo_client = require "mason-core.managers.cargo.client"
+local github_client = require "mason-core.managers.github.client"
local Result = require "mason-core.result"
local spawn = require "mason-core.spawn"
local path = require "mason-core.path"
@@ -23,6 +25,7 @@ describe("cargo manager", function()
".",
"--locked",
{ "--version", "42.13.37" },
+ vim.NIL, -- --git
vim.NIL, -- --features
"my-crate",
}
@@ -34,16 +37,17 @@ describe("cargo manager", function()
async_test(function()
local handle = InstallHandleGenerator "dummy"
local ctx = InstallContextGenerator(handle)
- installer.run_installer(ctx, cargo.crate("https://my-crate.git", { git = true }))
+ installer.run_installer(ctx, cargo.crate("my-crate", { git = { url = "https://my-crate.git" } }))
assert.spy(ctx.spawn.cargo).was_called(1)
assert.spy(ctx.spawn.cargo).was_called_with {
"install",
"--root",
".",
"--locked",
- vim.NIL,
- vim.NIL, -- --features
+ vim.NIL, -- version
{ "--git", "https://my-crate.git" },
+ vim.NIL, -- --features
+ "my-crate",
}
end)
)
@@ -53,16 +57,17 @@ describe("cargo manager", function()
async_test(function()
local handle = InstallHandleGenerator "dummy"
local ctx = InstallContextGenerator(handle)
- installer.run_installer(ctx, cargo.crate("crate-name", { git = "https://my-crate.git" }))
+ installer.run_installer(ctx, cargo.crate("crate-name", { git = { url = "https://my-crate.git" } }))
assert.spy(ctx.spawn.cargo).was_called(1)
assert.spy(ctx.spawn.cargo).was_called_with {
"install",
"--root",
".",
"--locked",
- vim.NIL,
+ vim.NIL, -- version
+ { "--git", "https://my-crate.git" },
vim.NIL, -- --features
- { "--git", "https://my-crate.git", "crate-name" },
+ "crate-name",
}
end)
)
@@ -80,6 +85,7 @@ describe("cargo manager", function()
".",
"--locked",
{ "--version", "42.13.37" },
+ vim.NIL, -- --git
{ "--features", "lsp" },
"my-crate",
}
@@ -87,20 +93,32 @@ describe("cargo manager", function()
)
it(
- "should not allow combining version with git crate",
+ "should target tagged git crates",
async_test(function()
local handle = InstallHandleGenerator "dummy"
+ stub(github, "tag")
+ github.tag.returns { tag = "v2.1.1", with_receipt = mockx.just_runs }
local ctx = InstallContextGenerator(handle, { requested_version = "42.13.37" })
- local err = assert.has_error(function()
- installer.run_installer(
- ctx,
- cargo.crate("my-crate", {
- git = true,
- })
- )
- end)
- assert.equals("Providing a version when installing a git crate is not allowed.", err)
- assert.spy(ctx.spawn.cargo).was_called(0)
+ installer.run_installer(
+ ctx,
+ cargo.crate("my-crate", {
+ git = {
+ url = "https://github.com/crate/my-crate",
+ tag = true,
+ },
+ features = "lsp",
+ })
+ )
+ assert.spy(ctx.spawn.cargo).was_called_with {
+ "install",
+ "--root",
+ ".",
+ "--locked",
+ { "--tag", "v2.1.1" },
+ { "--git", "https://github.com/crate/my-crate" }, -- --git
+ { "--features", "lsp" },
+ "my-crate",
+ }
end)
)
@@ -122,13 +140,22 @@ describe("cargo version check", function()
it("parses cargo installed packages output", function()
assert.same(
{
- ["bat"] = "0.18.3",
- ["exa"] = "0.10.1",
- ["git-select-branch"] = "0.1.1",
- ["hello_world"] = "0.0.1",
- ["rust-analyzer"] = "0.0.0",
- ["stylua"] = "0.11.2",
- ["zoxide"] = "0.5.0",
+ ["bat"] = { name = "bat", version = "0.18.3" },
+ ["exa"] = { name = "exa", version = "0.10.1" },
+ ["git-select-branch"] = { name = "git-select-branch", version = "0.1.1" },
+ ["hello_world"] = { name = "hello_world", version = "0.0.1" },
+ ["rust-analyzer"] = {
+ name = "rust-analyzer",
+ version = "187bee0b",
+ github_ref = { owner = "rust-lang", repo = "rust-analyzer", ref = "187bee0b" },
+ },
+ ["move-analyzer"] = {
+ name = "move-analyzer",
+ version = "3cef7fa8",
+ github_ref = { owner = "move-language", repo = "move", ref = "3cef7fa8" },
+ },
+ ["stylua"] = { name = "stylua", version = "0.11.2" },
+ ["zoxide"] = { name = "zoxide", version = "0.5.0" },
},
cargo.parse_installed_crates [[bat v0.18.3:
bat
@@ -138,7 +165,9 @@ git-select-branch v0.1.1:
git-select-branch
hello_world v0.0.1 (/private/var/folders/ky/s6yyhm_d24d0jsrql4t8k4p40000gn/T/tmp.LGbguATJHj):
hello_world
-rust-analyzer v0.0.0 (/private/var/folders/ky/s6yyhm_d24d0jsrql4t8k4p40000gn/T/tmp.YlsHeA9JVL/crates/rust-analyzer):
+move-analyzer v1.0.0 (https://github.com/move-language/move#3cef7fa8):
+ move-analyzer
+rust-analyzer v0.0.0 (https://github.com/rust-lang/rust-analyzer?tag=2022-09-19#187bee0b):
rust-analyzer
stylua v0.11.2:
stylua
@@ -178,7 +207,7 @@ zoxide v0.5.0:
cwd = path.package_prefix "dummy",
})
assert.is_true(result:is_success())
- assert.equals("0.8.8", result:get_or_nil())
+ assert.equals("4e452f07", result:get_or_nil())
spawn.cargo = nil
end)
@@ -194,8 +223,8 @@ zoxide v0.5.0:
]],
}
end)
- stub(client, "fetch_crate")
- client.fetch_crate.returns(Result.success {
+ stub(cargo_client, "fetch_crate")
+ cargo_client.fetch_crate.returns(Result.success {
crate = {
id = "lelwel",
max_stable_version = "0.4.2",
@@ -232,4 +261,89 @@ zoxide v0.5.0:
spawn.cargo = nil
end)
)
+
+ it(
+ "should recognize up-to-date crates",
+ async_test(function()
+ spawn.cargo = spy.new(function()
+ return Result.success {
+ stdout = [[lelwel v0.4.0:
+ lelwel-ls
+]],
+ }
+ end)
+ stub(cargo_client, "fetch_crate")
+ cargo_client.fetch_crate.returns(Result.success {
+ crate = {
+ id = "lelwel",
+ max_stable_version = "0.4.0",
+ max_version = "0.4.0",
+ newest_version = "0.4.0",
+ },
+ })
+
+ local result = cargo.check_outdated_primary_package(
+ mock.new {
+ primary_source = mock.new {
+ type = "cargo",
+ package = "lelwel",
+ },
+ },
+ path.package_prefix "dummy"
+ )
+
+ assert.is_true(result:is_failure())
+ assert.equals("Primary package is not outdated.", result:err_or_nil())
+ spawn.cargo = nil
+ end)
+ )
+
+ it(
+ "should return outdated primary package from git source",
+ async_test(function()
+ spawn.cargo = spy.new(function()
+ return Result.success {
+ stdout = [[move-analyzer v1.0.0 (https://github.com/move-language/move#3cef7fa8):
+ move-analyzer
+]],
+ }
+ end)
+
+ stub(github_client, "fetch_commits")
+ github_client.fetch_commits
+ .on_call_with("move-language/move", { page = 1, per_page = 1 })
+ .returns(Result.success {
+ {
+ sha = "b243f1fb",
+ },
+ })
+
+ local result = cargo.check_outdated_primary_package(
+ mock.new {
+ primary_source = mock.new {
+ type = "cargo",
+ package = "move-analyzer",
+ },
+ },
+ path.package_prefix "dummy"
+ )
+
+ assert.spy(spawn.cargo).was_called(1)
+ assert.spy(spawn.cargo).was_called_with(match.tbl_containing {
+ "install",
+ "--list",
+ "--root",
+ ".",
+ cwd = path.package_prefix "dummy",
+ })
+ assert.is_true(result:is_success())
+ assert.is_true(match.tbl_containing {
+ current_version = "3cef7fa8",
+ latest_version = "b243f1fb",
+ name = "move-analyzer",
+ }(result:get_or_nil()))
+
+ spawn.cargo = nil
+ end)
+ )
end)
diff --git a/tests/mason-core/managers/github_client_spec.lua b/tests/mason-core/managers/github_client_spec.lua
index 11b06880..8dec1ca8 100644
--- a/tests/mason-core/managers/github_client_spec.lua
+++ b/tests/mason-core/managers/github_client_spec.lua
@@ -1,4 +1,8 @@
+local spy = require "luassert.spy"
+local stub = require "luassert.stub"
local client = require "mason-core.managers.github.client"
+local spawn = require "mason-core.spawn"
+local Result = require "mason-core.result"
describe("github client", function()
---@type GitHubRelease
@@ -38,4 +42,21 @@ describe("github client", function()
assert.is_false(predicate(stub_release { prerelease = true }))
assert.is_false(predicate(stub_release { draft = true }))
end)
+
+ it("should provide query parameters in api calls", function()
+ stub(spawn, "gh")
+ spawn.gh.returns(Result.success { stdout = "response data" })
+ client.api_call("repos/some/repo", {
+ params = {
+ page = 23,
+ page_limit = 82,
+ },
+ })
+ assert.spy(spawn.gh).was_called(1)
+ assert.spy(spawn.gh).was_called_with {
+ "api",
+ "repos/some/repo?page=23&page_limit=82",
+ env = { CLICOLOR_FORCE = 0 },
+ }
+ end)
end)
diff --git a/tests/mason-core/optional_spec.lua b/tests/mason-core/optional_spec.lua
index 4e6b1325..b1a4f41a 100644
--- a/tests/mason-core/optional_spec.lua
+++ b/tests/mason-core/optional_spec.lua
@@ -1,4 +1,5 @@
local Optional = require "mason-core.optional"
+local Result = require "mason-core.result"
local spy = require "luassert.spy"
describe("Optional.of_nilable", function()
@@ -75,3 +76,19 @@ describe("Optional.if_not_present()", function()
assert.spy(present).was_called(1)
end)
end)
+
+describe("Optional.ok_or()", function()
+ it("should return success variant if non-empty", function()
+ local result = Optional.of_nilable("Hello world!"):ok_or()
+ assert.is_true(getmetatable(result) == Result)
+ assert.equals("Hello world!", result:get_or_nil())
+ end)
+
+ it("should return failure variant if empty", function()
+ local result = Optional.empty():ok_or(function()
+ return "I'm empty."
+ end)
+ assert.is_true(getmetatable(result) == Result)
+ assert.equals("I'm empty.", result:err_or_nil())
+ end)
+end)
diff --git a/tests/mason-core/result_spec.lua b/tests/mason-core/result_spec.lua
index 777e268b..737d8c56 100644
--- a/tests/mason-core/result_spec.lua
+++ b/tests/mason-core/result_spec.lua
@@ -1,6 +1,7 @@
local Result = require "mason-core.result"
local match = require "luassert.match"
local spy = require "luassert.spy"
+local Optional = require "mason-core.optional"
describe("result", function()
it("should create success", function()
@@ -140,4 +141,16 @@ describe("result", function()
assert.spy(on_success).was_called(1)
assert.spy(on_success).was_called_with "Oh noes"
end)
+
+ it("should convert success variants to non-empty optionals", function()
+ local opt = Result.success("Hello world!"):ok()
+ assert.is_true(getmetatable(opt) == Optional)
+ assert.equals("Hello world!", opt:get())
+ end)
+
+ it("should convert failure variants to empty optionals", function()
+ local opt = Result.failure("Hello world!"):ok()
+ assert.is_true(getmetatable(opt) == Optional)
+ assert.is_false(opt:is_present())
+ end)
end)