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(); + }); +});