刘光辉
8 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package jnpf.base.service;
 
import com.baomidou.dynamic.datasource.tx.TransactionContext;
import jnpf.base.ActionResult;
import jnpf.base.UserInfo;
import jnpf.exception.DataException;
import jnpf.util.TicketUtil;
import jnpf.util.UserProvider;
import org.junit.Test;
import java.util.Map;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
 
public class UploadEditNotificationsTest {
    @Test public void authorizedWatchOnlyWakesAfterCommitAndRejectsOtherUser() {
        var notifications = new UploadEditNotifications();
        UserInfo user = new UserInfo(); user.setTenantId("tenant"); user.setUserId("owner");
        try (var users = mockStatic(UserProvider.class); var tickets = mockStatic(TicketUtil.class)) {
            users.when(UserProvider::getUser).thenReturn(user);
            users.when(UserProvider::getLoginUserId).thenReturn("owner");
            tickets.when(() -> TicketUtil.createTicket(anyString(), eq(60L))).thenAnswer(call -> call.getArgument(0));
            tickets.when(() -> TicketUtil.parseTicket(anyString())).thenAnswer(call -> call.getArgument(0));
            String ticket = notifications.ticket(Map.of("draft", 0L));
            var waiting = notifications.watch(ticket);
            assertFalse(waiting.hasResult());
            TransactionContext.bind("test-transaction");
            try {
                notifications.changedAfterCommit("tenant", "draft");
                assertFalse(waiting.hasResult());
                TransactionContext.getSynchronizations().forEach(sync -> sync.afterCommit());
                assertTrue(waiting.hasResult());
                assertEquals(true, ((ActionResult<?>) waiting.getResult()).getData());
            } finally {
                TransactionContext.removeSynchronizations(); TransactionContext.remove();
            }
            // A missed event between state read and subscription is detected immediately.
            assertTrue(notifications.watch(ticket).hasResult());
            users.when(UserProvider::getLoginUserId).thenReturn("other");
            try { notifications.watch(ticket); fail("other user must not subscribe"); }
            catch (DataException expected) { assertTrue(expected.getMessage().contains("失效")); }
        }
    }
}