diff options
| author | William Boman <william@redwill.se> | 2022-10-05 20:33:21 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-05 20:33:21 +0200 |
| commit | 738684097dfdd9a4a67cd217b0beda3e169bd85d (patch) | |
| tree | d2eb8485dedcac66061b0d99ad7f810828911073 /tests | |
| parent | test(cargo): stub crates.io http call (#508) (diff) | |
| download | mason-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.lua | 172 | ||||
| -rw-r--r-- | tests/mason-core/managers/github_client_spec.lua | 21 | ||||
| -rw-r--r-- | tests/mason-core/optional_spec.lua | 17 | ||||
| -rw-r--r-- | tests/mason-core/result_spec.lua | 13 |
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) |
