Friday, 12 October 2018

12thOCt

***********

public with sharing class AutomatedTestSetup_Controller {

    public boolean hasScheduledJobs { get; set; }
    public boolean hasTestRun { get; set; }
    public boolean hasAbort { get; set; }
    public boolean isRunning { get; set; }
    public boolean isEmailing { get; set; }
    public AutomatedTestSetup_Controller ATS { get; set; }
    public String DtValue {get; set; }
    public boolean showMessage {get;set;}
    public String showdatetime{get;set;}
    public String Staticstics{get;set;}
    public Decimal Percentage{get;set;}
    public String shddatetime {get;set;}
    public String ATRdetails {get;set;}
    public List<CronTrigger> Schdjobs{get;set;}
    public String Jobstatus  {get;set;}
    public Automated_Test_Run__c AtrRecord  {get; set;}
    //public List<Shdwrapper> cronjbs=New List<Shdwrapper>(){get;set;}
     id ATERecordTypeId = Schema.SObjectType.Automated_Test_Run__c.getRecordTypeInfosByName().get('Automated Test Execution').getRecordTypeId();
     id ATEmailRecordTypeId = Schema.SObjectType.Automated_Test_Run__c.getRecordTypeInfosByName().get('Automated Test Email Notification').getRecordTypeId();
    public PageReference doInsert() {
       // Automated_Test_Run__c objdlt = new Automated_Test_Run__c();
        AtrRecord.Query__c=AtrRecord.Query__c;
        AtrRecord.Excluded_Classes__c=AtrRecord.Excluded_Classes__c;
        AtrRecord.Exclude_Managed_Packages__c=AtrRecord.Exclude_Managed_Packages__c;
        AtrRecord.Schedule__c=AtrRecord.Schedule__c;
       
        AtrRecord.RecordTypeId=ATERecordTypeId;
        //insert AtrRecord;
       
        Automated_Test_Run__c ATEemail = new Automated_Test_Run__c();
        ATEemail.Emails__c=AtrRecord.Emails__c;
        ATEemail.Email_on_Pass__c=AtrRecord.Email_on_Pass__c;
        ATEemail.RecordTypeId=ATEmailRecordTypeId;
        //insert ATEemail;
        Savepoint sp = Database.setSavepoint();
        try{     
            scheduleJobs(AtrRecord.Schedule__c);
                if(showMessage==false){
                    upsert AtrRecord;
                    upsert ATEemail;
                }     
        }
        catch(exception ex){
            Database.rollback(sp);
        }

       /*PageReference pageRef = new PageReference('/apex/AutomatedTestSetupVFP');
            pageRef.setRedirect(true);
            return pageRef;*/
            return null;
    }
    public Automated_Test_Run__c getAtrRecord()
    {
        return AtrRecord;
    }
   
   
    public AutomatedTestSetup_Controller(ApexPages.StandardController controller) {
        AtrRecord = (Automated_Test_Run__c)Controller.getRecord();
        this.ATS=ATS; 
       
        showMessage=false;
        refreshHasScheduledJobs();
        refreshHasTestRun();
        ShowAbortbutton();
        getPieData();
        Calculatepercentage();
        GetATSRunDeatils();   
    }

    public void refreshHasScheduledJobs() {
        //integer jobCount = [select count() from CronJobDetail where Name like '%TestRunner%' and JobType = '7'];
        //integer jobCount = [SELECT count() FROM CronTrigger  where CronJobDetail.Name like '%TestRunner%' and State in('WAITING','ACQUIRED','EXECUTING')];
        integer jobCount = [SELECT count() FROM CronTrigger  where CronJobDetail.Name like '%TestRunner%'];
        //integer jobCount = [SELECT count() FROM CronTrigger  where CronJobDetail.Name like '%TestRunner%' and State in('WAITING','ACQUIRED','EXECUTING')];
        Schdjobs=[SELECT CronJobDetail.Name,CreatedDate,NextFireTime,State FROM CronTrigger where CronJobDetail.Name like '%TestRunner%' and State in('WAITING','ACQUIRED','EXECUTING')];
        if(Schdjobs.size()>0){
            Jobstatus=Schdjobs[0].State;
            if(Schdjobs[0].NextFireTime!=null ){
            Datetime shddatetimeGSt=Schdjobs[0].NextFireTime;
            Datetime gmt = shddatetimeGSt;
             String timeZone = UserInfo.getTimeZone().getID();
             Datetime GivenDateTime=shddatetimeGSt;// here you can user your dates e.g. createddate
              Datetime localdt=Datetime.valueOf(GivenDateTime);
              //showdatetime = string.valueOfGmt(local);
              shddatetime=localdt.format();
              }
              else if(Jobstatus!=null && Jobstatus!='') {
                  shddatetime='Test Scheduled Job Current State is '+Jobstatus;
              }
            }           
        hasScheduledJobs = jobCount !=0;
        //hasScheduledJobs = (jobCount !=0 && Schdjobs.size()>0);         
            /*if(jobCount !=0){
                hasScheduledJobs = jobCount !=0;
            }else if(Schdjobs.size()>0){
            hasScheduledJobs =true;
            } */           
    }
    public void GetATSRunDeatils() {
        List<String> Keywords=New List<String>();
        Keywords.clear();
        ATRdetails='';
        //id ATERecordTypeId = Schema.SObjectType.Automated_Test_Run__c.getRecordTypeInfosByName().get('Automated Test Execution').getRecordTypeId();
        for(Automated_Test_Run__c atr: [select Query__c, Excluded_Classes__c,
                            Email_on_Pass__c, Exclude_Managed_Packages__c
                            from Automated_Test_Run__c
                            where Active__c = true and RecordTypeId=:ATERecordTypeId order by createdDate DESC limit 1]){
                        Keywords.add(atr.Query__c);                     
        }
        if(Keywords.size()>0){
            for(String kw:Keywords){
            ATRdetails+=kw;
            }
        }
    }
 
    public void refreshHasTestRun() {
        integer runCount = [select count() from Automated_Test_Run__c limit 1];
        hasTestRun = runCount > 0;   
    }
    public void ShowAbortbutton(){
        integer runCount = [select count() from Automated_Test_Run__c limit 1];
        Test_Runner_Job__c RunningJobnm =[Select Name,Automated_Test_Run__c,CreatedDate From Test_Runner_Job__c order by CreatedDate desc limit 1];
         integer TestexecrunCount = [select count() from ApexTestQueueItem WHERE Status IN ('Holding','Queued','Preparing','Processing') and ParentJobId=:RunningJobnm.Name];
        hasAbort = TestexecrunCount > 0;
        //hasScheduledJobs = TestexecrunCount > 0;     
               
    }
 
    public string getTestRunLink() {
        return '/' + Automated_Test_Run__c.SObjectType.getDescribe().getKeyPrefix();
    }
 
    public AutomatedTestSetup_Controller() {
         Automated_Test_Run__c AtrRecord = new Automated_Test_Run__c();
        refreshHasScheduledJobs();
        refreshHasTestRun();
        //getPieData();
        Calculatepercentage();
        ShowAbortbutton();
       
    }
   
    public PageReference scheduleJobs(Datetime DtValue) {
       
        System.debug('Date & Time is given***1'+DtValue);
        deleteCompletedJobs();
        Datetime gmt = DtValue;
        String timeZone = UserInfo.getTimeZone().getID();
        Datetime GivenDateTime=DtValue;// here you can user your dates e.g. createddate
         System.debug('GivenDateTime is***'+GivenDateTime);         
                Datetime local=Datetime.valueOf(GivenDateTime);
                System.debug('local is***'+local);
                Map <Integer,String> monthNumbers = new Map <Integer,String> {1=>'Jan', 2=>'Feb',3=>'Mar',4=>'Apr', 5=>'May', 6=>'Jun',7=>'Jul',8=>'Aug', 9=>'Sep', 10=>'Oct', 11=>'Nov', 12=>'Dec'};
                String TestShdmonth=monthNumbers.get(local.month());
                String strSchedule = '0 ' + local.minute() + ' ' +local.hour()+ ' ' + local.day()+ ' ' + TestShdmonth+ ' ? ' + ' ' + local.year();
                System.debug('***strSchedule***'+strSchedule);
                AutoTestRunner.setup(strSchedule,strSchedule);
                refreshHasScheduledJobs();             
         
       
    return null;
    }

    public PageReference CancelJobs() {   
          //List<CronTrigger> jobsToAbort = [select id,Name from CronJobDetail where Name like 'AutoTestRunner%' and JobType = '7'];
          List<CronTrigger> jobsToAbort = [select Id from CronTrigger where CronJobDetail.JobType = '7' and CronJobDetail.Name like '%TestRunner%'];
              if(jobsToAbort.size()>0){
                  for (CronTrigger job : jobsToAbort) {
                   System.abortJob(job.Id);
                   }
               }
               PageReference pageRef = new PageReference('/apex/AutomatedTestSetupVFP');
                    pageRef.setRedirect(true);
                    return pageRef;
    }
   
    public PageReference AbortTestJobs() {   
        Test_Runner_Job__c RunningJobnm =[Select Name,Automated_Test_Run__c,CreatedDate From Test_Runner_Job__c order by CreatedDate desc limit 1];
        ApexTestQueueItem[] items = [SELECT Id FROM ApexTestQueueItem WHERE Status IN ('Holding','Queued','Preparing','Processing') and ParentJobId=:RunningJobnm.Name];
        if(items.size()>0){
                for(ApexTestQueueItem item: items) {
                    item.Status = 'Aborted';
                }
                update items;
           }
        PageReference pageRef = new PageReference('/apex/AutomatedTestSetupVFP');
        pageRef.setRedirect(true);
        return pageRef;
    }

    public void deleteCompletedJobs(){
        List<CronTrigger> jobsToAbort = [select Id,State from CronTrigger where CronJobDetail.JobType = '7' and CronJobDetail.Name like '%TestRunner%' and State='DELETED'];
              for (CronTrigger job : jobsToAbort) {
               System.abortJob(job.Id);
               }     
    }
   
    public void createTestRun() {
        User currentUser = [select Email from User where Id = :UserInfo.getUserId()];
        insert new Automated_Test_Run__c(Name = 'All Tests', Emails__c = currentUser.Email);
        refreshHasTestRun();
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Confirm, 'Automated Test Run created'));
    }
 
    public void run() {
        AutoTestRunner.enqueueTests();
        isRunning = true;
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Confirm, 'Tests queued'));
    }
 
    public void email() {
        TestRunnerResults.emailUnprocessedJobStatus();
        isEmailing = true;
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Confirm, 'Results processed and emailed'));
    }
 
//Statistics part

    public Void Calculatepercentage() {
        Test_Runner_Job__c RunningJob =[Select Name,Automated_Test_Run__c,CreatedDate From Test_Runner_Job__c order by CreatedDate desc limit 1];
        if(RunningJob!=null){
            integer TotalJobsis   =  [select count() FROM ApexTestQueueItem where ParentJobId=:RunningJob.Name];
            integer CompltedJobsis   =  [select count() FROM ApexTestQueueItem where Status IN ('Completed','Aborted') and ParentJobId=:RunningJob.Name];
            //if((TotalJobsis!=null && TotalJobsis!='')&& (CompltedJobsis!=null&& CompltedJobsis!='')){
                if((TotalJobsis>0)&& (CompltedJobsis>0)){
                Percentage=(CompltedJobsis*100)/TotalJobsis;
                //RunningJob.Percentage_of_Completion__c=Percentage;
                System.debug('Total Jobs is'+TotalJobsis+ 'CompltedJobs' +CompltedJobsis+ 'Percentage is'+Percentage);
                //update RunningJob;
            }         
        }     
    }
    public List<PieWedgeData> getPieData() {
      //Select id,Status from ApexTestQueueItem where ParentJobId='7070K00008HsU7EQAV'
      //Test_Runner_Job__c RunningJob =[Select Name,Automated_Test_Run__c,CreatedDate From Test_Runner_Job__c where Processed__c = false order by CreatedDate desc limit 1];
      //SELECT AsyncApexJobId, Outcome, ApexClass.Name, MethodName, Message, StackTrace FROM ApexTestResult WHERE AsyncApexJobId='7074D00000OEnAAQA1'
      Test_Runner_Job__c RunningJob =[Select Name,Automated_Test_Run__c,CreatedDate From Test_Runner_Job__c order by CreatedDate desc limit 1];
      //integer Cmpltd       = [select count() FROM ApexTestResult WHERE Outcome = 'Pass' and AsyncApexJobId=:RunningJob.Name];
      integer CmpltdPass       = [select count() FROM ApexTestResult WHERE Outcome = 'Pass' and AsyncApexJobId=:RunningJob.Name];
      integer Failed       = [select count() FROM ApexTestResult WHERE Outcome = 'Fail' and AsyncApexJobId=:RunningJob.Name];
      integer Queuedjobs   = [select count() FROM ApexTestQueueItem where Status='Queued' and ParentJobId=:RunningJob.Name];
      integer TotalJobs   =  [select count() FROM ApexTestQueueItem where ParentJobId=:RunningJob.Name];
      //integer CompltedJobs   =  [select count() FROM ApexTestQueueItem where Status='Completed' and ParentJobId=:RunningJob.Name];
      //Staticstics='Total Testclasses '+TotalJobs+'  '+'Pending Testclasses '+Queuedjobs;
     //Staticstics= 'Total Testclasses '+TotalJobs+'\n';
    // Staticstics+= '\n'+'Pending Testclasses '+Queuedjobs+'\n';
    // Staticstics+= '\n'+'Test Execution Started on  '+RunningJob.CreatedDate;
        //Percentage=CompltedJobs/TotalJobs*100;
       
            List<PieWedgeData> data = new List<PieWedgeData>();
            if(Queuedjobs>0){
            data.add(new PieWedgeData('In Progress'+' '+Queuedjobs, +Queuedjobs));
            }if(CmpltdPass>0){
            data.add(new PieWedgeData('Passed'+' '+CmpltdPass, +CmpltdPass));
            }if(Failed>0){
            data.add(new PieWedgeData('Fail'+' '+Failed, +Failed));
            }
           
        return data;
    }

    // Wrapper class
    public class PieWedgeData {
       public String name { get; set; }
       public Integer data { get; set; }
       public Integer CmpltdPass{ get; set; }
       public Integer Failed{ get; set; }
       public Integer Queuedjobs{ get; set; }
           public PieWedgeData(String name, Integer data) {
                this.name = name;
                this.data = data;
            }
    }
   
    public PageReference Refresh(){
    deleteCompletedJobs();
    Calculatepercentage();
    refreshHasScheduledJobs();
    if(Percentage==100){
            email();                   
        }else{
            hasScheduledJobs = true;
        }                     
         PageReference pageRef = new PageReference('/apex/AutomatedTestSetupVFP');
            pageRef.setRedirect(true);
            return pageRef;
    }
   
}


*****************

<apex:page standardController="Automated_Test_Run__c" extensions="AutomatedTestSetup_Controller" Sidebar="False" id="pg" docType="html-5.0">
<script>
function fnChange(DT)
{
// first make sure 'DT ' is not null here
alert('Hello datetime'+DT);
DTPass(DT);
//alert(DT);
}
</script>
    <apex:form id="frm">
        <apex:pageBlock title="Job Schedule - Test Execution">
       <apex:pageMessages />
       <div align="right" draggable="false" >
       <apex:outputLink value="{!testRunLink}">Scheduled Jobs History</apex:outputLink>
       </div>
        <!--Automated Test Record-->
        <apex:outputPanel rendered="{!if(NOT(hasScheduledJobs) && Not(hasAbort),true,false)}">
         
                <apex:pageBlockSection title="Automated Test Run" columns="2">
                <!--<apex:image value="/s.gif" styleClass="helpIcon" title="Test class names containing this value would be considered for automated test execution Ex:Test% or %_Test (caseinsensitive)"/>-->  
                  <apex:inputField required="true" value="{!AtrRecord.Query__c}" label="Keyword"/> 
                  <c:AutomatedVFPHelpIcon helpText="Test class names containing this value would be considered for automated test execution Ex:Test% or %_Test (case insensitive)"/> 
                   
                                       
                   <apex:inputField value="{!AtrRecord.Excluded_Classes__c}" label="Excluded Classes"/> 
                   <c:AutomatedVFPHelpIcon helpText="Comma-delimited list of classes to exclude from testing"/> 
                   
                                       
                    <apex:inputField value="{!AtrRecord.Exclude_Managed_Packages__c}" label="Exclude Managed_Packages"/>  
                    <c:AutomatedVFPHelpIcon helpText="Check this box to exclude all Managed Package Unit Tests"/>                   
                </apex:pageBlockSection>
                
                <apex:pageBlockSection title="Automated Test Email" columns="2">
                    
                    <apex:inputField required="true" value="{!AtrRecord.Emails__c}" label="Email"/>
                    <c:AutomatedVFPHelpIcon helpText="Comma-separated email addresses"/> 
                    
                    
                    <apex:inputField value="{!AtrRecord.Email_on_Pass__c}" label="Email on Pass"/> 
                    <c:AutomatedVFPHelpIcon helpText="Send email when all tests pass"/>                     
                </apex:pageBlockSection>
                
                <apex:pageBlockSection title="Job Schedule " columns="3" >
                 
                    <apex:inputField required="true" value="{!AtrRecord.Schedule__c}" label="Date and Time"/><br/> 
                    <c:AutomatedVFPHelpIcon helpText="To Schedule Testclass Execution"/>   
                            <div align="center" draggable="false" >     
                     <apex:commandButton value="Save & Submit" action="{!doInsert}" />
                     </div>
                     
                 </apex:pageBlockSection>
            
                    <!--Automated Test Record-->
                   </apex:outputPanel>   
                     
                    <apex:outputPanel rendered="{!hasScheduledJobs}">
                        <apex:pageBlockSection title="Job Schedule Status" columns="1">
                            Automated Test Run Name:{!ATRdetails}_TestRun_{!shddatetime}                                                          
                                <apex:commandLink value="Cancel" rendered="{!if(hasScheduledJobs && Not(hasAbort),true,false) }" action="{!CancelJobs}" styleClass="btn">
                                </apex:commandLink> 
                        </apex:pageBlockSection>
                    </apex:outputPanel>
                    <!--Need to remove after start -->
                     <apex:outputPanel rendered="{!(hasAbort)}">
                        <apex:pageBlockSection title="Job Schedule Status" columns="1">
                            Automated Test Run Name:{!ATRdetails}_TestRun_In Progress                                                                                       
                        </apex:pageBlockSection>
                    </apex:outputPanel>
                    <!--Need to remove after END -->
                <!--Startstics Section -->
          
                <apex:pageBlockSection title="Test Class Execution Statistics" id="Piechartsec" columns="4"> 
                 Testclass execution {!Percentage}% completed
                    <apex:pageBlockSectionItem id="ShowGraph">   
                        <apex:outputPanel id="Graph">
                                <apex:chart height="250" width="350" data="{!pieData}" id="Piechartsec2">
                                    <apex:pieSeries dataField="data" labelField="name"/>
                                    <apex:legend position="left"/>
                                </apex:chart>
                            </apex:outputPanel>                                                     
                    </apex:pageBlockSectionItem>                
                    <apex:pageBlockSectionItem id="Refresh">    
                        <apex:commandlink value=" Refresh " status="progress" action="{!Refresh}" styleClass="btn" reRender="Piechartsec2"/>
                        <!-- <apex:commandlink value=" Refresh " status="progress" onclick="window.location.reload();" styleClass="btn" reRender="Piechartsec2"/>-->
                    </apex:pageBlockSectionItem> 

                    <apex:pageBlockSectionItem id="Abort">
                        <apex:commandlink value="Abort" status="progress" action="{!AbortTestJobs}" rendered="{!(hasAbort)}" styleClass="btn" reRender="Piechartsec2"/>
                    </apex:pageBlockSectionItem> 

                    
                </apex:pageBlockSection> 
        </apex:pageBlock>
    </apex:form>
</apex:page>

*****************
global class AutoTestRunner implements Schedulable {
    // derived from http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_testing_unit_tests_running.htm#APISectionTitle

    public static void setup(String strSchedule, String strEmailSchedule) {
        try {
            String cronexpression=strSchedule;
            String cronexpressionforEmail=strEmailSchedule;
            system.schedule('AutoTestRunner',cronexpression, new AutoTestRunner());
           //system.schedule('TestRunnerResults',cronexpressionforEmail, new TestRunnerResults());
        } catch (Asyncexception ex) {
            system.debug('Job already scheduled');
   ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severity.INFO,'Future Date Time only');
              ApexPages.addMessage(myMsg);
        }
    }
   
   global void execute(SchedulableContext SC) {
      enqueueTests();
   }
   
    // Enqueue all unit test classes as spec'd by Automated_Test_Run__c record(s)
    public static list<ID> enqueueTests() {
        list<Id> jobIds = new list<Id>();
   Id ATERecordTypeId = Schema.SObjectType.Automated_Test_Run__c.getRecordTypeInfosByName().get('Automated Test Execution').getRecordTypeId();
   Id ATEmilRecordTypeId = Schema.SObjectType.Automated_Test_Run__c.getRecordTypeInfosByName().get('Automated Test Email Notification').getRecordTypeId();
   Automated_Test_Run__c EmailRecord=[select Emails__c from Automated_Test_Run__c where RecordTypeId=:ATEmilRecordTypeId  order by createdDate DESC limit 1];
        for (Automated_Test_Run__c run : [select Query__c, Excluded_Classes__c,
        Email_on_Pass__c, Exclude_Managed_Packages__c
        from Automated_Test_Run__c where Active__c = true and RecordTypeId=:ATERecordTypeId order by createdDate DESC limit 1]) {
            string whereExcluded = '';
            if (run.Excluded_Classes__c != null) {
                for (string c : run.Excluded_Classes__c.split('[,\\s]+')) {
                    whereExcluded += 'and Name != \'' + c + '\'';
                }
            }
            if (run.Exclude_Managed_Packages__c == True) {
               whereExcluded += ' AND NameSpacePrefix = null';
            }
           
            string query = 'SELECT Id FROM ApexClass WHERE Name LIKE \'' + run.Query__c + '\' ' + whereExcluded;
            ApexClass[] testClasses = Database.query(query);
               
            if (testClasses.size() > 0) {
                ApexTestQueueItem[] queueItems = new List<ApexTestQueueItem>();
                for (ApexClass cls : testClasses) {
                    queueItems.add(new ApexTestQueueItem(ApexClassId=cls.Id));
                }
   
                if (!Test.isRunningTest()) {
                    //insert queueItems;
                    DataBase.insert(queueItems,false);
       
                    // Get the job ID of the first queue item returned.        
                    ApexTestQueueItem item =
                       [SELECT ParentJobId FROM ApexTestQueueItem
                        WHERE Id=:queueItems[0].Id LIMIT 1];
                       
                    insert new Test_Runner_Job__c(Name = item.parentjobid, Automated_Test_Run__c = EmailRecord.Id);
                   run.Active__c = false;
                   update run;
                    jobIds.add(item.parentjobid);
                }
            }
        }
       
        return jobIds;
    }

    public static list<Messaging.SingleEmailMessage> emailMethodStatus(list<Test_Runner_Job__c> jobs) {
        set<string> jobNames = new set<string>();
        for (Test_Runner_Job__c job : jobs) {
            jobNames.add(job.Name);
        }
       
        ApexTestResult[] results =
           [SELECT AsyncApexJobId, Outcome, ApexClass.Name, MethodName, Message, StackTrace
            FROM ApexTestResult
            WHERE AsyncApexJobId in :jobNames];
           
        return emailMethodStatus(jobs, results);
    }
       
    public static list<Messaging.SingleEmailMessage> emailMethodStatus(list<Test_Runner_Job__c> jobs, ApexTestResult[] results) {
        list<Messaging.SingleEmailMessage> messages = new list<Messaging.SingleEmailMessage>();
       
        for (Test_Runner_Job__c job : jobs) {
            system.debug('Test Runner Job: Id ' + job.Id + ' Name ' + job.Name);
            integer passed = 0;
            integer total = 0;
           
            string failTable = '<table border="1" cellpadding="5px">';
            string className = '';
               
            for (ApexTestResult atr : results) {
                system.debug('Apex Test Result: Id '  + atr.AsyncApexJobId);
                if ((string)atr.AsyncApexJobId == job.Name || (Test.isRunningTest() && jobs.size() == 1)) {
                    if (atr.Outcome == 'Pass') {
                        passed++;
                    } else {
                        if (atr.ApexClass.Name != className) {
                            className = atr.ApexClass.Name;
                            failTable += '<tr style="background: #ddd; font-weight: bold;"><td colspan="2">' + className + '</td></tr>\n';
                        }
                        failTable += '<tr><td>' + atr.MethodName + '</td><td> ' + atr.message + '</td></tr>\n';
                    }
                    total++;
                }
            }
           
            failTable += '</table>';
           
            string body = '<p>' + passed + '/' + total + ' tests passed</p>\n';
            boolean allPassed = passed == total;
           
            if (!allPassed) {
                body += '<p>Test Failures:</p>\n' + failTable;
            }
           
            if ((allPassed && job.Automated_Test_Run__r.Email_on_Pass__c) || !allPassed) {
                Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
                mail.setToAddresses(job.Automated_Test_Run__r.Emails__c.split('[,\\s]+'));
                mail.setSubject(job.Automated_Test_Run__r.Name + ' Automated Test Results: ' + (passed < total ? 'Fail' : 'Pass'));
                mail.setHtmlBody(body);
                System.debug(mail);
                messages.add(mail);
            }
        }     

        if (!Test.isRunningTest()) {
            Messaging.sendEmail(messages);
        }
       
        return messages;
    }
 }


************************

global class TestRunnerResults implements Schedulable {
    
   global void execute(SchedulableContext SC) {
        emailUnprocessedJobStatus();
   }
   
   public static list<Messaging.SingleEmailMessage> emailUnprocessedJobStatus() {
      list<Test_Runner_Job__c> jobs = getUnprocessedJobs();
       
      list<Messaging.SingleEmailMessage> messages = AutoTestRunner.emailMethodStatus(jobs);
      
      for (Test_Runner_Job__c job : jobs) {
          job.Processed__c = true;
      }
      
      update jobs;
      
     return messages;
   }
   
   public static list<Test_Runner_Job__c> getUnprocessedJobs() {
        return [Select t.Name, 
          t.Automated_Test_Run__r.Emails__c, 
          t.Automated_Test_Run__r.Email_on_Pass__c, 
          t.Automated_Test_Run__r.Name, 
          t.Automated_Test_Run__c 
          From Test_Runner_Job__c t where Processed__c = false];
   }
   
}


**********

No comments:

Post a Comment