def setUp(self):
        payment_request = PaymentRequest()
        payment_request.email = '*****@*****.**'
        payment_request.token = '12345678901234567890123456789012'

        checkout = CheckoutTestCase.build_checkout()
        payment_request.checkout = checkout
        self.payment_request = payment_request
 def __init__(self, email, token):
     self.payment_request = PaymentRequest(email=email, token=token)
     self.payment_request.checkout = Checkout()
     self.response = None
class Payment(BasePaymentRequest):
    """
    Classe que implementa a requisição à API do PagSeguro versão 2
    """

    def __init__(self, email, token):
        self.payment_request = PaymentRequest(email=email, token=token)
        self.payment_request.checkout = Checkout()
        self.response = None

    def add_item(self, item_id, description, amount, quantity, shipping_cost=None, weight=None):
        item = Item(
            item_id=item_id,
            description=description,
            amount=amount,
            quantity=quantity,
            shipping_cost=shipping_cost,
            weight=weight,
        )
        item.validate()
        if not self.payment_request.checkout.items:
            self.payment_request.checkout.items = []

        self.payment_request.checkout.items.append(item)

    def _process_response_xml(self, response_xml):
        """
        Processa o xml de resposta e caso não existam erros retorna um
        dicionario com o codigo e data.

        :return: dictionary
        """
        result = {}
        xml = ElementTree.fromstring(response_xml)
        if xml.tag == "errors":
            logger.error(u"Erro no pedido de pagamento ao PagSeguro." + " O xml de resposta foi: %s" % response_xml)
            errors_message = u"Ocorreu algum problema com os dados do pagamento: "
            for error in xml.findall("error"):
                error_code = error.find("code").text
                error_message = error.find("message").text
                errors_message += u"\n (code=%s) %s" % (error_code, error_message)
            raise PagSeguroPaymentException(errors_message)

        if xml.tag == "checkout":
            result["code"] = xml.find("code").text

            try:
                xml_date = xml.find("date").text
                result["date"] = dateutil.parser.parse(xml_date)
            except:
                logger.exception(
                    u"O campo date não foi encontrado ou é invalido" + " O xml de resposta foi: %s" % response_xml
                )
                result["date"] = None
        else:
            raise PagSeguroPaymentException(
                u'Erro ao processar resposta do pagamento: tag "checkout" nao'
                + "encontrada no xml de resposta. XML=%s" % response_xml
            )
        return result

    def payment_url(self):
        """ Retorna a url para onde o cliente deve ser redirecionado para
        continuar o fluxo de pagamento.

        :return: str, URL de pagamento
        """
        if self.response:
            return u"%s?code=%s" % (settings.PAGSEGURO_API_URL, self.response["code"])
        else:
            return None

    def request(self):
        """
        Faz a requisição de pagamento ao servidor do PagSeguro.

        :returns: str, URL para o cliente continuar o pagamento
        """

        params = self.payment_request.generate_params()
        req = requests.post(
            settings.PAGSEGURO_API_URL,
            params=params,
            headers={"Content-Type": "application/x-www-form-urlencoded; charset=ISO-8859-1"},
        )
        if req.status_code == 200:
            self.response = self._process_response_xml(req.text)
        else:
            raise PagSeguroApiException(
                u"Erro ao fazer request para a API:" + " HTTP Status=%s - Response: %s" % (req.status_code, req.text)
            )
        return self.response

    def api_version(self):
        return u"2.0"