Skip to content

Commit

Permalink
add Integration testcases for UserController#login
Browse files Browse the repository at this point in the history
  • Loading branch information
shashwatsai committed Jan 17, 2025
1 parent 6ba48a2 commit 4d4025f
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 19 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ Execute the following SQL to upgrade the database:
#### 2. Upgrade from 1.0.2 or before to 1.0.3 or after.
- Execute the following SQL to upgrade the database:
```
ALTER TABLE `user` ADD COLUMN `auth_provider` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL;
ALTER TABLE `user` ADD COLUMN `auth_provider` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT 'DB';
```
- Enabling LDAP Support,
- For LDAP support, you need to add the LDAP server configurations and include LDAP in the list of authentication providers in the application.yml file.
Expand Down
25 changes: 24 additions & 1 deletion README_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -231,4 +231,27 @@ sh bin/seatunnel-backend-daemon.sh start

```ALTER TABLE `t_st_job_instance` ADD COLUMN `error_message` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL;```


#### 2. 从1.0.2或更早版本升级到1.0.3或更高版本。
- 执行以下SQL语句以升级数据库:
```
ALTER TABLE `user` ADD COLUMN `auth_provider` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT 'DB';
```
- 启用LDAP支持,
- 要启用LDAP支持,您需要在`application.yml`文件中添加LDAP服务器配置,并将LDAP包含在认证提供者列表中。
- 如果未定义任何认证提供者,将使用默认的DB策略,不需要做任何更改。
- 以下是认证提供者和LDAP服务器设置的示例配置。
```
# sample application.yaml
spring:
ldap:
url: ldap://localhost:389
search:
base: ou=people,dc=example,dc=com
filter: (uid={0})
domain: example.com
seatunnel:
authentication:
providers:
- DB
- LDAP
```
Original file line number Diff line number Diff line change
Expand Up @@ -80,14 +80,11 @@ public class UserServiceImpl implements IUserService {

@PostConstruct
public void init() {
if (seatunnelAuthenticationProvidersConfig
.getProviders()
.contains(Constants.AUTHENTICATION_PROVIDER_DB)) {
List<String> providers = seatunnelAuthenticationProvidersConfig.getProviders();
if (providers.isEmpty() || providers.contains(Constants.AUTHENTICATION_PROVIDER_DB)) {
strategies.put(Constants.AUTHENTICATION_PROVIDER_DB, dbAuthenticationStrategy);
}
if (seatunnelAuthenticationProvidersConfig
.getProviders()
.contains(Constants.AUTHENTICATION_PROVIDER_LDAP)) {
if (providers.contains(Constants.AUTHENTICATION_PROVIDER_LDAP)) {
strategies.put(Constants.AUTHENTICATION_PROVIDER_LDAP, ldapAuthenticationStrategy);
}
}
Expand Down Expand Up @@ -173,12 +170,12 @@ public void disable(int id) {

@Override
public UserSimpleInfoRes login(UserLoginReq req, String authType) {
if (StringUtils.isNotEmpty(authType) && !strategies.containsKey(authType)) {
authType = StringUtils.isEmpty(authType) ? Constants.AUTHENTICATION_PROVIDER_DB : authType;
if (!strategies.containsKey(authType)) {
throw new SeatunnelException(
SeatunnelErrorEnum.INVALID_AUTHENTICATION_PROVIDER, authType);
}
IAuthenticationStrategy strategy =
strategies.getOrDefault(authType, dbAuthenticationStrategy);
IAuthenticationStrategy strategy = strategies.get(authType);
User user = strategy.authenticate(req);
UserSimpleInfoRes translate = translate(user);
final String token = jwtUtils.genToken(translate.toMap());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public enum SeatunnelErrorEnum {
TOKEN_ILLEGAL(10008, "token illegal", "The token is expired or invalid, please login again."),
INVALID_AUTHENTICATION_PROVIDER(
10010,
"supported authentication providers [LDAP, DB]",
"please provide the supported authentication providers, default DB",
"Invalid authentication provider [%s]"),
NO_SUCH_JOB(10009, "no such job", "No such job. Maybe deleted by others."),

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,20 @@
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Map;

public class SeatunnelWebTestingBase {
protected final String baseUrl = "http://localhost:8802/seatunnel/api/v1";

protected Result<UserSimpleInfoRes> login(UserLoginReq userLoginReq) {
public Result<UserSimpleInfoRes> login(UserLoginReq userLoginReq) {
return login(userLoginReq, null);
}

public Result<UserSimpleInfoRes> login(UserLoginReq userLoginReq, String authType) {
String requestBody = JsonUtils.toJsonString(userLoginReq);
String response = sendRequest(url("user/login"), requestBody, "POST");
Map<String, String> headers =
authType != null ? Map.of("X-Seatunnel-Auth-Type", authType) : null;
String response = sendRequest(url("user/login"), requestBody, "POST", headers);
return JSONTestUtils.parseObject(
response, new TypeReference<Result<UserSimpleInfoRes>>() {});
}
Expand All @@ -51,10 +58,15 @@ protected String urlWithParam(String pathAndParam) {
}

protected String sendRequest(String url) {
return sendRequest(url, null, "GET");
return sendRequest(url, null, "GET", null);
}

protected String sendRequest(String url, String requestBody, String httpMethod) {
return sendRequest(url, requestBody, httpMethod, null);
}

protected String sendRequest(
String url, String requestBody, String httpMethod, Map<String, String> headers) {
HttpURLConnection connection = null;
try {
URL urlObject = new URL(url);
Expand All @@ -69,6 +81,11 @@ protected String sendRequest(String url, String requestBody, String httpMethod)
if (!url.endsWith("user/login?")) {
connection.setRequestProperty("token", TokenProvider.getToken());
}
if (headers != null && !headers.isEmpty()) {
for (Map.Entry<String, String> header : headers.entrySet()) {
connection.setRequestProperty(header.getKey(), header.getValue());
}
}
connection.setDoOutput(true);
if (requestBody != null) {
try (OutputStream os = connection.getOutputStream()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,24 @@
import org.apache.seatunnel.app.controller.UserControllerWrapper;
import org.apache.seatunnel.app.domain.request.user.AddUserReq;
import org.apache.seatunnel.app.domain.request.user.UpdateUserReq;
import org.apache.seatunnel.app.domain.request.user.UserLoginReq;
import org.apache.seatunnel.app.domain.response.user.AddUserRes;
import org.apache.seatunnel.app.domain.response.user.UserSimpleInfoRes;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import java.util.function.Supplier;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class UserControllerTest {
private static final SeaTunnelWebCluster seaTunnelWebCluster = new SeaTunnelWebCluster();
private static UserControllerWrapper userControllerWrapper;
private static String uniqueId = "_" + System.currentTimeMillis();
final Supplier<String> uniqueId = () -> "_" + System.nanoTime();

@BeforeAll
public static void setUp() {
Expand All @@ -43,7 +48,7 @@ public static void setUp() {

@Test
public void addUser_shouldReturnSuccess_whenValidRequest() {
String user = "addUser" + uniqueId;
String user = "addUser" + uniqueId.get();
AddUserReq addUserReq = getAddUserReq(user, "pass1");
Result<AddUserRes> result = userControllerWrapper.addUser(addUserReq);
assertTrue(result.isSuccess());
Expand All @@ -61,7 +66,7 @@ private static AddUserReq getAddUserReq(String user, String pass) {

@Test
public void updateUser_shouldReturnSuccess_whenValidRequest() {
String user = "updateUser" + uniqueId;
String user = "updateUser" + uniqueId.get();
AddUserReq addUserReq = getAddUserReq(user, "pass2");
Result<AddUserRes> result = userControllerWrapper.addUser(addUserReq);
assertTrue(result.isSuccess());
Expand All @@ -79,7 +84,7 @@ public void updateUser_shouldReturnSuccess_whenValidRequest() {

@Test
public void deleteUser_shouldReturnSuccess_whenValidUserId() {
String user = "deleteUser" + uniqueId;
String user = "deleteUser" + uniqueId.get();
AddUserReq addUserReq = getAddUserReq(user, "pass3");
Result<AddUserRes> result = userControllerWrapper.addUser(addUserReq);
assertTrue(result.isSuccess());
Expand All @@ -95,6 +100,53 @@ public void listUsers_shouldReturnUsers_whenUsersExist() {
assertNotNull(result.getData());
}

@Test
public void login_shouldPass_whenValidAuthType() {
String user = "loginUser" + uniqueId.get();
AddUserReq addUserReq = getAddUserReq(user, "pass4");
Result<AddUserRes> addUserResult = userControllerWrapper.addUser(addUserReq);
assertTrue(addUserResult.isSuccess());

UserLoginReq loginReq = new UserLoginReq();
loginReq.setUsername(user);
loginReq.setPassword("pass4");

Result<UserSimpleInfoRes> loginResult = userControllerWrapper.login(loginReq, "DB");
assertTrue(loginResult.isSuccess());
}

@Test
public void login_shouldPass_whenNoAuthType() {
String user = "loginUser" + uniqueId.get();
AddUserReq addUserReq = getAddUserReq(user, "pass5");
Result<AddUserRes> addUserResult = userControllerWrapper.addUser(addUserReq);
assertTrue(addUserResult.isSuccess());

UserLoginReq loginReq = new UserLoginReq();
loginReq.setUsername(user);
loginReq.setPassword("pass5");

Result<UserSimpleInfoRes> loginResult = userControllerWrapper.login(loginReq);
assertTrue(loginResult.isSuccess());
}

@Test
public void login_shouldFail_whenInvalidAuthType() {
String user = "loginUser" + uniqueId.get();
AddUserReq addUserReq = getAddUserReq(user, "pass6");
Result<AddUserRes> addUserResult = userControllerWrapper.addUser(addUserReq);
assertTrue(addUserResult.isSuccess());

UserLoginReq loginReq = new UserLoginReq();
loginReq.setUsername(user);
loginReq.setPassword("pass6");

Result<UserSimpleInfoRes> loginResult =
userControllerWrapper.login(loginReq, "INVALID_AUTH_TYPE");
assertTrue(loginResult.isFailed());
assertEquals("Invalid authentication provider [INVALID_AUTH_TYPE]", loginResult.getMsg());
}

@AfterAll
public static void tearDown() {
Result<Void> logout = userControllerWrapper.logout();
Expand Down
12 changes: 12 additions & 0 deletions seatunnel-web-it/src/test/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ server:
port: 8802

spring:
ldap:
url: ldap://localhost:389
search:
base: ou=people,dc=example,dc=com
filter: (uid={0})
domain: example.com
application:
name: seatunnel
jackson:
Expand All @@ -38,6 +44,12 @@ jwt:
secretKey: https://github.com/apache/seatunnel
algorithm: HS256

seatunnel:
authentication:
providers:
- DB
#- LDAP # LDAP authentication is disabled by default

---
spring:
application:
Expand Down

0 comments on commit 4d4025f

Please sign in to comment.