/*
* 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.core.SObject;
import com.palominolabs.crm.sf.soap.jaxwsstub.partner.StatusCodeType;
import com.palominolabs.crm.sf.testutil.ConnectionTestSfUserProps;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static com.palominolabs.crm.sf.soap.TestConnectionUtils.getConnectionBundle;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class CampaignWeirdnessTest {
private PartnerConnection conn;
private static final Id CAMPAIGN_ID_FOR_CAMPAIGN_MEMBER_TESTS = new Id("70150000000TNY6");
/**
* campaign with no members so that statuses can be freely manipulated
*/
private static final Id CAMPAIGN_ID_FOR_CAMPAIGN_MEMBER_STATUS_TESTS = new Id("701A000000017Od");
private static final String USER =
ConnectionTestSfUserProps.getPropVal("com.palominolabs.test.crm.sf.conn.upsertUser");
private static final String PASSWORD =
ConnectionTestSfUserProps.getPropVal("com.palominolabs.test.crm.sf.conn.upsertPassword");
@Before
public void setUp() throws ApiException {
this.conn = getConnectionBundle(USER, PASSWORD).getPartnerConnection();
deleteMembersForCampaign(CAMPAIGN_ID_FOR_CAMPAIGN_MEMBER_TESTS, this.conn);
}
@Test
public void testDeletingCampaignMemberMakesItVanish() throws ApiException {
Id campaignId = CAMPAIGN_ID_FOR_CAMPAIGN_MEMBER_TESTS;
deleteMembersForCampaign(campaignId, this.conn);
// get an arbitrary contact and create a membership
PartnerQueryResult contactQR = this.conn.query("SELECT Id from Contact LIMIT 1");
Id contactId = contactQR.getSObjects().get(0).getId();
Id cmId = createCampaignMembership(campaignId, contactId, this.conn, "ContactId");
PartnerQueryResult queryResultBeforeDelete =
this.conn.queryAll("SELECT IsDeleted FROM CampaignMember WHERE Id = '" + cmId + "'");
assertEquals("false", queryResultBeforeDelete.getSObjects().get(0).getField("IsDeleted"));
deleteMembersForCampaign(campaignId, this.conn);
PartnerQueryResult queryResultAfterDelete =
this.conn.queryAll("SELECT IsDeleted FROM CampaignMember WHERE Id = '" + cmId + "'");
assertEquals(0, queryResultAfterDelete.getSObjects().size());
}
@Test
public void testUpsertUpdateInCompoundKeyStyleFails() throws ApiException {
// get an arbitrary contact and create a membership
PartnerQueryResult contactQR = this.conn.query("SELECT Id from Contact LIMIT 1");
Id contactId = contactQR.getSObjects().get(0).getId();
createCampaignMembership(CAMPAIGN_ID_FOR_CAMPAIGN_MEMBER_TESTS, contactId, this.conn, "ContactId");
// record now exists, try to update it
SObject cMemberToUpsert = PartnerSObjectImpl.getNew("CampaignMember");
cMemberToUpsert.setField("ContactId", contactId.toString());
cMemberToUpsert.setField("CampaignId", CAMPAIGN_ID_FOR_CAMPAIGN_MEMBER_TESTS.toString());
cMemberToUpsert.setField("Status", "Responded");
List<UpsertResult> upsertResultList = this.conn.upsert("Id", Arrays.asList(cMemberToUpsert));
UpsertResult upsertResult = upsertResultList.get(0);
assertFalse(upsertResult.isSuccess());
assertEquals(
"[{statusCode: DUPLICATE___VALUE, message: This entity is already a member of this campaign, fields: []}]",
upsertResult.getErrors().toString());
}
@Test
public void testUpsertInUpdateStyleWillUpdateStatusOfExistingCampaignMember() throws ApiException {
Id campaignId = CAMPAIGN_ID_FOR_CAMPAIGN_MEMBER_TESTS;
deleteMembersForCampaign(campaignId, this.conn);
// get an arbitrary contact and create a membership
PartnerQueryResult contactQR = this.conn.query("SELECT Id from Contact LIMIT 1");
Id contactId = contactQR.getSObjects().get(0).getId();
Id cmId = createCampaignMembership(campaignId, contactId, this.conn, "ContactId");
List<SObject> cMembers =
this.conn.retrieve("CampaignMember", Arrays.asList(cmId),
Arrays.asList("Id", "CampaignId", "ContactId", "Status")
);
SObject retrievedCMember = cMembers.get(0);
// assert default status is there
assertEquals("Sent", retrievedCMember.getField("Status"));
SObject cMemberToUpsert = PartnerSObjectImpl.getNewWithId("CampaignMember", cmId);
cMemberToUpsert.setField("Status", "Responded");
List<UpsertResult> upsertResultList = this.conn.upsert("Id", Arrays.asList(cMemberToUpsert));
UpsertResult upsertResult = upsertResultList.get(0);
assertTrue(upsertResult.getErrors().toString(), upsertResult.isSuccess());
assertFalse(upsertResult.isCreated());
}
@Test
public void testUpsertInsertsNewCampaignMember() throws ApiException {
// get an arbitrary contact and create a membership
PartnerQueryResult contactQR = this.conn.query("SELECT Id from Contact LIMIT 1");
Id contactId = contactQR.getSObjects().get(0).getId();
// record does not exist, try to create it
SObject cMemberToUpsert = PartnerSObjectImpl.getNew("CampaignMember");
cMemberToUpsert.setField("ContactId", contactId.toString());
cMemberToUpsert.setField("CampaignId", CAMPAIGN_ID_FOR_CAMPAIGN_MEMBER_TESTS.toString());
List<UpsertResult> upsertResultList = this.conn.upsert("Id", Arrays.asList(cMemberToUpsert));
UpsertResult upsertResult = upsertResultList.get(0);
assertTrue(upsertResult.isSuccess());
List<SObject> cMembers = this.conn
.retrieve("CampaignMember", Arrays.asList(upsertResult.getId()),
Arrays.asList("Id", "CampaignId", "ContactId", "Status")
);
SObject retrievedCMember = cMembers.get(0);
// assert default status is there
assertEquals("Sent", retrievedCMember.getField("Status"));
}
@Test
public void testUpsertInsertsNewCampaignMemberWithStatus() throws ApiException {
// get an arbitrary contact and create a membership
PartnerQueryResult contactQR = this.conn.query("SELECT Id from Contact LIMIT 1");
Id contactId = contactQR.getSObjects().get(0).getId();
// record does not exist, try to create it
SObject cMemberToUpsert = PartnerSObjectImpl.getNew("CampaignMember");
cMemberToUpsert.setField("ContactId", contactId.toString());
cMemberToUpsert.setField("CampaignId", CAMPAIGN_ID_FOR_CAMPAIGN_MEMBER_TESTS.toString());
cMemberToUpsert.setField("Status", "Responded");
List<UpsertResult> upsertResultList = this.conn.upsert("Id", Arrays.asList(cMemberToUpsert));
UpsertResult upsertResult = upsertResultList.get(0);
assertTrue(upsertResult.isSuccess());
List<SObject> cMembers = this.conn
.retrieve("CampaignMember", Arrays.asList(upsertResult.getId()),
Arrays.asList("Id", "CampaignId", "ContactId", "Status")
);
SObject retrievedCMember = cMembers.get(0);
// assert default status is there
assertEquals("Responded", retrievedCMember.getField("Status"));
}
@Test
public void testCreateDuplicateCampaignMemberFails() throws ApiException {
PartnerQueryResult contactQR = this.conn.query("SELECT Id from Contact LIMIT 1");
Id contactId = contactQR.getSObjects().get(0).getId();
createCampaignMembership(CAMPAIGN_ID_FOR_CAMPAIGN_MEMBER_TESTS, contactId, this.conn, "ContactId");
// now create the dupe
SObject cMemberToCreate = PartnerSObjectImpl.getNew("CampaignMember");
cMemberToCreate.setField("ContactId", contactId.toString());
cMemberToCreate.setField("CampaignId", CAMPAIGN_ID_FOR_CAMPAIGN_MEMBER_TESTS.toString());
List<SaveResult> createResults = this.conn.create(Arrays.asList(cMemberToCreate));
SaveResult createResult = createResults.get(0);
assertFalse(createResult.isSuccess());
assertEquals(1, createResult.getErrors().size());
PartnerApiError error = createResult.getErrors().get(0);
assertEquals("This entity is already a member of this campaign", error.getMessage());
assertEquals(StatusCodeType.DUPLICATE___VALUE, error.getStatusCode());
assertEquals(Collections.<String>emptyList(), error.getFields());
}
/**
* @param campaignId the campaign to put the member in
* @param memberId the contact or lead id to put in the campaign
* @param conn the connection to use
* @param memberIdField either "LeadId" or "ContactId"
*
* @return the campaign member id
*
* @throws ApiException if the creation fails
*/
public static Id createCampaignMembership(Id campaignId, Id memberId, PartnerConnection conn, String memberIdField)
throws ApiException {
SObject cMemberToCreate = PartnerSObjectImpl.getNew("CampaignMember");
cMemberToCreate.setField(memberIdField, memberId.toString());
cMemberToCreate.setField("CampaignId", campaignId.toString());
List<SaveResult> createResults = conn.create(Arrays.asList(cMemberToCreate));
SaveResult createResult = createResults.get(0);
assertTrue(createResult.getErrors().toString(), createResult.isSuccess());
return createResult.getId();
}
public static void deleteMembersForCampaign(Id campaignId, PartnerConnection conn) throws ApiException {
// delete all campaign members to ensure it's clean
PartnerQueryResult cmIdQueryResult =
conn.query("SELECT Id from CampaignMember where CampaignId = '" + campaignId.toString() + "'");
if (!cmIdQueryResult.getSObjects().isEmpty()) {
List<Id> idsToDelete = new ArrayList<Id>();
for (SObject sObject : cmIdQueryResult.getSObjects()) {
idsToDelete.add(sObject.getId());
}
List<DeleteResult> deleteResults = conn.delete(idsToDelete);
for (DeleteResult deleteResult : deleteResults) {
assertTrue(deleteResult.isSuccess());
}
// don't need to empty recycle bin since campaign members just vanish when you delete them
}
}
}