Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions src/main/java/net/tfminecraft/tfmcweb/managers/WebCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,8 @@ private boolean cmdLookup(CommandSender sender, String[] args) {
sender.sendMessage(ChatColor.GRAY + "cache: linked=" + cached.linked
+ " eligible=" + cached.eligible
+ " in_grace=" + cached.inGrace
+ " discord=" + nullSafe(cached.discordUsername)
+ " grace_until=" + nullSafe(cached.graceUntil));
sender.sendMessage(discordUsernameLine(cached.discordUsername));
Comment thread
Drefvelin marked this conversation as resolved.
} else {
sender.sendMessage(ChatColor.GRAY + "cache: (miss)");
}
Expand All @@ -181,8 +181,8 @@ private boolean cmdLookup(CommandSender sender, String[] args) {
sender.sendMessage(ChatColor.GRAY + "live: linked=" + status.linked
+ " eligible=" + status.eligible
+ " in_grace=" + status.inGrace
+ " discord=" + nullSafe(status.discordUsername)
+ " grace_until=" + nullSafe(status.graceUntil));
sender.sendMessage(discordUsernameLine(status.discordUsername));
Player online = Bukkit.getPlayer(uuid);
if (online != null && online.isOnline()) {
gateService.applyGate(online, status.eligible);
Expand Down Expand Up @@ -285,6 +285,13 @@ private static String nullSafe(String s) {
return s == null || s.isBlank() ? "-" : s;
}

/** Chat line for the command sender. Blank names stay visible as "-". */
@SuppressWarnings("deprecation")
static String discordUsernameLine(String username) {
return ChatColor.GRAY + "Discord username: "
+ ChatColor.AQUA + nullSafe(username);
}

@Override
public List<String> onTabComplete(
CommandSender sender,
Expand Down
123 changes: 123 additions & 0 deletions src/test/java/net/tfminecraft/tfmcweb/managers/WebCommandTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
package net.tfminecraft.tfmcweb.managers;

import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.contains;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.util.UUID;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;

import net.tfminecraft.tfmcweb.api.ProvinceSystemClient;
import net.tfminecraft.tfmcweb.api.ProvinceSystemClient.IdentityStatus;
import net.tfminecraft.tfmcweb.cache.LinkCache;
import net.tfminecraft.tfmcweb.gate.DiscordGateService;

class WebCommandTest {

@Test
void lookupLineNamesTheDiscordUserForTheSender() {
String line = WebCommand.discordUsernameLine("ada_stone");
assertTrue(line.contains("Discord username:"));
assertTrue(line.contains("ada_stone"));
}

@Test
void lookupLineShowsABlankWhenTheUsernameIsMissing() {
String line = WebCommand.discordUsernameLine(" ");
assertTrue(line.contains("Discord username:"));
assertTrue(line.endsWith("-"));
}
Comment thread
Drefvelin marked this conversation as resolved.

@Test
void lookupTellsTheSenderTheCachedDiscordUsername() {
UUID uuid = UUID.randomUUID();
Player target = mock(Player.class);
when(target.getUniqueId()).thenReturn(uuid);
when(target.getName()).thenReturn("Ada");

LinkCache cache = new LinkCache();
cache.putLinked(uuid, "111", "ada_stone");

CommandSender sender = mock(CommandSender.class);
when(sender.hasPermission("tfmcweb.admin")).thenReturn(true);

BukkitScheduler scheduler = mock(BukkitScheduler.class);
try (MockedStatic<Bukkit> bukkit = mockStatic(Bukkit.class)) {
bukkit.when(Bukkit::getScheduler).thenReturn(scheduler);
bukkit.when(() -> Bukkit.getPlayerExact("Ada")).thenReturn(target);

WebCommand command = new WebCommand(
mock(JavaPlugin.class),
cache,
mock(DiscordGateService.class)
);
command.onCommand(sender, mock(Command.class), "web", new String[] { "lookup", "Ada" });
}

verify(sender).sendMessage(contains("Discord username:"));
verify(sender).sendMessage(contains("ada_stone"));
}

@Test
void lookupTellsTheSenderTheLiveDiscordUsername() {
UUID uuid = UUID.randomUUID();
Player target = mock(Player.class);
when(target.getUniqueId()).thenReturn(uuid);
when(target.getName()).thenReturn("Ada");
when(target.isOnline()).thenReturn(true);

CommandSender sender = mock(CommandSender.class);
when(sender.hasPermission("tfmcweb.admin")).thenReturn(true);

BukkitScheduler scheduler = mock(BukkitScheduler.class);
when(scheduler.runTaskAsynchronously(any(Plugin.class), any(Runnable.class)))
.thenAnswer(invocation -> {
invocation.getArgument(1, Runnable.class).run();
return null;
});
when(scheduler.runTask(any(Plugin.class), any(Runnable.class)))
.thenAnswer(invocation -> {
invocation.getArgument(1, Runnable.class).run();
return null;
});

IdentityStatus status = IdentityStatus.fromJson(
"{\"linked\":true,\"eligible\":true,\"in_grace\":false,"
+ "\"discord_username\":\"ada_stone\"}"
);

try (
MockedStatic<Bukkit> bukkit = mockStatic(Bukkit.class);
MockedStatic<ProvinceSystemClient> client = mockStatic(ProvinceSystemClient.class)
) {
bukkit.when(Bukkit::getScheduler).thenReturn(scheduler);
bukkit.when(() -> Bukkit.getPlayerExact("Ada")).thenReturn(target);
bukkit.when(() -> Bukkit.getPlayer(uuid)).thenReturn(target);
client.when(() -> ProvinceSystemClient.getIdentityStatus(uuid.toString()))
.thenReturn(status);

WebCommand command = new WebCommand(
mock(JavaPlugin.class),
new LinkCache(),
mock(DiscordGateService.class)
);
command.onCommand(sender, mock(Command.class), "web", new String[] { "lookup", "Ada" });
}

verify(sender).sendMessage(contains("Discord username:"));
verify(sender).sendMessage(contains("ada_stone"));
}
}