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
Eric Blaxton 11Eric Blaxton 11 

Review the Class and help in writing a Test case for this...thank you

Hi and thanks for any help or direction.

1. Please tell me if this is good Apex class.  By good I mean, up to SF best practices, bulkification etc.
2. I need help in writing a test class.  

@RestResource(urlMapping='/TmwCaseUpdates/v1/*')

global class TmwCaseUpdates 
{

    global class OrderResponse 
    {
        string OrderNumber;
        List<string> Comments = new List<string>();
        List<string> Errors = new List<string>();
        string CaseNumber;
    }
    
  global class FuelOrderItem
    {
        string FuelOrderNumber;
        string FuelType;
        string CaseNumber;
        long FuelOrderedAmount;
        long FuelDeliveredAmount;
    }
    
  global class SalesforceUpdateCase
    {
        string Status;
        string FuelOrderStatus;
        string TMWOrderNumber;
        DateTime DeliveredTime;
        DateTime CarrierConfirmDateTime;
        string[] CaseComments;
        List<FuelOrderItem> FuelOrderItems;
        string NotifiedDate;
        string CreditAlertType;
        Date RequestDeliveryDate;
        string RequestDeliveryTimeframe;
        string Description;
        string Subject;
        string CompanyCode;
        string Origin;
    long QuantityDelivered;
    long QuantityRequested;
    }
    
    global static string GetAccountID(string companyId)
    {
        string cmpID = 'TMW-' + companyId;
        string accountID = [SELECT IntegratedSite__c FROM Translation_Table__c where Surrogate_ID__c='TMW-JMJHOR01' LIMIT 1].Id;
        return accountID;
    }
    
    @HttpPost
    global static List<OrderResponse> UpdateOrders()
    {
        string requestBody = RestContext.request.requestBody.tostring();
        System.debug('input data is ' + requestBody);
        List<SalesforceUpdateCase> updOrders = (List<SalesforceUpdateCase>)JSON.deserialize(requestBody, List<SalesforceUpdateCase>.class);
        System.debug(updOrders);
        // create OrderResponse list to be returned to the caller
        List<OrderResponse> orderList = new List<OrderResponse>();
        // loop through SalesforceUpdateCase objects.  Create new cases for valid orders.  Return any case comments
        for (SalesforceUpdateCase theOrder : updOrders)        
        {
            OrderResponse theResponse = new OrderResponse();
            List<Case> theCases = new List<Case>();
            theCases =   [ select id, status, AccountId, TMW_Order_Num__c, CaseNumber, Fuel_Order_Status__c 
                         FROM case WHERE TMW_Order_Num__c = :theOrder.TMWOrderNumber ];
            System.debug('order # is ' + theOrder.TMWOrderNumber);
            if (theCases.size() > 1)
            {
                theResponse.Errors.Add('Case ' + theCases[0].CaseNumber + 'for TMW Order ' + theOrder.TMWOrderNumber + ' already exists');
                System.debug('Case ' + theCases[0].CaseNumber + 'for TMW Order ' + theOrder.TMWOrderNumber + ' already exists');
                theResponse.OrderNumber = theOrder.TMWOrderNumber;
                theResponse.CaseNumber = theCases[0].CaseNumber;
                orderList.Add(theResponse);
            } else if (theCases.size() == 0)
            {
                // Create new SF case
                Case newCase = new Case();
        newCase.Status = theOrder.Status;
        newCase.Fuel_Order_Status__c = theOrder.FuelOrderStatus;
        newCase.TMW_Order_Num__c = theOrder.TMWOrderNumber;
        newCase.TMWSentDt__c = Date.today();
        newCase.Credit_Alert_Type__c = theOrder.CreditAlerttype;
                newCase.Delivered_Time__c = theOrder.DeliveredTime;
                // Get the company code from the translation table. Company codes are stored as TMW-xxxxx
                string translatedCompanyCode = 'TMW-' + theOrder.CompanyCode;
                System.debug(translatedCompanyCode);
                newCase.AccountId = [SELECT IntegratedSite__c 
                                     FROM Translation_Table__c 
                                     WHERE Surrogate_ID__c = :translatedCompanyCode].IntegratedSite__c;
                newCase.RQ_Delivery_Timeframe__c = theOrder.RequestDeliveryTimeframe;
                newCase.RQ_Delivery_Date__c = theOrder.RequestDeliveryDate;
                newCase.Origin = theOrder.Origin;
                integer i = 0;
                for (FuelOrderItem item : theOrder.FuelOrderItems)
                {
                    i++;
                    switch on i
                    {
                        when 1 
                        {
                            newCase.Fuel1_Requested_Type__c = item.FuelType;
                            if (theOrder.FuelOrderStatus == 'Delivered')
              {
                newCase.Fuel1_Delivered_Type__c = item.FuelType;
                                newCase.Fuel1_Delivered_Amount__c = item.FuelDeliveredAmount;
                        }
                        }
                        when 2 
                        {
                            newCase.Fuel2_Requested_Type__c = item.FuelType;
                            if (theOrder.FuelOrderStatus == 'Delivered')
              {
                newCase.Fuel2_Delivered_Type__c = item.FuelType;
                                newCase.Fuel2_Delivered_Amount__c = item.FuelDeliveredAmount;
                        }                            
                        }
                        when 3 
                        {
                            newCase.Fuel3_Requested_Type__c = item.FuelType;
                            if (theOrder.FuelOrderStatus == 'Delivered')
              {
                newCase.Fuel3_Delivered_Type__c = item.FuelType;
                                newCase.Fuel3_Delivered_Amount__c = item.FuelDeliveredAmount;
                        }                                            
                        }
                        when 4 
                        {
                            newCase.Fuel4_Requested_Type__c = item.FuelType;
              if (theOrder.FuelOrderStatus == 'Delivered')
              {
                newCase.Fuel4_Delivered_Type__c = item.FuelType;
                                newCase.Fuel4_Delivered_Amount__c = item.FuelDeliveredAmount;
                        }                
                        }
                    }
                }
                System.debug('about to insert case');
        Insert newCase;
        theResponse.OrderNumber = theOrder.TMWOrderNumber;
        theResponse.CaseNumber = newCase.CaseNumber;
        orderList.Add(theResponse);
            }
      else
            {
                // Update existing case
                Case updCase = theCases[0];
                if (updCase.Fuel_Order_Status__c != theOrder.FuelOrderStatus)
                {
                    updCase.Status = theOrder.Status;
                    updCase.Fuel_Order_Status__c = theOrder.FuelOrderStatus;
                    updCase.TMW_Order_Num__c = theOrder.TMWOrderNumber;
                    updCase.TMWSentDt__c = Date.today();
                    updCase.Credit_Alert_Type__c = theOrder.CreditAlerttype;
                    // update Delivered fields for completed orders
                    if (theOrder.FuelOrderStatus == 'Delivered')
                    {
                        for (FuelOrderItem item : theOrder.FuelOrderItems)
            {
                            if (updCase.Fuel1_Requested_Type__c == item.FuelType)
                            { 
                                updCase.Fuel1_Delivered_Amount__c = item.FuelDeliveredAmount; 
                            }
                            else if (updCase.Fuel2_Requested_Type__c == item.FuelType)
                            { 
                                updCase.Fuel2_Delivered_Amount__c = item.FuelDeliveredAmount; 
                            }
                            else if (updCase.Fuel3_Requested_Type__c == item.FuelType)
                            { 
                                updCase.Fuel3_Delivered_Amount__c = item.FuelDeliveredAmount; 
                            }
                            else if (updCase.Fuel4_Requested_Type__c == item.FuelType)
                            { 
                                updCase.Fuel4_Delivered_Amount__c = item.FuelDeliveredAmount; 
                            }
            }
                        updCase.Delivered_Time__c = theOrder.DeliveredTime;
                        updCase.Carrier_Confirm_Date_Time__c = theOrder.CarrierConfirmDateTime;
                    }
                    System.debug('about to update case');
            Update updCase;
                    theResponse.OrderNumber = theOrder.TMWOrderNumber;
                    theResponse.CaseNumber = updCase.CaseNumber;
                    orderList.Add(theResponse);
                }
            }            
        }
        return orderList;
    }
}
 
Best Answer chosen by Eric Blaxton 11
Andrew GAndrew G
Quick scan -  i see a SELECT statement in a FOR loop
for (SalesforceUpdateCase theOrder : updOrders)        
        {
            OrderResponse theResponse = new OrderResponse();
            List<Case> theCases = new List<Case>();
            theCases =   [ select id, status, AccountId, TMW_Order_Num__c, CaseNumber, Fuel_Order_Status__c 
                         FROM case WHERE TMW_Order_Num__c = :theOrder.TMWOrderNumber ];
            System.debug('order # is ' + theOrder.TMWOrderNumber);
            if (theCases.size() > 1)

That's a no-no.

You will hit governor limits as the SELECT statement will be called on every iteration of the loop.

I would need time to check the rest, buts that's a start point.

Regards
Andrew G

 

All Answers

Andrew GAndrew G
Quick scan -  i see a SELECT statement in a FOR loop
for (SalesforceUpdateCase theOrder : updOrders)        
        {
            OrderResponse theResponse = new OrderResponse();
            List<Case> theCases = new List<Case>();
            theCases =   [ select id, status, AccountId, TMW_Order_Num__c, CaseNumber, Fuel_Order_Status__c 
                         FROM case WHERE TMW_Order_Num__c = :theOrder.TMWOrderNumber ];
            System.debug('order # is ' + theOrder.TMWOrderNumber);
            if (theCases.size() > 1)

That's a no-no.

You will hit governor limits as the SELECT statement will be called on every iteration of the loop.

I would need time to check the rest, buts that's a start point.

Regards
Andrew G

 
This was selected as the best answer
v varaprasadv varaprasad
Hi Eric,

Please check once below sample code : 
@isTest
public class CustomerEditTest {

  @isTest
	static void teste(){
        
		Account acc1= new Account();
		acc1.Name ='Test';
		insert acc1;
		
		WSCustomerEdit.JsonAccount acc = new WSCustomerEdit.JsonAccount();
		acc.id      = acc1.id;
		acc.name    = 'NameTest';
		acc.phone   = '1198785496';
		acc.address = 'Rua x';
		String myJSON = JSON.serialize(acc);
		

        RestRequest request = new RestRequest();
        request.requestUri ='https://cs13.salesforce.com/services/apexrest/upsertaccount';
        request.httpMethod = 'POST';
		request.requestBody = Blob.valueof(myJSON);
		
        RestContext.request = request;
		Account accObj = WSCustomerEdit.doPost();
		
		
	}
}

Hope this helps you!
If my answer helps resolve your query, please mark it as the 'Best Answer' & upvote it to benefit others.


Thanks
Varaprasad
Salesforce Freelance Consultant/Developer/Administrator
@For Salesforce Project Support: varaprasad4sfdc@gmail.com

Salesforce latest interview questions  :
https://www.youtube.com/channel/UCOcam_Hb4KjeBdYJlJWV_ZA?sub_confirmation=1
 
Eric Blaxton 11Eric Blaxton 11
Andrew - thanks for catching that.  I made the change.

Varapasa - I tried the code you sent and it has lots of errors.