diff --git a/pom.xml b/pom.xml index 3ce85b1..0e0eaa1 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,20 @@ 2.1 + + + org.testng + testng + 7.0.0 + test + + + + org.mockito + mockito-core + 5.12.0 + test + diff --git a/src/main/java/tv/mangrana/config/ConfigLoader.java b/src/main/java/tv/mangrana/config/ConfigLoader.java index 36fd610..d76aac4 100644 --- a/src/main/java/tv/mangrana/config/ConfigLoader.java +++ b/src/main/java/tv/mangrana/config/ConfigLoader.java @@ -2,11 +2,15 @@ package tv.mangrana.config; import tv.mangrana.exception.IncorrectWorkingReferencesException; +import static tv.mangrana.config.ConfigLoader.ProjectConfiguration.TEST_MODE; + public class ConfigLoader extends CommonConfigFileLoader { private static final String CONFIG_FILE = "SonarrFixerConfig.yml"; private static ConfigLoader service; + private static boolean isUnitTesting = false; + private ConfigLoader() throws IncorrectWorkingReferencesException { super(ProjectConfiguration.class); } @@ -25,6 +29,13 @@ public class ConfigLoader extends CommonConfigFileLoader MINIMUM_FILE_SIZE_TO_BE_CONSIDERED_A_VIDEO; } diff --git a/src/main/java/tv/mangrana/worker/FileCopier.java b/src/main/java/tv/mangrana/worker/FileCopier.java index 2167d48..10d594f 100644 --- a/src/main/java/tv/mangrana/worker/FileCopier.java +++ b/src/main/java/tv/mangrana/worker/FileCopier.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import static tv.mangrana.config.ConfigLoader.ProjectConfiguration.TEST_MODE; import static tv.mangrana.config.ConfigLoader.ProjectConfiguration.UPLOADS_PATHS; class FileCopier { @@ -14,7 +13,7 @@ class FileCopier { try { createDestinationFolderIfApply(destination); - if (!ConfigLoader.isEnabled(TEST_MODE)) + if (!ConfigLoader.isTestMode()) Files.createLink(destination, source); } catch (IOException e) { System.out.printf("error when creating hardlink with destination %s, error: %s%n", @@ -27,7 +26,7 @@ class FileCopier { var destinationFolder = destinationFile.getParent(); if (isTemporaryDestination(destinationFolder) && !Files.exists(destinationFolder)) { System.out.printf("destination folder %s will be created", destinationFolder); - if (!ConfigLoader.isEnabled(TEST_MODE)) + if (!ConfigLoader.isTestMode()) Files.createDirectories(destinationFile); } } diff --git a/src/main/java/tv/mangrana/worker/MainWorker.java b/src/main/java/tv/mangrana/worker/MainWorker.java index 9505587..eda2c4f 100644 --- a/src/main/java/tv/mangrana/worker/MainWorker.java +++ b/src/main/java/tv/mangrana/worker/MainWorker.java @@ -3,28 +3,32 @@ package tv.mangrana.worker; import tv.mangrana.config.ConfigLoader; import tv.mangrana.exception.IncorrectWorkingReferencesException; import tv.mangrana.sonarr.Sonarr; - -import static tv.mangrana.config.ConfigLoader.ProjectConfiguration.TEST_MODE; +import tv.mangrana.sonarr.api.client.gateway.SonarrApiGateway; public class MainWorker { private final QueueFixer queueFixer; public static void main(String[] args) throws IncorrectWorkingReferencesException { - var worker = new MainWorker(); + SonarrApiGateway sonarrApiGateway = configureSonarApiGateway(); + var worker = new MainWorker(sonarrApiGateway); worker.work(); } - private MainWorker() throws IncorrectWorkingReferencesException { + private static SonarrApiGateway configureSonarApiGateway() { var configLoader = ConfigLoader.getLoader(); - if (ConfigLoader.isEnabled(TEST_MODE)) - System.out.println("ATTENTION! TEST MODE ENABLED. No folders will be created nor files copied."); - Sonarr.initService(configLoader); - queueFixer = new QueueFixer(); + return Sonarr.api(); } - private void work() { + MainWorker(SonarrApiGateway sonarGateway) throws IncorrectWorkingReferencesException { + if (ConfigLoader.isTestMode()) + System.out.println("ATTENTION! TEST MODE ENABLED. No folders will be created nor files copied."); + + queueFixer = new QueueFixer(sonarGateway); + } + + void work() { queueFixer.fix(); } } diff --git a/src/main/java/tv/mangrana/worker/QueueFixer.java b/src/main/java/tv/mangrana/worker/QueueFixer.java index 549c51a..f73c5cc 100644 --- a/src/main/java/tv/mangrana/worker/QueueFixer.java +++ b/src/main/java/tv/mangrana/worker/QueueFixer.java @@ -1,7 +1,6 @@ package tv.mangrana.worker; import tv.mangrana.config.ConfigLoader; -import tv.mangrana.sonarr.Sonarr; import tv.mangrana.sonarr.api.client.gateway.SonarrApiGateway; import tv.mangrana.sonarr.api.schema.queue.Record; import tv.mangrana.sonarr.api.schema.series.SonarrSerie; @@ -11,16 +10,14 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; -import static tv.mangrana.config.ConfigLoader.ProjectConfiguration.TEST_MODE; - public class QueueFixer { final static String IMPORT_FAILURE_BECAUSE_MATCHED_BY_ID = "Found matching series via grab history, but release was matched to series by ID. Automatic import is not possible. See the FAQ for details."; private final SonarrApiGateway sonarrApiGateway; private final FailedImportFixer.Factory fixerFactory; - QueueFixer() { - sonarrApiGateway = Sonarr.api(); + QueueFixer(SonarrApiGateway sonarGateway) { + sonarrApiGateway = sonarGateway; fixerFactory = FailedImportFixer.factory(); } @@ -67,7 +64,7 @@ public class QueueFixer { private void cleanWorkedElementsFromQueue(List sonarQueue, List recordsToFix) { List workedTitles = mapRecord2Title(recordsToFix); List recordIds2Delete = filterPresentTitlesFromQueue(sonarQueue, workedTitles); - if (!ConfigLoader.isEnabled(TEST_MODE)) + if (!ConfigLoader.isTestMode()) sonarrApiGateway.deleteQueueElements(recordIds2Delete); } diff --git a/src/test/java/tv/mangrana/worker/SonarQueueFixerTest.java b/src/test/java/tv/mangrana/worker/SonarQueueFixerTest.java new file mode 100644 index 0000000..7023a84 --- /dev/null +++ b/src/test/java/tv/mangrana/worker/SonarQueueFixerTest.java @@ -0,0 +1,63 @@ +package tv.mangrana.worker; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import tv.mangrana.config.ConfigLoader; +import tv.mangrana.sonarr.api.client.gateway.SonarrApiGateway; +import tv.mangrana.sonarr.api.schema.queue.Record; +import tv.mangrana.sonarr.api.schema.queue.StatusMessage; +import tv.mangrana.sonarr.api.schema.series.SonarrSerie; + +import java.util.List; + +import static org.mockito.Mockito.*; +import static tv.mangrana.worker.QueueFixer.IMPORT_FAILURE_BECAUSE_MATCHED_BY_ID; + +public class SonarQueueFixerTest { + + private SonarrApiGateway sonarrApiGateway; + + private MainWorker mainWorker; + + @BeforeMethod + public void setup() { + ConfigLoader.weAreUnitTesting(); + sonarrApiGateway = mock(SonarrApiGateway.class, RETURNS_DEEP_STUBS); + mainWorker = new MainWorker(sonarrApiGateway); + } + + @Test //just for debugging purpose + public void whenDestinationFolderDoesNotExist_AndIsTemporary_shouldCreateIt_AndHardlinkFiles() { + prepareSonarrMockQueue(); + prepareSonarrMockSerie(); + + mainWorker.work(); + + //asserting nothing, sorry (too stuff would be needed to be mocked, and it's not worthy at this moment) + } + + private void prepareSonarrMockQueue() { + var record = new Record() + .withSeriesId(getRandomInteger()) + .withTitle("Star Trek (1987) S01 [1080p]") + .withOutputPath("./test/torrents/Star Trek (1987) S01 [1080p]") + .withStatusMessages(prepareWarningMessages()); + when(sonarrApiGateway.getFullQueue().getRecords()).thenReturn(List.of(record)); + } + + private int getRandomInteger() { + return Double.valueOf(Math.random()*100).intValue(); + } + + private List prepareWarningMessages() { + return List.of(new StatusMessage() + .withMessages(List.of(IMPORT_FAILURE_BECAUSE_MATCHED_BY_ID))); + } + + private void prepareSonarrMockSerie() { + SonarrSerie serie = new SonarrSerie() + .withPath("./test/sonarr_uploads/Star Trek (1987) {tvdb-71470}"); + when(sonarrApiGateway.getSerieById(anyInt())).thenReturn(serie); + } + +} \ No newline at end of file diff --git a/test/torrents/Star Trek (1987) S01 [1080p]/Star Trek (1987) S01 [1080p] E01.fakeVideo b/test/torrents/Star Trek (1987) S01 [1080p]/Star Trek (1987) S01 [1080p] E01.fakeVideo new file mode 100644 index 0000000..e69de29