Skip to content

Commit bd2474d

Browse files
Thomasludomikula
Thomas
authored andcommitted
Add generic oauth login integration test case
1 parent ab4a39b commit bd2474d

File tree

3 files changed

+102
-56
lines changed

3 files changed

+102
-56
lines changed

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/GenericAuthRequest.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,22 @@
2222
* This class is for Generic Auth Request
2323
*/
2424
public class GenericAuthRequest extends AbstractOauth2Request<Oauth2GenericAuthConfig>{
25+
private static boolean isTest = false;
26+
27+
public static void setIsTest(boolean isTest) {
28+
GenericAuthRequest.isTest = isTest;
29+
}
2530

2631
public GenericAuthRequest(Oauth2GenericAuthConfig context) {
2732
super(context, new GenericOAuthProviderSource(context));
2833
}
2934

3035
@Override
3136
protected Mono<AuthToken> getAuthToken(OAuth2RequestContext context) {
32-
return WebClientBuildHelper.builder()
37+
if(isTest) {
38+
AuthToken authToken = AuthToken.builder().build();
39+
return Mono.just(authToken);
40+
} else return WebClientBuildHelper.builder()
3341
.systemProxy()
3442
.timeoutMs(HTTP_TIMEOUT)
3543
.build()
@@ -53,7 +61,10 @@ protected Mono<AuthToken> getAuthToken(OAuth2RequestContext context) {
5361

5462
@Override
5563
protected Mono<AuthToken> refreshAuthToken(String refreshToken) {
56-
return WebClientBuildHelper.builder()
64+
if(isTest) {
65+
AuthToken authToken = AuthToken.builder().build();
66+
return Mono.just(authToken);
67+
} else return WebClientBuildHelper.builder()
5768
.systemProxy()
5869
.timeoutMs(HTTP_TIMEOUT)
5970
.build()
@@ -75,6 +86,13 @@ protected Mono<AuthToken> refreshAuthToken(String refreshToken) {
7586

7687
@Override
7788
protected Mono<AuthUser> getAuthUser(AuthToken authToken) {
89+
if(isTest) {
90+
AuthUser authUser = AuthUser.builder()
91+
.uid("uId")
92+
.username("dummyname")
93+
.build();
94+
return Mono.just(authUser);
95+
}
7896
return WebClientBuildHelper.builder()
7997
.systemProxy()
8098
.timeoutMs(HTTP_TIMEOUT)
Lines changed: 62 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,45 @@
11
package org.lowcoder.api.authentication;
22

3+
import com.google.common.collect.Iterables;
34
import org.junit.Test;
45
import org.junit.runner.RunWith;
6+
import org.lowcoder.api.authentication.request.AuthRequest;
7+
import org.lowcoder.api.authentication.request.AuthRequestFactory;
8+
import org.lowcoder.api.authentication.request.oauth2.Oauth2AuthRequestFactory;
9+
import org.lowcoder.api.authentication.request.oauth2.request.GenericAuthRequest;
10+
import org.lowcoder.api.authentication.service.AuthenticationApiServiceImpl;
11+
import org.lowcoder.api.common.mockuser.WithMockUser;
12+
import org.lowcoder.api.framework.view.ResponseView;
13+
import org.lowcoder.domain.authentication.AuthenticationService;
514
import org.lowcoder.domain.authentication.AuthenticationServiceImpl;
6-
import org.lowcoder.domain.organization.model.Organization;
7-
import org.lowcoder.domain.organization.service.OrgMemberService;
8-
import org.lowcoder.domain.organization.service.OrganizationService;
15+
import org.lowcoder.domain.authentication.FindAuthConfig;
16+
import org.lowcoder.domain.authentication.context.AuthRequestContext;
17+
import org.lowcoder.domain.encryption.EncryptionService;
18+
import org.lowcoder.domain.user.model.*;
19+
import org.lowcoder.domain.user.repository.UserRepository;
920
import org.lowcoder.sdk.auth.AbstractAuthConfig;
10-
import org.lowcoder.sdk.config.AuthProperties;
11-
import org.lowcoder.sdk.config.CommonConfig;
21+
import org.lowcoder.sdk.constants.AuthSourceConstants;
22+
import org.lowcoder.sdk.constants.GlobalContext;
1223
import org.mockito.InjectMocks;
1324
import org.mockito.Mock;
25+
import org.mockito.Mockito;
26+
import org.springframework.beans.factory.annotation.Autowired;
1427
import org.springframework.boot.test.context.SpringBootTest;
28+
import org.springframework.boot.test.mock.mockito.MockBean;
29+
import org.springframework.http.ResponseCookie;
30+
import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
31+
import org.springframework.mock.web.server.MockServerWebExchange;
1532
import org.springframework.test.context.junit4.SpringRunner;
33+
import org.springframework.util.MultiValueMap;
1634
import reactor.core.publisher.Mono;
1735
import reactor.test.StepVerifier;
36+
import reactor.util.context.Context;
1837

19-
import java.lang.reflect.Method;
20-
import java.util.Arrays;
21-
import java.util.List;
22-
import static org.mockito.Mockito.mock;
23-
import static org.mockito.Mockito.when;
38+
import java.util.Objects;
39+
40+
import static org.junit.Assert.*;
41+
import static org.junit.Assert.assertTrue;
42+
import static org.mockito.ArgumentMatchers.any;
2443

2544
/**
2645
* This class is for testing GenericAuth feature
@@ -29,55 +48,45 @@
2948
@RunWith(SpringRunner.class)
3049
public class GenericAuthenticateTest {
3150

32-
@InjectMocks
33-
AuthenticationServiceImpl mockAuthenticationService;
34-
35-
@Mock
36-
OrgMemberService mockOrgMemberService;
37-
38-
@Mock
39-
OrganizationService mockOrganizationService;
40-
41-
@Mock
42-
private AuthProperties authProperties;
43-
44-
@Mock
45-
private CommonConfig commonConfig;
51+
@Autowired
52+
private AuthenticationController authenticationController;
53+
@Autowired
54+
private UserRepository userRepository;
55+
@Autowired
56+
private AuthenticationService authenticationService;
4657

4758
@Test
48-
public void findAllAuthConfigsTest() throws Exception {
49-
String orgId = "org123";
50-
boolean enableOnly = true;
51-
52-
// Create mock objects
53-
Organization mockOrganization = mock(Organization.class);
54-
List<AbstractAuthConfig> mockAuthConfigs = Arrays.asList();
55-
CommonConfig.Workspace mockedWorkspace = new CommonConfig.Workspace();
59+
@WithMockUser
60+
public void testGoogleLoginSuccess() {
61+
String source = AuthSourceConstants.GOOGLE;
62+
String code = "test-code-123456";
63+
String orgId = "org01";
64+
String redirectUrl = "https://test.com";
5665

57-
// Mock functions
58-
when(mockOrganization.getAuthConfigs()).thenReturn(mockAuthConfigs);
59-
when(mockOrganizationService.getByDomain()).thenReturn(Mono.just(mockOrganization));
60-
when(mockOrganizationService.getById(orgId)).thenReturn(Mono.just(mockOrganization));
61-
when(mockOrgMemberService.doesAtleastOneAdminExist()).thenReturn(Mono.just(true));
62-
when(commonConfig.getWorkspace()).thenReturn(mockedWorkspace);
66+
GenericAuthRequest.setIsTest(true);
67+
String uid = "uId";
6368

64-
// Mocking auth properties email configuration
65-
AuthProperties.Email emailConfig = new AuthProperties.Email();
66-
emailConfig.setEnable(true);
67-
emailConfig.setEnableRegister(true);
68-
when(authProperties.getEmail()).thenReturn(emailConfig);
69+
MockServerHttpRequest request = MockServerHttpRequest.post("").build();
70+
MockServerWebExchange exchange = MockServerWebExchange.builder(request).build();
6971

70-
// Use reflection to access the private method
71-
Method findAllAuthConfigsByDomain = AuthenticationServiceImpl.class.getDeclaredMethod("findAllAuthConfigsByDomain");
72-
findAllAuthConfigsByDomain.setAccessible(true);
73-
Method findAllAuthConfigsForEnterpriseMode = AuthenticationServiceImpl.class.getDeclaredMethod("findAllAuthConfigsForEnterpriseMode");
74-
findAllAuthConfigsForEnterpriseMode.setAccessible(true);
75-
Method findAllAuthConfigsForSaasMode = AuthenticationServiceImpl.class.getDeclaredMethod("findAllAuthConfigsForSaasMode", String.class);
76-
findAllAuthConfigsForSaasMode.setAccessible(true);
72+
var authId = getGenericAuthConfigId(orgId).block();
73+
Mono<User> userMono = authenticationController.loginWithThirdParty(authId, source, code, null, redirectUrl, orgId, exchange)
74+
.then(userRepository.findByConnections_SourceAndConnections_RawId(source, uid));
7775

78-
// Act & Assert
79-
StepVerifier.create(mockAuthenticationService.findAllAuthConfigs(orgId, enableOnly))
80-
.expectNextMatches(findAuthConfig -> findAuthConfig.authConfig().isEnable())
76+
StepVerifier.create(userMono)
77+
.assertNext(user -> {
78+
assertEquals("dummyname", user.getName());
79+
assertEquals(UserState.ACTIVATED, user.getState());
80+
assertEquals(1, user.getConnections().size());
81+
assertTrue(user.getIsEnabled());
82+
})
8183
.verifyComplete();
8284
}
85+
86+
private Mono<String> getGenericAuthConfigId(String orgId) {
87+
return authenticationService.findAuthConfigBySource(orgId, AuthSourceConstants.GOOGLE)
88+
.map(FindAuthConfig::authConfig)
89+
.map(AbstractAuthConfig::getId)
90+
.contextWrite(Context.of(GlobalContext.DOMAIN, "avengers.com"));
91+
}
8392
}

server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/common/json/organization.json

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,26 @@
77
"state": "ACTIVE",
88
"organizationDomain": {
99
"domain": "avengers.com",
10-
"authConfigs": [
10+
"configs": [
11+
{
12+
"source": "GOOGLE",
13+
"sourceName": "Google OAuth",
14+
"sourceDescription": "An OAuth Provider for Google",
15+
"sourceIcon": "/icon:solid/address-card",
16+
"sourceCategory": "DEVELOPMENT",
17+
"clientId": "uR87...xWgdohR9jYeHU6",
18+
"clientSecret": "ATOAUZhwL...xU5SsSRCDA158FEA4",
19+
"issuer": "https://auth.google.com",
20+
"authorizationEndpoint": "https://auth.google.com/authorize?audience=api.google.com&client_id=uR87lwqLSHRvGaltLYxWgdohR9jYeHU6&scope=&redirect_uri=$REDIRECT_URL&state=$STATE&response_type=code&prompt=consent",
21+
"tokenEndpoint": "https://auth.google.com/oauth/token",
22+
"userInfoEndpoint": "https://auth.google.com/userinfo",
23+
"scope": "openid profile",
24+
"id": "106e4f4a4f6a48e5aa23cca6757c29e4",
25+
"authType": "GENERIC",
26+
"userInfoIntrospection": false,
27+
"enable": true,
28+
"enableRegister": true
29+
}
1130
]
1231
}
1332
}

0 commit comments

Comments
 (0)