diff --git a/src/main/java/database/maker/MakerInfoProvider.java b/src/main/java/database/maker/MakerInfoProvider.java index 3a0092c217..e418af84d7 100644 --- a/src/main/java/database/maker/MakerInfoProvider.java +++ b/src/main/java/database/maker/MakerInfoProvider.java @@ -13,6 +13,9 @@ public class MakerInfoProvider { private final Map recipeCache = new ConcurrentHashMap<>(); public MakerInfoProvider(MakerDao makerDao) { + if (makerDao == null) { + throw new IllegalArgumentException("MakerDao is null"); + } this.makerDao = makerDao; } diff --git a/src/test/java/database/maker/MakerInfoProviderTest.java b/src/test/java/database/maker/MakerInfoProviderTest.java new file mode 100644 index 0000000000..97df426db2 --- /dev/null +++ b/src/test/java/database/maker/MakerInfoProviderTest.java @@ -0,0 +1,125 @@ +package database.maker; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import testutil.AnyValues; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class MakerInfoProviderTest { + + @Mock + private MakerDao makerDao; + + private MakerInfoProvider makerInfoProvider; + + @BeforeEach + void reset() { + MockitoAnnotations.openMocks(this); + this.makerInfoProvider = new MakerInfoProvider(makerDao); + } + + @Test + void requireNonNullDao() { + assertThrows(IllegalArgumentException.class, () -> new MakerInfoProvider(null)); + } + + @Test + void getReagentFromDb() { + int itemId = 5783; + MakerReagent reagent = createReagent(itemId); + when(makerDao.getReagent(anyInt())).thenReturn(Optional.of(reagent)); + + Optional retrievedReagent = makerInfoProvider.getMakerReagent(itemId); + + assertTrue(retrievedReagent.isPresent()); + assertEquals(reagent, retrievedReagent.get()); + } + + @Test + void getCachedReagent() { + int itemId = 90123444; + MakerReagent reagent = createReagent(itemId); + when(makerDao.getReagent(anyInt())).thenReturn(Optional.of(reagent)); + + Optional firstReagent = makerInfoProvider.getMakerReagent(itemId); + Optional secondReagent = makerInfoProvider.getMakerReagent(itemId); + + assertTrue(firstReagent.isPresent()); + assertEquals(reagent, firstReagent.get()); + assertTrue(secondReagent.isPresent()); + assertEquals(reagent, secondReagent.get()); + verify(makerDao, times(1)).getReagent(itemId); + } + + private MakerReagent createReagent(int itemId) { + return new MakerReagent(itemId, "incPAD", 3); + } + + @Test + void getRecipeFromDb() { + int itemId = 43893; + MakerRecipe recipe = createRecipe(itemId); + when(makerDao.getRecipe(itemId)).thenReturn(Optional.of(recipe)); + + Optional retrievedRecipe = makerInfoProvider.getMakerRecipe(itemId); + + assertTrue(retrievedRecipe.isPresent()); + assertEquals(recipe, retrievedRecipe.get()); + } + + @Test + void getRecipeFromDb_notFound() { + when(makerDao.getRecipe(anyInt())).thenReturn(Optional.empty()); + + Optional recipe = makerInfoProvider.getMakerRecipe(AnyValues.integer()); + + assertTrue(recipe.isEmpty()); + } + + @Test + void getCachedRecipe() { + int itemId = 10848; + MakerRecipe recipe = createRecipe(itemId); + when(makerDao.getRecipe(anyInt())).thenReturn(Optional.of(recipe)); + + Optional firstRecipe = makerInfoProvider.getMakerRecipe(itemId); + Optional secondRecipe = makerInfoProvider.getMakerRecipe(itemId); + + assertTrue(firstRecipe.isPresent()); + assertEquals(recipe, firstRecipe.get()); + assertTrue(secondRecipe.isPresent()); + assertEquals(recipe, secondRecipe.get()); + verify(makerDao, times(1)).getRecipe(itemId); + } + + private MakerRecipe createRecipe(int itemId) { + return new MakerRecipe(itemId, (short) 0, (short) 45, (short) 1, 100_000, null, null, null, (short) 1, (short) 1); + } + + @Test + void getStimulant() { + int catalyst = 4031200; + MakerRecipe recipeWithCatalyst = new MakerRecipe(0, (short) 0, (short) 0, (short) 0, 0, null, null, catalyst, (short) 0, (short) 0); + when(makerDao.getRecipe(anyInt())).thenReturn(Optional.of(recipeWithCatalyst)); + + Optional stimulant = makerInfoProvider.getStimulant(AnyValues.integer()); + + assertTrue(stimulant.isPresent()); + assertEquals(catalyst, stimulant.get()); + } + + @Test + void getStimulant_noRecipe() { + when(makerDao.getRecipe(anyInt())).thenReturn(Optional.empty()); + + Optional stimulant = makerInfoProvider.getStimulant(AnyValues.integer()); + + assertTrue(stimulant.isEmpty()); + } +} diff --git a/src/test/java/testutil/AnyValues.java b/src/test/java/testutil/AnyValues.java index ccf9c0abbf..509f379b50 100644 --- a/src/test/java/testutil/AnyValues.java +++ b/src/test/java/testutil/AnyValues.java @@ -8,6 +8,10 @@ public class AnyValues { return "string"; } + public static int integer() { + return 17; + } + public static DaoException daoException() { return new DaoException(string(), new RuntimeException()); }