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
bohemianguy100bohemianguy100 

unit test help - list is empty

I have a VF page that displays a series of records with a checkbox next to each record.  I have a command button that allows the user to update selected records.

 

The problem is my uptest method is returns an empty list when I try to call my update method that processes the selected records.

 

Here is my VF page:

 

<apex:page title="Unbilled Project Time" StandardController="Project_Invoice__c" extensions="ProjectTimeController">
    <script>
    	function checkAll(cb){
    		var inputElem = document.getElementsByTagName("input");
    		for(var i=0; i<inputElem.length; i++){
        		if(inputElem[i].id.indexOf("selectLine")!=-1){
            		inputElem[i].checked = cb.checked;
        		}
    		}
		}
    </script>
    <apex:sectionHeader title="Project Name: {!ProjectName} - Invoice Number: {!InvoiceNumber}" />
    <apex:form >
    	<apex:pageBlock id="pgBlock" >
    	<apex:pageMessages />
    		<apex:PageBlockButtons location="both" >
            <apex:commandButton value="Update Project Time" action="{!processProjectTimeUpdates}" reRender="pgBlock" />
        </apex:PageBlockButtons>
    		<apex:pageBlockTable value="{!ProjectTime}" var="p" id="theTable" rowClasses="odd,even">
            	<apex:column >
                	<apex:facet name="header">
                    	<apex:inputCheckbox onclick="checkAll(this)" />
                	</apex:facet>
                	<apex:inputCheckbox value="{!p.selected}" Id="selectLine" />
            	</apex:column>      
            	<apex:column >
                	<apex:facet name="header">
                    	Project Time #
                	</apex:facet>
                	<apex:outputLink value="/{!p.projTime.Id}">{!p.projTime.Name}</apex:outputLink> 
            	</apex:column>
            	<apex:column >
                	<apex:facet name="header">
                    	Project
                	</apex:facet>
                	<apex:outputLink value="/{!p.projTime.Project__c}">{!p.projTime.Project__r.Name}</apex:outputLink> 
            	</apex:column>
            	<apex:column >
                	<apex:facet name="header">
                    	Work Date
                	</apex:facet>
                	<apex:outputText value="{0,date,MM/dd/yyyy}">
                		<apex:param value="{!p.projTime.Work_Date__c}" />
                	</apex:outputText>
            	</apex:column>
            	<apex:column >
                	<apex:facet name="header">
                    	Hours
                	</apex:facet>
                	<apex:outputText value="{!p.projTime.Hours__c}" />
            	</apex:column>
            	<apex:column >
                	<apex:facet name="header">
                    	Hourly Rate
                	</apex:facet>
                	<apex:outputText value="{!p.projTime.Hourly_Rate__c}" />
            	</apex:column>
            	<apex:column >
                	<apex:facet name="header">
                    	Fee Amount
                	</apex:facet>
                	<apex:outputText value="{!p.projTime.Fee_Amount__c}" />
            	</apex:column>
    		</apex:pageBlockTable>
    	</apex:pageBlock>
    </apex:form>
     
 
</apex:page>

 

 

Here is my controller:

 

public class ProjectTimeController {
	
	private List<Project_Invoice__c> listPI = new List<Project_Invoice__c>();
    public String getProjectName() {return listPI[0].Project__r.Name;}
    public String getInvoiceNumber() {return listPI[0].Invoice_Number__c;}
	private List<ProjectTimeLines> ProjectTimeList {get; set;}
	
	
	public ProjectTimeController(ApexPages.StandardController stdController) 
    {
    	listPI = [Select Project__r.Name, Invoice_Number__c From Project_Invoice__c Where Id = :ApexPages.currentPage().getParameters().get('Id')];
    }
    
    public List<ProjectTimeLines> getProjectTime()  
    {
    	ProjectTimeList = new List<ProjectTimeLines>(); 
    	
    	List<Project_Time__c> lstPT = [Select Id, Name, Hours__c, Hourly_Rate__c, Fee_Amount__c, Work_Date__c, Project__c, Project_Invoice__c, Project__r.Name, Project__r.Id From Project_Time__c Where Fee_Amount__c > 0 AND Project_Invoice__c = null Order By Project__r.Name, Work_Date__c ASC];
    	   
    	for (Project_Time__c pt : lstPT) {   
    		ProjectTimeList.add(new ProjectTimeLines(pt));
    	}
    	 	  	
 	  	return ProjectTimeList;
    }
    
    public PageReference processProjectTimeUpdates()
    {
        List<Project_Time__c> selectedPTLs = new List<Project_Time__c>();
        List<Project_Time__c> ptls = new List<Project_Time__c>();
        for(ProjectTimeLines pt : ProjectTimeList){
            if(pt.selected){
                selectedPTLs.add(pt.projTime);
            }
        }
        
        Project_Invoice__c pi = [Select Id From Project_Invoice__c Where Project__c =: selectedPTLs[0].Project__c];
        string str = '';
        if (selectedPTLs.size() != 0) {
        	for(Project_Time__c p : selectedPTLs){
        		str += p.Name + ', ';
            	p.Project_Invoice__c = pi.Id;
            	ptls.add(p);
        	}
        	update ptls;
			ApexPages.Message msg = new ApexPages.message(ApexPages.Severity.CONFIRM, 'The following Project Time records: ' + str + ' have been successfully updated.');
			ApexPages.addMessage(msg);

        	return null;
        }
        else {
        	ApexPages.Message msg = new ApexPages.message(ApexPages.Severity.ERROR, 'No records selected.  Please select at least one record.');
        	ApexPages.addMessage(msg);
        	
        	return null;	
        }
    }
    
    public class ProjectTimeLines 
    {
    	public Project_Time__c projTime {get; set;}
    	public Boolean selected {get; set;}
    	
    	public ProjectTimeLines(Project_Time__c  pt) {
    		projTime = pt;;	
    	}	
    }
    
    static testMethod void test() 
    {	
    	Project__c p = new Project__c(Name = 'Test Project', Hourly_Rate__c = 80.00);
    	insert p;
    	
    	Project_Invoice__c pi = new Project_Invoice__c(Project__c = p.Id);
    	insert pi;
    	
    	Project_Time__c pt = new Project_Time__c(Project__c = p.Id, Work_Date__c = System.today());
    	insert pt;
    	
		PageReference page= new PageReference('/apex/ProjectTimeUnbilled?Id='+ pi.Id);
        Test.setCurrentPage(page);
        
        
        ApexPages.StandardController ctl = new ApexPages.StandardController(pi);
        ProjectTimeController Ctrl = new ProjectTimeController(ctl);
        
        
        Ctrl.getProjectTime();
        Ctrl.getProjectName();
        Ctrl.getInvoiceNumber();
        //Ctrl.processProjectTimeUpdates();
    }

}

 

This is the line that that returns the empty list:

 

Project_Invoice__c pi = [Select Id From Project_Invoice__c Where Project__c =: selectedPTLs[0].Project__c];

 

 

Thanks for any help

Best Answer chosen by Admin (Salesforce Developers) 
bob_buzzardbob_buzzard

Once you've constructed your controller, none of your project time lines have the selected flag set to true.    You'll need to programmatically mimic the user checking the boxes.

 

Something like the following should set at least one:

 

 

 Ctrl.getInvoiceNumber();

 // if there are entries in the list, select the first one.
 if (Ctrl.ProjectTimeList.size()>0)
 {
     Ctrl.ProjectTimeList[0].selected=true;
 }

 Ctrl.processProjectTimeUpdates();

You may also wish to change something in the wrapped Project_Time__c and verify after the update that the changes were written to the database.

 

All Answers

bob_buzzardbob_buzzard

Once you've constructed your controller, none of your project time lines have the selected flag set to true.    You'll need to programmatically mimic the user checking the boxes.

 

Something like the following should set at least one:

 

 

 Ctrl.getInvoiceNumber();

 // if there are entries in the list, select the first one.
 if (Ctrl.ProjectTimeList.size()>0)
 {
     Ctrl.ProjectTimeList[0].selected=true;
 }

 Ctrl.processProjectTimeUpdates();

You may also wish to change something in the wrapped Project_Time__c and verify after the update that the changes were written to the database.

 

This was selected as the best answer
Andrei KuznetsovAndrei Kuznetsov

Hi,

 

If this was ever completed, could I please see solution for it. I've done similar thing and now have to test it.

 

Thank you very much.