|
@@ -37,6 +37,9 @@ import static org.mockito.Mockito.never;
|
|
|
|
|
|
|
|
class EmployeeRosterServiceImplTest {
|
|
class EmployeeRosterServiceImplTest {
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 验证银行信息与部门接口取得的一级部门名称都写入对应数据库参数。
|
|
|
|
|
+ */
|
|
|
@ParameterizedTest
|
|
@ParameterizedTest
|
|
|
@ValueSource(booleans = {true, false})
|
|
@ValueSource(booleans = {true, false})
|
|
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
|
@@ -54,6 +57,8 @@ class EmployeeRosterServiceImplTest {
|
|
|
String bankCode = useFieldNames ? "custom-bank" : "bank_name";
|
|
String bankCode = useFieldNames ? "custom-bank" : "bank_name";
|
|
|
String branchCode = useFieldNames ? "custom-branch" : "bank_branch_code";
|
|
String branchCode = useFieldNames ? "custom-branch" : "bank_branch_code";
|
|
|
given(dingTalkClient.getAccessToken()).willReturn("access-token");
|
|
given(dingTalkClient.getAccessToken()).willReturn("access-token");
|
|
|
|
|
+ given(rosterClient.getFirstDepartmentId("access-token", "user-1", 1L)).willReturn(123L);
|
|
|
|
|
+ given(rosterClient.getDepartmentName("access-token", 123L)).willReturn("研发中心");
|
|
|
given(contactsClient.listDeptUserDetail_v2(eq("access-token"), eq(1L), anyMap())).willReturn(mapOf(
|
|
given(contactsClient.listDeptUserDetail_v2(eq("access-token"), eq(1L), anyMap())).willReturn(mapOf(
|
|
|
"list", Collections.singletonList(user("user-1", "Alice", "1001")), "has_more", false));
|
|
"list", Collections.singletonList(user("user-1", "Alice", "1001")), "has_more", false));
|
|
|
given(rosterClient.listRosterFieldGroups("access-token", 123456L)).willReturn(Collections.singletonList(mapOf(
|
|
given(rosterClient.listRosterFieldGroups("access-token", 123456L)).willReturn(Collections.singletonList(mapOf(
|
|
@@ -81,6 +86,8 @@ class EmployeeRosterServiceImplTest {
|
|
|
assertTrue(sql.getValue().contains("bank_branch_code = VALUES(bank_branch_code)"));
|
|
assertTrue(sql.getValue().contains("bank_branch_code = VALUES(bank_branch_code)"));
|
|
|
PreparedStatement statement = mock(PreparedStatement.class);
|
|
PreparedStatement statement = mock(PreparedStatement.class);
|
|
|
setter.getValue().setValues(statement);
|
|
setter.getValue().setValues(statement);
|
|
|
|
|
+ assertTrue(sql.getValue().contains("first_department = VALUES(first_department)"));
|
|
|
|
|
+ verify(statement).setString(9, "研发中心");
|
|
|
verify(statement).setLong(10, 1L);
|
|
verify(statement).setLong(10, 1L);
|
|
|
verify(statement).setString(13, "6222020000000000000");
|
|
verify(statement).setString(13, "6222020000000000000");
|
|
|
verify(statement).setString(14, "Test Bank");
|
|
verify(statement).setString(14, "Test Bank");
|
|
@@ -106,6 +113,9 @@ class EmployeeRosterServiceImplTest {
|
|
|
verify(repository).findByEmployeeNo("1001");
|
|
verify(repository).findByEmployeeNo("1001");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 验证去重员工按各自部门查询一级部门,同一部门共享名称查询,无部门时清空旧花名册值。
|
|
|
|
|
+ */
|
|
|
@Test
|
|
@Test
|
|
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
|
|
void syncCollectsDepartmentUsersAndUpsertsRosterRecords() {
|
|
void syncCollectsDepartmentUsersAndUpsertsRosterRecords() {
|
|
@@ -142,6 +152,10 @@ class EmployeeRosterServiceImplTest {
|
|
|
given(rosterClient.getManagerUserId("access-token", "user-1")).willReturn("manager-001");
|
|
given(rosterClient.getManagerUserId("access-token", "user-1")).willReturn("manager-001");
|
|
|
given(rosterClient.getManagerUserId("access-token", "user-2")).willReturn(null);
|
|
given(rosterClient.getManagerUserId("access-token", "user-2")).willReturn(null);
|
|
|
given(rosterClient.getManagerUserId("access-token", "user-3")).willReturn("manager-002");
|
|
given(rosterClient.getManagerUserId("access-token", "user-3")).willReturn("manager-002");
|
|
|
|
|
+ given(rosterClient.getFirstDepartmentId("access-token", "user-1", 101L)).willReturn(10L);
|
|
|
|
|
+ given(rosterClient.getFirstDepartmentId("access-token", "user-2", 1L)).willReturn(10L);
|
|
|
|
|
+ given(rosterClient.getFirstDepartmentId("access-token", "user-3", 1L)).willReturn(null);
|
|
|
|
|
+ given(rosterClient.getDepartmentName("access-token", 10L)).willReturn("新研发中心");
|
|
|
|
|
|
|
|
EmployeeRosterServiceImpl service = new EmployeeRosterServiceImpl(
|
|
EmployeeRosterServiceImpl service = new EmployeeRosterServiceImpl(
|
|
|
dingTalkClient,
|
|
dingTalkClient,
|
|
@@ -170,7 +184,9 @@ class EmployeeRosterServiceImplTest {
|
|
|
assertEquals("P6", records.get(0).getJobGrade());
|
|
assertEquals("P6", records.get(0).getJobGrade());
|
|
|
assertEquals("10010", records.get(0).getJobGradeId());
|
|
assertEquals("10010", records.get(0).getJobGradeId());
|
|
|
assertEquals("技术部", records.get(0).getDepartment());
|
|
assertEquals("技术部", records.get(0).getDepartment());
|
|
|
- assertEquals("研发中心", records.get(0).getFirstDepartment());
|
|
|
|
|
|
|
+ assertEquals("新研发中心", records.get(0).getFirstDepartment());
|
|
|
|
|
+ assertEquals("新研发中心", records.get(1).getFirstDepartment());
|
|
|
|
|
+ assertNull(records.get(2).getFirstDepartment());
|
|
|
assertEquals(Long.valueOf(101L), records.get(0).getDepartmentId());
|
|
assertEquals(Long.valueOf(101L), records.get(0).getDepartmentId());
|
|
|
assertEquals("manager-001", records.get(0).getManagerUserId());
|
|
assertEquals("manager-001", records.get(0).getManagerUserId());
|
|
|
assertNull(records.get(1).getManagerUserId());
|
|
assertNull(records.get(1).getManagerUserId());
|
|
@@ -178,6 +194,41 @@ class EmployeeRosterServiceImplTest {
|
|
|
verify(rosterClient).getManagerUserId("access-token", "user-1");
|
|
verify(rosterClient).getManagerUserId("access-token", "user-1");
|
|
|
verify(rosterClient).getManagerUserId("access-token", "user-2");
|
|
verify(rosterClient).getManagerUserId("access-token", "user-2");
|
|
|
verify(rosterClient).getManagerUserId("access-token", "user-3");
|
|
verify(rosterClient).getManagerUserId("access-token", "user-3");
|
|
|
|
|
+ verify(rosterClient).getFirstDepartmentId("access-token", "user-1", 101L);
|
|
|
|
|
+ verify(rosterClient).getFirstDepartmentId("access-token", "user-2", 1L);
|
|
|
|
|
+ verify(rosterClient).getFirstDepartmentId("access-token", "user-3", 1L);
|
|
|
|
|
+ verify(rosterClient).getDepartmentName("access-token", 10L);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 父部门或部门详情查询失败时不执行数据库写入,保留已同步数据。
|
|
|
|
|
+ */
|
|
|
|
|
+ @ParameterizedTest
|
|
|
|
|
+ @ValueSource(booleans = {true, false})
|
|
|
|
|
+ @SuppressWarnings({"rawtypes", "unchecked"})
|
|
|
|
|
+ void departmentLookupFailureStopsSyncBeforeDatabaseWrites(boolean failParentLookup) {
|
|
|
|
|
+ DDClient dingTalkClient = mock(DDClient.class);
|
|
|
|
|
+ DDClient_Contacts contactsClient = mock(DDClient_Contacts.class);
|
|
|
|
|
+ DingTalkEmployeeRosterClient rosterClient = mock(DingTalkEmployeeRosterClient.class);
|
|
|
|
|
+ EmployeeRosterRepository repository = mock(EmployeeRosterRepository.class);
|
|
|
|
|
+ DDConf configuration = new DDConf();
|
|
|
|
|
+ configuration.setAgentId(123456L);
|
|
|
|
|
+ given(dingTalkClient.getAccessToken()).willReturn("access-token");
|
|
|
|
|
+ given(contactsClient.listDeptUserDetail_v2(eq("access-token"), eq(1L), anyMap()))
|
|
|
|
|
+ .willReturn(mapOf("list", Collections.singletonList(user("user-1", "Alice", "1001")), "has_more", false));
|
|
|
|
|
+ if (failParentLookup) {
|
|
|
|
|
+ given(rosterClient.getFirstDepartmentId("access-token", "user-1", 1L))
|
|
|
|
|
+ .willThrow(new IllegalStateException("DingTalk parent departments request failed"));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ given(rosterClient.getFirstDepartmentId("access-token", "user-1", 1L)).willReturn(123L);
|
|
|
|
|
+ given(rosterClient.getDepartmentName("access-token", 123L))
|
|
|
|
|
+ .willThrow(new IllegalStateException("DingTalk department details request failed"));
|
|
|
|
|
+ }
|
|
|
|
|
+ EmployeeRosterServiceImpl service = new EmployeeRosterServiceImpl(dingTalkClient, contactsClient,
|
|
|
|
|
+ configuration, rosterClient, repository, new EmployeeRosterProperties());
|
|
|
|
|
+
|
|
|
|
|
+ assertThrows(IllegalStateException.class, () -> service.syncFull());
|
|
|
|
|
+ verify(repository, never()).upsertAll(anyList());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
@Test
|