diff --git a/executable/Uninstall.re b/executable/Uninstall.re
index e5b0f98..f61da51 100644
--- a/executable/Uninstall.re
+++ b/executable/Uninstall.re
@@ -2,14 +2,20 @@ open Fnm;
open Lwt.Infix;
let run = (~version) => {
- let version = Versions.format(version);
+ let%lwt installedVersions = Versions.getInstalledVersions();
- let%lwt installedVersion =
- Versions.getInstalledVersions()
- >|= List.find_opt(x => Versions.Local.(x.name == version));
+ let formattedVersionName = Versions.format(version);
+ let matchingLocalVersions =
+ installedVersions
+ |> Versions.(
+ List.filter(v =>
+ isVersionFitsPrefix(formattedVersionName, Local.(v.name))
+ || v.name == formattedVersionName
+ )
+ );
- switch (installedVersion) {
- | None =>
+ switch (matchingLocalVersions) {
+ | [] =>
Logger.error(
"The version "
@@ -18,7 +24,7 @@ let run = (~version) => {
,
);
Lwt.return_error(1);
- | Some(installedVersion) =>
+ | [installedVersion] =>
Logger.debug(
"Uninstalling node "
@@ -38,5 +44,25 @@ let run = (~version) => {
,
);
Lwt.return_ok();
+ | _ =>
+ Logger.info(
+
+ "There are multiple versions matching your criterias:"
+ ,
+ );
+ matchingLocalVersions
+ |> List.iter(matchingVersion =>
+ Logger.info(
+
+ Versions.Local.(matchingVersion.name)
+ ,
+ )
+ );
+ Logger.info(
+
+ "\nPlease run the command again with the correct version."
+ ,
+ );
+ Lwt.return_error(1);
};
};
diff --git a/test/TestFnm.re b/test/TestFnm.re
index adcbb92..f98c173 100644
--- a/test/TestFnm.re
+++ b/test/TestFnm.re
@@ -1,6 +1,7 @@
include SmokeTest;
include TestSemver;
include TestFs;
+include TestUninstall;
include TestListRemote;
TestFramework.cli();
diff --git a/test/TestUninstall.re b/test/TestUninstall.re
new file mode 100644
index 0000000..e3e35fd
--- /dev/null
+++ b/test/TestUninstall.re
@@ -0,0 +1,54 @@
+open TestFramework;
+
+let installVersion = version => run([|"install", version|]);
+let uninstallVersion = version => run([|"uninstall", version|]);
+
+let isVersionInstalled = version =>
+ run([|"ls"|])
+ |> String.split_on_char('\n')
+ |> List.exists(v => v == "* v" ++ version);
+
+describe("Uninstall", ({test}) => {
+ test("Should be possible to uninstall a specific version", ({expect, _}) => {
+ let version = "6.0.0";
+ let _ = installVersion(version);
+ let response = uninstallVersion(version);
+ expect.string(response).toMatch(
+ ".*v" ++ version ++ ".* has correctly been removed.*",
+ );
+ expect.bool(isVersionInstalled(version)).toBeFalse();
+ });
+ test(
+ "Should print out a message if multiple versions match the prefix",
+ ({expect, _}) => {
+ let v1 = "6.10.0";
+ let v2 = "6.11.0";
+ let _ = installVersion(v1);
+ let _ = installVersion(v2);
+ let response =
+ uninstallVersion("6")
+ |> String.split_on_char('\n')
+ |> String.concat(" ");
+ expect.string(response).toMatch(
+ ".*multiple versions.*" ++ v1 ++ ".*" ++ v2 ++ ".*",
+ );
+ expect.bool(isVersionInstalled(v1)).toBeTrue();
+ expect.bool(isVersionInstalled(v2)).toBeTrue();
+ clearTmpDir();
+ });
+ test(
+ "Should be able to uninstall with a prefix if only one version match",
+ ({expect, _}) => {
+ let v1 = "6.10.0";
+ let v2 = "6.11.0";
+ let _ = installVersion(v1);
+ let _ = installVersion(v2);
+ let response = uninstallVersion("6.10");
+ expect.string(response).toMatch(
+ ".*v" ++ v1 ++ ".* has correctly been removed.*",
+ );
+ expect.bool(isVersionInstalled(v1)).toBeFalse();
+ expect.bool(isVersionInstalled(v2)).toBeTrue();
+ clearTmpDir();
+ });
+});