package com.xly.erp.common.security; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicReference; import static org.junit.jupiter.api.Assertions.*; class LoginContextTest { @AfterEach void tearDown() { LoginContext.clear(); } @Test void setAndCurrent_returnsSameUser() { LoginContext.LoginUser u = new LoginContext.LoginUser(42, "alice", "NORMAL", "HQ"); LoginContext.set(u); assertSame(u, LoginContext.current()); } @Test void clear_returnsNullForCurrent() { LoginContext.set(new LoginContext.LoginUser(1, "x", "NORMAL", "HQ")); LoginContext.clear(); assertNull(LoginContext.current()); } @Test void setAndCurrent_isolatedPerThread() throws InterruptedException { LoginContext.set(new LoginContext.LoginUser(1, "main", "NORMAL", "HQ")); AtomicReference seen = new AtomicReference<>(); CountDownLatch latch = new CountDownLatch(1); Thread t = new Thread(() -> { seen.set(LoginContext.current()); LoginContext.set(new LoginContext.LoginUser(2, "child", "SUPER_ADMIN", "HQ")); latch.countDown(); }); t.start(); latch.await(); t.join(); assertNull(seen.get(), "子线程不应继承父线程 ThreadLocal"); assertEquals("main", LoginContext.current().username(), "父线程上下文不应被子线程改动影响"); } }