chore: Moving settings from organization configuration to instance variables (#39736)

## Description
> [!TIP]  
> _Add a TL;DR when the description is longer than 500 words or
extremely technical (helps the content, marketing, and DevRel team)._
>
> _Please also include relevant motivation and context. List any
dependencies that are required for this change. Add links to Notion,
Figma or any other documents that might be relevant to the PR._


Fixes #`Issue Number`  
_or_  
Fixes `Issue URL`
> [!WARNING]  
> _If no issue exists, please create an issue first, and check with the
maintainers if the issue is valid._

## Automation

/test all

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!IMPORTANT]
> 🟣 🟣 🟣 Your tests are running.
> Tests running at:
<https://github.com/appsmithorg/appsmith/actions/runs/13901423078>
> Commit: 0744f07a7ca5e30225dedd4de3c07371ce2a3083
> Workflow: `PR Automation test suite`
> Tags: `@tag.All`
> Spec: ``
> <hr>Mon, 17 Mar 2025 14:04:22 UTC
<!-- end of auto-generated comment: Cypress test results  -->


## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [ ] No


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Upgraded configuration management now uses a unified instance-level
approach, ensuring more consistent handling of service settings such as
email verification and integrations.
- Legacy settings have been migrated to improve reliability and
streamline system behavior.
  
- **Tests**
- Comprehensive tests have been added to verify the stability and
accuracy of the new configuration processes.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Trisha Anand 2025-03-17 19:34:42 +05:30 committed by GitHub
parent 37051762af
commit 5364a6c0c9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 367 additions and 34 deletions

View File

@ -1,6 +1,7 @@
package com.appsmith.server.authentication.handlers;
import com.appsmith.server.authentication.handlers.ce.AuthenticationSuccessHandlerCE;
import com.appsmith.server.helpers.InstanceVariablesHelper;
import com.appsmith.server.helpers.RedirectHelper;
import com.appsmith.server.helpers.WorkspaceServiceHelper;
import com.appsmith.server.ratelimiting.RateLimitService;
@ -34,7 +35,8 @@ public class AuthenticationSuccessHandler extends AuthenticationSuccessHandlerCE
RateLimitService rateLimitService,
OrganizationService organizationService,
UserService userService,
WorkspaceServiceHelper workspaceServiceHelper) {
WorkspaceServiceHelper workspaceServiceHelper,
InstanceVariablesHelper instanceVariablesHelper) {
super(
redirectHelper,
sessionUserService,
@ -48,6 +50,7 @@ public class AuthenticationSuccessHandler extends AuthenticationSuccessHandlerCE
rateLimitService,
organizationService,
userService,
workspaceServiceHelper);
workspaceServiceHelper,
instanceVariablesHelper);
}
}

View File

@ -10,6 +10,7 @@ import com.appsmith.server.domains.LoginSource;
import com.appsmith.server.domains.User;
import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.ResendEmailVerificationDTO;
import com.appsmith.server.helpers.InstanceVariablesHelper;
import com.appsmith.server.helpers.RedirectHelper;
import com.appsmith.server.helpers.WorkspaceServiceHelper;
import com.appsmith.server.ratelimiting.RateLimitService;
@ -26,7 +27,6 @@ import com.appsmith.server.solutions.WorkspacePermission;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.security.web.server.DefaultServerRedirectStrategy;
@ -68,12 +68,11 @@ public class AuthenticationSuccessHandlerCE implements ServerAuthenticationSucce
private final OrganizationService organizationService;
private final UserService userService;
private final WorkspaceServiceHelper workspaceServiceHelper;
private final InstanceVariablesHelper instanceVariablesHelper;
private Mono<Boolean> isVerificationRequired(String userEmail, String method) {
Mono<Boolean> emailVerificationEnabledMono = organizationService
.getOrganizationConfiguration()
.map(organization -> organization.getOrganizationConfiguration().isEmailVerificationEnabled())
.cache();
Mono<Boolean> emailVerificationEnabledMono =
instanceVariablesHelper.isEmailVerificationEnabled().cache();
Mono<User> userMono = organizationService
.getCurrentUserOrganizationId()

View File

@ -208,4 +208,5 @@ public class FieldNameCE {
public static final String ORGANIZATION_ID = "organizationId";
public static final String NONE = "none";
public static final String ORGANIZATION_ADMINISTRATOR_ROLE = "Organization Administrator Role";
public static final String INSTANCE_VARIABLES = "instanceVariables";
}

View File

@ -20,15 +20,18 @@ import java.util.Map;
@FieldNameConstants
public class OrganizationConfigurationCE implements Serializable {
@Deprecated(forRemoval = true, since = "v1.65")
private String googleMapsKey;
private Boolean isFormLoginEnabled;
@Deprecated(forRemoval = true, since = "v1.65")
private String instanceName;
protected License license;
// organization admin can toggle this field to enable/disable email verification
@Deprecated(forRemoval = true, since = "v1.65")
private Boolean emailVerificationEnabled;
// We add `JsonInclude` here, so that this field is included in the JSON response, even if it is `null`. Reason is,
@ -91,5 +94,9 @@ public class OrganizationConfigurationCE implements Serializable {
return Boolean.TRUE.equals(this.emailVerificationEnabled);
}
public static class Fields {}
public static class Fields {
public Fields() {
// Public constructor for Fields class
}
}
}

View File

@ -0,0 +1,18 @@
package com.appsmith.server.helpers;
import com.appsmith.server.helpers.ce.InstanceVariablesHelperCE;
import com.appsmith.server.services.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* Helper class for accessing instance variables from the instance config
*/
@Component
@Slf4j
public class InstanceVariablesHelper extends InstanceVariablesHelperCE {
public InstanceVariablesHelper(ConfigService configService) {
super(configService);
}
}

View File

@ -0,0 +1,50 @@
package com.appsmith.server.helpers.ce;
import com.appsmith.server.constants.Appsmith;
import com.appsmith.server.services.ConfigService;
import lombok.RequiredArgsConstructor;
import reactor.core.publisher.Mono;
/**
* Helper class for accessing instance variables from the instance config
*/
@RequiredArgsConstructor
public class InstanceVariablesHelperCE {
private final ConfigService configService;
/**
* Get the instance name from the instance variables
* @return The instance name, or the default instance name if not set
*/
public Mono<String> getInstanceName() {
return configService.getInstanceVariables().map(instanceVariables -> {
Object value = instanceVariables.getOrDefault("instanceName", Appsmith.DEFAULT_INSTANCE_NAME);
return value != null ? value.toString() : Appsmith.DEFAULT_INSTANCE_NAME;
});
}
/**
* Get the email verification enabled flag from the instance variables
* @return True if email verification is enabled, false otherwise
*/
public Mono<Boolean> isEmailVerificationEnabled() {
return configService.getInstanceVariables().map(instanceVariables -> {
Object value = instanceVariables.getOrDefault("emailVerificationEnabled", false);
if (value instanceof Boolean) {
return (Boolean) value;
}
return Boolean.FALSE;
});
}
/**
* Get the Google Maps API key from the instance variables
* @return The Google Maps API key, or an empty string if not set
*/
public Mono<String> getGoogleMapsKey() {
return configService.getInstanceVariables().map(instanceVariables -> {
Object value = instanceVariables.getOrDefault("googleMapsKey", "");
return value != null ? value.toString() : "";
});
}
}

View File

@ -0,0 +1,85 @@
package com.appsmith.server.migrations.db.ce;
import com.appsmith.server.constants.Appsmith;
import com.appsmith.server.constants.FieldName;
import com.appsmith.server.domains.Config;
import com.appsmith.server.domains.Organization;
import com.appsmith.server.domains.OrganizationConfiguration;
import io.mongock.api.annotations.ChangeUnit;
import io.mongock.api.annotations.Execution;
import io.mongock.api.annotations.RollbackExecution;
import lombok.extern.slf4j.Slf4j;
import net.minidev.json.JSONObject;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import static org.springframework.data.mongodb.core.query.Criteria.where;
@Slf4j
@ChangeUnit(order = "069", id = "migrate-organization-config-to-instance-config", author = "")
public class Migration069MigrateOrganizationConfigToInstanceConfig {
private final MongoTemplate mongoTemplate;
public Migration069MigrateOrganizationConfigToInstanceConfig(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
@RollbackExecution
public void rollbackExecution() {
// This is a data migration, no rollback required
}
@Execution
public void migrateOrganizationConfigToInstanceConfig() {
log.info("Starting migration of organization configuration fields to instance config");
// 1. Fetch the instanceConfig from Config collection
Query instanceConfigQuery = new Query();
instanceConfigQuery.addCriteria(where(Config.Fields.name).is(FieldName.INSTANCE_CONFIG));
Config instanceConfig = mongoTemplate.findOne(instanceConfigQuery, Config.class);
if (instanceConfig == null) {
log.error("Instance config not found. Migration cannot proceed.");
return;
}
// 2. Fetch the Organization with its OrganizationConfiguration
Query organizationQuery = new Query();
Organization organization = mongoTemplate.findOne(organizationQuery, Organization.class);
if (organization == null || organization.getOrganizationConfiguration() == null) {
log.info("No organization or organization configuration found. Nothing to migrate.");
return;
}
// 3. Create instanceVariables JSON object with the required fields
OrganizationConfiguration orgConfig = organization.getOrganizationConfiguration();
JSONObject config = instanceConfig.getConfig();
if (config == null) {
config = new JSONObject();
}
// Create instanceVariables object
JSONObject instanceVariables = new JSONObject();
// Copy values from OrganizationConfiguration to instanceVariables
if (orgConfig.getInstanceName() != null) {
instanceVariables.put("instanceName", orgConfig.getInstanceName());
} else {
instanceVariables.put("instanceName", Appsmith.DEFAULT_INSTANCE_NAME);
}
instanceVariables.put("emailVerificationEnabled", orgConfig.isEmailVerificationEnabled());
instanceVariables.put("googleMapsKey", orgConfig.getGoogleMapsKey());
// Add instanceVariables to config
config.put("instanceVariables", instanceVariables);
instanceConfig.setConfig(config);
// 4. Save the updated instanceConfig
mongoTemplate.save(instanceConfig);
log.info("Successfully migrated organization configuration fields to instance config");
}
}

View File

@ -2,6 +2,7 @@ package com.appsmith.server.services;
import com.appsmith.server.configurations.CommonConfig;
import com.appsmith.server.helpers.FeatureFlagMigrationHelper;
import com.appsmith.server.helpers.InstanceVariablesHelper;
import com.appsmith.server.helpers.UserOrganizationHelper;
import com.appsmith.server.repositories.CacheableRepositoryHelper;
import com.appsmith.server.repositories.OrganizationRepository;
@ -25,7 +26,8 @@ public class OrganizationServiceImpl extends OrganizationServiceCEImpl implement
CacheableRepositoryHelper cacheableRepositoryHelper,
CommonConfig commonConfig,
ObservationRegistry observationRegistry,
UserOrganizationHelper userOrganizationHelper) {
UserOrganizationHelper userOrganizationHelper,
InstanceVariablesHelper instanceVariablesHelper) {
super(
validator,
repository,
@ -36,6 +38,7 @@ public class OrganizationServiceImpl extends OrganizationServiceCEImpl implement
cacheableRepositoryHelper,
commonConfig,
observationRegistry,
userOrganizationHelper);
userOrganizationHelper,
instanceVariablesHelper);
}
}

View File

@ -2,6 +2,7 @@ package com.appsmith.server.services;
import com.appsmith.server.configurations.CommonConfig;
import com.appsmith.server.configurations.EmailConfig;
import com.appsmith.server.helpers.InstanceVariablesHelper;
import com.appsmith.server.helpers.UserServiceHelper;
import com.appsmith.server.helpers.UserUtils;
import com.appsmith.server.notifications.EmailSender;
@ -42,7 +43,8 @@ public class UserServiceImpl extends UserServiceCECompatibleImpl implements User
EmailService emailService,
RateLimitService rateLimitService,
PACConfigurationService pacConfigurationService,
UserServiceHelper userServiceHelper) {
UserServiceHelper userServiceHelper,
InstanceVariablesHelper instanceVariablesHelper) {
super(
validator,
repository,
@ -59,6 +61,7 @@ public class UserServiceImpl extends UserServiceCECompatibleImpl implements User
emailService,
rateLimitService,
pacConfigurationService,
userServiceHelper);
userServiceHelper,
instanceVariablesHelper);
}
}

View File

@ -3,6 +3,7 @@ package com.appsmith.server.services.ce;
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.domains.Config;
import com.appsmith.server.domains.User;
import net.minidev.json.JSONObject;
import reactor.core.publisher.Mono;
import java.util.Map;
@ -24,4 +25,17 @@ public interface ConfigServiceCE {
Mono<Config> getByName(String name, AclPermission permission);
Mono<Config> getByNameAsUser(String name, User user, AclPermission permission);
/**
* Get the instance variables from the instance config
* @return Map containing the instance variables
*/
Mono<Map<String, Object>> getInstanceVariables();
/**
* Update the instance variables in the instance config
* @param instanceVariables JSONObject containing the instance variables to update
* @return Updated Config object
*/
Mono<Config> updateInstanceVariables(JSONObject instanceVariables);
}

View File

@ -13,6 +13,8 @@ import reactor.core.publisher.Mono;
import java.util.Map;
import static com.appsmith.server.constants.ce.FieldNameCE.INSTANCE_VARIABLES;
@Slf4j
public class ConfigServiceCEImpl implements ConfigServiceCE {
private final ConfigRepository repository;
@ -92,4 +94,33 @@ public class ConfigServiceCEImpl implements ConfigServiceCE {
public Mono<Config> getByNameAsUser(String name, User user, AclPermission permission) {
return repository.findByNameAsUser(name, user, permission);
}
@Override
public Mono<Map<String, Object>> getInstanceVariables() {
return getByName(FieldName.INSTANCE_CONFIG).map(config -> {
Object instanceVariablesObj = config.getConfig().getOrDefault(INSTANCE_VARIABLES, new JSONObject());
Map<String, Object> instanceVariables;
if (instanceVariablesObj instanceof JSONObject) {
instanceVariables = ((JSONObject) instanceVariablesObj);
} else if (instanceVariablesObj instanceof Map) {
instanceVariables = (Map<String, Object>) instanceVariablesObj;
} else {
instanceVariables = new JSONObject();
}
return instanceVariables;
});
}
@Override
public Mono<Config> updateInstanceVariables(JSONObject instanceVariables) {
return getByName(FieldName.INSTANCE_CONFIG, AclPermission.MANAGE_INSTANCE_CONFIGURATION)
.flatMap(config -> {
JSONObject configObj = config.getConfig();
configObj.put(INSTANCE_VARIABLES, instanceVariables);
config.setConfig(configObj);
return repository.save(config);
});
}
}

View File

@ -14,6 +14,7 @@ import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.exceptions.AppsmithException;
import com.appsmith.server.helpers.CollectionUtils;
import com.appsmith.server.helpers.FeatureFlagMigrationHelper;
import com.appsmith.server.helpers.InstanceVariablesHelper;
import com.appsmith.server.helpers.UserOrganizationHelper;
import com.appsmith.server.repositories.CacheableRepositoryHelper;
import com.appsmith.server.repositories.OrganizationRepository;
@ -56,6 +57,8 @@ public class OrganizationServiceCEImpl extends BaseService<OrganizationRepositor
private final UserOrganizationHelper userOrganizationHelper;
private final InstanceVariablesHelper instanceVariablesHelper;
public OrganizationServiceCEImpl(
Validator validator,
OrganizationRepository repository,
@ -66,7 +69,8 @@ public class OrganizationServiceCEImpl extends BaseService<OrganizationRepositor
CacheableRepositoryHelper cacheableRepositoryHelper,
CommonConfig commonConfig,
ObservationRegistry observationRegistry,
UserOrganizationHelper userOrganizationHelper) {
UserOrganizationHelper userOrganizationHelper,
InstanceVariablesHelper instanceVariablesHelper) {
super(validator, repository, analyticsService);
this.configService = configService;
this.envManager = envManager;
@ -75,6 +79,7 @@ public class OrganizationServiceCEImpl extends BaseService<OrganizationRepositor
this.commonConfig = commonConfig;
this.observationRegistry = observationRegistry;
this.userOrganizationHelper = userOrganizationHelper;
this.instanceVariablesHelper = instanceVariablesHelper;
}
@Override
@ -149,9 +154,12 @@ public class OrganizationServiceCEImpl extends BaseService<OrganizationRepositor
@Override
public Mono<Organization> getOrganizationConfiguration(Mono<Organization> dbOrganizationMono) {
String adminEmailDomainHash = commonConfig.getAdminEmailDomainHash();
Mono<Organization> clientOrganizationMono = configService
.getInstanceId()
.map(instanceId -> {
Mono<Organization> clientOrganizationMono = Mono.zip(
configService.getInstanceId(), instanceVariablesHelper.getGoogleMapsKey())
.map(tuple -> {
final String instanceId = tuple.getT1();
final String googleMapsKey = tuple.getT2();
final Organization organization = new Organization();
organization.setInstanceId(instanceId);
organization.setAdminEmailDomainHash(adminEmailDomainHash);
@ -159,7 +167,7 @@ public class OrganizationServiceCEImpl extends BaseService<OrganizationRepositor
final OrganizationConfiguration config = new OrganizationConfiguration();
organization.setOrganizationConfiguration(config);
config.setGoogleMapsKey(System.getenv("APPSMITH_GOOGLE_MAPS_API_KEY"));
config.setGoogleMapsKey(googleMapsKey);
if (StringUtils.hasText(System.getenv("APPSMITH_OAUTH2_GOOGLE_CLIENT_ID"))) {
config.addThirdPartyAuth("google");

View File

@ -22,6 +22,7 @@ import com.appsmith.server.dtos.UserSignupDTO;
import com.appsmith.server.dtos.UserUpdateDTO;
import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.exceptions.AppsmithException;
import com.appsmith.server.helpers.InstanceVariablesHelper;
import com.appsmith.server.helpers.UserServiceHelper;
import com.appsmith.server.helpers.UserUtils;
import com.appsmith.server.ratelimiting.RateLimitService;
@ -104,6 +105,7 @@ public class UserServiceCEImpl extends BaseService<UserRepository, User, String>
private final PACConfigurationService pacConfigurationService;
private final UserServiceHelper userPoliciesComputeHelper;
private final InstanceVariablesHelper instanceVariablesHelper;
private static final WebFilterChain EMPTY_WEB_FILTER_CHAIN = serverWebExchange -> Mono.empty();
private static final String FORGOT_PASSWORD_CLIENT_URL_FORMAT = "%s/user/resetPassword?token=%s";
@ -134,7 +136,8 @@ public class UserServiceCEImpl extends BaseService<UserRepository, User, String>
EmailService emailService,
RateLimitService rateLimitService,
PACConfigurationService pacConfigurationService,
UserServiceHelper userServiceHelper) {
UserServiceHelper userServiceHelper,
InstanceVariablesHelper instanceVariablesHelper) {
super(validator, repository, analyticsService);
this.workspaceService = workspaceService;
@ -150,6 +153,7 @@ public class UserServiceCEImpl extends BaseService<UserRepository, User, String>
this.emailService = emailService;
this.userPoliciesComputeHelper = userServiceHelper;
this.pacConfigurationService = pacConfigurationService;
this.instanceVariablesHelper = instanceVariablesHelper;
}
@Override
@ -789,10 +793,8 @@ public class UserServiceCEImpl extends BaseService<UserRepository, User, String>
if (TRUE.equals(user.getEmailVerified())) {
return Mono.error(new AppsmithException(AppsmithError.USER_ALREADY_VERIFIED));
}
return organizationService.getOrganizationConfiguration().flatMap(organization -> {
Boolean emailVerificationEnabled =
organization.getOrganizationConfiguration().isEmailVerificationEnabled();
// Email verification not enabled at organization level
return instanceVariablesHelper.isEmailVerificationEnabled().flatMap(emailVerificationEnabled -> {
// Email verification not enabled at instance level
if (!TRUE.equals(emailVerificationEnabled)) {
return Mono.error(
new AppsmithException(AppsmithError.ORGANIZATION_EMAIL_VERIFICATION_NOT_ENABLED));

View File

@ -1,6 +1,7 @@
package com.appsmith.server.services.ce_compatible;
import com.appsmith.server.configurations.CommonConfig;
import com.appsmith.server.helpers.InstanceVariablesHelper;
import com.appsmith.server.helpers.UserServiceHelper;
import com.appsmith.server.helpers.UserUtils;
import com.appsmith.server.ratelimiting.RateLimitService;
@ -37,7 +38,8 @@ public class UserServiceCECompatibleImpl extends UserServiceCEImpl implements Us
EmailService emailService,
RateLimitService rateLimitService,
PACConfigurationService pacConfigurationService,
UserServiceHelper userServiceHelper) {
UserServiceHelper userServiceHelper,
InstanceVariablesHelper instanceVariablesHelper) {
super(
validator,
repository,
@ -54,6 +56,7 @@ public class UserServiceCECompatibleImpl extends UserServiceCEImpl implements Us
emailService,
rateLimitService,
pacConfigurationService,
userServiceHelper);
userServiceHelper,
instanceVariablesHelper);
}
}

View File

@ -0,0 +1,116 @@
package com.appsmith.server.helpers.ce;
import com.appsmith.server.constants.Appsmith;
import com.appsmith.server.helpers.InstanceVariablesHelper;
import com.appsmith.server.services.ConfigService;
import net.minidev.json.JSONObject;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
public class InstanceVariablesTest {
@Mock
private ConfigService configService;
private InstanceVariablesHelper instanceVariablesHelper;
@BeforeEach
public void setUp() {
instanceVariablesHelper = new InstanceVariablesHelper(configService);
}
@Test
public void testGetInstanceName() {
// Setup test data
JSONObject instanceVariables = new JSONObject();
instanceVariables.put("instanceName", "Test Instance");
// Mock service call
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
// Execute and verify
StepVerifier.create(instanceVariablesHelper.getInstanceName())
.expectNext("Test Instance")
.verifyComplete();
}
@Test
public void testGetInstanceNameWithDefault() {
// Setup test data with no instanceName
JSONObject instanceVariables = new JSONObject();
// Mock service call
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
// Execute and verify
StepVerifier.create(instanceVariablesHelper.getInstanceName())
.expectNext(Appsmith.DEFAULT_INSTANCE_NAME)
.verifyComplete();
}
@Test
public void testIsEmailVerificationEnabled() {
// Setup test data
JSONObject instanceVariables = new JSONObject();
instanceVariables.put("emailVerificationEnabled", true);
// Mock service call
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
// Execute and verify
StepVerifier.create(instanceVariablesHelper.isEmailVerificationEnabled())
.expectNext(true)
.verifyComplete();
}
@Test
public void testIsEmailVerificationEnabledWithDefault() {
// Setup test data with no emailVerificationEnabled
JSONObject instanceVariables = new JSONObject();
// Mock service call
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
// Execute and verify
StepVerifier.create(instanceVariablesHelper.isEmailVerificationEnabled())
.expectNext(false)
.verifyComplete();
}
@Test
public void testGetGoogleMapsKey() {
// Setup test data
JSONObject instanceVariables = new JSONObject();
instanceVariables.put("googleMapsKey", "test-maps-key");
// Mock service call
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
// Execute and verify
StepVerifier.create(instanceVariablesHelper.getGoogleMapsKey())
.expectNext("test-maps-key")
.verifyComplete();
}
@Test
public void testGetGoogleMapsKeyWithDefault() {
// Setup test data with no googleMapsKey
JSONObject instanceVariables = new JSONObject();
// Mock service call
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
// Execute and verify
StepVerifier.create(instanceVariablesHelper.getGoogleMapsKey())
.expectNext("")
.verifyComplete();
}
}

View File

@ -119,16 +119,6 @@ class OrganizationServiceCETest {
.block();
}
@Test
void ensureMapsKey() {
StepVerifier.create(organizationService.getOrganizationConfiguration())
.assertNext(organization -> {
assertThat(organization.getOrganizationConfiguration().getGoogleMapsKey())
.isNull();
})
.verifyComplete();
}
@Test
@WithUserDetails("api_user")
void setMapsKeyAndGetItBack() {