Upload via GUI (67 Dateien)
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Prüft das fertige Plugin (Spigot/Paper-Teil) gegen einen simulierten Server (MockBukkit). Braucht Java 21.
|
||||
Ablauf: im Ordner minecraft-plugin "mvn install", danach hier "mvn test" (siehe BAUEN.md). -->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>de.deskhub</groupId>
|
||||
<artifactId>deskhub-minecraft-integration-test</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<packaging>jar</packaging>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.release>21</maven.compiler.release>
|
||||
</properties>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>papermc</id>
|
||||
<url>https://repo.papermc.io/repository/maven-public/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>io.papermc.paper</groupId>
|
||||
<artifactId>paper-api</artifactId>
|
||||
<version>1.21.11-R0.1-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mockbukkit.mockbukkit</groupId>
|
||||
<artifactId>mockbukkit-v1.21</artifactId>
|
||||
<version>4.116.3</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>de.deskhub</groupId>
|
||||
<artifactId>deskhub-minecraft</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter</artifactId>
|
||||
<version>6.0.3</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>3.5.4</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
+162
@@ -0,0 +1,162 @@
|
||||
package de.deskhub.minecraft;
|
||||
|
||||
import com.sun.net.httpserver.HttpServer;
|
||||
import de.deskhub.minecraft.bukkit.BukkitPlugin;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockbukkit.mockbukkit.MockBukkit;
|
||||
import org.mockbukkit.mockbukkit.ServerMock;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/** Spigot/Paper-Teil des fertigen Plugins gegen einen simulierten Server und eine simulierte DeskHub-API. */
|
||||
class PaperPluginTest {
|
||||
private static final String KEY = "dh_" + "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4";
|
||||
private ServerMock server;
|
||||
private BukkitPlugin plugin;
|
||||
private HttpServer http;
|
||||
private final List<String> bodies = new CopyOnWriteArrayList<>();
|
||||
private final List<String> keys = new CopyOnWriteArrayList<>();
|
||||
|
||||
@BeforeEach
|
||||
void setUp() throws Exception {
|
||||
http = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
|
||||
http.createContext("/api/public/v1/tickets.php", ex -> {
|
||||
keys.add(ex.getRequestHeaders().getFirst("X-API-Key"));
|
||||
ByteArrayOutputStream b = new ByteArrayOutputStream();
|
||||
try (InputStream in = ex.getRequestBody()) { in.transferTo(b); }
|
||||
bodies.add(b.toString(StandardCharsets.UTF_8));
|
||||
byte[] out = ("{\"number\":\"T-" + bodies.size() + "\",\"status\":\"open\"}").getBytes(StandardCharsets.UTF_8);
|
||||
ex.sendResponseHeaders(201, out.length);
|
||||
ex.getResponseBody().write(out);
|
||||
ex.close();
|
||||
});
|
||||
http.start();
|
||||
server = MockBukkit.mock();
|
||||
plugin = MockBukkit.load(BukkitPlugin.class);
|
||||
server.getPluginManager().disablePlugin(plugin);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
void tearDown() {
|
||||
http.stop(0);
|
||||
MockBukkit.unmock();
|
||||
}
|
||||
|
||||
private void configure(String extra) throws Exception {
|
||||
String cfg = "deskhub:\n url: \"http://127.0.0.1:" + http.getAddress().getPort() + "\"\n api-key: \"" + KEY + "\"\n requester-email: \"mc@example.de\"\n"
|
||||
+ "ticket:\n department-id: 4\n priority-id: 3\n" + extra;
|
||||
Files.writeString(new File(plugin.getDataFolder(), "config.yml").toPath(), cfg);
|
||||
}
|
||||
|
||||
private File heartbeat() {
|
||||
return new File(plugin.getDataFolder(), "lebenszeichen.properties");
|
||||
}
|
||||
|
||||
private void writeHeartbeat(boolean running, boolean clean, long lastBeat) throws Exception {
|
||||
Properties p = new Properties();
|
||||
p.setProperty("running", String.valueOf(running));
|
||||
p.setProperty("clean", String.valueOf(clean));
|
||||
p.setProperty("lastBeat", String.valueOf(lastBeat));
|
||||
try (var out = Files.newOutputStream(heartbeat().toPath())) { p.store(out, null); }
|
||||
}
|
||||
|
||||
private void enable() {
|
||||
server.getPluginManager().enablePlugin(plugin);
|
||||
server.getScheduler().waitAsyncTasksFinished();
|
||||
}
|
||||
|
||||
@Test
|
||||
void startsWithoutConfigAndCreatesNoTicket() {
|
||||
// Standard-config: URL/Schlüssel fehlen -> Plugin läuft, meldet das Problem, legt nichts an
|
||||
enable();
|
||||
assertTrue(plugin.isEnabled());
|
||||
assertTrue(bodies.isEmpty());
|
||||
assertTrue(heartbeat().isFile(), "Lebenszeichen wird geschrieben");
|
||||
}
|
||||
|
||||
@Test
|
||||
void crashOfPreviousRunCreatesTicketOnStart() throws Exception {
|
||||
configure("");
|
||||
writeHeartbeat(true, false, System.currentTimeMillis() - 5 * 60_000L);
|
||||
enable();
|
||||
assertEquals(1, bodies.size(), "genau ein Ticket");
|
||||
String b = bodies.get(0);
|
||||
assertEquals(KEY, keys.get(0));
|
||||
assertTrue(b.contains("\"departmentId\":4") && b.contains("\"priorityId\":3"), b);
|
||||
assertTrue(b.contains("war nicht erreichbar"), b);
|
||||
assertTrue(b.contains("Ausfalldauer: ca. 5 Minuten"), b);
|
||||
}
|
||||
|
||||
@Test
|
||||
void cleanShutdownCreatesNoTicketOnNextStart() throws Exception {
|
||||
configure("");
|
||||
enable();
|
||||
server.getPluginManager().disablePlugin(plugin); // ordnungsgemäß beenden
|
||||
assertFalse(Files.readString(heartbeat().toPath()).contains("running=true"));
|
||||
configure("");
|
||||
enable();
|
||||
assertTrue(bodies.isEmpty(), "nach sauberem Beenden kein Ticket");
|
||||
}
|
||||
|
||||
@Test
|
||||
void firstEverStartCreatesNoTicket() throws Exception {
|
||||
configure("");
|
||||
Files.deleteIfExists(heartbeat().toPath());
|
||||
enable();
|
||||
assertTrue(bodies.isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
void crashTicketCanBeSwitchedOff() throws Exception {
|
||||
configure("backend:\n ticket-on-crash: false\n");
|
||||
writeHeartbeat(true, false, System.currentTimeMillis() - 60_000L);
|
||||
enable();
|
||||
assertTrue(bodies.isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
void shutdownTicketOnlyWhenEnabled() throws Exception {
|
||||
configure("backend:\n ticket-on-shutdown: true\n");
|
||||
enable();
|
||||
server.getPluginManager().disablePlugin(plugin);
|
||||
assertEquals(1, bodies.size());
|
||||
assertTrue(bodies.get(0).contains("heruntergefahren"), bodies.get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testCommandCreatesTicketAndNeedsPermission() throws Exception {
|
||||
configure("");
|
||||
enable();
|
||||
var op = server.addPlayer();
|
||||
op.setOp(false);
|
||||
server.dispatchCommand(op, "deskhubmc test");
|
||||
server.getScheduler().waitAsyncTasksFinished();
|
||||
assertTrue(bodies.isEmpty(), "ohne Berechtigung kein Ticket");
|
||||
server.dispatchCommand(server.getConsoleSender(), "deskhubmc test");
|
||||
server.getScheduler().waitAsyncTasksFinished();
|
||||
server.getScheduler().performOneTick();
|
||||
assertEquals(1, bodies.size());
|
||||
assertTrue(bodies.get(0).contains("Testticket"), bodies.get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
void crashWithBrokenConfigDoesNotCrashPlugin() throws Exception {
|
||||
Files.writeString(new File(plugin.getDataFolder(), "config.yml").toPath(), "deskhub:\n url: \"\"\n");
|
||||
writeHeartbeat(true, false, 1);
|
||||
assertDoesNotThrow(this::enable);
|
||||
assertTrue(plugin.isEnabled());
|
||||
assertTrue(bodies.isEmpty());
|
||||
}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
de\deskhub\minecraft\PaperPluginTest.class
|
||||
+1
@@ -0,0 +1 @@
|
||||
C:\Users\Viper\Desktop\deskhub\minecraft-plugin\integration-test\src\test\java\de\deskhub\minecraft\PaperPluginTest.java
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
# Created at 2026-10-21T13:17:32.125
|
||||
java.lang.NoClassDefFoundError: org/junit/platform/engine/OutputDirectoryCreator
|
||||
at org.apache.maven.surefire.junitplatform.TestPlanScannerFilter.accept(TestPlanScannerFilter.java:47)
|
||||
at org.apache.maven.surefire.api.util.DefaultScanResult.applyFilter(DefaultScanResult.java:87)
|
||||
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.scanClasspath(JUnitPlatformProvider.java:142)
|
||||
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:122)
|
||||
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
|
||||
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
|
||||
at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
|
||||
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
|
||||
Caused by: java.lang.ClassNotFoundException: org.junit.platform.engine.OutputDirectoryCreator
|
||||
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
|
||||
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
|
||||
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
|
||||
... 8 more
|
||||
|
||||
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
# Created at 2026-10-21T13:17:32.130
|
||||
org/junit/platform/engine/OutputDirectoryCreator
|
||||
|
||||
+121
File diff suppressed because one or more lines are too long
+4
@@ -0,0 +1,4 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: de.deskhub.minecraft.PaperPluginTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.317 s -- in de.deskhub.minecraft.PaperPluginTest
|
||||
BIN
Binary file not shown.
Reference in New Issue
Block a user