diff options
| author | William Boman <william@redwill.se> | 2022-07-08 18:34:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-07-08 18:34:38 +0200 |
| commit | 976aa4fbee8a070f362cab6f6ec84e9251a90cf9 (patch) | |
| tree | 5e8d9c9c59444a25c7801b8f39763c4ba6e1f76d /tests/mason-core/managers/cargo_spec.lua | |
| parent | feat: add gotests, gomodifytags, impl (#28) (diff) | |
| download | mason-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.lua | 226 |
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) |
