domingo, 18 de junho de 2017

Lendo o código fonte HTML de uma página web com Apex - Salesforce

Quem nunca precisou fazer um request em uma URL para pegar o HTML de uma página, visando buscar e tratar algum conteúdo dessa página?
Me lembro da época de faculdade que um professor solicitou que acessássemos o site do INPE (Instituto de Pesquisas Espaciais), usando C++, para buscar dados históricos de meteorologia e armazená-las em uma tabela de banco de dados. Foi uma desafio bem legal na época... Esses dias lembrei dessa situação e pensei: Seria possível acessar o HTML de uma página após uma requisição, no Apex do Salesforce? Sim. É possível! Veja:

Nesse exemplo, resolvi buscar a previsão do tempo atual no site Clima Tempo. Para inciar, é necessário registrar o site do clima tempo, como site seguro no Salesforce. Para tal, é necessário configurar o site do Clima Tempo na Configurações de site remoto:



E adicionar o site:



Após isso, podemos criar nossa classe para fazer o request no site do Clima Tempo:

public class PrevisaoTempoController {
    
    public String temperatura { get; set; }
    
    public PrevisaoTempoController(){
        
        String url = 'https://www.climatempo.com.br/previsao-do-tempo/aeroporto/258/belohorizonte-mg';
        
        Http h = new Http();
        HttpRequest request = new HttpRequest();
        request.setEndpoint(url);
        request.setMethod('GET');
        
        HttpResponse response = h.send(request);
        String htmlRetorno = response.getBody().replaceAll('\\n', ' ');
        
        //Tratando conteúdo
        integer indice = htmlRetorno.indexOf('id="momento-temperatura">');
        this.temperatura = htmlRetorno.substring(25 + indice, 27 + indice);
    }
}


Veja que faço uma requisição com o HttpRequest na URL que tem a previsão do tempo de Belo Horizonte. Com o método getBody() do response, consigo o HTML de retorno. As linhas finais são apenas para pegar a informação específica dentro do HTML. É importante ressaltar que esse tratamento da informação pode parar de funcionar, caso o Clima Tempo altere seu site.

Por fim, um Visualforce simples para exibir as informações de temperatura:

<apex:page controller="PrevisaoTempoController">
    
    Temperatura em Belo Horizonte: {!temperatura}°
    
</apex:page>


Veja o resultado final renderizado, de nossa página Visualforce:



Por hoje é isso! Até mais...


* Precisa de um suporte ou consultoria nos desenvolvimentos Apex sua Org Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros gerenciado Salesforce.



segunda-feira, 5 de junho de 2017

Métodos visíveis apenas para classes de test no Apex - Salesforce

Uma coisa que pode ser muito complicada na execução de um trabalho que envolve codificação Apex no ambiente Salesforce é a necessidade de cobertura de teste (de pelo menos 75% do código). Dependendo do nível de complexidade da classe que se deseja testar, o trabalho de se gerar as condições para cobrir o todo o código, pode ser bem mais desgastante. É quase um consenso entre eu e meus amigos desenvolvedores Salesforce, que é rápido construir a classe, do que sua cobertura de teste! ;) Talvez esteja sendo dramático... mas é quase isso. 

Pensando nesse cenário, suponhamos que tenhamos que testar a classe abaixo (supondo que ela fosse uma classe com uma complexa lógica):


public class LogicaComplexa {
    
    public LogicaComplexa(){}
    
    public void metodoComplexo(){
        //lógica muito complexa e no meio dela você chama um método privado
        this.metodoPrivado();
    }
    
    private void metodoPrivado(){
        //código que precisa ser coberto
    }
}


Veja que no exemplo acima, temos um método privado e um público. Suponhamos que precise testar o método privado, sem ter que passar por toda lógica do método público, que possui uma lógica complexa. O que podemos fazer? Colocar o método público? Nada disso... Para ajudar nesse árduo trabalho que é cobrir 100% de todo o código, temos uma anotação para método Apex, que permite acessarmos um método (para realizar a cobertura de teste) mesmo ele sendo privado (private method). Essa anotação é o @TestVisible. Com ele, mesmo o método sendo privado, é possível acessá-lo por uma classe de teste Apex. Veja com fica esse método:


@TestVisible private void metodoPrivado(){
    //código que precisa ser coberto
}

Com essa annotation @TestVisible, é possível acessar um método privado em uma classe de teste: 


@isTest
private class LogicaComplexaTest {
    @isTest static void teste() {
        LogicaComplexa logica = new LogicaComplexa();
        logica.metodoPrivado();
    }
}


Bem, essa é a dica rápida de hoje.



* Está precisando de um suporte ou uma consultoria nos desenvolvimentos de classes teste Apex dentro da sua plataforma Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/