function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
William Roach-BarretteWilliam Roach-Barrette 

Not using ID to insert? Insert failed: FIELD_CUSTOM_VALIDATION_EXCEPTION, Please provide either an Email Address or Phone Number: []

I am having trouble understanding this error and how its being caused. I am trying to pull user data in the form of JSON from an external website then Im trying to store that data in the contacts record. I know that every JSON string has a name, email and contact ID present. So how is it I can get an error like this? 
System.DmlException: Insert failed. First exception on row 0; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION, Please provide either an Email Address or Phone Number: []

For testing purposes I had to create a mock response by implimenting the HTTPMockUp class, you can see my code below. Can I add some kind of logic check that would keep this from happening? im really close to passing all my orgs tests. 

Wrapper for JSON:
 
public class GDPRWrapper{

    public GDPRWrapper(List<GDPRData> templst){
            GDPRList = templst;
        }
    public List<GDPRData> GDPRList {get; set;}

    public class GDPRData {

        public Integer gdprId {get; set;}  //26636
        public String firstName {get; set;}
        public String lastName {get; set;}
        public String email {get; set;}
        public String phone {get; set;}
        public String accountName {get; set;}
        public String contactId {get; set;}    //AA111222333AAAe
        public String emailHash {get; set;}    //78fcb5ad502033c46d35abcecb3615bd92757fb0451485a19b27b7515f6d82d0
        public String createDate {get; set;}   //2018-05-17T15:19:37.000+0000
        public String responseDate {get; set;} //2018-05-21T10:38:53.000+0000
        public String notifyDate {get; set;}
        public boolean marketing {get; set;}
        public boolean security {get; set;}
        public boolean support {get; set;}
        public boolean contactPhone {get; set;}
        public boolean contactEmail {get; set;}
        public boolean contactOther {get; set;}
        public boolean invalid {get; set;}
        
        
    }
   public static List<GDPRData> parse(httpResponse json){
        return (List<GDPRData>) System.JSON.deserialize(json.getBody(), List<GDPRData>.class);
    }
 
    
}

Callout Class and updater:
 
public class JSONDeserialize {

    public GDPRWrapper wrapper {get;set;}
    public HttpResponse httpResponse {get;set;}
   
    
    
    @future(callout=true)
    public static void deserialize() {
        GDPRWrapper wrapper;
        HttpResponse httpResponse = new HttpResponse();
        
        Http h = new Http();
        HttpRequest request = new HttpRequest();
        
        request.setEndPoint('https://private');
        Blob headerValue = Blob.valueOf('d18849ea4155:d83ce6ef3dbe');
        String authorizationHeader = ('Basic ' + EncodingUtil.base64Encode(headerValue));
        
        
        request.setHeader('Authorization', authorizationHeader);
        request.setMethod('GET');
        HttpResponse response = new HttpResponse();
        try{
        response = h.send(request);
        
        
        System.debug('JSON RESPONSE: ' + response);
        List<GDPRWrapper.GDPRData> obj = GDPRWrapper.parse(response);
        wrapper = new GDPRWrapper(obj);
        
        System.assert(wrapper.GDPRList!=null);
        updateData(wrapper);
        }catch(JSONException j){
                    System.debug('An unexpected error has occured: ' + j.getMessage());
                }
              
        
      }
      
      
      public static void UpdateData(GDPRWrapper wrapper){
        List<Contact> contactPref = new List<Contact>();
        List<Contact> newContacts = new List<Contact>();
          
        for(Integer i = 0; i < wrapper.GDPRList.size(); i ++){
        if(wrapper.GDPRList[i].contactId.length() > 3){
                if(wrapper.GDPRList[i].contactId.subString(0,3) == '003'){
                    Contact toInsert = new Contact();
                    toInsert.firstName = wrapper.GDPRList[i].firstName;
                    toInsert.lastName = wrapper.GDPRList[i].lastName;
                    toInsert.email = wrapper.GDPRList[i].email;
                    toInsert.Email_Hash__c = wrapper.GDPRList[i].emailHash;
                    toInsert.Id = wrapper.GDPRList[i].contactId;
                    toInsert.Sales_and_Marketing__c = wrapper.GDPRList[i].marketing;
                    toInsert.Critical_Security_Notes__c = wrapper.GDPRList[i].security;
                    toInsert.Product_Information__c = wrapper.GDPRList[i].support;
                    toInsert.Contact_Via_Text__c = wrapper.GDPRList[i].contactPhone;
                    toInsert.Contact_Via_Email__c = wrapper.GDPRList[i].contactEmail;
                    contactPref.add(toInsert);
           
                }
            }
        else{
             Contact toInsert = new Contact();
             toInsert.firstName = wrapper.GDPRList[i].firstName;
             toInsert.lastName = wrapper.GDPRList[i].lastName;
             toInsert.email = wrapper.GDPRList[i].email;
             toInsert.Email_Hash__c = wrapper.GDPRList[i].emailHash;
             
             toInsert.Sales_and_Marketing__c = wrapper.GDPRList[i].marketing;
             toInsert.Critical_Security_Notes__c = wrapper.GDPRList[i].security;
             toInsert.Product_Information__c = wrapper.GDPRList[i].support;
             toInsert.Contact_Via_Text__c = wrapper.GDPRList[i].contactPhone;
             toInsert.Contact_Via_Email__c = wrapper.GDPRList[i].contactEmail;
             newContacts.add(toInsert);
        
        
        }
           
            
          
        
        }
          try{
              if(contactPref.size()>0){
                  upsert contactPref;
              }
              if(NewContacts.size()>0){
                 // insert NewContacts;
              }          
            } 
            catch(DmlException e){
                    System.debug('An unexpected error has occured: ' + e.getMessage());
                }
      
      }
     }

My test class:
 
@isTest
private class JSONDeserializeTest {

        @isTest static void testCalloutWithStaticResource(){

            Test.setMock(HttpCalloutMock.class, new Test_callApply1());
            JSONDeserialize.deserialize();
            System.assert(true);
        
        
        }


}

HttpCalloutMock implementation:
@isTest
global class Test_callApply1 implements HttpCalloutMock {
    // Implement this interface method
    global HTTPResponse respond(HttpRequest req) {
        // Optionally, only send a mock response for a specific endpoint
        // and method.
        //System.assertEquals('http://example.com/example/test', req.getEndpoint());
        //System.assertEquals('GET', req.getMethod());
        
        // Create a fake response
        HttpResponse res = new HttpResponse();
        res.setHeader('Content-Type','application/json');
        res.setBody('PRIVATE JSON DATA');
        res.setStatusCode(200);
        return res;
    }
}

My trigger:
 
trigger GDPR_Prefrences_Updater on Contact (after insert, after update) {
   if(System.IsBatch() == false && System.isFuture() == false && !Test.isRunningTest())
    {
        System.debug('i got triggered!!!');
        JSONDeserialize.deserialize();
    }

}

And here is a picture of my errors:
User-added image
Raj VakatiRaj Vakati
The Issue is in the TestDeleteTrigger and TestSSDupeCheckTest,TestUserRestroctQueryTest Class .. 

You need to insert an email or phone into the Object in your test classes 

 
Raj VakatiRaj Vakati
TestSSDupeCheckCacheTest class als thowing an error 
Raj VakatiRaj Vakati
If you want the temporary solution, use run as specific test class and pass only your test class which you are deploying..

https://releasenotes.docs.salesforce.com/en-us/winter16/release-notes/rn_deployment_change_sets_test_levels.htm
Run Specified Tests
Only the tests that you specify are run. Provide the names of test classes in a comma-separated list.