package jnpf.elnService.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
import jnpf.elnEntity.runtime.ElnRecordForms;
|
import jnpf.elnEntity.runtime.ElnRecordVos;
|
import jnpf.elnEntity.runtime.ElnSharedFillOperationEntity;
|
import jnpf.elnEntity.runtime.ElnSharedFillTargetOperationEntity;
|
import jnpf.elnMapper.ElnSharedFillOperationMapper;
|
import jnpf.elnMapper.ElnSharedFillTargetOperationMapper;
|
import jnpf.exception.DataException;
|
import jnpf.util.JsonUtil;
|
import org.junit.Before;
|
import org.junit.Test;
|
|
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.fail;
|
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.anyString;
|
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.when;
|
|
public class ElnRecordSharedFillOperationServiceTest {
|
|
private ElnSharedFillOperationMapper operationMapper;
|
private ElnSharedFillTargetOperationMapper targetMapper;
|
private ElnRecordSharedFillOperationService service;
|
|
@Before
|
public void setUp() {
|
operationMapper = mock(ElnSharedFillOperationMapper.class);
|
targetMapper = mock(ElnSharedFillTargetOperationMapper.class);
|
service = new ElnRecordSharedFillOperationService(operationMapper, targetMapper);
|
}
|
|
@Test
|
public void rejectsTheSameOperationCodeForADifferentRequest() {
|
when(operationMapper.insertIgnore(any())).thenReturn(0);
|
when(operationMapper.selectOne(any(Wrapper.class)))
|
.thenReturn(operation("OPEN", "digest-a", "user-1", null));
|
|
try {
|
service.begin("tenant-a", "user-1", "shared-fill-1", "digest-b");
|
fail("a reused operation code must keep the original request digest");
|
} catch (DataException expected) {
|
assertEquals("批量填写操作码已用于其他请求", expected.getMessage());
|
}
|
}
|
|
@Test
|
public void rejectsAnUnknownPersistentOperationStatus() {
|
when(operationMapper.insertIgnore(any())).thenReturn(0);
|
when(operationMapper.selectOne(any(Wrapper.class)))
|
.thenReturn(operation("FAILED", "digest-a", "user-1", null));
|
|
try {
|
service.begin("tenant-a", "user-1", "shared-fill-1", "digest-a");
|
fail("an unknown operation status must not be resumed");
|
} catch (DataException expected) {
|
assertEquals("批量填写操作状态无效", expected.getMessage());
|
}
|
}
|
|
@Test
|
public void revalidatesAnOpenOperationThatHasNoCompletedTarget() {
|
when(operationMapper.insertIgnore(any())).thenReturn(0);
|
when(operationMapper.selectOne(any(Wrapper.class)))
|
.thenReturn(operation("OPEN", "digest-a", "user-1", null));
|
when(targetMapper.selectCount(any(Wrapper.class))).thenReturn(0L);
|
|
ElnRecordSharedFillServiceImpl.OperationStart start = service.begin(
|
"tenant-a", "user-1", "shared-fill-1", "digest-a");
|
|
assertEquals(false, start.isResuming());
|
}
|
|
@Test
|
public void resumesAnOpenOperationAfterATargetCompleted() {
|
when(operationMapper.insertIgnore(any())).thenReturn(0);
|
when(operationMapper.selectOne(any(Wrapper.class)))
|
.thenReturn(operation("OPEN", "digest-a", "user-1", null));
|
when(targetMapper.selectCount(any(Wrapper.class))).thenReturn(1L);
|
|
ElnRecordSharedFillServiceImpl.OperationStart start = service.begin(
|
"tenant-a", "user-1", "shared-fill-1", "digest-a");
|
|
assertEquals(true, start.isResuming());
|
}
|
|
@Test
|
public void replaysACompletedTargetWithoutReservingItAgain() {
|
ElnRecordVos.SharedFillTargetResult stored = targetResult("COMMITTED", 4);
|
when(targetMapper.insertIgnore(any())).thenReturn(0);
|
when(targetMapper.selectOne(any(Wrapper.class))).thenReturn(
|
targetOperation("COMPLETED", "record-1",
|
JsonUtil.getObjectToString(stored)));
|
|
ElnRecordVos.SharedFillTargetResult replayed = service.reserveTarget(
|
"tenant-a", "user-1", "shared-fill-1", target());
|
|
assertNotNull(replayed);
|
assertEquals("COMMITTED", replayed.getStatus());
|
assertEquals(Integer.valueOf(4), replayed.getRecordVersion());
|
}
|
|
@Test
|
public void returnsNullAfterPersistingANewTargetReservation() {
|
when(targetMapper.insertIgnore(any())).thenReturn(1);
|
|
assertNull(service.reserveTarget(
|
"tenant-a", "user-1", "shared-fill-1", target()));
|
}
|
|
@Test
|
public void returnsTheStoredSummaryWhenCompletionCasAlreadyWon() {
|
ElnRecordVos.SharedFilled stored = summary("shared-fill-1", "COMMITTED");
|
when(operationMapper.complete(anyString(), anyString(), anyString(),
|
anyString(), anyString())).thenReturn(0);
|
when(operationMapper.selectOne(any(Wrapper.class))).thenReturn(
|
operation("COMPLETED", "digest-a", "user-1",
|
JsonUtil.getObjectToString(stored)));
|
|
ElnRecordVos.SharedFilled replayed = service.complete(
|
"tenant-a", "user-1", "shared-fill-1", "digest-a",
|
summary("shared-fill-1", "REJECTED"));
|
|
assertEquals("COMMITTED", replayed.getTargets().get(0).getStatus());
|
verify(operationMapper).complete(eq("tenant-a"), eq("shared-fill-1"),
|
eq("digest-a"), anyString(), eq("user-1"));
|
}
|
|
private static ElnSharedFillOperationEntity operation(
|
String status, String digest, String userId, String resultJson) {
|
ElnSharedFillOperationEntity value = new ElnSharedFillOperationEntity();
|
value.setOperationStatus(status);
|
value.setRequestDigest(digest);
|
value.setOperatorUserId(userId);
|
value.setResultJson(resultJson);
|
return value;
|
}
|
|
private static ElnSharedFillTargetOperationEntity targetOperation(
|
String status, String recordId, String resultJson) {
|
ElnSharedFillTargetOperationEntity value =
|
new ElnSharedFillTargetOperationEntity();
|
value.setOperationStatus(status);
|
value.setDianziJiluId(recordId);
|
value.setResultJson(resultJson);
|
return value;
|
}
|
|
private static ElnRecordForms.SharedFillTarget target() {
|
ElnRecordForms.SharedFillTarget value = new ElnRecordForms.SharedFillTarget();
|
value.setTestWorkItemId("item-1");
|
value.setRecordId("record-1");
|
value.setExpectedRecordVersion(3);
|
return value;
|
}
|
|
private static ElnRecordVos.SharedFillTargetResult targetResult(
|
String status, int recordVersion) {
|
ElnRecordVos.SharedFillTargetResult value =
|
new ElnRecordVos.SharedFillTargetResult();
|
value.setTestWorkItemId("item-1");
|
value.setRecordId("record-1");
|
value.setStatus(status);
|
value.setRecordVersion(recordVersion);
|
return value;
|
}
|
|
private static ElnRecordVos.SharedFilled summary(
|
String operationCode, String targetStatus) {
|
ElnRecordVos.SharedFilled value = new ElnRecordVos.SharedFilled();
|
value.setOperationCode(operationCode);
|
value.getTargets().add(targetResult(targetStatus, 4));
|
return value;
|
}
|
}
|