/* * Copyright © 2013. Palomino Labs (http://palominolabs.com) * * Licensed 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 com.palominolabs.crm.sf.soap; import com.palominolabs.crm.sf.core.Id; import com.palominolabs.crm.sf.soap.jaxwsstub.apex.ApexPortType; import com.palominolabs.crm.sf.soap.jaxwsstub.metadata.MetadataPortType; import com.palominolabs.crm.sf.soap.jaxwsstub.partner.ExceptionCode; import com.palominolabs.crm.sf.soap.jaxwsstub.partner.Soap; import com.palominolabs.crm.sf.testutil.ConnectionTestSfUserProps; import com.palominolabs.crm.sf.testutil.TestMetricRegistry; import com.sun.xml.ws.developer.WSBindingProvider; import org.junit.Before; import org.junit.Test; import javax.xml.ws.BindingProvider; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; public class BindingConfigurerTest { private static final String DEFAULT_USER = ConnectionTestSfUserProps.getPropVal("com.palominolabs.test.crm.sf.util.sfLogin"); private static final String DEFAULT_PASSWORD = ConnectionTestSfUserProps.getPropVal("com.palominolabs.test.crm.sf.util.sfPassword"); private final CallSemaphore semaphore = new CallSemaphore(); private final PartnerBindingCache partnerBindingCache = new PartnerBindingCache(); private final MetadataBindingCache metadataBindingCache = new MetadataBindingCache(); private final ApexBindingCache apexBindingCache = new ApexBindingCache(); private BindingConfigurer configurer; @Before public void setUp() { this.semaphore.setMaxPermits(1); this.configurer = new BindingConfigurer(PartnerConnectionImplTest.TEST_PARTNER_KEY, TestMetricRegistry.METRIC_REGISTRY); } @Test public void testBadPasswordThrowsConnectionException() { String pw = DEFAULT_PASSWORD + "x"; try { this.configurer .loginAndGetBindingConfigData(DEFAULT_USER, pw, partnerBindingCache.getBinding(), this.semaphore, false); fail(); } catch (ApiException e) { assertEquals(ExceptionCode.INVALID___LOGIN, e.getApiFaultCode()); assertEquals("Invalid username, password, security token; or user locked out.", e.getApiFaultMessage()); assertEquals("Bad credentials for user '" + DEFAULT_USER + "'", e.getMessage()); } } @Test public void testBadUserThrowsConnectionException() { String user = DEFAULT_USER + "x"; try { this.configurer.loginAndGetBindingConfigData(user, DEFAULT_PASSWORD, partnerBindingCache.getBinding(), this.semaphore, false); fail(); } catch (ApiException e) { assertEquals(ExceptionCode.INVALID___LOGIN, e.getApiFaultCode()); assertEquals("Invalid username, password, security token; or user locked out.", e.getApiFaultMessage()); assertEquals("Bad credentials for user '" + DEFAULT_USER + "x'", e.getMessage()); } } @Test public void testLoginAndGetBindingConfigData() throws ApiException { final BindingConfig data = this.configurer .loginAndGetBindingConfigData(DEFAULT_USER, DEFAULT_PASSWORD, partnerBindingCache.getBinding(), this.semaphore, false); assertEquals("00D50000000Ixbv", data.getOrgId().toString()); assertEquals( "https://na3.salesforce.com/services/Soap/u/" + ApiVersion.API_VERSION_STRING + "/00D50000000Ixbv", data.getPartnerServerUrl()); assertEquals( "https://na3.salesforce.com/services/Soap/m/" + ApiVersion.API_VERSION_STRING + "/00D50000000Ixbv", data.getMetadataServerUrl()); assertEquals("https://na3.salesforce.com/services/Soap/s/" + ApiVersion.API_VERSION_STRING, data.getApexServerUrl()); assertNotNull(data.getSessionId()); assertEquals(DEFAULT_USER, data.getUsername()); } @Test public void testConfigureMetadataBindingSetsEndpoint() { final MetadataPortType binding = this.metadataBindingCache.getBinding(); assertEquals("https://na3.salesforce.com/services/Soap/m/" + ApiVersion.API_VERSION_STRING, getEndpoint(binding)); final String mdEndpt = "http://metadata.com"; this.configurer.configureMetadataBinding(binding, new BindingConfig(new Id("012345678901234"), "session", "endpt", mdEndpt, "user")); assertEquals(mdEndpt, getEndpoint(binding)); } @Test public void testConfigurePartnerBindingSetsEndpoint() { final Soap binding = this.partnerBindingCache.getBinding(); assertEquals("https://login.salesforce.com/services/Soap/u/" + ApiVersion.API_VERSION_STRING, getEndpoint(binding)); final String partnerServerUrl = "http://partner.com"; this.configurer.configurePartnerBinding(binding, new BindingConfig(new Id("012345678901234"), "session", partnerServerUrl, "http://metadata.com", "user")); assertEquals(partnerServerUrl, getEndpoint(binding)); } @Test public void testConfigureApexBindingSetsEndpoint() { final ApexPortType binding = this.apexBindingCache.getBinding(); assertEquals("https://na3.salesforce.com/services/Soap/s/" + ApiVersion.API_VERSION_STRING, getEndpoint(binding)); this.configurer.configureApexBinding(binding, new BindingConfig(new Id("012345678901234"), "session", "http://partner.com", "http://metadata.com", "user")); assertEquals("https://metadata.com/services/Soap/s/" + ApiVersion.API_VERSION_STRING, getEndpoint(binding)); } private String getEndpoint(MetadataPortType binding) { return getEndpoint((WSBindingProvider) binding); } private String getEndpoint(Soap binding) { return getEndpoint((WSBindingProvider) binding); } private String getEndpoint(ApexPortType binding) { return getEndpoint((WSBindingProvider) binding); } String getEndpoint(WSBindingProvider provider) { return (String) provider.getRequestContext().get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY); } }