|
@@ -8,8 +8,14 @@ import com.malk.server.dingtalk.DDConf;
|
|
|
import com.malk.service.dingtalk.DDClient;
|
|
import com.malk.service.dingtalk.DDClient;
|
|
|
import com.malk.service.dingtalk.DDClient_Contacts;
|
|
import com.malk.service.dingtalk.DDClient_Contacts;
|
|
|
import org.junit.jupiter.api.Test;
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
|
+import org.junit.jupiter.params.ParameterizedTest;
|
|
|
|
|
+import org.junit.jupiter.params.provider.ValueSource;
|
|
|
import org.mockito.ArgumentCaptor;
|
|
import org.mockito.ArgumentCaptor;
|
|
|
|
|
+import org.springframework.beans.factory.ObjectProvider;
|
|
|
|
|
+import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
|
|
+import org.springframework.jdbc.core.PreparedStatementSetter;
|
|
|
|
|
|
|
|
|
|
+import java.sql.PreparedStatement;
|
|
|
import java.util.Arrays;
|
|
import java.util.Arrays;
|
|
|
import java.util.Collections;
|
|
import java.util.Collections;
|
|
|
import java.util.LinkedHashMap;
|
|
import java.util.LinkedHashMap;
|
|
@@ -19,6 +25,7 @@ import java.util.Map;
|
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
|
|
import static org.junit.jupiter.api.Assertions.assertSame;
|
|
import static org.junit.jupiter.api.Assertions.assertSame;
|
|
|
|
|
+import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
|
import static org.mockito.ArgumentMatchers.anyList;
|
|
import static org.mockito.ArgumentMatchers.anyList;
|
|
|
import static org.mockito.ArgumentMatchers.anyMap;
|
|
import static org.mockito.ArgumentMatchers.anyMap;
|
|
|
import static org.mockito.ArgumentMatchers.eq;
|
|
import static org.mockito.ArgumentMatchers.eq;
|
|
@@ -28,6 +35,55 @@ import static org.mockito.Mockito.verify;
|
|
|
|
|
|
|
|
class EmployeeRosterServiceImplTest {
|
|
class EmployeeRosterServiceImplTest {
|
|
|
|
|
|
|
|
|
|
+ @ParameterizedTest
|
|
|
|
|
+ @ValueSource(booleans = {true, false})
|
|
|
|
|
+ @SuppressWarnings({"rawtypes", "unchecked"})
|
|
|
|
|
+ void syncFullWritesBankInformationFromRosterNamesOrCodes(boolean useFieldNames) throws Exception {
|
|
|
|
|
+ DDClient dingTalkClient = mock(DDClient.class);
|
|
|
|
|
+ DDClient_Contacts contactsClient = mock(DDClient_Contacts.class);
|
|
|
|
|
+ DingTalkEmployeeRosterClient rosterClient = mock(DingTalkEmployeeRosterClient.class);
|
|
|
|
|
+ JdbcTemplate jdbcTemplate = mock(JdbcTemplate.class);
|
|
|
|
|
+ ObjectProvider<JdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
|
|
+ EmployeeRosterRepository repository = new EmployeeRosterRepository(jdbcTemplateProvider, new EmployeeRosterProperties());
|
|
|
|
|
+ DDConf configuration = new DDConf();
|
|
|
|
|
+ configuration.setAgentId(123456L);
|
|
|
|
|
+ String cardCode = useFieldNames ? "custom-card" : "bank_card_no";
|
|
|
|
|
+ String bankCode = useFieldNames ? "custom-bank" : "bank_name";
|
|
|
|
|
+ String branchCode = useFieldNames ? "custom-branch" : "bank_branch_code";
|
|
|
|
|
+ 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));
|
|
|
|
|
+ given(rosterClient.listRosterFieldGroups("access-token", 123456L)).willReturn(Collections.singletonList(mapOf(
|
|
|
|
|
+ "field_list", Arrays.asList(
|
|
|
|
|
+ field(cardCode, useFieldNames ? "银行卡号" : "Card"),
|
|
|
|
|
+ field(bankCode, useFieldNames ? "开户行" : "Bank"),
|
|
|
|
|
+ field(branchCode, useFieldNames ? "支行联行号" : "Branch")))));
|
|
|
|
|
+ given(rosterClient.listEmployeeRoster(eq("access-token"), eq(Collections.singletonList("user-1")),
|
|
|
|
|
+ eq(123456L), eq(Arrays.asList(cardCode, bankCode, branchCode))))
|
|
|
|
|
+ .willReturn(Collections.singletonList(mapOf("userid", "user-1", "field_data_list", Arrays.asList(
|
|
|
|
|
+ rosterField(cardCode, "6222020000000000000"),
|
|
|
|
|
+ rosterField(bankCode, "Test Bank"),
|
|
|
|
|
+ rosterField(branchCode, "001234567890")))));
|
|
|
|
|
+
|
|
|
|
|
+ EmployeeRosterServiceImpl service = new EmployeeRosterServiceImpl(dingTalkClient, contactsClient,
|
|
|
|
|
+ configuration, rosterClient, repository, new EmployeeRosterProperties());
|
|
|
|
|
+ service.syncFull();
|
|
|
|
|
+
|
|
|
|
|
+ ArgumentCaptor<String> sql = ArgumentCaptor.forClass(String.class);
|
|
|
|
|
+ ArgumentCaptor<PreparedStatementSetter> setter = ArgumentCaptor.forClass(PreparedStatementSetter.class);
|
|
|
|
|
+ verify(jdbcTemplate).update(sql.capture(), setter.capture());
|
|
|
|
|
+ assertTrue(sql.getValue().contains("bank_card_no, bank_name, bank_branch_code"));
|
|
|
|
|
+ assertTrue(sql.getValue().contains("bank_card_no = VALUES(bank_card_no)"));
|
|
|
|
|
+ assertTrue(sql.getValue().contains("bank_name = VALUES(bank_name)"));
|
|
|
|
|
+ assertTrue(sql.getValue().contains("bank_branch_code = VALUES(bank_branch_code)"));
|
|
|
|
|
+ PreparedStatement statement = mock(PreparedStatement.class);
|
|
|
|
|
+ setter.getValue().setValues(statement);
|
|
|
|
|
+ verify(statement).setString(12, "6222020000000000000");
|
|
|
|
|
+ verify(statement).setString(13, "Test Bank");
|
|
|
|
|
+ verify(statement).setString(14, "001234567890");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Test
|
|
@Test
|
|
|
void findByEmployeeNoDelegatesToRepository() {
|
|
void findByEmployeeNoDelegatesToRepository() {
|
|
|
EmployeeRosterRepository repository = mock(EmployeeRosterRepository.class);
|
|
EmployeeRosterRepository repository = mock(EmployeeRosterRepository.class);
|