+ Start a Discussion

Help with web service test class

So I have this method that I slightly modified from http://www.valnavjo.com. 
All it does is when I press custom buttom "Generate Invoice" it uses a template "Invoice" from quotes template to generate and attach 
the invoice pdf to Attachment section of opportunity. I dont know why Im getting only 23% coverage as I invoke the method.
Also, I dont know why it is not creating the attachment in my test class when I check in system assert. Please help. 
Below is the method: 

global with sharing class InvoicePdfWsSample {
   * Default header height for invoice
  private static final String DEFAULT_INVOICE_HEADER_HEIGHT = '100';
   * Default footer height for invoice
  private static final String DEFAULT_INVOICE_FOOTER_HEIGHT = '100';
   * Webservice method that is called from a custom button to generate
   * an invoice PDF file using quote templates feature.
   * It generates the invoice based on:
   *     - The synced Quote, or
   *    - The latest Quote
   * If the Opportunity doesn't have any Quotes, this method doesn't do
   * anything.
   * This method uses PageReference.getContent().
   * @param oppsIdList {List<Id>} list of Opportunity Ids from where the method
   *           will generate the Invoice PDF.
   * @return {String} with an error message, if any. Blank otherwise.
  webService static String generateInvoicePdf(List<Id> oppsIdList) {
    try {
      //From list to set
      final Set<Id> oppsId = new Set<Id>(oppsIdList);

      //Get template Id for Invoice and url to hack pdf generation
      final String invoiceTemplateId = Application_Properties__c.getAll().get('Invoice_Template_Id').value__c;
      String invoiceHeaderHeight = Application_Properties__c.getAll().get('Invoice_Header_Height').value__c;
      String invoiceFooterHeight = Application_Properties__c.getAll().get('Invoice_Footer_Height').value__c;
      final String quoteTemplateDataViewerUrl = Application_Properties__c.getAll().get('Quote_Template_Data_Viewer_URL').value__c;
      //Invoice_Template_Id and Quote_Template_Data_Viewer_URL are mandatory 
      if (String.isBlank(invoiceTemplateId) || String.isBlank(quoteTemplateDataViewerUrl)) {
        String errorMsg = 'Invoice Template Id or Quote Template Data Viewer URL are blank, please review their values in Application Properties custom setting.';

        return errorMsg;
      //Default values for invoice header/footer height
      if (String.isBlank(invoiceHeaderHeight)) invoiceHeaderHeight = DEFAULT_INVOICE_HEADER_HEIGHT;
      if (String.isBlank(invoiceFooterHeight)) invoiceFooterHeight = DEFAULT_INVOICE_FOOTER_HEIGHT; 

      //Iterate over Opps and generate Attachments list
      final List<Attachment> attList = new List<Attachment>();
      for (Opportunity opp : [select Id,
                       (select Id, Invoice_No__c, QuotetoInvoice__c, CreatedDate
                         from Quotes 
                         order by CreatedDate DESC)
                  from Opportunity
                  where Id IN :oppsId]) {
        //No Quotes, no party
        if (opp.Quotes.isEmpty()) continue;

        //Synced quote
        Quote theQuote = null;

        //Try to get the synced one
        for (Quote quoteAux : opp.Quotes) {
          if (quoteAux.Quotetoinvoice__c) {
            theQuote = quoteAux;

        //No synced Quote, get the last one
      if (theQuote == null) return 'Select a Quote to Invoice under Quotes section';

        PageReference pageRef = new PageReference(
          quoteTemplateDataViewerUrl.replace('{!QuoteId}', theQuote.Id)
                        .replace('{!InvoiceHeaderHeight}', invoiceHeaderHeight)
                        .replace('{!InvoiceFooterHeight}', invoiceFooterHeight)
                        .replace('{!InvoiceTemplateId}', invoiceTemplateId)

          new Attachment(
            Name = 'Invoice #' + theQuote.Invoice_No__c + '.pdf',
            Body = pageRef.getContent(),
            ParentId = opp.Id

      //Create Attachments
      if (!attList.isEmpty()) insert attList;
      return '';
    } catch (Exception e) {
      System.debug(LoggingLevel.ERROR, e.getMessage());

      final String errorMsg = 'An error has occured while generating the invoice. Details:\n\n' +
                   e.getMessage() + '\n\n' +
      return errorMsg;

and the test class; 


private class TestInvoicepdfclass {
    @isTest static void testpdfbutton(){
Pricebook2 pb = new Pricebook2(Name = 'Standard Price Book 2009', Description = 'Price Book 2009 Products', IsActive = true );
    insert pb;
Product2 prod = new Product2(Name = 'SLA: Bronze', IsActive = true);
    insert prod;

PricebookEntry pbe=new PricebookEntry(unitprice=0.01,Product2Id=prod.Id, Pricebook2Id=Test.getStandardPricebookId(), IsActive= true); 
     insert pbe;       
           // insert opp
        Account acc = new Account (name='Acme');
        insert acc;
        Opportunity opp= new Opportunity ();
         opp.name= 'Testopp';
        Opp.Accountid= acc.id;
        opp.CloseDate= date.today();
        opp.StageName= 'Closed Won';
        insert opp; 
OpportunityLineItem oppLine = new OpportunityLineItem( pricebookentryid=pbe.Id,TotalPrice=2000, Quantity = 2,Opportunityid = opp.Id);
insert oppLine;       
        // insert quote
        Quote q= new Quote ();
        	 q.Name= 'Testq';
        	q.OpportunityId= Opp.id;
         	q.quotetoinvoice__C= True;
         	q.REP__C= 'AC' ;
        	q.BillingStreet= '123';
        	q.BillingCity= 'City';
        	q.BillingPostalCode= '12345';
             q.Pricebook2Id= Test.getStandardPricebookId();
           insert q;
        //add to list
         List<id> oppids= new List<id> ();
        // pass the list to the method
      List <Attachment> attlist= [SELECT id, name, parentid From Attachment WHERE parentid IN :oppids];
        System.assert (!attlist.isEmpty());  //check if attachment is present