aboutsummaryrefslogtreecommitdiffstats
path: root/tests/mason-core/managers/cargo_spec.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-07-08 18:34:38 +0200
committerGitHub <noreply@github.com>2022-07-08 18:34:38 +0200
commit976aa4fbee8a070f362cab6f6ec84e9251a90cf9 (patch)
tree5e8d9c9c59444a25c7801b8f39763c4ba6e1f76d /tests/mason-core/managers/cargo_spec.lua
parentfeat: add gotests, gomodifytags, impl (#28) (diff)
downloadmason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.gz
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.bz2
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.lz
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.xz
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.zst
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.zip
refactor: add mason-schemas and mason-core modules (#29)
* refactor: add mason-schemas and move generated filetype map to mason-lspconfig * refactor: add mason-core module
Diffstat (limited to 'tests/mason-core/managers/cargo_spec.lua')
-rw-r--r--tests/mason-core/managers/cargo_spec.lua226
1 files changed, 226 insertions, 0 deletions
diff --git a/tests/mason-core/managers/cargo_spec.lua b/tests/mason-core/managers/cargo_spec.lua
new file mode 100644
index 00000000..a938452b
--- /dev/null
+++ b/tests/mason-core/managers/cargo_spec.lua
@@ -0,0 +1,226 @@
+local spy = require "luassert.spy"
+local match = require "luassert.match"
+local mock = require "luassert.mock"
+local Optional = require "mason-core.optional"
+local installer = require "mason-core.installer"
+local cargo = require "mason-core.managers.cargo"
+local Result = require "mason-core.result"
+local spawn = require "mason-core.spawn"
+local path = require "mason-core.path"
+
+describe("cargo manager", function()
+ it(
+ "should call cargo install",
+ async_test(function()
+ local handle = InstallHandleGenerator "dummy"
+ local ctx = InstallContextGenerator(handle, { requested_version = "42.13.37" })
+ installer.run_installer(ctx, cargo.crate "my-crate")
+ assert.spy(ctx.spawn.cargo).was_called(1)
+ assert.spy(ctx.spawn.cargo).was_called_with {
+ "install",
+ "--root",
+ ".",
+ "--locked",
+ { "--version", "42.13.37" },
+ vim.NIL, -- --features
+ "my-crate",
+ }
+ end)
+ )
+
+ it(
+ "should call cargo install with git source",
+ async_test(function()
+ local handle = InstallHandleGenerator "dummy"
+ local ctx = InstallContextGenerator(handle)
+ installer.run_installer(ctx, cargo.crate("https://my-crate.git", { git = true }))
+ assert.spy(ctx.spawn.cargo).was_called(1)
+ assert.spy(ctx.spawn.cargo).was_called_with {
+ "install",
+ "--root",
+ ".",
+ "--locked",
+ vim.NIL,
+ vim.NIL, -- --features
+ { "--git", "https://my-crate.git" },
+ }
+ end)
+ )
+
+ it(
+ "should call cargo install with git source and a specific crate",
+ async_test(function()
+ local handle = InstallHandleGenerator "dummy"
+ local ctx = InstallContextGenerator(handle)
+ installer.run_installer(ctx, cargo.crate("crate-name", { git = "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
+ { "--git", "https://my-crate.git", "crate-name" },
+ }
+ end)
+ )
+
+ it(
+ "should respect options",
+ async_test(function()
+ local handle = InstallHandleGenerator "dummy"
+ local ctx = InstallContextGenerator(handle, { requested_version = "42.13.37" })
+ installer.run_installer(ctx, cargo.crate("my-crate", { features = "lsp" }))
+ assert.spy(ctx.spawn.cargo).was_called(1)
+ assert.spy(ctx.spawn.cargo).was_called_with {
+ "install",
+ "--root",
+ ".",
+ "--locked",
+ { "--version", "42.13.37" },
+ { "--features", "lsp" },
+ "my-crate",
+ }
+ end)
+ )
+
+ it(
+ "should not allow combining version with git crate",
+ async_test(function()
+ local handle = InstallHandleGenerator "dummy"
+ 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)
+ end)
+ )
+
+ it(
+ "should provide receipt information",
+ async_test(function()
+ local handle = InstallHandleGenerator "dummy"
+ local ctx = InstallContextGenerator(handle)
+ installer.run_installer(ctx, cargo.crate "main-package")
+ assert.same({
+ type = "cargo",
+ package = "main-package",
+ }, ctx.receipt.primary_source)
+ end)
+ )
+end)
+
+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",
+ },
+ cargo.parse_installed_crates [[bat v0.18.3:
+ bat
+exa v0.10.1:
+ exa
+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):
+ rust-analyzer
+stylua v0.11.2:
+ stylua
+zoxide v0.5.0:
+ zoxide
+]]
+ )
+ end)
+
+ it(
+ "should return current version",
+ async_test(function()
+ spawn.cargo = spy.new(function()
+ return Result.success {
+ stdout = [[flux-lsp v0.8.8 (https://github.com/influxdata/flux-lsp#4e452f07):
+ flux-lsp
+]],
+ }
+ end)
+
+ local result = cargo.get_installed_primary_package_version(
+ mock.new {
+ primary_source = mock.new {
+ type = "cargo",
+ package = "https://github.com/influxdata/flux-lsp",
+ },
+ },
+ 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.equals("0.8.8", result:get_or_nil())
+
+ spawn.cargo = nil
+ end)
+ )
+
+ -- XXX: This test will actually send http request to crates.io's API. It's not mocked.
+ it(
+ "should return outdated primary package",
+ async_test(function()
+ spawn.cargo = spy.new(function()
+ return Result.success {
+ stdout = [[lelwel v0.4.0:
+ lelwel-ls
+]],
+ }
+ end)
+
+ local result = cargo.check_outdated_primary_package(
+ mock.new {
+ primary_source = mock.new {
+ type = "cargo",
+ package = "lelwel",
+ },
+ },
+ 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 = "0.4.0",
+ latest_version = match.matches "%d.%d.%d",
+ name = "lelwel",
+ }(result:get_or_nil()))
+
+ spawn.cargo = nil
+ end)
+ )
+end)