diff --git a/server/api-service/lowcoder-server/pom.xml b/server/api-service/lowcoder-server/pom.xml index 12dac31cd..dcdc34918 100644 --- a/server/api-service/lowcoder-server/pom.xml +++ b/server/api-service/lowcoder-server/pom.xml @@ -15,6 +15,9 @@ 17 + false + ${skipTests} + ${skipTests} @@ -175,6 +178,13 @@ 2.0.0.AM26 test + + org.junit.vintage + junit-vintage-engine + 5.9.3 + test + + @@ -186,7 +196,66 @@ org.apache.maven.plugins maven-surefire-plugin - 2.12.4 + 3.1.2 + + ${skipUnitTests} + + **/*IntegrationTest.java + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + ${skipIntegrationTests} + + **/*IntegrationTest.java + + + -Dpf4j.pluginsDir=../lowcoder-plugins/plugins + + + + + + integration-test + verify + + + + + + maven-antrun-plugin + + + copy-plugins-jar-for-integration-tests + pre-integration-test + + + + + + + + + + run + + + + delete-plugins-after-integration-tests-phase + post-integration-test + + + + + + + run + + + diff --git a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceIntegrationTest.java b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceIntegrationTest.java new file mode 100644 index 000000000..ff8ce5e81 --- /dev/null +++ b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceIntegrationTest.java @@ -0,0 +1,115 @@ +package org.lowcoder.api.application; + + +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.lowcoder.api.application.ApplicationController.CreateApplicationRequest; +import org.lowcoder.api.application.view.ApplicationView; +import org.lowcoder.api.common.mockuser.WithMockUser; +import org.lowcoder.api.datasource.DatasourceApiService; +import org.lowcoder.api.datasource.DatasourceApiServiceIntegrationTest; +import org.lowcoder.api.permission.view.CommonPermissionView; +import org.lowcoder.api.permission.view.PermissionItemView; +import org.lowcoder.domain.application.model.Application; +import org.lowcoder.domain.application.model.ApplicationType; +import org.lowcoder.domain.datasource.model.Datasource; +import org.lowcoder.domain.permission.model.ResourceRole; +import org.lowcoder.sdk.exception.BizError; +import org.lowcoder.sdk.exception.BizException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import java.util.Map; +import java.util.Set; + +@SuppressWarnings({"OptionalGetWithoutIsPresent"}) +@SpringBootTest +@RunWith(SpringRunner.class) +@Slf4j(topic = "ApplicationApiServiceIntegrationTest") +public class ApplicationApiServiceIntegrationTest { + + @Autowired + private ApplicationApiService applicationApiService; + @Autowired + private DatasourceApiService datasourceApiService; + + @SuppressWarnings("ConstantConditions") + @Test + @WithMockUser(id = "user02") + public void testCreateApplicationSuccess() { + + Mono datasourceMono = datasourceApiService.create(DatasourceApiServiceIntegrationTest.buildMysqlDatasource("mysql07")).cache(); + Mono commonPermissionViewMono = + datasourceMono.flatMap(datasource -> datasourceApiService.getPermissions(datasource.getId())); + Mono deleteMono = commonPermissionViewMono.flatMap(commonPermissionView -> { + String permissionId = commonPermissionView.getUserPermissions().stream() + .filter(permissionItemView -> permissionItemView.getId().equals("user02")) + .findFirst() + .map(PermissionItemView::getPermissionId) + .get(); + return datasourceApiService.updatePermission(permissionId, ResourceRole.VIEWER); + }); + // + Mono applicationViewMono = datasourceMono.map(datasource -> new CreateApplicationRequest( + "org01", + "app05", + ApplicationType.APPLICATION.getValue(), + Map.of("comp", "table"), + Map.of("comp", "list", "queries", Set.of(Map.of("datasourceId", datasource.getId()))), + null)) + .delayUntil(__ -> deleteMono) + .flatMap(createApplicationRequest -> applicationApiService.create(createApplicationRequest)); + + StepVerifier.create(applicationViewMono) + .assertNext(applicationView -> Assert.assertNotNull(applicationView.getApplicationInfoView().getApplicationId())) + .verifyComplete(); + } + + @Ignore + @SuppressWarnings("ConstantConditions") + @Test + @WithMockUser(id = "user02") + public void testUpdateApplicationFailedDueToLackOfDatasourcePermissions() { + + Mono datasourceMono = datasourceApiService.create(DatasourceApiServiceIntegrationTest.buildMysqlDatasource("mysql08")).cache(); + Mono commonPermissionViewMono = + datasourceMono.flatMap(datasource -> datasourceApiService.getPermissions(datasource.getId())); + Mono deleteMono = commonPermissionViewMono.flatMap(commonPermissionView -> { + String permissionId = commonPermissionView.getUserPermissions().stream() + .filter(permissionItemView -> permissionItemView.getId().equals("user02")) + .findFirst() + .map(PermissionItemView::getPermissionId) + .get(); + return datasourceApiService.deletePermission(permissionId); + }); + // + Mono applicationViewMono = datasourceMono.map(datasource -> new CreateApplicationRequest( + "org01", + "app03", + ApplicationType.APPLICATION.getValue(), + Map.of("comp", "table"), + Map.of("comp", "list", "queries", Set.of(Map.of("datasourceId", datasource.getId()))), + null)) + .delayUntil(__ -> deleteMono) + .flatMap(createApplicationRequest -> applicationApiService.create(createApplicationRequest)) + .flatMap(applicationView -> { + Application application = Application.builder() + .editingApplicationDSL(applicationView.getApplicationDSL()) + .name("app03") + .build(); + return applicationApiService.update(applicationView.getApplicationInfoView().getApplicationId(), application); + }); + + StepVerifier.create(applicationViewMono) + .expectErrorMatches(throwable -> throwable instanceof BizException bizException + && bizException.getError() == BizError.NOT_AUTHORIZED + && bizException.getMessageKey().equals("APPLICATION_EDIT_ERROR_LACK_OF_DATASOURCE_PERMISSIONS")) + .verify(); + } +} \ No newline at end of file diff --git a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceTest.java b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceTest.java index 1cac5601d..5280dd56e 100644 --- a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceTest.java +++ b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceTest.java @@ -3,8 +3,6 @@ import lombok.extern.slf4j.Slf4j; import org.junit.Assert; -import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.lowcoder.api.application.ApplicationController.CreateApplicationRequest; @@ -12,20 +10,16 @@ import org.lowcoder.api.application.view.ApplicationView; import org.lowcoder.api.common.mockuser.WithMockUser; import org.lowcoder.api.datasource.DatasourceApiService; -import org.lowcoder.api.datasource.DatasourceApiServiceTest; import org.lowcoder.api.home.FolderApiService; -import org.lowcoder.api.permission.view.CommonPermissionView; import org.lowcoder.api.permission.view.PermissionItemView; import org.lowcoder.domain.application.model.Application; import org.lowcoder.domain.application.model.ApplicationStatus; import org.lowcoder.domain.application.model.ApplicationType; import org.lowcoder.domain.application.service.ApplicationService; -import org.lowcoder.domain.datasource.model.Datasource; import org.lowcoder.domain.permission.model.ResourceHolder; import org.lowcoder.domain.permission.model.ResourceRole; import org.lowcoder.sdk.exception.BizError; import org.lowcoder.sdk.exception.BizException; -import org.pf4j.PluginManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @@ -35,7 +29,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -@SuppressWarnings({"OptionalGetWithoutIsPresent"}) @SpringBootTest @RunWith(SpringRunner.class) @Slf4j(topic = "ApplicationApiServiceTest") @@ -50,19 +43,6 @@ public class ApplicationApiServiceTest { @Autowired private DatasourceApiService datasourceApiService; - @Autowired - private PluginManager pluginManager; - - @Before - public void init() { - try { - pluginManager.loadPlugins(); - pluginManager.startPlugins(); - } catch (Exception e) { - log.error("Failed to load/start plugins. Exception: " + e); - } - } - @Test @WithMockUser public void testAutoInheritFoldersPermissionsOnAppCreate() { @@ -284,78 +264,4 @@ public void testPermissions() { .verifyComplete(); } - @Ignore - @SuppressWarnings("ConstantConditions") - @Test - @WithMockUser(id = "user02") - public void testCreateApplicationSuccess() { - - Mono datasourceMono = datasourceApiService.create(DatasourceApiServiceTest.buildMysqlDatasource("mysql07")).cache(); - Mono commonPermissionViewMono = - datasourceMono.flatMap(datasource -> datasourceApiService.getPermissions(datasource.getId())); - Mono deleteMono = commonPermissionViewMono.flatMap(commonPermissionView -> { - String permissionId = commonPermissionView.getUserPermissions().stream() - .filter(permissionItemView -> permissionItemView.getId().equals("user02")) - .findFirst() - .map(PermissionItemView::getPermissionId) - .get(); - return datasourceApiService.updatePermission(permissionId, ResourceRole.VIEWER); - }); - // - Mono applicationViewMono = datasourceMono.map(datasource -> new CreateApplicationRequest( - "org01", - "app05", - ApplicationType.APPLICATION.getValue(), - Map.of("comp", "table"), - Map.of("comp", "list", "queries", Set.of(Map.of("datasourceId", datasource.getId()))), - null)) - .delayUntil(__ -> deleteMono) - .flatMap(createApplicationRequest -> applicationApiService.create(createApplicationRequest)); - - StepVerifier.create(applicationViewMono) - .assertNext(applicationView -> Assert.assertNotNull(applicationView.getApplicationInfoView().getApplicationId())) - .verifyComplete(); - } - - @Ignore - @SuppressWarnings("ConstantConditions") - @Test - @WithMockUser(id = "user02") - public void testUpdateApplicationFailedDueToLackOfDatasourcePermissions() { - - Mono datasourceMono = datasourceApiService.create(DatasourceApiServiceTest.buildMysqlDatasource("mysql08")).cache(); - Mono commonPermissionViewMono = - datasourceMono.flatMap(datasource -> datasourceApiService.getPermissions(datasource.getId())); - Mono deleteMono = commonPermissionViewMono.flatMap(commonPermissionView -> { - String permissionId = commonPermissionView.getUserPermissions().stream() - .filter(permissionItemView -> permissionItemView.getId().equals("user02")) - .findFirst() - .map(PermissionItemView::getPermissionId) - .get(); - return datasourceApiService.deletePermission(permissionId); - }); - // - Mono applicationViewMono = datasourceMono.map(datasource -> new CreateApplicationRequest( - "org01", - "app03", - ApplicationType.APPLICATION.getValue(), - Map.of("comp", "table"), - Map.of("comp", "list", "queries", Set.of(Map.of("datasourceId", datasource.getId()))), - null)) - .delayUntil(__ -> deleteMono) - .flatMap(createApplicationRequest -> applicationApiService.create(createApplicationRequest)) - .flatMap(applicationView -> { - Application application = Application.builder() - .editingApplicationDSL(applicationView.getApplicationDSL()) - .name("app03") - .build(); - return applicationApiService.update(applicationView.getApplicationInfoView().getApplicationId(), application); - }); - - StepVerifier.create(applicationViewMono) - .expectErrorMatches(throwable -> throwable instanceof BizException bizException - && bizException.getError() == BizError.NOT_AUTHORIZED - && bizException.getMessageKey().equals("APPLICATION_EDIT_ERROR_LACK_OF_DATASOURCE_PERMISSIONS")) - .verify(); - } } \ No newline at end of file diff --git a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/common/SpringPluginManagerConfiguration.java b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/common/SpringPluginManagerConfiguration.java deleted file mode 100644 index 2a5918fc6..000000000 --- a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/common/SpringPluginManagerConfiguration.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.lowcoder.api.common; - -import static org.pf4j.AbstractPluginManager.MODE_PROPERTY_NAME; -import static org.pf4j.RuntimeMode.DEVELOPMENT; - -import java.nio.file.Path; - -import org.pf4j.spring.SpringPluginManager; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; - -@Configuration -public class SpringPluginManagerConfiguration { - - @Bean - @Primary - public SpringPluginManager springPluginManager() { - System.setProperty(MODE_PROPERTY_NAME, DEVELOPMENT.toString()); - Path path = Path.of("../lowcoder-plugins"); - return new SpringPluginManager(path); - } -} diff --git a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/datasource/DatasourceApiServiceTest.java b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/datasource/DatasourceApiServiceIntegrationTest.java similarity index 98% rename from server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/datasource/DatasourceApiServiceTest.java rename to server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/datasource/DatasourceApiServiceIntegrationTest.java index c5841ab3c..2757bc6f7 100644 --- a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/datasource/DatasourceApiServiceTest.java +++ b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/datasource/DatasourceApiServiceIntegrationTest.java @@ -28,12 +28,10 @@ @SpringBootTest @RunWith(SpringRunner.class) -public class DatasourceApiServiceTest { - +public class DatasourceApiServiceIntegrationTest { @Autowired private DatasourceApiService datasourceApiService; - @Ignore @Test @WithMockUser(id = "user02") public void testListOrgDatasource() { @@ -62,7 +60,6 @@ private DatasourceView findDatasourceView(Collection datasourceV .orElse(null); } - @Ignore @Test @WithMockUser public void testGrantPermissionAndGetPermissionSuccess() { @@ -90,7 +87,6 @@ public void testGrantPermissionAndGetPermissionSuccess() { .verifyComplete(); } - @Ignore @Test @WithMockUser public void testUpdatePermissionAndDeletePermissionSuccess() { @@ -128,7 +124,6 @@ public void testUpdatePermissionAndDeletePermissionSuccess() { .verifyComplete(); } - @Ignore @Test @WithMockUser(id = "user02") public void testUpdatePermissionErrorWithNoPermission() { diff --git a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/infra/ServerConfigRepositoryTest.java b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/infra/ServerConfigRepositoryTest.java index 426ddf6ef..309a6e8cf 100644 --- a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/infra/ServerConfigRepositoryTest.java +++ b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/infra/ServerConfigRepositoryTest.java @@ -2,7 +2,6 @@ import com.google.common.collect.ImmutableList; import lombok.extern.slf4j.Slf4j; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.lowcoder.infra.config.model.ServerConfig; @@ -16,7 +15,7 @@ import java.util.List; import java.util.Map; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.Assert.assertEquals; @RunWith(SpringRunner.class) @SpringBootTest @@ -36,7 +35,7 @@ public void test() throws InterruptedException { Conf> test2 = configInstance.ofList("key2", ImmutableList.of(1), Integer.class); Conf test3 = configInstance.ofJson("key3", SomeClass.class, new SomeClass(11, 22)); - assertEquals(0, test1.get()); + assertEquals(0, test1.get().intValue()); assertEquals(ImmutableList.of(1), test2.get()); assertEquals(new SomeClass(11, 22), test3.get()); @@ -45,7 +44,7 @@ public void test() throws InterruptedException { configRepository.save(getNewConfig("key3", Map.of("x", 22, "y", 33))).block(); Thread.sleep(3000); - assertEquals(123, test1.get()); + assertEquals(123, test1.get().intValue()); assertEquals(ImmutableList.of(1, 2), test2.get()); assertEquals(new SomeClass(22, 33), test3.get()); @@ -55,7 +54,7 @@ public void test() throws InterruptedException { Thread.sleep(3000); - assertEquals(12345, test1.get()); + assertEquals(12345, test1.get().intValue()); assertEquals(ImmutableList.of(1, 2, 3), test2.get()); assertEquals(new SomeClass(33, 44), test3.get()); diff --git a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/query/LibraryQueryApiServiceTest.java b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/query/LibraryQueryApiServiceIntegrationTest.java similarity index 91% rename from server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/query/LibraryQueryApiServiceTest.java rename to server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/query/LibraryQueryApiServiceIntegrationTest.java index 2ded3db79..ee3ddf49f 100644 --- a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/query/LibraryQueryApiServiceTest.java +++ b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/query/LibraryQueryApiServiceIntegrationTest.java @@ -6,7 +6,7 @@ import org.junit.runner.RunWith; import org.lowcoder.api.common.mockuser.WithMockUser; import org.lowcoder.api.datasource.DatasourceApiService; -import org.lowcoder.api.datasource.DatasourceApiServiceTest; +import org.lowcoder.api.datasource.DatasourceApiServiceIntegrationTest; import org.lowcoder.api.query.view.LibraryQueryView; import org.lowcoder.domain.query.model.LibraryQuery; import org.springframework.beans.factory.annotation.Autowired; @@ -24,18 +24,17 @@ @SuppressWarnings("SameParameterValue") @SpringBootTest @RunWith(SpringRunner.class) -public class LibraryQueryApiServiceTest { +public class LibraryQueryApiServiceIntegrationTest { @Autowired private DatasourceApiService datasourceApiService; @Autowired private LibraryQueryApiService libraryQueryApiService; - @Ignore @Test @WithMockUser public void testListLibraryQueries() { - Mono> listMono = datasourceApiService.create(DatasourceApiServiceTest.buildMysqlDatasource("mysql06")) + Mono> listMono = datasourceApiService.create(DatasourceApiServiceIntegrationTest.buildMysqlDatasource("mysql06")) .flatMap(datasource -> libraryQueryApiService.create(buildLibraryQuery("query01", datasource.getId()))) .then(libraryQueryApiService.listLibraryQueries()); diff --git a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/service/impl/ApplicationHistorySnapshotServiceTest.java b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/service/impl/ApplicationHistorySnapshotServiceTest.java index 2fc586de7..0c7db45d8 100644 --- a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/service/impl/ApplicationHistorySnapshotServiceTest.java +++ b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/service/impl/ApplicationHistorySnapshotServiceTest.java @@ -1,8 +1,8 @@ package org.lowcoder.api.service.impl; -import org.junit.Ignore; +import com.google.common.collect.ImmutableMap; +import lombok.extern.slf4j.Slf4j; import org.junit.Test; -import org.junit.jupiter.api.Assertions; import org.junit.runner.RunWith; import org.lowcoder.domain.application.model.ApplicationHistorySnapshot; import org.lowcoder.domain.application.service.ApplicationHistorySnapshotService; @@ -11,12 +11,10 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.PageRequest; import org.springframework.test.context.junit4.SpringRunner; - -import com.google.common.collect.ImmutableMap; - -import lombok.extern.slf4j.Slf4j; import reactor.test.StepVerifier; +import static org.junit.Assert.*; + @SuppressWarnings({"ReactiveStreamsNullableInLambdaInTransform"}) @RunWith(SpringRunner.class) @SpringBootTest @@ -47,19 +45,19 @@ public void testServiceMethods() { StepVerifier.create(service.listAllHistorySnapshotBriefInfo(applicationId, PageRequest.of(0, 5))) .assertNext(list -> { - Assertions.assertEquals(2, list.size()); + assertEquals(2, list.size()); ApplicationHistorySnapshot first = list.get(0); ApplicationHistorySnapshot second = list.get(1); - Assertions.assertTrue(first.getCreatedAt().isAfter(second.getCreatedAt())); + assertTrue(first.getCreatedAt().isAfter(second.getCreatedAt())); - Assertions.assertNull(first.getDsl()); - Assertions.assertEquals(ImmutableMap.of("context", "context2"), first.getContext()); - Assertions.assertEquals(applicationId, first.getApplicationId()); + assertNull(first.getDsl()); + assertEquals(ImmutableMap.of("context", "context2"), first.getContext()); + assertEquals(applicationId, first.getApplicationId()); - Assertions.assertNull(second.getDsl()); - Assertions.assertEquals(ImmutableMap.of("context", "context1"), second.getContext()); - Assertions.assertEquals(applicationId, second.getApplicationId()); + assertNull(second.getDsl()); + assertEquals(ImmutableMap.of("context", "context1"), second.getContext()); + assertEquals(applicationId, second.getApplicationId()); }) @@ -67,11 +65,11 @@ public void testServiceMethods() { StepVerifier.create(service.listAllHistorySnapshotBriefInfo(applicationId, PageRequest.of(1, 1))) .assertNext(list -> { - Assertions.assertEquals(1, list.size()); + assertEquals(1, list.size()); ApplicationHistorySnapshot one = list.get(0); - Assertions.assertNull(one.getDsl()); - Assertions.assertEquals(ImmutableMap.of("context", "context1"), one.getContext()); - Assertions.assertEquals(applicationId, one.getApplicationId()); + assertNull(one.getDsl()); + assertEquals(ImmutableMap.of("context", "context1"), one.getContext()); + assertEquals(applicationId, one.getApplicationId()); }) .verifyComplete(); @@ -81,8 +79,8 @@ public void testServiceMethods() { .map(HasIdAndAuditing::getId) .flatMap(id -> service.getHistorySnapshotDetail(id))) .assertNext(snapshot -> { - Assertions.assertEquals(ImmutableMap.of("dsl", "dsl2"), snapshot.getDsl()); - Assertions.assertEquals(ImmutableMap.of("context", "context2"), snapshot.getContext()); + assertEquals(ImmutableMap.of("dsl", "dsl2"), snapshot.getDsl()); + assertEquals(ImmutableMap.of("context", "context2"), snapshot.getContext()); }) .verifyComplete(); diff --git a/server/api-service/lowcoder-server/src/test/resources/application.yml b/server/api-service/lowcoder-server/src/test/resources/application.yml index 46726fe39..1c9d1ce0f 100644 --- a/server/api-service/lowcoder-server/src/test/resources/application.yml +++ b/server/api-service/lowcoder-server/src/test/resources/application.yml @@ -29,5 +29,3 @@ common: auth: email: enable: true - google: - enable: true \ No newline at end of file