This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 297085fc6251ae97cafd4724870770b2fe315dbd Author: Andrea Cosentino <anco...@gmail.com> AuthorDate: Fri May 9 11:12:07 2025 +0200 CAMEL-22013 - camel-api - Remove all usage of component.extension and the component.extension package content itself - Salesforce Signed-off-by: Andrea Cosentino <anco...@gmail.com> --- .../component/salesforce/SalesforceComponent.java | 2 - .../SalesforceComponentVerifierExtension.java | 118 ---------------- .../salesforce/SalesforceMetaDataExtension.java | 130 ----------------- ...lesforceComponentVerifierExtensionManualIT.java | 138 ------------------- .../SalesforceComponentVerifierExtensionTest.java | 98 ------------- .../SalesforceMetaDataExtensionTest.java | 153 --------------------- 6 files changed, 639 deletions(-) diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java index 9e2173b0532..babc4a41f1d 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java +++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java @@ -297,8 +297,6 @@ public class SalesforceComponent extends DefaultComponent implements SSLContextP public SalesforceComponent(CamelContext context) { super(context); - registerExtension(SalesforceComponentVerifierExtension::new); - registerExtension(SalesforceMetaDataExtension::new); } @Override diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtension.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtension.java deleted file mode 100644 index e96367c84cf..00000000000 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtension.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.component.salesforce; - -import java.util.Collections; -import java.util.Map; -import java.util.Optional; - -import org.apache.camel.component.extension.verifier.DefaultComponentVerifierExtension; -import org.apache.camel.component.extension.verifier.NoSuchOptionException; -import org.apache.camel.component.extension.verifier.OptionsGroup; -import org.apache.camel.component.extension.verifier.ResultBuilder; -import org.apache.camel.component.extension.verifier.ResultErrorBuilder; -import org.apache.camel.component.extension.verifier.ResultErrorHelper; -import org.apache.camel.component.salesforce.api.SalesforceException; -import org.apache.camel.component.salesforce.api.dto.RestError; - -public class SalesforceComponentVerifierExtension extends DefaultComponentVerifierExtension { - - SalesforceComponentVerifierExtension() { - super("salesforce"); - } - - // ********************************* - // Parameters validation - // ********************************* - - @Override - protected Result verifyParameters(Map<String, Object> parameters) { - // Validate mandatory component options, needed to be done here as these - // options are not properly marked as mandatory in the catalog. - // - // Validation rules are borrowed from SalesforceLoginConfig's validate - // method, which support 3 workflow: - // - // - OAuth Username/Password Flow - // - OAuth Refresh Token Flow: - // - OAuth JWT Flow - // - ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.PARAMETERS) - .errors(ResultErrorHelper - .requiresAny(parameters, - OptionsGroup.withName(AuthenticationType.USERNAME_PASSWORD).options("operationName", "clientId", - "clientSecret", - "userName", "password", "!refreshToken", "!keystore"), - OptionsGroup.withName(AuthenticationType.REFRESH_TOKEN).options("operationName", "clientId", - "clientSecret", - "refreshToken", "!password", "!keystore"), - OptionsGroup.withName(AuthenticationType.JWT).options("operationName", "clientId", "userName", - "keystore", - "!password", "!refreshToken"))); - - // Validate using the catalog - super.verifyParametersAgainstCatalog(builder, parameters); - - return builder.build(); - } - - // ********************************* - // Connectivity validation - // ********************************* - - @Override - protected Result verifyConnectivity(Map<String, Object> parameters) { - // Default is success - ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.CONNECTIVITY); - - try { - SalesforceClientTemplate.invoke(getCamelContext(), parameters, client -> { - client.getVersions(Collections.emptyMap(), - (response, headers, exception) -> processSalesforceException(builder, Optional.ofNullable(exception))); - return null; - }); - } catch (NoSuchOptionException e) { - builder.error(ResultErrorBuilder.withMissingOption(e.getOptionName()).build()); - } catch (Exception e) { - if (e.getCause() instanceof SalesforceException) { - processSalesforceException(builder, Optional.of((SalesforceException) e.getCause())); - } else { - builder.error(ResultErrorBuilder.withException(e).build()); - } - } - - return builder.build(); - } - - // ********************************* - // Helpers - // ********************************* - - private static void processSalesforceException(ResultBuilder builder, Optional<SalesforceException> exception) { - exception.ifPresent(e -> { - builder.error(ResultErrorBuilder.withException(e) - .detail(VerificationError.HttpAttribute.HTTP_CODE, e.getStatusCode()).build()); - - for (RestError error : e.getErrors()) { - builder.error(ResultErrorBuilder.withCode(VerificationError.StandardCode.GENERIC) - .description(error.getMessage()).parameterKeys(error.getFields()) - .detail("salesforce_code", error.getErrorCode()).build()); - } - }); - } - -} diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtension.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtension.java deleted file mode 100644 index 0c390039a27..00000000000 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtension.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.component.salesforce; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Collections; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.function.Consumer; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.module.jsonSchema.jakarta.JsonSchema; -import org.apache.camel.RuntimeCamelException; -import org.apache.camel.component.extension.metadata.AbstractMetaDataExtension; -import org.apache.camel.component.extension.metadata.MetaDataBuilder; -import org.apache.camel.component.salesforce.api.dto.GlobalObjects; -import org.apache.camel.component.salesforce.api.dto.SObjectDescription; -import org.apache.camel.component.salesforce.api.utils.JsonUtils; -import org.apache.camel.component.salesforce.internal.client.RestClient; -import org.apache.camel.component.salesforce.internal.client.RestClient.ResponseCallback; - -public class SalesforceMetaDataExtension extends AbstractMetaDataExtension { - - @FunctionalInterface - interface SchemaMapper { - JsonSchema map(InputStream stream) throws IOException; - } - - private static final ObjectMapper MAPPER = JsonUtils.createObjectMapper(); - - @Override - public Optional<MetaData> meta(final Map<String, Object> parameters) { - final JsonSchema schema = schemaFor(parameters); - - final MetaData metaData = MetaDataBuilder.on(getCamelContext())// - .withAttribute(MetaData.CONTENT_TYPE, "application/schema+json")// - .withAttribute(MetaData.JAVA_TYPE, JsonNode.class)// - .withPayload(schema).build(); - - return Optional.ofNullable(metaData); - } - - JsonSchema allObjectsSchema(final Map<String, Object> parameters) throws Exception { - return SalesforceClientTemplate.invoke(getCamelContext(), parameters, client -> fetchAllObjectsSchema(client)); - } - - JsonSchema schemaFor(final Map<String, Object> parameters) { - try { - if (parameters.containsKey(SalesforceEndpointConfig.SOBJECT_NAME)) { - return singleObjectSchema(parameters); - } - - return allObjectsSchema(parameters); - } catch (final Exception e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } - - } - - JsonSchema singleObjectSchema(final Map<String, Object> parameters) throws Exception { - return SalesforceClientTemplate.invoke(getCamelContext(), parameters, - client -> fetchSingleObjectSchema(client, (String) parameters.get(SalesforceEndpointConfig.SOBJECT_NAME))); - } - - static JsonSchema fetch(final Consumer<ResponseCallback> restMethod, final SchemaMapper callback) { - final CompletableFuture<JsonSchema> ret = new CompletableFuture<>(); - - restMethod.accept((response, headers, exception) -> { - if (exception != null) { - ret.completeExceptionally(exception); - } else { - try (final InputStream is = response) { - ret.complete(callback.map(is)); - } catch (final IOException e) { - ret.completeExceptionally(e); - } - } - }); - - try { - return ret.get(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } catch (ExecutionException e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } - } - - static JsonSchema fetchAllObjectsSchema(final RestClient client) { - return fetch(callback -> client.getGlobalObjects(Collections.emptyMap(), callback), - SalesforceMetaDataExtension::mapAllObjectsSchema); - } - - static JsonSchema fetchSingleObjectSchema(final RestClient client, final String objectName) { - return fetch(callback -> client.getDescription(objectName, Collections.emptyMap(), callback), - SalesforceMetaDataExtension::mapSingleObjectSchema); - } - - static JsonSchema mapAllObjectsSchema(final InputStream stream) throws IOException { - final GlobalObjects globalObjects = MAPPER.readerFor(GlobalObjects.class).readValue(stream); - - return JsonUtils.getGlobalObjectsJsonSchemaAsSchema(globalObjects); - } - - static JsonSchema mapSingleObjectSchema(final InputStream stream) throws IOException { - final SObjectDescription description = MAPPER.readerFor(SObjectDescription.class).readValue(stream); - - return JsonUtils.getSObjectJsonSchemaAsSchema(description, true); - } - -} diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtensionManualIT.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtensionManualIT.java deleted file mode 100644 index 86c68ea940b..00000000000 --- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtensionManualIT.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.component.salesforce; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.Component; -import org.apache.camel.component.extension.ComponentVerifierExtension; -import org.apache.camel.component.salesforce.api.SalesforceException; -import org.apache.camel.test.junit5.CamelTestSupport; -import org.apache.camel.util.ObjectHelper; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class SalesforceComponentVerifierExtensionManualIT extends CamelTestSupport { - - @Override - public boolean isUseRouteBuilder() { - return false; - } - - // ********************************* - // Helpers - // ********************************* - - protected Map<String, Object> getParameters() { - SalesforceLoginConfig loginConfig = LoginConfigHelper.getLoginConfig(); - - HashMap<String, Object> parameters = new HashMap<>(); - parameters.put("clientId", loginConfig.getClientId()); - parameters.put("clientSecret", loginConfig.getClientSecret()); - parameters.put("userName", loginConfig.getUserName()); - parameters.put("password", loginConfig.getPassword()); - parameters.put("loginUrl", loginConfig.getLoginUrl()); - - return parameters; - } - - public static String getSystemPropertyOrEnvVar(String systemProperty) { - String answer = System.getProperty(systemProperty); - if (ObjectHelper.isEmpty(answer)) { - String envProperty = systemProperty.toUpperCase().replaceAll("[.-]", "_"); - answer = System.getenv(envProperty); - } - - return answer; - } - - protected ComponentVerifierExtension getExtension() { - Component component = context().getComponent("salesforce"); - ComponentVerifierExtension verifier - = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new); - - return verifier; - } - - // ********************************* - // Connectivity validation - // ********************************* - - @Test - public void testConnectivity() { - Map<String, Object> parameters = getParameters(); - ComponentVerifierExtension.Result result - = getExtension().verify(ComponentVerifierExtension.Scope.CONNECTIVITY, parameters); - - assertEquals(ComponentVerifierExtension.Result.Status.OK, result.getStatus()); - } - - @Test - public void testConnectivityWithWrongUserName() { - Map<String, Object> parameters = getParameters(); - parameters.put("userName", "not-a-salesforce-user"); - - ComponentVerifierExtension.Result result - = getExtension().verify(ComponentVerifierExtension.Scope.CONNECTIVITY, parameters); - - assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus()); - assertEquals(2, result.getErrors().size()); - - // Exception - assertEquals(ComponentVerifierExtension.VerificationError.StandardCode.EXCEPTION, result.getErrors().get(0).getCode()); - assertNotNull(result.getErrors().get(0).getDetails() - .get(ComponentVerifierExtension.VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE)); - assertTrue(result.getErrors().get(0).getDetails() - .get(ComponentVerifierExtension.VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE) instanceof SalesforceException); - assertEquals(400, result.getErrors().get(0).getDetails() - .get(ComponentVerifierExtension.VerificationError.HttpAttribute.HTTP_CODE)); - - // Salesforce Error - assertEquals("invalid_grant", result.getErrors().get(1).getDetail("salesforce_code")); - } - - @Test - public void testConnectivityWithWrongSecrets() { - Map<String, Object> parameters = getParameters(); - parameters.put("clientId", "wrong-client-id"); - parameters.put("clientSecret", "wrong-client-secret"); - - ComponentVerifierExtension.Result result - = getExtension().verify(ComponentVerifierExtension.Scope.CONNECTIVITY, parameters); - - assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus()); - - assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus()); - assertEquals(2, result.getErrors().size()); - - // Exception - assertEquals(ComponentVerifierExtension.VerificationError.StandardCode.EXCEPTION, result.getErrors().get(0).getCode()); - assertNotNull(result.getErrors().get(0).getDetails() - .get(ComponentVerifierExtension.VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE)); - assertTrue(result.getErrors().get(0).getDetails() - .get(ComponentVerifierExtension.VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE) instanceof SalesforceException); - assertEquals(400, result.getErrors().get(0).getDetails() - .get(ComponentVerifierExtension.VerificationError.HttpAttribute.HTTP_CODE)); - - // Salesforce Error - assertEquals("invalid_client_id", result.getErrors().get(1).getDetail("salesforce_code")); - } -} diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtensionTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtensionTest.java deleted file mode 100644 index a9a8e71e336..00000000000 --- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtensionTest.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.component.salesforce; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.Component; -import org.apache.camel.component.extension.ComponentVerifierExtension; -import org.apache.camel.test.junit5.CamelTestSupport; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class SalesforceComponentVerifierExtensionTest extends CamelTestSupport { - - @Override - public boolean isUseRouteBuilder() { - return false; - } - - protected ComponentVerifierExtension getExtension() { - Component component = context().getComponent("salesforce"); - ComponentVerifierExtension verifier - = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new); - - return verifier; - } - - // ********************************* - // Parameters validation - // ********************************* - - @Test - public void testUsernamePasswordParameters() { - HashMap<String, Object> parameters = new HashMap<>(); - parameters.put("operationName", "subscribe"); - parameters.put("clientId", "clientId"); - parameters.put("clientSecret", "clientSecret"); - parameters.put("userName", "userName"); - parameters.put("password", "password"); - - ComponentVerifierExtension.Result result - = getExtension().verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters); - - assertEquals(ComponentVerifierExtension.Result.Status.OK, result.getStatus()); - } - - @Test - public void testRefreshTokenParameters() { - Map<String, Object> parameters = new HashMap<>(); - parameters.put("operationName", "subscribe"); - parameters.put("clientId", "clientId"); - parameters.put("clientSecret", "clientSecret"); - parameters.put("refreshToken", "refreshToken"); - - ComponentVerifierExtension.Result result - = getExtension().verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters); - - assertEquals(ComponentVerifierExtension.Result.Status.OK, result.getStatus()); - } - - @Test - public void testWrongParameters() { - HashMap<String, Object> parameters = new HashMap<>(); - parameters.put("operationName", "subscribe"); - parameters.put("clientId", "clientId"); - parameters.put("clientSecret", "clientSecret"); - parameters.put("password", "password"); - - ComponentVerifierExtension.Result result - = getExtension().verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters); - - assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus()); - assertEquals(3, result.getErrors().size()); - - assertEquals(ComponentVerifierExtension.VerificationError.StandardCode.ILLEGAL_PARAMETER_GROUP_COMBINATION, - result.getErrors().get(0).getCode()); - assertEquals(ComponentVerifierExtension.VerificationError.StandardCode.ILLEGAL_PARAMETER_GROUP_COMBINATION, - result.getErrors().get(1).getCode()); - assertEquals(ComponentVerifierExtension.VerificationError.StandardCode.ILLEGAL_PARAMETER_GROUP_COMBINATION, - result.getErrors().get(2).getCode()); - } -} diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtensionTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtensionTest.java deleted file mode 100644 index e893c396b42..00000000000 --- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtensionTest.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.component.salesforce; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.function.Predicate; -import java.util.stream.StreamSupport; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.module.jsonSchema.jakarta.JsonSchema; -import com.fasterxml.jackson.module.jsonSchema.jakarta.types.ObjectSchema; -import org.apache.camel.component.extension.MetaDataExtension; -import org.apache.camel.component.extension.MetaDataExtension.MetaData; -import org.apache.camel.component.salesforce.api.utils.JsonUtils; -import org.apache.camel.component.salesforce.internal.client.RestClient; -import org.apache.camel.component.salesforce.internal.client.RestClient.ResponseCallback; -import org.apache.camel.impl.DefaultCamelContext; -import org.junit.jupiter.api.Test; -import org.mockito.stubbing.Answer; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; - -public class SalesforceMetaDataExtensionTest { - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static final Class<Map<String, List<String>>> HEADERS_TYPE = (Class) Map.class; - - final SalesforceComponent component = new SalesforceComponent(); - - final MetaDataExtension metadata; - - final RestClient restClient = mock(RestClient.class); - - public SalesforceMetaDataExtensionTest() { - component.setCamelContext(new DefaultCamelContext()); - SalesforceClientTemplate.restClientSupplier = (c, p) -> restClient; - metadata = component.getExtension(MetaDataExtension.class).get(); - } - - @Test - public void componentShouldProvideMetadataExtension() { - assertThat(component.getExtension(MetaDataExtension.class)).isPresent(); - } - - @Test - public void shouldProvideSalesforceObjectFields() throws IOException { - final Optional<MetaData> maybeMeta; - try (InputStream stream = resource("/objectDescription.json")) { - doAnswer(provideStreamToCallback(stream)).when(restClient).getDescription(eq("Account"), any(HEADERS_TYPE), - any(ResponseCallback.class)); - maybeMeta = metadata.meta(Collections.singletonMap(SalesforceEndpointConfig.SOBJECT_NAME, "Account")); - } - - assertThat(maybeMeta).isPresent(); - - final MetaData meta = maybeMeta.get(); - assertThat(meta.getAttribute(MetaDataExtension.MetaData.JAVA_TYPE)).isEqualTo(JsonNode.class); - assertThat(meta.getAttribute(MetaDataExtension.MetaData.CONTENT_TYPE)).isEqualTo("application/schema+json"); - - final ObjectSchema payload = meta.getPayload(ObjectSchema.class); - assertThat(payload).isNotNull(); - - assertThat(schemaFor(payload, "Merchandise__c")).isPresent(); - assertThat(schemaFor(payload, "QueryRecordsMerchandise__c")).isPresent(); - } - - @Test - public void shouldProvideSalesforceObjectTypes() throws IOException { - final Optional<MetaData> maybeMeta; - try (InputStream stream = resource("/globalObjects.json")) { - doAnswer(provideStreamToCallback(stream)).when(restClient).getGlobalObjects(any(HEADERS_TYPE), - any(ResponseCallback.class)); - maybeMeta = metadata.meta(Collections.emptyMap()); - } - - assertThat(maybeMeta).isPresent(); - - final MetaData meta = maybeMeta.get(); - assertThat(meta.getAttribute(MetaDataExtension.MetaData.JAVA_TYPE)).isEqualTo(JsonNode.class); - assertThat(meta.getAttribute(MetaDataExtension.MetaData.CONTENT_TYPE)).isEqualTo("application/schema+json"); - - final ObjectSchema payload = meta.getPayload(ObjectSchema.class); - assertThat(payload).isNotNull(); - - @SuppressWarnings({ "unchecked", "rawtypes" }) - final Set<JsonSchema> oneOf = (Set) payload.getOneOf(); - assertThat(oneOf).hasSize(4); - - assertThat(schemaFor(payload, "AcceptedEventRelation")).isPresent() - .hasValueSatisfying(schema -> assertThat(schema.getTitle()).isEqualTo("Accepted Event Relation")); - assertThat(schemaFor(payload, "Account")).isPresent() - .hasValueSatisfying(schema -> assertThat(schema.getTitle()).isEqualTo("Account")); - assertThat(schemaFor(payload, "AccountCleanInfo")).isPresent() - .hasValueSatisfying(schema -> assertThat(schema.getTitle()).isEqualTo("Account Clean Info")); - assertThat(schemaFor(payload, "AccountContactRole")).isPresent() - .hasValueSatisfying(schema -> assertThat(schema.getTitle()).isEqualTo("Account Contact Role")); - } - - static Answer<Void> provideStreamToCallback(final InputStream stream) { - return invocation -> { - final ResponseCallback callback = (ResponseCallback) Arrays.stream(invocation.getArguments()) - .filter(ResponseCallback.class::isInstance).findFirst().get(); - callback.onResponse(stream, Collections.emptyMap(), null); - - return null; - }; - } - - static InputStream resource(final String path) { - return SalesforceMetaDataExtensionTest.class.getResourceAsStream(path); - } - - static Optional<ObjectSchema> schemaFor(final ObjectSchema schema, final String sObjectName) { - @SuppressWarnings({ "unchecked", "rawtypes" }) - final Set<ObjectSchema> oneOf = (Set) schema.getOneOf(); - - return StreamSupport.stream(oneOf.spliterator(), false) - .filter(idMatches(JsonUtils.DEFAULT_ID_PREFIX + ":" + sObjectName)).findAny(); - } - - static String valueAt(final JsonNode payload, final int idx, final String name) { - return payload.get(idx).get(name).asText(); - } - - private static Predicate<JsonSchema> idMatches(final String wantedId) { - return schema -> wantedId.equals(schema.getId()); - } -}