From edbc9e5029b314ce45f98d59974a742a6c035616 Mon Sep 17 00:00:00 2001 From: Asta86 Date: Mon, 1 Dec 2025 14:46:55 -0300 Subject: [PATCH 1/6] Make dryRun variable non-static --- pom.xml | 2 +- src/main/java/cf/maybelambda/fedora/Main.java | 8 +++ .../fedora/PostInstallUpdater.java | 14 ++-- .../fedora/PostInstallUpdaterTests.java | 69 +++++++++---------- 4 files changed, 47 insertions(+), 46 deletions(-) create mode 100644 src/main/java/cf/maybelambda/fedora/Main.java diff --git a/pom.xml b/pom.xml index b3727ce..92db067 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ true - cf.maybelambda.fedora.PostInstallUpdater + cf.maybelambda.fedora.Main diff --git a/src/main/java/cf/maybelambda/fedora/Main.java b/src/main/java/cf/maybelambda/fedora/Main.java new file mode 100644 index 0000000..d3708b1 --- /dev/null +++ b/src/main/java/cf/maybelambda/fedora/Main.java @@ -0,0 +1,8 @@ +package cf.maybelambda.fedora; + +public class Main { + public static void main(String[] args) { + PostInstallUpdater updater = new PostInstallUpdater(); + updater.main(args); + } +} diff --git a/src/main/java/cf/maybelambda/fedora/PostInstallUpdater.java b/src/main/java/cf/maybelambda/fedora/PostInstallUpdater.java index c49061f..befd695 100644 --- a/src/main/java/cf/maybelambda/fedora/PostInstallUpdater.java +++ b/src/main/java/cf/maybelambda/fedora/PostInstallUpdater.java @@ -17,9 +17,9 @@ import static cf.maybelambda.fedora.ConsoleIOHelper.promptForExclusions; public class PostInstallUpdater { - private static boolean dryRun; + private boolean dryRun; - public static void main(String[] args) { + public void main(String[] args) { if (Arrays.asList(args).contains("-h") || Arrays.asList(args).contains("--help")) { ConsoleIOHelper.printHelp(); return; @@ -117,19 +117,19 @@ public static void main(String[] args) { System.out.println(color("\n.o0×X×0o. All actions completed. Goodbye. .o0×X×0o.", GREEN)); } - static boolean isDryRun() { + boolean isDryRun() { return dryRun; } - static void setDryRun(boolean dryRun) { - PostInstallUpdater.dryRun = dryRun; + void setDryRun(boolean dryRun) { + this.dryRun = dryRun; } - static ProcessBuilder createProcessBuilder(String[] cmd) { + ProcessBuilder createProcessBuilder(String[] cmd) { return new ProcessBuilder(cmd); } - static int runCommand(String[] command) { + int runCommand(String[] command) { System.out.println("Executing shell command: " + color(String.join(" ", command), BLUE)); if (isDryRun()) { System.out.println(color("Dry-run: command not executed.", YELLOW)); diff --git a/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java b/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java index cd5a8e7..875329f 100644 --- a/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java +++ b/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java @@ -1,80 +1,73 @@ package cf.maybelambda.fedora; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; -import org.mockito.Mockito; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.when; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.CALLS_REAL_METHODS; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.when; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; class PostInstallUpdaterTests { + private PostInstallUpdater updater; + private ProcessBuilder mockBuilder; + + @BeforeEach + void setUp() { + this.updater = Mockito.spy(new PostInstallUpdater()); + this.mockBuilder = mock(ProcessBuilder.class); + } + @Test void runCommandReturnsStatusCodeOfCommandExecuted() throws Exception { Process mockProcess = mock(Process.class); when(mockProcess.getInputStream()).thenReturn(new ByteArrayInputStream("ok".getBytes(StandardCharsets.UTF_8))); when(mockProcess.waitFor()).thenReturn(0); - - ProcessBuilder mockBuilder = mock(ProcessBuilder.class); when(mockBuilder.start()).thenReturn(mockProcess); when(mockBuilder.redirectErrorStream(true)).thenReturn(mockBuilder); + Mockito.doReturn(mockBuilder).when(updater).createProcessBuilder(any(String[].class)); - try (MockedStatic updaterMock = Mockito.mockStatic(PostInstallUpdater.class, CALLS_REAL_METHODS)) { - updaterMock.when(() -> PostInstallUpdater.createProcessBuilder(any(String[].class))) - .thenReturn(mockBuilder); + int exitCode = updater.runCommand(new String[]{"echo", "test"}); - int exitCode = PostInstallUpdater.runCommand(new String[]{"echo", "test"}); - - assertEquals(0, exitCode); - } + assertEquals(0, exitCode); } @Test void runCommandReturnsStatusMinusOneOnIOException() throws Exception { - ProcessBuilder mockBuilder = mock(ProcessBuilder.class); when(mockBuilder.start()).thenThrow(new IOException("Simulated I/O error")); + Mockito.doReturn(mockBuilder).when(updater).createProcessBuilder(any(String[].class)); - try (MockedStatic updaterMock = Mockito.mockStatic(PostInstallUpdater.class, CALLS_REAL_METHODS)) { - updaterMock.when(() -> PostInstallUpdater.createProcessBuilder(any(String[].class))) - .thenReturn(mockBuilder); - - int exitCode = PostInstallUpdater.runCommand(new String[]{"failing", "cmd"}); + int exitCode = updater.runCommand(new String[]{"failing", "cmd"}); - assertEquals(-1, exitCode); - } + assertEquals(-1, exitCode); } @Test void runCommandSkipsExecutionInDryRunMode() { - PostInstallUpdater.setDryRun(true); - try (MockedStatic updaterMock = Mockito.mockStatic(PostInstallUpdater.class, CALLS_REAL_METHODS)) { - updaterMock.when(() -> PostInstallUpdater.createProcessBuilder(any(String[].class))) - .thenThrow(new AssertionError("Should not create ProcessBuilder in dry-run mode")); + updater.setDryRun(true); + Mockito.doThrow(new AssertionError("Should not create ProcessBuilder in dry-run mode")) + .when(updater).createProcessBuilder(any(String[].class)); - int exitCode = PostInstallUpdater.runCommand(new String[]{"fake", "cmd"}); + int exitCode = updater.runCommand(new String[]{"fake", "cmd"}); - assertEquals(0, exitCode); - } finally { - PostInstallUpdater.setDryRun(false); - } + assertEquals(0, exitCode); } @Test void helpOptionDisplaysHelpTextAndExits() { - try (MockedStatic filesMock = mockStatic(ConfigManager.class)) { + try (var filesMock = mockStatic(ConfigManager.class)) { filesMock.when(() -> ConfigManager.readResourceLines(any(String.class))) .thenReturn(List.of("Usage instructions go here")); - PostInstallUpdater.main(new String[]{"--help"}); - PostInstallUpdater.main(new String[]{"-h"}); + updater.main(new String[]{"--help"}); + updater.main(new String[]{"-h"}); filesMock.verify(() -> ConfigManager.getHelpText(), Mockito.times(2)); } From 171f5705feaa3c5f884e9a04c12e4609dd583bf3 Mon Sep 17 00:00:00 2001 From: Asta86 Date: Mon, 1 Dec 2025 15:43:22 -0300 Subject: [PATCH 2/6] Move post-install actions to Main class and leave PostInstallUpdater for interacting with OS --- src/main/java/cf/maybelambda/fedora/Main.java | 107 ++++++++++++++++- .../fedora/PostInstallUpdater.java | 113 +----------------- .../fedora/PostInstallUpdaterTests.java | 4 +- 3 files changed, 112 insertions(+), 112 deletions(-) diff --git a/src/main/java/cf/maybelambda/fedora/Main.java b/src/main/java/cf/maybelambda/fedora/Main.java index d3708b1..8df0d28 100644 --- a/src/main/java/cf/maybelambda/fedora/Main.java +++ b/src/main/java/cf/maybelambda/fedora/Main.java @@ -1,8 +1,113 @@ package cf.maybelambda.fedora; +import static cf.maybelambda.fedora.ConsoleIOHelper.GREEN; +import static cf.maybelambda.fedora.ConsoleIOHelper.RED; +import static cf.maybelambda.fedora.ConsoleIOHelper.color; +import static cf.maybelambda.fedora.ConsoleIOHelper.confirm; +import static cf.maybelambda.fedora.ConsoleIOHelper.promptForExclusions; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + public class Main { public static void main(String[] args) { + if (Arrays.asList(args).contains("-h") || Arrays.asList(args).contains("--help")) { + ConsoleIOHelper.printHelp(); + return; + } + + System.out.println(color("]|I{•------» Fedora Setup Script «------•}I|[\n", GREEN)); + + List dnfInstallPackages = ConfigManager.getDnfInstallPackages(); + List dnfRemovePackages = ConfigManager.getDnfRemovePackages(); + List flatpakInstallPackages = ConfigManager.getFlatpakInstallPackages(); + Scanner scanner = new Scanner(System.in); PostInstallUpdater updater = new PostInstallUpdater(); - updater.main(args); + + updater.setDryRun(Arrays.asList(args).contains("--dry-run")); + if (updater.isDryRun()) { + System.out.println(color("---[Dry Run Mode] Shell Commands will not be executed.---\n", RED)); + } + + if (confirm(scanner, "Install RPMFusion repos?")) { + for (String key : ConfigManager.getRPMFusionGpgKeys()) { + updater.runCommand(new String[]{"sudo", "rpm", "--import", key}); + } + + List repos = ConfigManager.getRPMFusionRepos(); + String[] cmd = new String[repos.size() + 4]; + cmd[0] = "sudo"; + cmd[1] = "dnf"; + cmd[2] = "install"; + cmd[3] = "-y"; + for (int i = 0; i < repos.size(); i++) { + cmd[4 + i] = repos.get(i); + } + updater.runCommand(cmd); + } + + if (confirm(scanner, "Install additional packages with DNF?")) { + List filtered = promptForExclusions(dnfInstallPackages, scanner); + String[] cmd = new String[filtered.size() + 5]; + cmd[0] = "sudo"; + cmd[1] = "dnf"; + cmd[2] = "--refresh"; + cmd[3] = "install"; + cmd[4] = "-y"; + for (int i = 0; i < filtered.size(); i++) { + cmd[5 + i] = filtered.get(i); + } + updater.runCommand(cmd); + } + + if (confirm(scanner, "Remove all DNF packages marked for removal?")) { + List filtered = promptForExclusions(dnfRemovePackages, scanner); + String[] cmd = new String[filtered.size() + 4]; + cmd[0] = "sudo"; + cmd[1] = "dnf"; + cmd[2] = "remove"; + cmd[3] = "-y"; + for (int i = 0; i < filtered.size(); i++) { + cmd[4 + i] = filtered.get(i); + } + updater.runCommand(cmd); + updater.runCommand(new String[]{"sudo", "dnf", "autoremove", "-y"}); + } + + if (confirm(scanner, "Install Flatpak apps?")) { + String name = ConfigManager.getFlatpakRemoteName(); + String url = ConfigManager.getFlatpakRemoteUrl(); + updater.runCommand(new String[]{"flatpak", "remote-add", "--if-not-exists", name, url}); + List filtered = promptForExclusions(flatpakInstallPackages, scanner); + String[] cmd = new String[filtered.size() + 4]; + cmd[0] = "flatpak"; + cmd[1] = "install"; + cmd[2] = "-y"; + cmd[3] = name; + for (int i = 0; i < filtered.size(); i++) { + cmd[4 + i] = filtered.get(i); + } + updater.runCommand(cmd); + } + + if (confirm(scanner, "Ensure admin groups exist and add current user to them?")) { + String user = System.getProperty("user.name"); + for (String group : ConfigManager.getAdminGroups()) { + int exit = updater.runCommand(new String[]{"getent", "group", group}); + boolean groupExists = (exit == 0); + if (!groupExists) { + System.out.println("Group '" + group + "' does not exist. Creating..."); + updater.runCommand(new String[]{"sudo", "groupadd", group}); + } + updater.runCommand(new String[]{"sudo", "usermod", "-aG", group, user}); + } + } + + if (confirm(scanner, "Enable and start cockpit.socket service?")) { + updater.runCommand(new String[]{"sudo", "systemctl", "enable", "--now", "cockpit.socket"}); + } + + System.out.println(color("\n.o0×X×0o. All actions completed. Goodbye. .o0×X×0o.", GREEN)); } } diff --git a/src/main/java/cf/maybelambda/fedora/PostInstallUpdater.java b/src/main/java/cf/maybelambda/fedora/PostInstallUpdater.java index befd695..cc559c7 100644 --- a/src/main/java/cf/maybelambda/fedora/PostInstallUpdater.java +++ b/src/main/java/cf/maybelambda/fedora/PostInstallUpdater.java @@ -1,122 +1,17 @@ package cf.maybelambda.fedora; +import static cf.maybelambda.fedora.ConsoleIOHelper.BLUE; +import static cf.maybelambda.fedora.ConsoleIOHelper.YELLOW; +import static cf.maybelambda.fedora.ConsoleIOHelper.color; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.util.Arrays; -import java.util.List; import java.util.NoSuchElementException; -import java.util.Scanner; - -import static cf.maybelambda.fedora.ConsoleIOHelper.BLUE; -import static cf.maybelambda.fedora.ConsoleIOHelper.GREEN; -import static cf.maybelambda.fedora.ConsoleIOHelper.RED; -import static cf.maybelambda.fedora.ConsoleIOHelper.YELLOW; -import static cf.maybelambda.fedora.ConsoleIOHelper.color; -import static cf.maybelambda.fedora.ConsoleIOHelper.confirm; -import static cf.maybelambda.fedora.ConsoleIOHelper.promptForExclusions; public class PostInstallUpdater { private boolean dryRun; - public void main(String[] args) { - if (Arrays.asList(args).contains("-h") || Arrays.asList(args).contains("--help")) { - ConsoleIOHelper.printHelp(); - return; - } - - List dnfInstallPackages = ConfigManager.getDnfInstallPackages(); - List dnfRemovePackages = ConfigManager.getDnfRemovePackages(); - List flatpakInstallPackages = ConfigManager.getFlatpakInstallPackages(); - Scanner scanner = new Scanner(System.in); - - System.out.println(color("]|I{•------» Fedora Setup Script «------•}I|[\n", GREEN)); - setDryRun(Arrays.asList(args).contains("--dry-run")); - if (isDryRun()) { - System.out.println(color("---[Dry Run Mode] Shell Commands will not be executed.---\n", RED)); - } - - if (confirm(scanner, "Install RPMFusion repos?")) { - for (String key : ConfigManager.getRPMFusionGpgKeys()) { - runCommand(new String[]{"sudo", "rpm", "--import", key}); - } - - List repos = ConfigManager.getRPMFusionRepos(); - String[] cmd = new String[repos.size() + 4]; - cmd[0] = "sudo"; - cmd[1] = "dnf"; - cmd[2] = "install"; - cmd[3] = "-y"; - for (int i = 0; i < repos.size(); i++) { - cmd[4 + i] = repos.get(i); - } - runCommand(cmd); - } - - if (confirm(scanner, "Install additional packages with DNF?")) { - List filtered = promptForExclusions(dnfInstallPackages, scanner); - String[] cmd = new String[filtered.size() + 5]; - cmd[0] = "sudo"; - cmd[1] = "dnf"; - cmd[2] = "--refresh"; - cmd[3] = "install"; - cmd[4] = "-y"; - for (int i = 0; i < filtered.size(); i++) { - cmd[5 + i] = filtered.get(i); - } - runCommand(cmd); - } - - if (confirm(scanner, "Remove all DNF packages marked for removal?")) { - List filtered = promptForExclusions(dnfRemovePackages, scanner); - String[] cmd = new String[filtered.size() + 4]; - cmd[0] = "sudo"; - cmd[1] = "dnf"; - cmd[2] = "remove"; - cmd[3] = "-y"; - for (int i = 0; i < filtered.size(); i++) { - cmd[4 + i] = filtered.get(i); - } - runCommand(cmd); - runCommand(new String[]{"sudo", "dnf", "autoremove", "-y"}); - } - - if (confirm(scanner, "Install Flatpak apps?")) { - String name = ConfigManager.getFlatpakRemoteName(); - String url = ConfigManager.getFlatpakRemoteUrl(); - runCommand(new String[]{"flatpak", "remote-add", "--if-not-exists", name, url}); - List filtered = promptForExclusions(flatpakInstallPackages, scanner); - String[] cmd = new String[filtered.size() + 4]; - cmd[0] = "flatpak"; - cmd[1] = "install"; - cmd[2] = "-y"; - cmd[3] = name; - for (int i = 0; i < filtered.size(); i++) { - cmd[4 + i] = filtered.get(i); - } - runCommand(cmd); - } - - if (confirm(scanner, "Ensure admin groups exist and add current user to them?")) { - String user = System.getProperty("user.name"); - for (String group : ConfigManager.getAdminGroups()) { - int exit = runCommand(new String[]{"getent", "group", group}); - boolean groupExists = (exit == 0); - if (!groupExists) { - System.out.println("Group '" + group + "' does not exist. Creating..."); - runCommand(new String[]{"sudo", "groupadd", group}); - } - runCommand(new String[]{"sudo", "usermod", "-aG", group, user}); - } - } - - if (confirm(scanner, "Enable and start cockpit.socket service?")) { - runCommand(new String[]{"sudo", "systemctl", "enable", "--now", "cockpit.socket"}); - } - - System.out.println(color("\n.o0×X×0o. All actions completed. Goodbye. .o0×X×0o.", GREEN)); - } - boolean isDryRun() { return dryRun; } diff --git a/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java b/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java index 875329f..d5031cf 100644 --- a/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java +++ b/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java @@ -66,8 +66,8 @@ void helpOptionDisplaysHelpTextAndExits() { filesMock.when(() -> ConfigManager.readResourceLines(any(String.class))) .thenReturn(List.of("Usage instructions go here")); - updater.main(new String[]{"--help"}); - updater.main(new String[]{"-h"}); + Main.main(new String[]{"--help"}); + Main.main(new String[]{"-h"}); filesMock.verify(() -> ConfigManager.getHelpText(), Mockito.times(2)); } From dcfb57c90920aa86b4356e059cdcb4f59e7601dd Mon Sep 17 00:00:00 2001 From: Asta86 Date: Mon, 1 Dec 2025 15:49:09 -0300 Subject: [PATCH 3/6] Add sudo to flatpak remote-add command --- src/main/java/cf/maybelambda/fedora/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cf/maybelambda/fedora/Main.java b/src/main/java/cf/maybelambda/fedora/Main.java index 8df0d28..356c969 100644 --- a/src/main/java/cf/maybelambda/fedora/Main.java +++ b/src/main/java/cf/maybelambda/fedora/Main.java @@ -78,7 +78,7 @@ public static void main(String[] args) { if (confirm(scanner, "Install Flatpak apps?")) { String name = ConfigManager.getFlatpakRemoteName(); String url = ConfigManager.getFlatpakRemoteUrl(); - updater.runCommand(new String[]{"flatpak", "remote-add", "--if-not-exists", name, url}); + updater.runCommand(new String[]{"sudo", "flatpak", "remote-add", "--if-not-exists", name, url}); List filtered = promptForExclusions(flatpakInstallPackages, scanner); String[] cmd = new String[filtered.size() + 4]; cmd[0] = "flatpak"; From 6fcbf2b5957f9983bb234241c96dcd9aa628f679 Mon Sep 17 00:00:00 2001 From: Asta86 Date: Mon, 1 Dec 2025 15:56:50 -0300 Subject: [PATCH 4/6] Bump version number --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 92db067..7b0a8c1 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cf.maybelambda fedora-setup-script - 3.0.4 + 3.0.5 21 From b71a411a0cd2e62abd65c8dc285e0bc3e2430210 Mon Sep 17 00:00:00 2001 From: Asta86 Date: Tue, 2 Dec 2025 14:23:49 -0300 Subject: [PATCH 5/6] Add test cases --- src/main/java/cf/maybelambda/fedora/Main.java | 11 ++- .../java/cf/maybelambda/fedora/MainTests.java | 88 +++++++++++++++++++ .../fedora/PostInstallUpdaterTests.java | 15 ---- 3 files changed, 95 insertions(+), 19 deletions(-) create mode 100644 src/test/java/cf/maybelambda/fedora/MainTests.java diff --git a/src/main/java/cf/maybelambda/fedora/Main.java b/src/main/java/cf/maybelambda/fedora/Main.java index 356c969..6e09eb1 100644 --- a/src/main/java/cf/maybelambda/fedora/Main.java +++ b/src/main/java/cf/maybelambda/fedora/Main.java @@ -5,14 +5,18 @@ import static cf.maybelambda.fedora.ConsoleIOHelper.color; import static cf.maybelambda.fedora.ConsoleIOHelper.confirm; import static cf.maybelambda.fedora.ConsoleIOHelper.promptForExclusions; +import static java.util.Arrays.asList; -import java.util.Arrays; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { - if (Arrays.asList(args).contains("-h") || Arrays.asList(args).contains("--help")) { + run(args, new PostInstallUpdater()); + } + + static void run(String[] args, PostInstallUpdater updater) { + if (asList(args).contains("-h") || asList(args).contains("--help")) { ConsoleIOHelper.printHelp(); return; } @@ -23,9 +27,8 @@ public static void main(String[] args) { List dnfRemovePackages = ConfigManager.getDnfRemovePackages(); List flatpakInstallPackages = ConfigManager.getFlatpakInstallPackages(); Scanner scanner = new Scanner(System.in); - PostInstallUpdater updater = new PostInstallUpdater(); - updater.setDryRun(Arrays.asList(args).contains("--dry-run")); + updater.setDryRun(asList(args).contains("--dry-run")); if (updater.isDryRun()) { System.out.println(color("---[Dry Run Mode] Shell Commands will not be executed.---\n", RED)); } diff --git a/src/test/java/cf/maybelambda/fedora/MainTests.java b/src/test/java/cf/maybelambda/fedora/MainTests.java new file mode 100644 index 0000000..cb385b1 --- /dev/null +++ b/src/test/java/cf/maybelambda/fedora/MainTests.java @@ -0,0 +1,88 @@ +package cf.maybelambda.fedora; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +class MainTests { + private PostInstallUpdater mockUpdater = mock(PostInstallUpdater.class); + private static final List EXPECTED_COMMAND_PARTS = List.of( + "rpm --import", + "dnf install -y repo1", + "dnf --refresh install -y pkg1", + "dnf remove -y pkg2", + "dnf autoremove", + "flatpak remote-add", + "flatpak install -y flathub flatpak1", + "getent group wheel", + "usermod -aG wheel", + "systemctl enable --now cockpit.socket" + ); + + private void setupConfigManager(MockedStatic cfg) { + cfg.when(ConfigManager::getDnfInstallPackages).thenReturn(List.of("pkg1")); + cfg.when(ConfigManager::getDnfRemovePackages).thenReturn(List.of("pkg2")); + cfg.when(ConfigManager::getFlatpakInstallPackages).thenReturn(List.of("flatpak1")); + cfg.when(ConfigManager::getRPMFusionGpgKeys).thenReturn(List.of("key1")); + cfg.when(ConfigManager::getRPMFusionRepos).thenReturn(List.of("repo1")); + cfg.when(ConfigManager::getFlatpakRemoteName).thenReturn("flathub"); + cfg.when(ConfigManager::getFlatpakRemoteUrl).thenReturn("https://flathub"); + cfg.when(ConfigManager::getAdminGroups).thenReturn(List.of("wheel")); + } + + private void simulateUserInput() { + // Simulate user input: answers to 9 prompts (y/y/empty/y/empty/y/empty/y/y) + String input = String.join("\n", "y", "y", "", "y", "", "y", "", "y", "y") + "\n"; + System.setIn(new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8))); + } + + private void assertCommandSequence(List actualCommands) { + for (int i = 0; i < EXPECTED_COMMAND_PARTS.size(); i++) { + assertTrue(actualCommands.get(i).contains(EXPECTED_COMMAND_PARTS.get(i)), + "Command at index " + i + " should contain '" + EXPECTED_COMMAND_PARTS.get(i) + "'"); + } + } + + @Test + void runExecutesAllActionsInExpectedOrder() { + try (var cfg = mockStatic(ConfigManager.class)) { + setupConfigManager(cfg); + simulateUserInput(); + when(mockUpdater.runCommand(any(String[].class))).thenReturn(0); + + Main.run(new String[]{}, mockUpdater); + + ArgumentCaptor captor = ArgumentCaptor.forClass(String[].class); + Mockito.verify(mockUpdater, Mockito.atLeastOnce()).runCommand(captor.capture()); + List joined = captor.getAllValues().stream() + .map(arr -> String.join(" ", arr)) + .toList(); + + assertCommandSequence(joined); + } + } + + @Test + void helpOptionDisplaysHelpTextAndExits() { + try (var filesMock = mockStatic(ConfigManager.class)) { + filesMock.when(() -> ConfigManager.readResourceLines(any(String.class))) + .thenReturn(List.of("Usage instructions go here")); + + Main.main(new String[]{"--help"}); + Main.main(new String[]{"-h"}); + + filesMock.verify(() -> ConfigManager.getHelpText(), Mockito.times(2)); + } + } +} diff --git a/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java b/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java index d5031cf..1fe0891 100644 --- a/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java +++ b/src/test/java/cf/maybelambda/fedora/PostInstallUpdaterTests.java @@ -3,13 +3,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -59,17 +57,4 @@ void runCommandSkipsExecutionInDryRunMode() { assertEquals(0, exitCode); } - - @Test - void helpOptionDisplaysHelpTextAndExits() { - try (var filesMock = mockStatic(ConfigManager.class)) { - filesMock.when(() -> ConfigManager.readResourceLines(any(String.class))) - .thenReturn(List.of("Usage instructions go here")); - - Main.main(new String[]{"--help"}); - Main.main(new String[]{"-h"}); - - filesMock.verify(() -> ConfigManager.getHelpText(), Mockito.times(2)); - } - } } From ba2938fbb07eb2bfdc938f472e315edcfbb352d0 Mon Sep 17 00:00:00 2001 From: Asta86 Date: Wed, 3 Dec 2025 15:18:49 -0300 Subject: [PATCH 6/6] Remove plasma-discover ensuring flatpak is not transitively removed --- src/main/java/cf/maybelambda/fedora/Main.java | 6 ++++-- src/main/resources/dnf-remove.cf | 1 + src/test/java/cf/maybelambda/fedora/MainTests.java | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/cf/maybelambda/fedora/Main.java b/src/main/java/cf/maybelambda/fedora/Main.java index 6e09eb1..ba49580 100644 --- a/src/main/java/cf/maybelambda/fedora/Main.java +++ b/src/main/java/cf/maybelambda/fedora/Main.java @@ -66,15 +66,17 @@ static void run(String[] args, PostInstallUpdater updater) { if (confirm(scanner, "Remove all DNF packages marked for removal?")) { List filtered = promptForExclusions(dnfRemovePackages, scanner); - String[] cmd = new String[filtered.size() + 4]; + String[] cmd = new String[filtered.size() + 5]; cmd[0] = "sudo"; cmd[1] = "dnf"; cmd[2] = "remove"; cmd[3] = "-y"; + cmd[4] = "--noautoremove"; for (int i = 0; i < filtered.size(); i++) { - cmd[4 + i] = filtered.get(i); + cmd[5 + i] = filtered.get(i); } updater.runCommand(cmd); + updater.runCommand(new String[]{"sudo", "dnf", "mark", "user", "flatpak"}); updater.runCommand(new String[]{"sudo", "dnf", "autoremove", "-y"}); } diff --git a/src/main/resources/dnf-remove.cf b/src/main/resources/dnf-remove.cf index d1f8c26..6d86291 100644 --- a/src/main/resources/dnf-remove.cf +++ b/src/main/resources/dnf-remove.cf @@ -13,6 +13,7 @@ krdc krfb ktnef neochat +plasma-discover plasma-welcome skanpage spectacle diff --git a/src/test/java/cf/maybelambda/fedora/MainTests.java b/src/test/java/cf/maybelambda/fedora/MainTests.java index cb385b1..fa9815a 100644 --- a/src/test/java/cf/maybelambda/fedora/MainTests.java +++ b/src/test/java/cf/maybelambda/fedora/MainTests.java @@ -21,7 +21,8 @@ class MainTests { "rpm --import", "dnf install -y repo1", "dnf --refresh install -y pkg1", - "dnf remove -y pkg2", + "dnf remove -y --noautoremove pkg2", + "dnf mark user flatpak", "dnf autoremove", "flatpak remote-add", "flatpak install -y flathub flatpak1",