Skip to content

Commit e549049

Browse files
authored
Merge pull request #397 from BentoBoxWorld/develop
Release 1.6.2
2 parents 0a70348 + 419815a commit e549049

12 files changed

Lines changed: 58 additions & 6 deletions

File tree

pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
<!-- Non-minecraft related dependencies -->
4444
<junit.version>5.10.2</junit.version>
4545
<mockito.version>5.11.0</mockito.version>
46-
<mock-bukkit.version>v1.21-SNAPSHOT</mock-bukkit.version>
46+
<mock-bukkit.version>4.110.0</mock-bukkit.version>
4747
<!-- More visible way how to change dependency versions -->
4848
<paper.version>1.21.11-R0.1-SNAPSHOT</paper.version>
4949
<bentobox.version>3.14.0</bentobox.version>
@@ -53,7 +53,7 @@
5353
<!-- Revision variable removes warning about dynamic version -->
5454
<revision>${build.version}-SNAPSHOT</revision>
5555
<!-- This allows to change between versions and snapshots. -->
56-
<build.version>1.6.1</build.version>
56+
<build.version>1.6.2</build.version>
5757
<build.number>-LOCAL</build.number>
5858
<!-- Sonar Cloud -->
5959
<sonar.projectKey>BentoBoxWorld_Challenges</sonar.projectKey>
@@ -205,8 +205,8 @@
205205
</dependency>
206206
<!-- MockBukkit -->
207207
<dependency>
208-
<groupId>com.github.MockBukkit</groupId>
209-
<artifactId>MockBukkit</artifactId>
208+
<groupId>org.mockbukkit.mockbukkit</groupId>
209+
<artifactId>mockbukkit-v1.21</artifactId>
210210
<version>${mock-bukkit.version}</version>
211211
<scope>test</scope>
212212
</dependency>

src/main/java/world/bentobox/challenges/managers/ChallengesImportManager.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,7 @@ public void importDatabaseFile(User user, World world, String fileName)
736736
}
737737
catch (Exception e)
738738
{
739-
this.addon.getPlugin().logStacktrace(e);
739+
reportImportFailure(user, world, e);
740740
return;
741741
}
742742

@@ -745,6 +745,21 @@ public void importDatabaseFile(User user, World world, String fileName)
745745
}
746746

747747

748+
/**
749+
* Logs the stacktrace and, if a player triggered the import, surfaces a chat error
750+
* so they know to look at the server console.
751+
*/
752+
private void reportImportFailure(User user, World world, Exception e)
753+
{
754+
this.addon.getPlugin().logStacktrace(e);
755+
if (user != null && user.isPlayer())
756+
{
757+
Utils.sendMessage(user, world, Constants.ERRORS + "import-failed",
758+
"[message]", e.getMessage() == null ? e.getClass().getSimpleName() : e.getMessage());
759+
}
760+
}
761+
762+
748763
/**
749764
* This method loads downloaded challenges into memory.
750765
* @param user User who calls downloaded challenge loading
@@ -813,7 +828,7 @@ public void loadDownloadedChallenges(User user, World world, String downloadStri
813828
}
814829
catch (Exception e)
815830
{
816-
this.addon.getPlugin().logStacktrace(e);
831+
reportImportFailure(user, world, e);
817832
return;
818833
}
819834

src/main/resources/locales/en-US.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,6 +1232,7 @@ challenges:
12321232
island-level: "<red>Your island must be at least level [number] to complete this challenge!"
12331233
no-load: "<red>Error: Could not load [file]. Error: [message]."
12341234
load-error: "<red>Error: Cannot load [value]."
1235+
import-failed: "<red>Could not import challenges: [message]. Check the server console for details."
12351236
no-rank: "<red>You do not have a high enough rank to do that."
12361237
cannot-remove-items: "<red>Some items cannot be removed from your inventory!"
12371238
exist-challenges-or-levels: "<red>Challenges already exist in your world. Cannot proceed!"

src/test/java/world/bentobox/challenges/ChallengesAddonTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,15 @@
4242
import org.junit.jupiter.api.AfterEach;
4343
import org.junit.jupiter.api.BeforeEach;
4444
import org.junit.jupiter.api.Test;
45+
import org.mockbukkit.mockbukkit.MockBukkit;
4546
import org.mockito.Mock;
4647
import org.mockito.MockedStatic;
4748
import org.mockito.Mockito;
4849
import org.mockito.MockitoAnnotations;
4950
import org.mockito.stubbing.Answer;
5051

52+
import world.bentobox.challenges.panel.PanelTestHelper;
53+
5154
import world.bentobox.bentobox.BentoBox;
5255
import world.bentobox.bentobox.Settings;
5356
import world.bentobox.bentobox.api.addons.Addon;
@@ -101,6 +104,15 @@ public class ChallengesAddonTest {
101104
@BeforeEach
102105
public void setUp() throws Exception {
103106
closeable = MockitoAnnotations.openMocks(this);
107+
// Force Bukkit's Tag.<clinit> to run against a real MockBukkit ServerMock before
108+
// we install the Mockito static mock below. Without this, Tag.<clinit> can later
109+
// fire while Bukkit is statically mocked, permanently null-ing every Tag constant
110+
// for the JVM and corrupting any subsequent test that creates an ItemStack
111+
// (e.g. CommonPagedPanelTest -> ItemType.<clinit> -> MaterialTags.<clinit> ->
112+
// Objects.requireNonNull(Tag.ALL_SIGNS) -> NPE).
113+
MockBukkit.mock();
114+
PanelTestHelper.primeBukkitRegistry();
115+
MockBukkit.unmock();
104116
// Set up plugin
105117
WhiteBox.setInternalState(BentoBox.class, "instance", plugin);
106118
when(plugin.getLogger()).thenReturn(Logger.getAnonymousLogger());

src/test/java/world/bentobox/challenges/panel/CommonPagedPanelTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ public int getPageIndex() throws Exception {
116116
void setUp() {
117117
closeable = MockitoAnnotations.openMocks(this);
118118
ServerMock mbServer = MockBukkit.mock();
119+
PanelTestHelper.primeBukkitRegistry();
119120

120121
when(addon.getChallengesManager()).thenReturn(manager);
121122
PanelTestHelper.setupUserTranslations(user);

src/test/java/world/bentobox/challenges/panel/CommonPanelTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public PanelItem getReturnButton() {
7878
void setUp() {
7979
closeable = MockitoAnnotations.openMocks(this);
8080
ServerMock mbServer = MockBukkit.mock();
81+
PanelTestHelper.primeBukkitRegistry();
8182

8283
when(addon.getChallengesManager()).thenReturn(manager);
8384
PanelTestHelper.setupUserTranslations(user);

src/test/java/world/bentobox/challenges/panel/ConversationUtilsTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class ConversationUtilsTest {
4545
void setUp() {
4646
closeable = MockitoAnnotations.openMocks(this);
4747
ServerMock mbServer = MockBukkit.mock();
48+
PanelTestHelper.primeBukkitRegistry();
4849

4950
when(user.getTranslation(anyString())).thenAnswer(
5051
(Answer<String>) inv -> inv.getArgument(0, String.class));

src/test/java/world/bentobox/challenges/panel/PanelTestHelper.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,23 @@
2222
*/
2323
public class PanelTestHelper {
2424

25+
/**
26+
* Force Bukkit's material registry to be populated while MockBukkit's mock
27+
* server is active. Call this immediately after `MockBukkit.mock()`.
28+
*
29+
* <p>Why: `org.bukkit.inventory.ItemType.&lt;clinit&gt;` iterates over Material and
30+
* looks each entry up in the registry. If it runs before MockBukkit has populated
31+
* the registry (e.g., when a panel test that doesn't extend AbstractChallengesTest
32+
* runs first on CI's filesystem ordering), it throws NoSuchElementException, and
33+
* ItemStackMock stays in an errored state for the rest of the JVM — poisoning every
34+
* subsequent test. Touching `Tag.LEAVES` forces the registry to populate before
35+
* ItemType loads.
36+
*/
37+
public static void primeBukkitRegistry() {
38+
@SuppressWarnings("unused")
39+
var unused = org.bukkit.Tag.LEAVES;
40+
}
41+
2542
/**
2643
* Set up user translation mocks to return the key for any invocation.
2744
* Uses a lenient default answer that returns the first String argument

src/test/java/world/bentobox/challenges/panel/admin/AdminPanelTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class AdminPanelTest {
5454
void setUp() throws Exception {
5555
closeable = MockitoAnnotations.openMocks(this);
5656
ServerMock mbServer = MockBukkit.mock();
57+
PanelTestHelper.primeBukkitRegistry();
5758

5859
when(addon.getChallengesManager()).thenReturn(manager);
5960
PanelTestHelper.setupUserTranslations(user);

src/test/java/world/bentobox/challenges/panel/admin/ListChallengesPanelTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class ListChallengesPanelTest {
4747
void setUp() {
4848
closeable = MockitoAnnotations.openMocks(this);
4949
ServerMock mbServer = MockBukkit.mock();
50+
PanelTestHelper.primeBukkitRegistry();
5051

5152
when(addon.getChallengesManager()).thenReturn(manager);
5253
PanelTestHelper.setupUserTranslations(user);

0 commit comments

Comments
 (0)