From 1747223aefcebda47bdbbe409095a19a9f4a3818 Mon Sep 17 00:00:00 2001 From: Ludo Mikula Date: Sun, 4 Oct 2026 11:37:44 +0200 Subject: [PATCH 1/2] new: api-service test harness for testing request/response payload de/serialization of all API endpoints --- .gitignore | 3 + server/api-service/lombok.config | 2 + .../lowcoder-coverage-report/pom.xml | 127 +++ server/api-service/lowcoder-domain/pom.xml | 8 + .../DatasourcePersistenceContractTest.java | 149 ++++ .../DatasourcePluginClientContractTest.java | 233 ++++++ .../TemplateDslCopyContractTest.java | 135 ++++ ...ateSolutionService.createFromTemplate.json | 254 ++++++ .../DatasourcePluginClient.calls.json | 470 +++++++++++ .../DatasourceRepository.configs.input.json | 122 +++ .../DatasourceRepository.storedConfigs.json | 227 ++++++ server/api-service/lowcoder-infra/pom.xml | 8 + .../config/ConfigCenterContractTest.java | 163 ++++ .../AutoReloadConfig.values.json | 756 ++++++++++++++++++ .../ClickHouseBindContractTest.java | 63 ++ .../ClickHouseConfigBindingContractTest.java | 41 + .../ClickHouseResultContractTest.java | 101 +++ .../ClickHouseDatasourceConfig.input.json | 41 + .../ClickHouseDatasourceConfig.json | 180 +++++ .../ClickHouseQueryConfig.input.json | 20 + .../config-binding/ClickHouseQueryConfig.json | 86 ++ .../ClickHouseQueryExecutor.binds.txt | 10 + .../ClickHouseQueryExecutor.results.json | 100 +++ .../es/EsConfigBindingContractTest.java | 57 ++ .../plugin/es/EsDslTextContractTest.java | 74 ++ .../plugin/es/EsResultContractTest.java | 104 +++ .../EsDatasourceConfig.input.json | 13 + .../config-binding/EsDatasourceConfig.json | 65 ++ .../config-binding/EsQueryConfig.input.json | 21 + .../config-binding/EsQueryConfig.json | 85 ++ .../EsQueryExecutor.results.json | 102 +++ .../tree-text/EsQueryExecutor.dsl.txt | 3 + ...GoogleSheetsConfigBindingContractTest.java | 71 ++ .../GoogleSheetsResultContractTest.java | 111 +++ .../GoogleSheetsActionRequest.input.json | 41 + .../GoogleSheetsActionRequest.json | 92 +++ .../GoogleSheetsDatasourceConfig.input.json | 6 + .../GoogleSheetsDatasourceConfig.json | 33 + .../external-json/GoogleSheets.results.json | 79 ++ .../GraphQLConfigBindingContractTest.java | 30 + .../GraphQLExecutorCodecGuardTest.java | 35 + .../GraphQLRequestBodyContractTest.java | 98 +++ .../graphql/GraphQLResponseContractTest.java | 137 ++++ .../GraphQLQueryConfig.input.json | 33 + .../config-binding/GraphQLQueryConfig.json | 97 +++ .../GraphQLExecutor.requestBody.json | 10 + .../GraphQLExecutor.responses.json | 192 +++++ .../mongo/MongoConfigBindingContractTest.java | 30 + .../plugin/mongo/MongoResultContractTest.java | 162 ++++ .../mongo/MongoSpecialTypesContractTest.java | 87 ++ .../mongo/MongoTreeTextContractTest.java | 159 ++++ .../MongoDatasourceConfig.input.json | 37 + .../config-binding/MongoDatasourceConfig.json | 134 ++++ .../MongoEngine.specialTypes.txt | 9 + .../external-json/MongoEngine.results.json | 167 ++++ .../tree-text/MongoEngine.commands.txt | 5 + .../tree-text/MongoQueryUtils.distinct.txt | 2 + .../mssql/MssqlConfigBindingContractTest.java | 43 + .../MssqlDatasourceConfig.input.json | 41 + .../config-binding/MssqlDatasourceConfig.json | 358 +++++++++ .../MssqlQueryConfig.input.json | 65 ++ .../config-binding/MssqlQueryConfig.json | 165 ++++ .../mysql/MysqlConfigBindingContractTest.java | 40 + .../MysqlDatasourceConfig.input.json | 41 + .../config-binding/MysqlDatasourceConfig.json | 180 +++++ .../MysqlQueryConfig.input.json | 65 ++ .../config-binding/MysqlQueryConfig.json | 165 ++++ .../OracleConfigBindingContractTest.java | 29 + .../OracleDatasourceConfig.input.json | 35 + .../OracleDatasourceConfig.json | 172 ++++ server/api-service/lowcoder-plugins/pom.xml | 8 + .../PostgresConfigBindingContractTest.java | 43 + .../postgres/PostgresResultContractTest.java | 154 ++++ .../PostgresDatasourceConfig.input.json | 41 + .../PostgresDatasourceConfig.json | 358 +++++++++ .../PostgresQueryConfig.input.json | 65 ++ .../config-binding/PostgresQueryConfig.json | 147 ++++ .../PostgresResultParser.rows.json | 95 +++ .../redis/RedisConfigBindingContractTest.java | 29 + .../plugin/redis/RedisResultContractTest.java | 101 +++ .../RedisDatasourceConfig.input.json | 20 + .../config-binding/RedisDatasourceConfig.json | 109 +++ .../query-results/RedisEngine.results.json | 97 +++ .../RestApiConfigBindingContractTest.java | 30 + .../RestApiExecutorCodecGuardTest.java | 35 + .../restapi/RestApiJsonBodyContractTest.java | 98 +++ .../restapi/RestApiResponseContractTest.java | 132 +++ .../RestApiSpecialJsonBodyContractTest.java | 111 +++ .../RestApiQueryConfig.input.json | 46 ++ .../config-binding/RestApiQueryConfig.json | 181 +++++ .../RestApiExecutor.jsonBody.json | 10 + .../RestApiExecutor.responses.json | 166 ++++ .../RestApiExecutor.specialJsonBody.txt | 3 + .../SmtpConfigBindingContractTest.java | 30 + .../plugins/SmtpListsContractTest.java | 90 +++ .../plugins/SmtpResultContractTest.java | 28 + .../plugins/SmtpTreeTextContractTest.java | 91 +++ .../SmtpDatasourceConfig.input.json | 21 + .../config-binding/SmtpDatasourceConfig.json | 88 ++ .../query-results/SmtpPlugin.result.json | 10 + ...SmtpEngine.buildQueryExecutionContext.json | 112 +++ .../tree-text/SmtpEngine.renderedLists.txt | 5 + .../SnowflakeConfigBindingContractTest.java | 29 + .../SnowflakeDatasourceConfig.input.json | 41 + .../SnowflakeDatasourceConfig.json | 180 +++++ .../plugin/sql/SqlBindContractTest.java | 59 ++ .../sql/SqlConfigBindingContractTest.java | 29 + .../plugin/sql/SqlResultContractTest.java | 98 +++ .../config-binding/SqlQueryConfig.input.json | 65 ++ .../config-binding/SqlQueryConfig.json | 194 +++++ .../GeneralSqlExecutor.binds.txt | 10 + .../GeneralSqlExecutor.results.json | 270 +++++++ server/api-service/lowcoder-sdk/pom.xml | 29 + .../lowcoder/sdk/contract/BoundarySites.java | 24 + .../lowcoder/sdk/contract/CanonicalJson.java | 390 +++++++++ .../sdk/contract/CanonicalJsonTest.java | 205 +++++ .../lowcoder/sdk/contract/ClientCodecs.java | 164 ++++ .../sdk/contract/ClientCodecsTest.java | 69 ++ .../lowcoder/sdk/contract/ConfigBinding.java | 161 ++++ .../sdk/contract/ConfigBindingTest.java | 112 +++ .../org/lowcoder/sdk/contract/FakeJdbc.java | 250 ++++++ .../org/lowcoder/sdk/contract/FieldTree.java | 132 +++ .../lowcoder/sdk/contract/FieldTreeTest.java | 93 +++ .../org/lowcoder/sdk/contract/GoldenJson.java | 157 ++++ .../lowcoder/sdk/contract/GoldenJsonTest.java | 147 ++++ .../sdk/contract/JacksonAnnotationGuard.java | 222 +++++ .../contract/JacksonAnnotationGuardTest.java | 241 ++++++ .../sdk/contract/JavaValueWalker.java | 73 ++ .../sdk/contract/PayloadBoundsTest.java | 161 ++++ .../PluginConfigPolymorphismTest.java | 148 ++++ .../lowcoder/sdk/contract/QueryResults.java | 78 ++ .../sdk/contract/RecordingHttpServer.java | 130 +++ .../lowcoder/sdk/contract/RenderValues.java | 44 + .../sdk/contract/RepresentativeInput.java | 62 ++ .../plugin/SdkConfigBindingContractTest.java | 56 ++ .../sql/ResultSetParserContractTest.java | 256 ++++++ .../plugin/http/RawHttpBodyContractTest.java | 98 +++ ...PairChangeSetErrorMessageContractTest.java | 72 ++ .../util/DownstreamRenderContractTest.java | 209 +++++ .../sdk/util/NodeConversionContractTest.java | 322 ++++++++ .../sdk/util/TreeTextContractTest.java | 139 ++++ .../GraphQLDatasourceConfig.input.json | 98 +++ .../GraphQLDatasourceConfig.json | 329 ++++++++ .../MysqlDatasourceConfig.input.json | 34 + .../config-binding/MysqlDatasourceConfig.json | 212 +++++ .../RestApiDatasourceConfig.input.json | 112 +++ .../RestApiDatasourceConfig.json | 362 +++++++++ .../RawHttpHandlerHelper.jsonBody.json | 17 + .../downstream-render/BulkInsertCommand.txt | 10 + .../downstream-render/BulkUpdateCommand.txt | 10 + .../downstream-render/InsertCommand.txt | 10 + .../MustacheHelper.inOperator.txt | 10 + .../MustacheHelper.renderMustacheString.txt | 10 + .../MustacheHelper.valueInsideQuotes.txt | 10 + .../SqlGuiUtils.GuiSqlValue.txt | 10 + .../downstream-render/UpdateCommand.txt | 10 + .../KeyValuePairChangeSet.messages.txt | 9 + .../BulkObjectChangeSet.render.json | 462 +++++++++++ ...DataUtils.convertToMultiformFileValue.json | 54 ++ .../ObjectChangeSet.render.json | 410 ++++++++++ .../SheetBulkObjectChangeSet.render.json | 216 +++++ .../SheetKeyValuePairChangeSet.render.json | 186 +++++ .../SheetObjectChangeSet.render.json | 194 +++++ .../SqlGuiUtils.renderPsBindValue.json | 402 ++++++++++ .../node-conversion/renderMustacheJson.json | 265 ++++++ .../polymorphism/AuthConfig.inputs.json | 9 + .../polymorphism/AuthConfig.json | 1 + .../polymorphism/SslConfig.inputs.json | 7 + .../json-contract/polymorphism/SslConfig.json | 1 + .../polymorphism/registered-ids.json | 12 + .../query-results/ResultSetParser.leaves.json | 193 +++++ .../json-contract/selftest/golden.json | 5 + .../resources/json-contract/tree-text/E13.txt | 2 + .../tree-text/RawHttpRequest.renderParams.txt | 13 + .../renderMustacheArrayJsonString.txt | 13 + .../tree-text/renderMustacheJsonString.txt | 13 + .../sdk/contract/representative.input.json | 32 + server/api-service/lowcoder-server/pom.xml | 14 +- .../api/home/FolderApiServiceImpl.java | 12 +- ...uthenticationEndpointsIntegrationTest.java | 14 +- ...authProviderErrorMessagesContractTest.java | 218 +++++ .../OauthProviderResponsesContractTest.java | 191 +++++ .../oauth2/request/OauthProviderStubs.java | 212 +++++ .../org/lowcoder/api/common/InitData.java | 49 +- .../ConfigEndpointsIntegrationTest.java | 14 +- .../api/contract/ClientCodecGuardTest.java | 82 ++ .../api/contract/JsonBoundaryGateTest.java | 159 ++++ .../api/contract/PayloadBoundsTest.java | 129 +++ .../PayloadContractCompletenessTest.java | 427 ++++++++++ .../api/contract/ServerCodecGuardTest.java | 114 +++ .../boundary/JsLibraryFetchContractTest.java | 184 +++++ .../boundary/JwtClaimsContractTest.java | 107 +++ .../boundary/SessionCacheContractTest.java | 208 +++++ .../UpsertDatasourceContractTest.java | 117 +++ .../ApiFlowEndpointsContractTest.java | 241 ++++++ .../ApplicationEndpointsContractTest.java | 520 ++++++++++++ ...nHistorySnapshotEndpointsContractTest.java | 248 ++++++ ...pplicationRecordEndpointsContractTest.java | 126 +++ .../endpoint/AssetEndpointsContractTest.java | 61 ++ .../AuthenticationEndpointsContractTest.java | 280 +++++++ .../endpoint/BundleEndpointsContractTest.java | 437 ++++++++++ .../endpoint/ConfigEndpointsContractTest.java | 130 +++ .../DatasourceEndpointsContractTest.java | 546 +++++++++++++ .../endpoint/FolderEndpointsContractTest.java | 308 +++++++ .../endpoint/GroupEndpointsContractTest.java | 335 ++++++++ .../endpoint/IndexControllerContractTest.java | 40 + .../InvitationEndpointsContractTest.java | 142 ++++ .../JsLibraryEndpointsContractTest.java | 188 +++++ .../LibraryQueryEndpointsContractTest.java | 253 ++++++ ...braryQueryRecordEndpointsContractTest.java | 152 ++++ .../MaterialEndpointsContractTest.java | 147 ++++ .../endpoint/MetaEndpointsContractTest.java | 75 ++ .../OrganizationEndpointsContractTest.java | 429 ++++++++++ .../endpoint/PluginRouteContractTest.java | 91 +++ ...rivateNpmRegistryEndpointContractTest.java | 226 ++++++ .../endpoint/QueryEndpointsContractTest.java | 197 +++++ .../ServerSettingEndpointsContractTest.java | 55 ++ .../endpoint/StateEndpointsContractTest.java | 66 ++ .../endpoint/UserEndpointsContractTest.java | 605 ++++++++++++++ .../error/ErrorCasesContractTest.java | 290 +++++++ .../ApplicationPayloadGettersTest.java | 128 +++ .../payload/AuthConfigPolymorphismTest.java | 108 +++ .../AuthConfigRequestConsumerTest.java | 72 ++ .../ContainerCoercionContractTest.java | 184 +++++ .../api/contract/payload/EnumGoldensTest.java | 59 ++ .../contract/payload/EnvelopeGoldensTest.java | 113 +++ .../contract/payload/InstantContractTest.java | 106 +++ .../LibraryQueryPayloadGettersTest.java | 111 +++ .../payload/PayloadSamplesAdequacyTest.java | 342 ++++++++ .../payload/QueryResultViewContractTest.java | 95 +++ .../RepresentativeInputContractTest.java | 125 +++ .../payload/RequestPayloadGoldensTest.java | 184 +++++ .../payload/ResponsePayloadGoldensTest.java | 375 +++++++++ .../payload/ScalarCoercionContractTest.java | 213 +++++ .../UserManagementPayloadGettersTest.java | 183 +++++ .../contract/support/ApplicationSamples.java | 394 +++++++++ .../support/AuthenticationSamples.java | 38 + .../api/contract/support/BundleSamples.java | 165 ++++ .../api/contract/support/ConfigSamples.java | 54 ++ .../api/contract/support/ContractHarness.java | 35 + .../contract/support/ContractRegistry.java | 245 ++++++ .../api/contract/support/ContractSources.java | 248 ++++++ .../contract/support/ContractTestClient.java | 252 ++++++ .../support/ContractTestClientTest.java | 386 +++++++++ .../contract/support/DatasourceSamples.java | 189 +++++ .../contract/support/EndpointContract.java | 408 ++++++++++ .../api/contract/support/FolderSamples.java | 30 + .../support/JsonBoundaryClassification.java | 320 ++++++++ .../contract/support/JsonBoundaryScanner.java | 512 ++++++++++++ .../support/JsonBoundaryScannerTest.java | 217 +++++ .../contract/support/LibraryQuerySamples.java | 147 ++++ .../api/contract/support/MaterialSamples.java | 50 ++ .../api/contract/support/MetaSamples.java | 196 +++++ .../api/contract/support/MiscSamples.java | 78 ++ .../contract/support/OrganizationSamples.java | 148 ++++ .../contract/support/PayloadAssertions.java | 212 +++++ .../api/contract/support/PayloadSamples.java | 432 ++++++++++ .../contract/support/PayloadTypeWalker.java | 371 +++++++++ .../support/PayloadTypeWalkerTest.java | 245 ++++++ .../api/contract/support/QuerySamples.java | 248 ++++++ .../api/contract/support/StoredValues.java | 41 + .../support/UserManagementSamples.java | 384 +++++++++ .../api/contract/support/UserSamples.java | 108 +++ .../support/ViewMarkedConnectionConfig.java | 42 + .../contract/support/WebClientRedirect.java | 69 ++ .../contract/support/WorkPackageStatus.java | 49 ++ .../DatasourceEndpointsIntegrationTest.java | 14 +- .../api/service/FolderApiServiceTest.java | 75 +- .../boundary-sites/json-boundary-control.out | 22 + .../boundary-sites/json-boundary-groups.tsv | 27 + .../boundary-sites/json-boundary-sites.tsv | 269 +++++++ .../lowcoder-sdk/src/main/java/Ctl.java | 18 + .../lowcoder-sdk/src/main/java/FqnUse.java | 4 + .../src/main/java/ImportOnly.java | 6 + .../src/main/java/LombokOnly.java | 4 + .../src/main/java/OtherLibraryJackson.java | 8 + .../src/main/java/ReaderWriter.java | 6 + .../src/main/java/StaticInserter.java | 7 + .../lowcoder-sdk/src/main/java/TreeText.java | 7 + .../lowcoder-sdk/src/main/java/Wrap.java | 9 + .../api-flow/representative.body.json | 1 + .../GenericAuthRequest.messages.json | 6 + .../GithubRequest.messages.json | 4 + .../GoogleRequest.messages.json | 5 + .../KeycloakRequest.messages.json | 7 + .../OryRequest.messages.json | 5 + .../error-message-json/github.token.error.txt | 1 + .../error-message-json/provider.error.json | 1 + .../boundary/js-library/fetch.json | 31 + .../boundary/js-library/recommended.json | 25 + .../boundary/js-library/registry.full.json | 16 + .../js-library/registry.no-homepage.json | 5 + .../boundary/js-library/registry.not-json.txt | 1 + .../registry.repository-homepage.json | 7 + .../boundary/jwt-claims/claims.input.json | 21 + .../boundary/jwt-claims/claims.read.json | 76 ++ .../npm-outbound/default-registries.json | 1 + .../npm-outbound/with-registries.json | 1 + .../boundary/oauth/generic.decoded.json | 185 +++++ .../boundary/oauth/generic.refresh.json | 1 + .../boundary/oauth/generic.token.json | 1 + .../boundary/oauth/generic.user.json | 1 + .../boundary/oauth/github.decoded.json | 81 ++ .../boundary/oauth/github.token.txt | 1 + .../boundary/oauth/github.user.json | 1 + .../boundary/oauth/google.decoded.json | 87 ++ .../boundary/oauth/google.refresh.json | 1 + .../boundary/oauth/google.token.json | 1 + .../boundary/oauth/google.user.json | 1 + .../boundary/oauth/keycloak.decoded.json | 102 +++ .../boundary/oauth/keycloak.refresh.json | 1 + .../boundary/oauth/keycloak.token.json | 1 + .../boundary/oauth/keycloak.user.json | 1 + .../boundary/oauth/ory.decoded.json | 105 +++ .../boundary/oauth/ory.refresh.json | 1 + .../boundary/oauth/ory.token.json | 1 + .../boundary/oauth/ory.user.json | 1 + .../Application.editingQueries.json | 1 + .../Application.liveQueries.json | 1 + .../payload-getters/LibraryQuery.query.json | 1 + .../LibraryQueryRecord.query.json | 1 + ...OrganizationDomain.beforeMongodbWrite.json | 1 + .../User.beforeMongodbWrite.json | 1 + .../boundary/session-cache/legacy-user.json | 1 + .../session-cache/session-values.read.json | 29 + .../json-contract/coercion/D5.builder.json | 673 ++++++++++++++++ .../json-contract/coercion/D5.creator.json | 673 ++++++++++++++++ .../coercion/D5.field-setter.json | 673 ++++++++++++++++ .../resources/json-contract/coercion/D6.json | 528 ++++++++++++ .../json-contract/contract-registry.tsv | 179 +++++ .../DatasourceEndpoints.info.output.json | 16 + .../dynamic/QueryResultView.mixed.output.json | 1 + .../dynamic/representative.input.json | 32 + .../dynamic/representative.output.json | 1 + .../dynamic/representative.read.json | 402 ++++++++++ .../dynamic/representative.stored.output.json | 1 + .../GroupListResponseView.success.json | 1 + .../envelope/PageResponseView.error.json | 1 + .../envelope/PageResponseView.success.json | 1 + .../ResponseView.error-with-data.json | 1 + .../envelope/ResponseView.error.json | 1 + .../envelope/ResponseView.redirect.json | 1 + .../ResponseView.success-null-data.json | 1 + .../envelope/ResponseView.success.json | 1 + .../errors/X5.unmapped-path.json | 1 + .../errors/X6.filter-runtime-exception.json | 1 + .../errors/X7.filter-response-status-403.json | 1 + .../json-contract/functional-routes.json | 23 + .../json-contract/producer-sites.tsv | 23 + .../json-contract/routes/plugins.json | 1 + ...$ApplicationAsAgencyProfileRequest.D1.json | 3 + ...$ApplicationAsAgencyProfileRequest.D3.json | 12 + ...ints$ApplicationPublicToAllRequest.D1.json | 3 + ...ints$ApplicationPublicToAllRequest.D3.json | 12 + ...licationPublicToMarketplaceRequest.D1.json | 3 + ...licationPublicToMarketplaceRequest.D3.json | 12 + ...ndpoints$BatchAddPermissionRequest.D1.json | 5 + ...ndpoints$BatchAddPermissionRequest.D3.json | 32 + ...Endpoints$CreateApplicationRequest.D1.json | 30 + ...Endpoints$CreateApplicationRequest.D3.json | 82 ++ ...onEndpoints$UpdateEditStateRequest.D1.json | 3 + ...onEndpoints$UpdateEditStateRequest.D3.json | 12 + ...nEndpoints$UpdatePermissionRequest.D1.json | 3 + ...nEndpoints$UpdatePermissionRequest.D3.json | 12 + ...pplicationHistorySnapshotBriefInfo.S1.json | 1 + ...pplicationHistorySnapshotBriefInfo.S2.json | 1 + ...$ApplicationHistorySnapshotRequest.D1.json | 70 ++ ...$ApplicationHistorySnapshotRequest.D3.json | 32 + ...plication.view.ApplicationInfoView.S1.json | 1 + ...plication.view.ApplicationInfoView.S2.json | 1 + ...ion.view.ApplicationPermissionView.S1.json | 1 + ...ion.view.ApplicationPermissionView.S2.json | 1 + ....ApplicationPermissionView.S2Throwing.json | 8 + ...ion.view.ApplicationPublishRequest.D1.json | 4 + ...ion.view.ApplicationPublishRequest.D3.json | 22 + ...ion.view.ApplicationRecordMetaView.S1.json | 1 + ...ion.view.ApplicationRecordMetaView.S2.json | 1 + ...i.application.view.ApplicationView.S1.json | 1 + ...i.application.view.ApplicationView.S2.json | 1 + ...cation.view.HistorySnapshotDslView.S1.json | 1 + ...cation.view.HistorySnapshotDslView.S2.json | 1 + ...iew.MarketplaceApplicationInfoView.S1.json | 1 + ...iew.MarketplaceApplicationInfoView.S2.json | 1 + ...ticationEndpoints$FormLoginRequest.D1.json | 7 + ...ticationEndpoints$FormLoginRequest.D3.json | 52 ++ ...i.authentication.dto.APIKeyRequest.D1.json | 5 + ...thentication.dto.AuthConfigRequest.D1.json | 24 + ...pi.authentication.dto.RedirectView.S1.json | 1 + ...pi.authentication.dto.RedirectView.S2.json | 1 + ...ndpoints$BatchAddPermissionRequest.D1.json | 5 + ...ndpoints$BatchAddPermissionRequest.D3.json | 32 + ...oints$BundleAsAgencyProfileRequest.D1.json | 3 + ...oints$BundleAsAgencyProfileRequest.D3.json | 12 + ...Endpoints$BundlePublicToAllRequest.D1.json | 3 + ...Endpoints$BundlePublicToAllRequest.D3.json | 12 + ...s$BundlePublicToMarketplaceRequest.D1.json | 3 + ...s$BundlePublicToMarketplaceRequest.D3.json | 12 + ...undleEndpoints$CreateBundleRequest.D1.json | 10 + ...undleEndpoints$CreateBundleRequest.D3.json | 82 ++ ...eEndpoints$UpdatePermissionRequest.D1.json | 3 + ...eEndpoints$UpdatePermissionRequest.D3.json | 12 + ...der.api.bundle.view.BundleInfoView.S1.json | 1 + ...der.api.bundle.view.BundleInfoView.S2.json | 1 + ...i.bundle.view.BundlePermissionView.S1.json | 1 + ...i.bundle.view.BundlePermissionView.S2.json | 1 + ....view.BundlePermissionView.S2Throwing.json | 8 + ...dle.view.MarketplaceBundleInfoView.S1.json | 1 + ...dle.view.MarketplaceBundleInfoView.S2.json | 1 + ...onfigEndpoints$UpdateConfigRequest.D1.json | 3 + ...onfigEndpoints$UpdateConfigRequest.D3.json | 12 + ...org.lowcoder.api.config.ConfigView.S1.json | 1 + ...oder.api.config.ConfigView.S1Internal.json | 1 + ...wcoder.api.config.ConfigView.S1Public.json | 1 + ...org.lowcoder.api.config.ConfigView.S2.json | 1 + ...ndpoints$BatchAddPermissionRequest.D1.json | 11 + ...ndpoints$BatchAddPermissionRequest.D3.json | 32 + ...eEndpoints$UpdatePermissionRequest.D1.json | 3 + ...eEndpoints$UpdatePermissionRequest.D3.json | 12 + ...oder.api.datasource.DatasourceView.S1.json | 1 + ....datasource.DatasourceView.S1Internal.json | 1 + ...pi.datasource.DatasourceView.S1Public.json | 1 + ...oder.api.datasource.DatasourceView.S2.json | 1 + ...datasource.UpsertDatasourceRequest.D1.json | 23 + ...ndpoints$BatchAddPermissionRequest.D1.json | 5 + ...ndpoints$BatchAddPermissionRequest.D3.json | 32 + ...rEndpoints$UpdatePermissionRequest.D1.json | 3 + ...rEndpoints$UpdatePermissionRequest.D3.json | 12 + ...g.lowcoder.api.home.FolderInfoView.S1.json | 1 + ...g.lowcoder.api.home.FolderInfoView.S2.json | 1 + ...lowcoder.api.home.UserHomepageView.S1.json | 1 + ....api.home.UserHomepageView.S1Internal.json | 1 + ...er.api.home.UserHomepageView.S1Public.json | 1 + ...lowcoder.api.home.UserHomepageView.S2.json | 1 + ...ial.MaterialEndpoints$MaterialView.S1.json | 1 + ...ial.MaterialEndpoints$MaterialView.S2.json | 1 + ...Endpoints$UploadMaterialRequestDTO.D1.json | 5 + ...a.MetaEndpoints$GetMetaDataRequest.D1.json | 34 + ...a.MetaEndpoints$GetMetaDataRequest.D3.json | 82 ++ ....api.meta.view.ApplicationMetaView.S1.json | 1 + ....api.meta.view.ApplicationMetaView.S2.json | 1 + ...coder.api.meta.view.BundleMetaView.S1.json | 1 + ...coder.api.meta.view.BundleMetaView.S2.json | 1 + ...r.api.meta.view.DatasourceMetaView.S1.json | 1 + ...r.api.meta.view.DatasourceMetaView.S2.json | 1 + ...coder.api.meta.view.FolderMetaView.S1.json | 1 + ...coder.api.meta.view.FolderMetaView.S2.json | 1 + ...wcoder.api.meta.view.GroupMetaView.S1.json | 1 + ...wcoder.api.meta.view.GroupMetaView.S2.json | 1 + ...api.meta.view.LibraryQueryMetaView.S1.json | 1 + ...api.meta.view.LibraryQueryMetaView.S2.json | 1 + ...rg.lowcoder.api.meta.view.MetaView.S1.json | 1 + ...rg.lowcoder.api.meta.view.MetaView.S2.json | 1 + ...lowcoder.api.meta.view.OrgMetaView.S1.json | 1 + ...lowcoder.api.meta.view.OrgMetaView.S2.json | 1 + ...owcoder.api.meta.view.UserMetaView.S1.json | 1 + ...owcoder.api.meta.view.UserMetaView.S2.json | 1 + ....misc.ApiFlowEndpoints$FlowRequest.D1.json | 21 + ....misc.ApiFlowEndpoints$FlowRequest.D3.json | 62 ++ ....JsLibraryController$JsLibraryMeta.S1.json | 1 + ....JsLibraryController$JsLibraryMeta.S2.json | 1 + ...rmission.view.CommonPermissionView.S1.json | 1 + ...rmission.view.CommonPermissionView.S2.json | 1 + ....view.CommonPermissionView.S2Throwing.json | 8 + ...permission.view.PermissionItemView.S1.json | 1 + ...permission.view.PermissionItemView.S2.json | 1 + ...ery.view.LibraryQueryAggregateView.S1.json | 1 + ...ery.view.LibraryQueryAggregateView.S2.json | 1 + ...pi.query.view.LibraryQueryMetaView.S1.json | 1 + ...pi.query.view.LibraryQueryMetaView.S2.json | 1 + ...ry.view.LibraryQueryPublishRequest.D1.json | 4 + ...ry.view.LibraryQueryPublishRequest.D3.json | 22 + ...ry.view.LibraryQueryRecordMetaView.S1.json | 1 + ...ry.view.LibraryQueryRecordMetaView.S2.json | 1 + ...ery.view.LibraryQueryRequestFromJs.D1.json | 73 ++ ...er.api.query.view.LibraryQueryView.S1.json | 1 + ...er.api.query.view.LibraryQueryView.S2.json | 1 + ...i.query.view.QueryExecutionRequest.D1.json | 77 ++ ...i.query.view.QueryExecutionRequest.D3.json | 12 + ...der.api.query.view.QueryResultView.S1.json | 1 + ...der.api.query.view.QueryResultView.S2.json | 1 + ...query.view.QueryResultView.S2Throwing.json | 14 + ...ery.view.UpsertLibraryQueryRequest.D1.json | 21 + ...tationEndpoints$InviteEmailRequest.D1.json | 4 + ...tationEndpoints$InviteEmailRequest.D3.json | 22 + ...nts$UpdateOrgCommonSettingsRequest.D1.json | 35 + ...nts$UpdateOrgCommonSettingsRequest.D3.json | 22 + ...nt.UserEndpoints$CreateUserRequest.D1.json | 4 + ...nt.UserEndpoints$CreateUserRequest.D3.json | 22 + ....UserEndpoints$LostPasswordRequest.D1.json | 3 + ....UserEndpoints$LostPasswordRequest.D3.json | 12 + ...serEndpoints$MarkUserStatusRequest.D1.json | 35 + ...serEndpoints$MarkUserStatusRequest.D3.json | 22 + ...Endpoints$ResetLostPasswordRequest.D1.json | 5 + ...Endpoints$ResetLostPasswordRequest.D3.json | 32 + ...UserEndpoints$ResetPasswordRequest.D1.json | 3 + ...UserEndpoints$ResetPasswordRequest.D3.json | 12 + ...serEndpoints$UpdatePasswordRequest.D1.json | 4 + ...serEndpoints$UpdatePasswordRequest.D3.json | 22 + ...r.api.usermanagement.view.APIKeyVO.S1.json | 1 + ...r.api.usermanagement.view.APIKeyVO.S2.json | 1 + ...ermanagement.view.AddMemberRequest.D1.json | 4 + ...management.view.CreateGroupRequest.D1.json | 4 + ...ment.view.GroupMemberAggregateView.S1.json | 1 + ...ment.view.GroupMemberAggregateView.S2.json | 1 + ...sermanagement.view.GroupMemberView.S1.json | 1 + ...sermanagement.view.GroupMemberView.S2.json | 1 + ...ement.view.GroupMemberView.S2Throwing.json | 13 + ....api.usermanagement.view.GroupView.S1.json | 1 + ....api.usermanagement.view.GroupView.S2.json | 1 + ...i.usermanagement.view.InvitationVO.S1.json | 1 + ...i.usermanagement.view.InvitationVO.S2.json | 1 + ...agement.view.OrgAndVisitorRoleView.S1.json | 1 + ...view.OrgAndVisitorRoleView.S1Internal.json | 1 + ...t.view.OrgAndVisitorRoleView.S1Public.json | 1 + ...agement.view.OrgAndVisitorRoleView.S2.json | 1 + ...ew.OrgMemberListView$OrgMemberView.S1.json | 1 + ...ew.OrgMemberListView$OrgMemberView.S2.json | 1 + ...rmanagement.view.OrgMemberListView.S1.json | 1 + ...rmanagement.view.OrgMemberListView.S2.json | 1 + ...er.api.usermanagement.view.OrgView.S1.json | 1 + ...er.api.usermanagement.view.OrgView.S2.json | 1 + ...sermanagement.view.OrgView.S2Throwing.json | 8 + ...management.view.UpdateGroupRequest.D1.json | 4 + ...ermanagement.view.UpdateOrgRequest.D1.json | 7 + ...rmanagement.view.UpdateRoleRequest.D1.json | 4 + ...rmanagement.view.UpdateUserRequest.D1.json | 4 + ...sermanagement.view.UserProfileView.S1.json | 1 + ...ement.view.UserProfileView.S1Internal.json | 1 + ...agement.view.UserProfileView.S1Public.json | 1 + ...sermanagement.view.UserProfileView.S2.json | 1 + ...main.application.model.Application.D1.json | 72 ++ ...plication.model.Application.D1Instant.json | 7 + ...main.application.model.Application.S1.json | 1 + ...main.application.model.Application.S2.json | 1 + ...lication.model.Application.S2Throwing.json | 5 + ...pplication.model.ApplicationStatus.S1.json | 1 + ...owcoder.domain.bundle.model.Bundle.D1.json | 47 ++ ...ain.bundle.model.BundleApplication.S1.json | 1 + ...ain.bundle.model.BundleApplication.S2.json | 1 + ...r.domain.bundle.model.BundleStatus.S1.json | 1 + ...domain.datasource.model.Datasource.S1.json | 1 + ...atasource.model.Datasource.S1Internal.json | 1 + ....datasource.model.Datasource.S1Public.json | 1 + ...domain.datasource.model.Datasource.S2.json | 1 + ...atasource.model.Datasource.S2Throwing.json | 5 + ....datasource.model.DatasourceStatus.S1.json | 1 + ...owcoder.domain.folder.model.Folder.D1.json | 14 + ...domain.material.model.MaterialType.S1.json | 1 + ...ization$OrganizationCommonSettings.S1.json | 1 + ...in.organization.model.Organization.D1.json | 86 ++ ...in.organization.model.Organization.S1.json | 1 + ...ization.model.Organization.S1Internal.json | 1 + ...anization.model.Organization.S1Public.json | 1 + ...in.organization.model.Organization.S2.json | 1 + ...anization.model.OrganizationDomain.D1.json | 35 + ...ganization.model.OrganizationState.S1.json | 1 + ...in.permission.model.ResourceHolder.S1.json | 1 + ...r.domain.plugin.DatasourceMetaInfo.S1.json | 1 + ...r.domain.plugin.DatasourceMetaInfo.S2.json | 1 + ...o.GetPluginDynamicConfigRequestDTO.D1.json | 20 + ...omain.query.model.ApplicationQuery.S1.json | 1 + ...omain.query.model.ApplicationQuery.S2.json | 1 + ...ery.model.ApplicationQuery.S2Throwing.json | 6 + ...coder.domain.query.model.BaseQuery.S1.json | 1 + ...coder.domain.query.model.BaseQuery.S2.json | 1 + ...er.domain.query.model.LibraryQuery.D1.json | 25 + ....query.model.LibraryQueryCombineId.S1.json | 1 + ....query.model.LibraryQueryCombineId.S2.json | 1 + ....lowcoder.domain.user.model.APIKey.S1.json | 1 + ....lowcoder.domain.user.model.APIKey.S2.json | 1 + ...coder.domain.user.model.Connection.S1.json | 1 + ...coder.domain.user.model.Connection.S2.json | 1 + ...ser.model.User$TransformedUserInfo.S1.json | 1 + ...ser.model.User$TransformedUserInfo.S2.json | 1 + ...rg.lowcoder.domain.user.model.User.S1.json | 1 + ...rg.lowcoder.domain.user.model.User.S2.json | 1 + ...coder.domain.user.model.UserDetail.S1.json | 1 + ...coder.domain.user.model.UserDetail.S2.json | 1 + ...wcoder.domain.user.model.UserState.S1.json | 1 + ...a.config.model.ServerConfig.NotStored.json | 1 + ...er.infra.config.model.ServerConfig.S1.json | 1 + ...er.infra.config.model.ServerConfig.S2.json | 1 + ...coder.sdk.auth.AbstractAuthConfig.ids.json | 8 + ....lowcoder.sdk.auth.EmailAuthConfig.D1.json | 8 + ....lowcoder.sdk.auth.EmailAuthConfig.S1.json | 1 + ....lowcoder.sdk.auth.EmailAuthConfig.S2.json | 1 + ...r.sdk.auth.Oauth2GenericAuthConfig.D1.json | 25 + ...r.sdk.auth.Oauth2GenericAuthConfig.S1.json | 1 + ...th.Oauth2GenericAuthConfig.S1Internal.json | 1 + ...auth.Oauth2GenericAuthConfig.S1Public.json | 1 + ...r.sdk.auth.Oauth2GenericAuthConfig.S2.json | 1 + ...th.Oauth2GenericAuthConfig.S2Throwing.json | 14 + ....sdk.auth.Oauth2KeycloakAuthConfig.D1.json | 13 + ....sdk.auth.Oauth2KeycloakAuthConfig.S1.json | 1 + ...h.Oauth2KeycloakAuthConfig.S1Internal.json | 1 + ...uth.Oauth2KeycloakAuthConfig.S1Public.json | 1 + ....sdk.auth.Oauth2KeycloakAuthConfig.S2.json | 1 + ...h.Oauth2KeycloakAuthConfig.S2Throwing.json | 17 + ...coder.sdk.auth.Oauth2OryAuthConfig.D1.json | 12 + ...coder.sdk.auth.Oauth2OryAuthConfig.S1.json | 1 + ...k.auth.Oauth2OryAuthConfig.S1Internal.json | 1 + ...sdk.auth.Oauth2OryAuthConfig.S1Public.json | 1 + ...coder.sdk.auth.Oauth2OryAuthConfig.S2.json | 1 + ...k.auth.Oauth2OryAuthConfig.S2Throwing.json | 14 + ...er.sdk.auth.Oauth2SimpleAuthConfig.D1.json | 10 + ...er.sdk.auth.Oauth2SimpleAuthConfig.S1.json | 1 + ...uth.Oauth2SimpleAuthConfig.S1Internal.json | 1 + ....auth.Oauth2SimpleAuthConfig.S1Public.json | 1 + ...er.sdk.auth.Oauth2SimpleAuthConfig.S2.json | 1 + ...uth.Oauth2SimpleAuthConfig.S2Throwing.json | 8 + ...wcoder.sdk.constants.WorkspaceMode.S1.json | 1 + ....models.DatasourceStructure$Column.S1.json | 1 + ....models.DatasourceStructure$Column.S2.json | 1 + ...k.models.DatasourceStructure$Table.S1.json | 1 + ...k.models.DatasourceStructure$Table.S2.json | 1 + ...dels.DatasourceStructure$TableType.S1.json | 1 + ...der.sdk.models.DatasourceStructure.S1.json | 1 + ...der.sdk.models.DatasourceStructure.S2.json | 1 + .../org.lowcoder.sdk.models.Param.D1.json | 35 + .../resources/json-contract/wp-status.json | 3 + server/api-service/pom.xml | 46 ++ 621 files changed, 42453 insertions(+), 62 deletions(-) create mode 100644 server/api-service/lowcoder-coverage-report/pom.xml create mode 100644 server/api-service/lowcoder-domain/src/test/java/org/lowcoder/domain/datasource/repository/DatasourcePersistenceContractTest.java create mode 100644 server/api-service/lowcoder-domain/src/test/java/org/lowcoder/domain/plugin/client/DatasourcePluginClientContractTest.java create mode 100644 server/api-service/lowcoder-domain/src/test/java/org/lowcoder/domain/solutions/TemplateDslCopyContractTest.java create mode 100644 server/api-service/lowcoder-domain/src/test/resources/json-contract/dynamic-roundtrip/TemplateSolutionService.createFromTemplate.json create mode 100644 server/api-service/lowcoder-domain/src/test/resources/json-contract/node-service/DatasourcePluginClient.calls.json create mode 100644 server/api-service/lowcoder-domain/src/test/resources/json-contract/persistence-roundtrip/DatasourceRepository.configs.input.json create mode 100644 server/api-service/lowcoder-domain/src/test/resources/json-contract/persistence-roundtrip/DatasourceRepository.storedConfigs.json create mode 100644 server/api-service/lowcoder-infra/src/test/java/org/lowcoder/infra/config/ConfigCenterContractTest.java create mode 100644 server/api-service/lowcoder-infra/src/test/resources/json-contract/config-center/AutoReloadConfig.values.json create mode 100644 server/api-service/lowcoder-plugins/clickHousePlugin/src/test/java/org/lowcoder/plugin/clickhouse/ClickHouseBindContractTest.java create mode 100644 server/api-service/lowcoder-plugins/clickHousePlugin/src/test/java/org/lowcoder/plugin/clickhouse/ClickHouseConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/clickHousePlugin/src/test/java/org/lowcoder/plugin/clickhouse/ClickHouseResultContractTest.java create mode 100644 server/api-service/lowcoder-plugins/clickHousePlugin/src/test/resources/json-contract/config-binding/ClickHouseDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/clickHousePlugin/src/test/resources/json-contract/config-binding/ClickHouseDatasourceConfig.json create mode 100644 server/api-service/lowcoder-plugins/clickHousePlugin/src/test/resources/json-contract/config-binding/ClickHouseQueryConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/clickHousePlugin/src/test/resources/json-contract/config-binding/ClickHouseQueryConfig.json create mode 100644 server/api-service/lowcoder-plugins/clickHousePlugin/src/test/resources/json-contract/downstream-render/ClickHouseQueryExecutor.binds.txt create mode 100644 server/api-service/lowcoder-plugins/clickHousePlugin/src/test/resources/json-contract/query-results/ClickHouseQueryExecutor.results.json create mode 100644 server/api-service/lowcoder-plugins/elasticSearchPlugin/src/test/java/org/lowcoder/plugin/es/EsConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/elasticSearchPlugin/src/test/java/org/lowcoder/plugin/es/EsDslTextContractTest.java create mode 100644 server/api-service/lowcoder-plugins/elasticSearchPlugin/src/test/java/org/lowcoder/plugin/es/EsResultContractTest.java create mode 100644 server/api-service/lowcoder-plugins/elasticSearchPlugin/src/test/resources/json-contract/config-binding/EsDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/elasticSearchPlugin/src/test/resources/json-contract/config-binding/EsDatasourceConfig.json create mode 100644 server/api-service/lowcoder-plugins/elasticSearchPlugin/src/test/resources/json-contract/config-binding/EsQueryConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/elasticSearchPlugin/src/test/resources/json-contract/config-binding/EsQueryConfig.json create mode 100644 server/api-service/lowcoder-plugins/elasticSearchPlugin/src/test/resources/json-contract/external-json/EsQueryExecutor.results.json create mode 100644 server/api-service/lowcoder-plugins/elasticSearchPlugin/src/test/resources/json-contract/tree-text/EsQueryExecutor.dsl.txt create mode 100644 server/api-service/lowcoder-plugins/googleSheetsPlugin/src/test/java/org/lowcoder/plugin/googlesheets/GoogleSheetsConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/googleSheetsPlugin/src/test/java/org/lowcoder/plugin/googlesheets/GoogleSheetsResultContractTest.java create mode 100644 server/api-service/lowcoder-plugins/googleSheetsPlugin/src/test/resources/json-contract/config-binding/GoogleSheetsActionRequest.input.json create mode 100644 server/api-service/lowcoder-plugins/googleSheetsPlugin/src/test/resources/json-contract/config-binding/GoogleSheetsActionRequest.json create mode 100644 server/api-service/lowcoder-plugins/googleSheetsPlugin/src/test/resources/json-contract/config-binding/GoogleSheetsDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/googleSheetsPlugin/src/test/resources/json-contract/config-binding/GoogleSheetsDatasourceConfig.json create mode 100644 server/api-service/lowcoder-plugins/googleSheetsPlugin/src/test/resources/json-contract/external-json/GoogleSheets.results.json create mode 100644 server/api-service/lowcoder-plugins/graphqlPlugin/src/test/java/org/lowcoder/plugin/graphql/GraphQLConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/graphqlPlugin/src/test/java/org/lowcoder/plugin/graphql/GraphQLExecutorCodecGuardTest.java create mode 100644 server/api-service/lowcoder-plugins/graphqlPlugin/src/test/java/org/lowcoder/plugin/graphql/GraphQLRequestBodyContractTest.java create mode 100644 server/api-service/lowcoder-plugins/graphqlPlugin/src/test/java/org/lowcoder/plugin/graphql/GraphQLResponseContractTest.java create mode 100644 server/api-service/lowcoder-plugins/graphqlPlugin/src/test/resources/json-contract/config-binding/GraphQLQueryConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/graphqlPlugin/src/test/resources/json-contract/config-binding/GraphQLQueryConfig.json create mode 100644 server/api-service/lowcoder-plugins/graphqlPlugin/src/test/resources/json-contract/downstream-encode/GraphQLExecutor.requestBody.json create mode 100644 server/api-service/lowcoder-plugins/graphqlPlugin/src/test/resources/json-contract/external-json/GraphQLExecutor.responses.json create mode 100644 server/api-service/lowcoder-plugins/mongoPlugin/src/test/java/org/lowcoder/plugin/mongo/MongoConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/mongoPlugin/src/test/java/org/lowcoder/plugin/mongo/MongoResultContractTest.java create mode 100644 server/api-service/lowcoder-plugins/mongoPlugin/src/test/java/org/lowcoder/plugin/mongo/MongoSpecialTypesContractTest.java create mode 100644 server/api-service/lowcoder-plugins/mongoPlugin/src/test/java/org/lowcoder/plugin/mongo/MongoTreeTextContractTest.java create mode 100644 server/api-service/lowcoder-plugins/mongoPlugin/src/test/resources/json-contract/config-binding/MongoDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/mongoPlugin/src/test/resources/json-contract/config-binding/MongoDatasourceConfig.json create mode 100644 server/api-service/lowcoder-plugins/mongoPlugin/src/test/resources/json-contract/downstream-render/MongoEngine.specialTypes.txt create mode 100644 server/api-service/lowcoder-plugins/mongoPlugin/src/test/resources/json-contract/external-json/MongoEngine.results.json create mode 100644 server/api-service/lowcoder-plugins/mongoPlugin/src/test/resources/json-contract/tree-text/MongoEngine.commands.txt create mode 100644 server/api-service/lowcoder-plugins/mongoPlugin/src/test/resources/json-contract/tree-text/MongoQueryUtils.distinct.txt create mode 100644 server/api-service/lowcoder-plugins/mssqlPlugin/src/test/java/org/lowcoder/plugin/mssql/MssqlConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/mssqlPlugin/src/test/resources/json-contract/config-binding/MssqlDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/mssqlPlugin/src/test/resources/json-contract/config-binding/MssqlDatasourceConfig.json create mode 100644 server/api-service/lowcoder-plugins/mssqlPlugin/src/test/resources/json-contract/config-binding/MssqlQueryConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/mssqlPlugin/src/test/resources/json-contract/config-binding/MssqlQueryConfig.json create mode 100644 server/api-service/lowcoder-plugins/mysqlPlugin/src/test/java/org/lowcoder/plugin/mysql/MysqlConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/mysqlPlugin/src/test/resources/json-contract/config-binding/MysqlDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/mysqlPlugin/src/test/resources/json-contract/config-binding/MysqlDatasourceConfig.json create mode 100644 server/api-service/lowcoder-plugins/mysqlPlugin/src/test/resources/json-contract/config-binding/MysqlQueryConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/mysqlPlugin/src/test/resources/json-contract/config-binding/MysqlQueryConfig.json create mode 100644 server/api-service/lowcoder-plugins/oraclePlugin/src/test/java/org/lowcoder/plugin/oracle/OracleConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/oraclePlugin/src/test/resources/json-contract/config-binding/OracleDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/oraclePlugin/src/test/resources/json-contract/config-binding/OracleDatasourceConfig.json create mode 100644 server/api-service/lowcoder-plugins/postgresPlugin/src/test/java/org/lowcoder/plugin/postgres/PostgresConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/postgresPlugin/src/test/java/org/lowcoder/plugin/postgres/PostgresResultContractTest.java create mode 100644 server/api-service/lowcoder-plugins/postgresPlugin/src/test/resources/json-contract/config-binding/PostgresDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/postgresPlugin/src/test/resources/json-contract/config-binding/PostgresDatasourceConfig.json create mode 100644 server/api-service/lowcoder-plugins/postgresPlugin/src/test/resources/json-contract/config-binding/PostgresQueryConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/postgresPlugin/src/test/resources/json-contract/config-binding/PostgresQueryConfig.json create mode 100644 server/api-service/lowcoder-plugins/postgresPlugin/src/test/resources/json-contract/external-json/PostgresResultParser.rows.json create mode 100644 server/api-service/lowcoder-plugins/redisPlugin/src/test/java/org/lowcoder/plugin/redis/RedisConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/redisPlugin/src/test/java/org/lowcoder/plugin/redis/RedisResultContractTest.java create mode 100644 server/api-service/lowcoder-plugins/redisPlugin/src/test/resources/json-contract/config-binding/RedisDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/redisPlugin/src/test/resources/json-contract/config-binding/RedisDatasourceConfig.json create mode 100644 server/api-service/lowcoder-plugins/redisPlugin/src/test/resources/json-contract/query-results/RedisEngine.results.json create mode 100644 server/api-service/lowcoder-plugins/restApiPlugin/src/test/java/org/lowcoder/plugin/restapi/RestApiConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/restApiPlugin/src/test/java/org/lowcoder/plugin/restapi/RestApiExecutorCodecGuardTest.java create mode 100644 server/api-service/lowcoder-plugins/restApiPlugin/src/test/java/org/lowcoder/plugin/restapi/RestApiJsonBodyContractTest.java create mode 100644 server/api-service/lowcoder-plugins/restApiPlugin/src/test/java/org/lowcoder/plugin/restapi/RestApiResponseContractTest.java create mode 100644 server/api-service/lowcoder-plugins/restApiPlugin/src/test/java/org/lowcoder/plugin/restapi/RestApiSpecialJsonBodyContractTest.java create mode 100644 server/api-service/lowcoder-plugins/restApiPlugin/src/test/resources/json-contract/config-binding/RestApiQueryConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/restApiPlugin/src/test/resources/json-contract/config-binding/RestApiQueryConfig.json create mode 100644 server/api-service/lowcoder-plugins/restApiPlugin/src/test/resources/json-contract/downstream-encode/RestApiExecutor.jsonBody.json create mode 100644 server/api-service/lowcoder-plugins/restApiPlugin/src/test/resources/json-contract/external-json/RestApiExecutor.responses.json create mode 100644 server/api-service/lowcoder-plugins/restApiPlugin/src/test/resources/json-contract/tree-text/RestApiExecutor.specialJsonBody.txt create mode 100644 server/api-service/lowcoder-plugins/smtpPlugin/src/test/java/org/lowcoder/plugins/SmtpConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/smtpPlugin/src/test/java/org/lowcoder/plugins/SmtpListsContractTest.java create mode 100644 server/api-service/lowcoder-plugins/smtpPlugin/src/test/java/org/lowcoder/plugins/SmtpResultContractTest.java create mode 100644 server/api-service/lowcoder-plugins/smtpPlugin/src/test/java/org/lowcoder/plugins/SmtpTreeTextContractTest.java create mode 100644 server/api-service/lowcoder-plugins/smtpPlugin/src/test/resources/json-contract/config-binding/SmtpDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/smtpPlugin/src/test/resources/json-contract/config-binding/SmtpDatasourceConfig.json create mode 100644 server/api-service/lowcoder-plugins/smtpPlugin/src/test/resources/json-contract/query-results/SmtpPlugin.result.json create mode 100644 server/api-service/lowcoder-plugins/smtpPlugin/src/test/resources/json-contract/smtp-lists/SmtpEngine.buildQueryExecutionContext.json create mode 100644 server/api-service/lowcoder-plugins/smtpPlugin/src/test/resources/json-contract/tree-text/SmtpEngine.renderedLists.txt create mode 100644 server/api-service/lowcoder-plugins/snowflakePlugin/src/test/java/org/lowcoder/plugin/snowflake/SnowflakeConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/snowflakePlugin/src/test/resources/json-contract/config-binding/SnowflakeDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/snowflakePlugin/src/test/resources/json-contract/config-binding/SnowflakeDatasourceConfig.json create mode 100644 server/api-service/lowcoder-plugins/sqlBasedPlugin/src/test/java/org/lowcoder/plugin/sql/SqlBindContractTest.java create mode 100644 server/api-service/lowcoder-plugins/sqlBasedPlugin/src/test/java/org/lowcoder/plugin/sql/SqlConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-plugins/sqlBasedPlugin/src/test/java/org/lowcoder/plugin/sql/SqlResultContractTest.java create mode 100644 server/api-service/lowcoder-plugins/sqlBasedPlugin/src/test/resources/json-contract/config-binding/SqlQueryConfig.input.json create mode 100644 server/api-service/lowcoder-plugins/sqlBasedPlugin/src/test/resources/json-contract/config-binding/SqlQueryConfig.json create mode 100644 server/api-service/lowcoder-plugins/sqlBasedPlugin/src/test/resources/json-contract/downstream-render/GeneralSqlExecutor.binds.txt create mode 100644 server/api-service/lowcoder-plugins/sqlBasedPlugin/src/test/resources/json-contract/query-results/GeneralSqlExecutor.results.json create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/BoundarySites.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/CanonicalJson.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/CanonicalJsonTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/ClientCodecs.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/ClientCodecsTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/ConfigBinding.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/ConfigBindingTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/FakeJdbc.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/FieldTree.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/FieldTreeTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/GoldenJson.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/GoldenJsonTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/JacksonAnnotationGuard.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/JacksonAnnotationGuardTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/JavaValueWalker.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/PayloadBoundsTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/PluginConfigPolymorphismTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/QueryResults.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/RecordingHttpServer.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/RenderValues.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/contract/RepresentativeInput.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/plugin/SdkConfigBindingContractTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/plugin/common/sql/ResultSetParserContractTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/plugin/http/RawHttpBodyContractTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/KeyValuePairChangeSetErrorMessageContractTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/util/DownstreamRenderContractTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/util/NodeConversionContractTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/java/org/lowcoder/sdk/util/TreeTextContractTest.java create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/config-binding/GraphQLDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/config-binding/GraphQLDatasourceConfig.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/config-binding/MysqlDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/config-binding/MysqlDatasourceConfig.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/config-binding/RestApiDatasourceConfig.input.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/config-binding/RestApiDatasourceConfig.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/downstream-encode/RawHttpHandlerHelper.jsonBody.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/downstream-render/BulkInsertCommand.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/downstream-render/BulkUpdateCommand.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/downstream-render/InsertCommand.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/downstream-render/MustacheHelper.inOperator.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/downstream-render/MustacheHelper.renderMustacheString.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/downstream-render/MustacheHelper.valueInsideQuotes.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/downstream-render/SqlGuiUtils.GuiSqlValue.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/downstream-render/UpdateCommand.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/error-message-json/KeyValuePairChangeSet.messages.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/node-conversion/BulkObjectChangeSet.render.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/node-conversion/DataUtils.convertToMultiformFileValue.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/node-conversion/ObjectChangeSet.render.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/node-conversion/SheetBulkObjectChangeSet.render.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/node-conversion/SheetKeyValuePairChangeSet.render.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/node-conversion/SheetObjectChangeSet.render.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/node-conversion/SqlGuiUtils.renderPsBindValue.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/node-conversion/renderMustacheJson.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/polymorphism/AuthConfig.inputs.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/polymorphism/AuthConfig.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/polymorphism/SslConfig.inputs.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/polymorphism/SslConfig.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/polymorphism/registered-ids.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/query-results/ResultSetParser.leaves.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/selftest/golden.json create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/tree-text/E13.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/tree-text/RawHttpRequest.renderParams.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/tree-text/renderMustacheArrayJsonString.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/json-contract/tree-text/renderMustacheJsonString.txt create mode 100644 server/api-service/lowcoder-sdk/src/test/resources/org/lowcoder/sdk/contract/representative.input.json create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/authentication/request/oauth2/request/OauthProviderErrorMessagesContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/authentication/request/oauth2/request/OauthProviderResponsesContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/authentication/request/oauth2/request/OauthProviderStubs.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/ClientCodecGuardTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/JsonBoundaryGateTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/PayloadBoundsTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/PayloadContractCompletenessTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/ServerCodecGuardTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/boundary/JsLibraryFetchContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/boundary/JwtClaimsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/boundary/SessionCacheContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/boundary/UpsertDatasourceContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/ApiFlowEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/ApplicationEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/ApplicationHistorySnapshotEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/ApplicationRecordEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/AssetEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/AuthenticationEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/BundleEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/ConfigEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/DatasourceEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/FolderEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/GroupEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/IndexControllerContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/InvitationEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/JsLibraryEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/LibraryQueryEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/LibraryQueryRecordEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/MaterialEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/MetaEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/OrganizationEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/PluginRouteContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/PrivateNpmRegistryEndpointContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/QueryEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/ServerSettingEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/StateEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/endpoint/UserEndpointsContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/error/ErrorCasesContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/ApplicationPayloadGettersTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/AuthConfigPolymorphismTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/AuthConfigRequestConsumerTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/ContainerCoercionContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/EnumGoldensTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/EnvelopeGoldensTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/InstantContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/LibraryQueryPayloadGettersTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/PayloadSamplesAdequacyTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/QueryResultViewContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/RepresentativeInputContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/RequestPayloadGoldensTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/ResponsePayloadGoldensTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/ScalarCoercionContractTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/payload/UserManagementPayloadGettersTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/ApplicationSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/AuthenticationSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/BundleSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/ConfigSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/ContractHarness.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/ContractRegistry.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/ContractSources.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/ContractTestClient.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/ContractTestClientTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/DatasourceSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/EndpointContract.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/FolderSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/JsonBoundaryClassification.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/JsonBoundaryScanner.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/JsonBoundaryScannerTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/LibraryQuerySamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/MaterialSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/MetaSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/MiscSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/OrganizationSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/PayloadAssertions.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/PayloadSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/PayloadTypeWalker.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/PayloadTypeWalkerTest.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/QuerySamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/StoredValues.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/UserManagementSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/UserSamples.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/ViewMarkedConnectionConfig.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/WebClientRedirect.java create mode 100644 server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/contract/support/WorkPackageStatus.java create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json-boundary-control.out create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json-boundary-groups.tsv create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json-boundary-sites.tsv create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json_boundary_control/lowcoder-sdk/src/main/java/Ctl.java create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json_boundary_control/lowcoder-sdk/src/main/java/FqnUse.java create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json_boundary_control/lowcoder-sdk/src/main/java/ImportOnly.java create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json_boundary_control/lowcoder-sdk/src/main/java/LombokOnly.java create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json_boundary_control/lowcoder-sdk/src/main/java/OtherLibraryJackson.java create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json_boundary_control/lowcoder-sdk/src/main/java/ReaderWriter.java create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json_boundary_control/lowcoder-sdk/src/main/java/StaticInserter.java create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json_boundary_control/lowcoder-sdk/src/main/java/TreeText.java create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary-sites/json_boundary_control/lowcoder-sdk/src/main/java/Wrap.java create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/api-flow/representative.body.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/error-message-json/GenericAuthRequest.messages.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/error-message-json/GithubRequest.messages.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/error-message-json/GoogleRequest.messages.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/error-message-json/KeycloakRequest.messages.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/error-message-json/OryRequest.messages.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/error-message-json/github.token.error.txt create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/error-message-json/provider.error.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/js-library/fetch.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/js-library/recommended.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/js-library/registry.full.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/js-library/registry.no-homepage.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/js-library/registry.not-json.txt create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/js-library/registry.repository-homepage.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/jwt-claims/claims.input.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/jwt-claims/claims.read.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/npm-outbound/default-registries.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/npm-outbound/with-registries.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/generic.decoded.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/generic.refresh.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/generic.token.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/generic.user.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/github.decoded.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/github.token.txt create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/github.user.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/google.decoded.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/google.refresh.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/google.token.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/google.user.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/keycloak.decoded.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/keycloak.refresh.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/keycloak.token.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/keycloak.user.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/ory.decoded.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/ory.refresh.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/ory.token.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/oauth/ory.user.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/payload-getters/Application.editingQueries.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/payload-getters/Application.liveQueries.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/payload-getters/LibraryQuery.query.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/payload-getters/LibraryQueryRecord.query.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/payload-getters/OrganizationDomain.beforeMongodbWrite.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/payload-getters/User.beforeMongodbWrite.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/session-cache/legacy-user.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/boundary/session-cache/session-values.read.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/coercion/D5.builder.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/coercion/D5.creator.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/coercion/D5.field-setter.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/coercion/D6.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/contract-registry.tsv create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/dynamic/DatasourceEndpoints.info.output.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/dynamic/QueryResultView.mixed.output.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/dynamic/representative.input.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/dynamic/representative.output.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/dynamic/representative.read.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/dynamic/representative.stored.output.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/envelope/GroupListResponseView.success.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/envelope/PageResponseView.error.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/envelope/PageResponseView.success.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/envelope/ResponseView.error-with-data.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/envelope/ResponseView.error.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/envelope/ResponseView.redirect.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/envelope/ResponseView.success-null-data.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/envelope/ResponseView.success.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/errors/X5.unmapped-path.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/errors/X6.filter-runtime-exception.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/errors/X7.filter-response-status-403.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/functional-routes.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/producer-sites.tsv create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/routes/plugins.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$ApplicationAsAgencyProfileRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$ApplicationAsAgencyProfileRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$ApplicationPublicToAllRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$ApplicationPublicToAllRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$ApplicationPublicToMarketplaceRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$ApplicationPublicToMarketplaceRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$BatchAddPermissionRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$BatchAddPermissionRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$CreateApplicationRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$CreateApplicationRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$UpdateEditStateRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$UpdateEditStateRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$UpdatePermissionRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationEndpoints$UpdatePermissionRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationHistorySnapshotEndpoints$ApplicationHistorySnapshotBriefInfo.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationHistorySnapshotEndpoints$ApplicationHistorySnapshotBriefInfo.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationHistorySnapshotEndpoints$ApplicationHistorySnapshotRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.ApplicationHistorySnapshotEndpoints$ApplicationHistorySnapshotRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.ApplicationInfoView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.ApplicationInfoView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.ApplicationPermissionView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.ApplicationPermissionView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.ApplicationPermissionView.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.ApplicationPublishRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.ApplicationPublishRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.ApplicationRecordMetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.ApplicationRecordMetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.ApplicationView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.ApplicationView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.HistorySnapshotDslView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.HistorySnapshotDslView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.MarketplaceApplicationInfoView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.application.view.MarketplaceApplicationInfoView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.authentication.AuthenticationEndpoints$FormLoginRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.authentication.AuthenticationEndpoints$FormLoginRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.authentication.dto.APIKeyRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.authentication.dto.AuthConfigRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.authentication.dto.RedirectView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.authentication.dto.RedirectView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$BatchAddPermissionRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$BatchAddPermissionRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$BundleAsAgencyProfileRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$BundleAsAgencyProfileRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$BundlePublicToAllRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$BundlePublicToAllRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$BundlePublicToMarketplaceRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$BundlePublicToMarketplaceRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$CreateBundleRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$CreateBundleRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$UpdatePermissionRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.BundleEndpoints$UpdatePermissionRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.view.BundleInfoView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.view.BundleInfoView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.view.BundlePermissionView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.view.BundlePermissionView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.view.BundlePermissionView.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.view.MarketplaceBundleInfoView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.bundle.view.MarketplaceBundleInfoView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.config.ConfigEndpoints$UpdateConfigRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.config.ConfigEndpoints$UpdateConfigRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.config.ConfigView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.config.ConfigView.S1Internal.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.config.ConfigView.S1Public.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.config.ConfigView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.datasource.DatasourceEndpoints$BatchAddPermissionRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.datasource.DatasourceEndpoints$BatchAddPermissionRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.datasource.DatasourceEndpoints$UpdatePermissionRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.datasource.DatasourceEndpoints$UpdatePermissionRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.datasource.DatasourceView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.datasource.DatasourceView.S1Internal.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.datasource.DatasourceView.S1Public.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.datasource.DatasourceView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.datasource.UpsertDatasourceRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.home.FolderEndpoints$BatchAddPermissionRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.home.FolderEndpoints$BatchAddPermissionRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.home.FolderEndpoints$UpdatePermissionRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.home.FolderEndpoints$UpdatePermissionRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.home.FolderInfoView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.home.FolderInfoView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.home.UserHomepageView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.home.UserHomepageView.S1Internal.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.home.UserHomepageView.S1Public.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.home.UserHomepageView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.material.MaterialEndpoints$MaterialView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.material.MaterialEndpoints$MaterialView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.material.MaterialEndpoints$UploadMaterialRequestDTO.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.MetaEndpoints$GetMetaDataRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.MetaEndpoints$GetMetaDataRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.ApplicationMetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.ApplicationMetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.BundleMetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.BundleMetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.DatasourceMetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.DatasourceMetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.FolderMetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.FolderMetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.GroupMetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.GroupMetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.LibraryQueryMetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.LibraryQueryMetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.MetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.MetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.OrgMetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.OrgMetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.UserMetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.meta.view.UserMetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.misc.ApiFlowEndpoints$FlowRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.misc.ApiFlowEndpoints$FlowRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.misc.JsLibraryController$JsLibraryMeta.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.misc.JsLibraryController$JsLibraryMeta.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.permission.view.CommonPermissionView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.permission.view.CommonPermissionView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.permission.view.CommonPermissionView.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.permission.view.PermissionItemView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.permission.view.PermissionItemView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.LibraryQueryAggregateView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.LibraryQueryAggregateView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.LibraryQueryMetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.LibraryQueryMetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.LibraryQueryPublishRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.LibraryQueryPublishRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.LibraryQueryRecordMetaView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.LibraryQueryRecordMetaView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.LibraryQueryRequestFromJs.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.LibraryQueryView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.LibraryQueryView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.QueryExecutionRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.QueryExecutionRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.QueryResultView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.QueryResultView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.QueryResultView.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.query.view.UpsertLibraryQueryRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.InvitationEndpoints$InviteEmailRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.InvitationEndpoints$InviteEmailRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.OrganizationEndpoints$UpdateOrgCommonSettingsRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.OrganizationEndpoints$UpdateOrgCommonSettingsRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$CreateUserRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$CreateUserRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$LostPasswordRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$LostPasswordRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$MarkUserStatusRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$MarkUserStatusRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$ResetLostPasswordRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$ResetLostPasswordRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$ResetPasswordRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$ResetPasswordRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$UpdatePasswordRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.UserEndpoints$UpdatePasswordRequest.D3.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.APIKeyVO.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.APIKeyVO.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.AddMemberRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.CreateGroupRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.GroupMemberAggregateView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.GroupMemberAggregateView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.GroupMemberView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.GroupMemberView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.GroupMemberView.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.GroupView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.GroupView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.InvitationVO.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.InvitationVO.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.OrgAndVisitorRoleView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.OrgAndVisitorRoleView.S1Internal.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.OrgAndVisitorRoleView.S1Public.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.OrgAndVisitorRoleView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.OrgMemberListView$OrgMemberView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.OrgMemberListView$OrgMemberView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.OrgMemberListView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.OrgMemberListView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.OrgView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.OrgView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.OrgView.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.UpdateGroupRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.UpdateOrgRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.UpdateRoleRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.UpdateUserRequest.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.UserProfileView.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.UserProfileView.S1Internal.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.UserProfileView.S1Public.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.api.usermanagement.view.UserProfileView.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.application.model.Application.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.application.model.Application.D1Instant.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.application.model.Application.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.application.model.Application.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.application.model.Application.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.application.model.ApplicationStatus.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.bundle.model.Bundle.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.bundle.model.BundleApplication.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.bundle.model.BundleApplication.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.bundle.model.BundleStatus.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.datasource.model.Datasource.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.datasource.model.Datasource.S1Internal.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.datasource.model.Datasource.S1Public.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.datasource.model.Datasource.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.datasource.model.Datasource.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.datasource.model.DatasourceStatus.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.folder.model.Folder.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.material.model.MaterialType.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.organization.model.Organization$OrganizationCommonSettings.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.organization.model.Organization.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.organization.model.Organization.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.organization.model.Organization.S1Internal.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.organization.model.Organization.S1Public.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.organization.model.Organization.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.organization.model.OrganizationDomain.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.organization.model.OrganizationState.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.permission.model.ResourceHolder.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.plugin.DatasourceMetaInfo.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.plugin.DatasourceMetaInfo.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.plugin.client.dto.GetPluginDynamicConfigRequestDTO.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.query.model.ApplicationQuery.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.query.model.ApplicationQuery.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.query.model.ApplicationQuery.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.query.model.BaseQuery.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.query.model.BaseQuery.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.query.model.LibraryQuery.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.query.model.LibraryQueryCombineId.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.query.model.LibraryQueryCombineId.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.user.model.APIKey.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.user.model.APIKey.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.user.model.Connection.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.user.model.Connection.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.user.model.User$TransformedUserInfo.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.user.model.User$TransformedUserInfo.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.user.model.User.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.user.model.User.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.user.model.UserDetail.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.user.model.UserDetail.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.domain.user.model.UserState.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.infra.config.model.ServerConfig.NotStored.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.infra.config.model.ServerConfig.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.infra.config.model.ServerConfig.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.AbstractAuthConfig.ids.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.EmailAuthConfig.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.EmailAuthConfig.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.EmailAuthConfig.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2GenericAuthConfig.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2GenericAuthConfig.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2GenericAuthConfig.S1Internal.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2GenericAuthConfig.S1Public.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2GenericAuthConfig.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2GenericAuthConfig.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2KeycloakAuthConfig.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2KeycloakAuthConfig.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2KeycloakAuthConfig.S1Internal.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2KeycloakAuthConfig.S1Public.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2KeycloakAuthConfig.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2KeycloakAuthConfig.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2OryAuthConfig.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2OryAuthConfig.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2OryAuthConfig.S1Internal.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2OryAuthConfig.S1Public.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2OryAuthConfig.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2OryAuthConfig.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2SimpleAuthConfig.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2SimpleAuthConfig.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2SimpleAuthConfig.S1Internal.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2SimpleAuthConfig.S1Public.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2SimpleAuthConfig.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.auth.Oauth2SimpleAuthConfig.S2Throwing.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.constants.WorkspaceMode.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.models.DatasourceStructure$Column.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.models.DatasourceStructure$Column.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.models.DatasourceStructure$Table.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.models.DatasourceStructure$Table.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.models.DatasourceStructure$TableType.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.models.DatasourceStructure.S1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.models.DatasourceStructure.S2.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/types/org.lowcoder.sdk.models.Param.D1.json create mode 100644 server/api-service/lowcoder-server/src/test/resources/json-contract/wp-status.json diff --git a/.gitignore b/.gitignore index edf38f05a3..00d8e3265e 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ node_modules # Local Netlify folder .netlify + +# Local API payload test plan, evidence and reports (not needed by the build or tests) +server/api-service/docs/ diff --git a/server/api-service/lombok.config b/server/api-service/lombok.config index 7eb5eb12e8..4190a3ac95 100644 --- a/server/api-service/lombok.config +++ b/server/api-service/lombok.config @@ -4,3 +4,5 @@ lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Quali lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Value lombok.copyableAnnotations += org.springframework.context.annotation.Lazy +# Mark Lombok-generated methods with @lombok.Generated, which JaCoCo leaves out of coverage (T11.1) +lombok.addLombokGeneratedAnnotation = true diff --git a/server/api-service/lowcoder-coverage-report/pom.xml b/server/api-service/lowcoder-coverage-report/pom.xml new file mode 100644 index 0000000000..01b9ed4ca9 --- /dev/null +++ b/server/api-service/lowcoder-coverage-report/pom.xml @@ -0,0 +1,127 @@ + + + 4.0.0 + + + org.lowcoder + lowcoder-root + ${revision} + + + + lowcoder-coverage-report + pom + lowcoder-coverage-report + + + + org.lowcoder + lowcoder-sdk + + + org.lowcoder + lowcoder-infra + + + org.lowcoder + lowcoder-domain + + + org.lowcoder + lowcoder-server + + + org.lowcoder.plugins + postgresPlugin + ${revision} + + + org.lowcoder.plugins + restApiPlugin + ${revision} + + + org.lowcoder.plugins + mongoPlugin + ${revision} + + + org.lowcoder.plugins + mysqlPlugin + ${revision} + + + org.lowcoder.plugins + elasticSearchPlugin + ${revision} + + + org.lowcoder.plugins + redisPlugin + ${revision} + + + org.lowcoder.plugins + mssqlPlugin + ${revision} + + + org.lowcoder.plugins + smtpPlugin + ${revision} + + + org.lowcoder.plugins + clickHousePlugin + ${revision} + + + org.lowcoder.plugins + googleSheetsPlugin + ${revision} + + + org.lowcoder.plugins + oraclePlugin + ${revision} + + + org.lowcoder.plugins + graphqlPlugin + ${revision} + + + org.lowcoder + sqlBasedPlugin + ${revision} + + + org.lowcoder.plugins + snowflakePlugin + ${revision} + + + + + + + org.jacoco + jacoco-maven-plugin + + + report-aggregate + verify + + report-aggregate + + + + + + + diff --git a/server/api-service/lowcoder-domain/pom.xml b/server/api-service/lowcoder-domain/pom.xml index 52845ece00..998763866b 100644 --- a/server/api-service/lowcoder-domain/pom.xml +++ b/server/api-service/lowcoder-domain/pom.xml @@ -46,6 +46,14 @@ org.lowcoder lowcoder-sdk + + + org.lowcoder + lowcoder-sdk + ${revision} + test-jar + test + org.lowcoder lowcoder-infra diff --git a/server/api-service/lowcoder-domain/src/test/java/org/lowcoder/domain/datasource/repository/DatasourcePersistenceContractTest.java b/server/api-service/lowcoder-domain/src/test/java/org/lowcoder/domain/datasource/repository/DatasourcePersistenceContractTest.java new file mode 100644 index 0000000000..a69a3e7df5 --- /dev/null +++ b/server/api-service/lowcoder-domain/src/test/java/org/lowcoder/domain/datasource/repository/DatasourcePersistenceContractTest.java @@ -0,0 +1,149 @@ +package org.lowcoder.domain.datasource.repository; + +import org.junit.jupiter.api.Test; +import org.lowcoder.domain.datasource.model.Datasource; +import org.lowcoder.domain.datasource.model.DatasourceDO; +import org.lowcoder.domain.datasource.service.JsDatasourceHelper; +import org.lowcoder.domain.encryption.EncryptionService; +import org.lowcoder.sdk.contract.BoundarySites; +import org.lowcoder.sdk.contract.ConfigBinding; +import org.lowcoder.sdk.contract.GoldenJson; +import org.lowcoder.sdk.contract.JavaValueWalker; +import org.lowcoder.sdk.contract.QueryResults; +import org.lowcoder.sdk.contract.RepresentativeInput; +import org.lowcoder.sdk.models.DatasourceConnectionConfig; +import org.lowcoder.sdk.models.JsDatasourceConnectionConfig; +import org.lowcoder.sdk.plugin.graphql.GraphQLDatasourceConfig; +import org.lowcoder.sdk.plugin.mysql.MysqlDatasourceConfig; +import org.lowcoder.sdk.plugin.restapi.RestApiDatasourceConfig; +import org.mockito.ArgumentCaptor; +import org.springframework.test.util.ReflectionTestUtils; +import reactor.core.publisher.Mono; + +import java.math.BigDecimal; +import java.time.Duration; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * Group {@code persistence-roundtrip} (docs/API_PAYLOAD_TEST_PLAN.md §4.10, task T9.4): before a data source is stored, + * {@code DatasourceRepository.save} encrypts its connection config and converts it into the stored {@code Map} as + * {@code fromJsonMap(toJson(encryptedConfig))}. The real repository saves one data source per config of + * {@link #CONFIGS}, with mocked collaborators, and the {@code Map} handed to the store is pinned: the class of every + * value ({@link JavaValueWalker}) and the text the production mapper writes for it, in {@value #REPORT}. The SDK config + * classes are bound by their {@code buildFrom} from the forms of {@value #INPUT}, copies of forms of their T8.1 + * {@code config-binding} input fixtures (the test-jar carries only the contract helpers, not those fixtures); the JS + * plugin config holds the §4.6 representative input and a password parameter. + * + *

Key order: the stored map of a bean config (the SDK classes) has its members in the order the production mapper + * writes the bean, which the JSON contract leaves out (plan §1.2) and which, for getter-only properties such as + * {@code RestApiDatasourceConfig#getAuthType} and {@code #isOauth2InheritFromLogin}, the JVM does not fix (plan §9 + * O18): the pinned key order of these two flipped between two full builds. So their shape keeps the classes but not + * the key order, and their written text is compared with member order only reported ({@code CanonicalJson}). The JS + * plugin config is a map, whose stored key order is its own and is pinned. + * + *

Limits: encryption is a stand-in that marks the text it is given ({@value #ENCRYPTED_PREFIX}), since the real + * cipher is random; the plugin configs of the plugin modules are not on this module's classpath, and only the stored map + * is pinned, not its reading back ({@code DatasourceMetaInfoService.resolveDetailConfig}). + */ +class DatasourcePersistenceContractTest { + + static final String REPORT = "persistence-roundtrip/DatasourceRepository.storedConfigs.json"; + static final String INPUT = "persistence-roundtrip/DatasourceRepository.configs.input.json"; + static final String ENCRYPTED_PREFIX = "encrypted:"; + static final String SHAPE_KEY = "shape"; + static final String WRITTEN_KEY = "written"; + static final String CONFIG_CLASS_KEY = "configClass"; + static final String JS_PLUGIN_TYPE = "contractJsPlugin"; + static final Duration TIMEOUT = Duration.ofSeconds(20); + static final Map> CONFIGS = configs(); + + private static final GoldenJson GOLDEN = GoldenJson.forModule(); + + @BoundarySites({ + "lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/repository/DatasourceRepository.java#DatasourceRepository.encryptDataAndConvertToDataObject#toJson#1", + "lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/repository/DatasourceRepository.java#DatasourceRepository.encryptDataAndConvertToDataObject#fromJsonMap#1"}) + @Test + void storedConfigsAsPinned() { + Map report = new LinkedHashMap<>(); + CONFIGS.forEach((name, config) -> report.put(name, stored(config.get()))); + String actual = ConfigBinding.write(report); + System.out.println("[DatasourcePersistenceContractTest] " + CONFIGS.size() + " configs\n" + actual); + GOLDEN.assertJson(REPORT, actual); + } + + /** The detail config map {@code DatasourceRepository.save} hands to the store for {@code config}, or the error. */ + private static Map stored(DatasourceConnectionConfig config) { + DatasourceDORepository store = mock(DatasourceDORepository.class); + when(store.save(any(DatasourceDO.class))).thenReturn(Mono.empty()); + JsDatasourceHelper jsDatasourceHelper = mock(JsDatasourceHelper.class); + when(jsDatasourceHelper.fillPluginDefinition(any(Datasource.class))).thenReturn(Mono.empty()); + EncryptionService encryptionService = mock(EncryptionService.class); + when(encryptionService.encryptString(any())).thenAnswer(call -> ENCRYPTED_PREFIX + call.getArgument(0)); + DatasourceRepository repository = new DatasourceRepository(); + ReflectionTestUtils.setField(repository, "repository", store); + ReflectionTestUtils.setField(repository, "jsDatasourceHelper", jsDatasourceHelper); + ReflectionTestUtils.setField(repository, "encryptionService", encryptionService); + + Datasource datasource = new Datasource(); + datasource.setName("contract"); + datasource.setDetailConfig(config); + Map outcome = new LinkedHashMap<>(); + outcome.put(CONFIG_CLASS_KEY, config.getClass().getName()); + try { + repository.save(datasource).block(TIMEOUT); + ArgumentCaptor saved = ArgumentCaptor.forClass(DatasourceDO.class); + verify(store).save(saved.capture()); + Map detailConfig = saved.getValue().getDetailConfig(); + Map shape = JavaValueWalker.shape(detailConfig); + if (!(config instanceof Map)) { + // a bean config's stored map has the members in the mapper's write order (see the class comment) + shape.remove(JavaValueWalker.KEY_ORDER_KEY); + } + outcome.put(SHAPE_KEY, shape); + outcome.put(WRITTEN_KEY, QueryResults.written(detailConfig)); + } catch (RuntimeException e) { + outcome.put(QueryResults.ERROR_KEY, ConfigBinding.errorText(e)); + } + return outcome; + } + + private static Map> configs() { + Map> configs = new LinkedHashMap<>(); + configs.put("mysql", () -> MysqlDatasourceConfig.buildFrom(form("mysql"))); + configs.put("restApiBasicAuth", () -> RestApiDatasourceConfig.buildFrom(form("restApiBasicAuth"))); + configs.put("restApiBearerToken", () -> RestApiDatasourceConfig.buildFrom(form("restApiBearerToken"))); + configs.put("graphQLBasicAuth", () -> GraphQLDatasourceConfig.buildFrom(form("graphQLBasicAuth"))); + configs.put("jsPlugin", DatasourcePersistenceContractTest::jsConfig); + return configs; + } + + /** A JS plugin config: a password parameter of its definition, a dynamic password, and the §4.6 representative input. */ + private static DatasourceConnectionConfig jsConfig() { + JsDatasourceConnectionConfig config = new JsDatasourceConnectionConfig(); + config.put("apiKey", "s3crét \"quoted\""); + config.put("limit", 3_000_000_001L); + config.put("ratio", new BigDecimal("1.50")); + config.put("representative", RepresentativeInput.map()); + Map dynamicPassword = new LinkedHashMap<>(); + dynamicPassword.put("key", "token"); + dynamicPassword.put("type", "password"); + config.put("dynamicParamsDef", List.of(dynamicPassword)); + config.put("dynamicParamsConfig", new LinkedHashMap<>(Map.of("token", "t0ken"))); + config.setType(JS_PLUGIN_TYPE); + config.setDefinition(Map.of("dataSourceConfig", Map.of("params", List.of(Map.of("key", "apiKey", "type", "password"))))); + return config; + } + + /** One input form of {@value #INPUT}, read by the production mapper. */ + private static Map form(String name) { + return ConfigBinding.forms(GOLDEN.read(INPUT)).get(name); + } +} diff --git a/server/api-service/lowcoder-domain/src/test/java/org/lowcoder/domain/plugin/client/DatasourcePluginClientContractTest.java b/server/api-service/lowcoder-domain/src/test/java/org/lowcoder/domain/plugin/client/DatasourcePluginClientContractTest.java new file mode 100644 index 0000000000..e57acf4974 --- /dev/null +++ b/server/api-service/lowcoder-domain/src/test/java/org/lowcoder/domain/plugin/client/DatasourcePluginClientContractTest.java @@ -0,0 +1,233 @@ +package org.lowcoder.domain.plugin.client; + +import org.apache.commons.codec.binary.Hex; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.lowcoder.domain.encryption.EncryptionServiceImpl; +import org.lowcoder.domain.plugin.client.dto.GetPluginDynamicConfigRequestDTO; +import org.lowcoder.infra.js.NodeServerHelper; +import org.lowcoder.sdk.config.CommonConfig; +import org.lowcoder.sdk.config.CommonConfigHelper; +import org.lowcoder.sdk.config.dynamic.ConfigCenterForTest; +import org.lowcoder.sdk.contract.BoundarySites; +import org.lowcoder.sdk.contract.ConfigBinding; +import org.lowcoder.sdk.contract.FieldTree; +import org.lowcoder.sdk.contract.GoldenJson; +import org.lowcoder.sdk.contract.JavaValueWalker; +import org.lowcoder.sdk.contract.QueryResults; +import org.lowcoder.sdk.contract.RecordingHttpServer; +import org.lowcoder.sdk.contract.RecordingHttpServer.Request; +import org.lowcoder.sdk.contract.RecordingHttpServer.Response; +import org.lowcoder.sdk.contract.RepresentativeInput; +import org.springframework.security.crypto.encrypt.Encryptors; +import org.springframework.test.util.ReflectionTestUtils; + +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * Group {@code node-service} (docs/API_PAYLOAD_TEST_PLAN.md §4.10, task T9.2) and the node-service row of the §4.6 + * producer table: a real {@link DatasourcePluginClient} talks to a local server ({@link RecordingHttpServer}) standing + * in for the node service, once per answer variant of {@link #VARIANTS}: + *