var_spec.rb 4.37 KB
require 'spec_helper'

describe Var do
  context 'as a class' do
    it { is_expected.to respond_to(:var_classes) }
    it { is_expected.to respond_to(:add_var_class) }
    it { is_expected.to respond_to(:create_charge) }
    it { is_expected.to respond_to(:conekta_webhook) }
    it { is_expected.to respond_to(:find_charge) }
  end

  it 'supports conekta' do
    expect(Var.send(:supported_service?, :conekta)).to be true
  end

  it 'holds var classes' do
    expect(Var.var_classes).to eq([Product])
    class Dummy < ActiveRecord::Base
      acts_as_chargeable
    end
    expect(Var.var_classes).to eq([Product, Dummy])
  end

  context 'when creating a charge' do
    it 'is delegates the call' do
      product = instance_double('Product')
      allow(product).to receive(:charge_with).and_return(:success)
      charge = Var.create_charge(:conekta, product, {})
      expect(charge).to eq :success
    end

    it 'raises an error if service is not supported' do
      product = instance_double('Product')
      expect do
        Var.create_charge(:random_payment_service, product, {})
      end.to raise_error 'Service is not supported'
    end

    it 'raises an error if object cannot be chargable' do
      product = instance_double('Product')
      expect do
        Var.create_charge(:conekta, product, {})
      end.to raise_error "#{product.class} doesn't support charges"
    end
  end

  context 'when receiving a webhook from conekta' do

    let!(:chargable_product) do
      Product.new # Weird hack to enable connection
      instance_double('Product')
    end
    
    it 'expects a Hash as an input' do
      [[], '', nil].each do |input|
        expect do
          Var.conekta_webhook(input)
        end.to raise_error "Hash expected, received #{input.class}"
      end
    end

    it 'expects a {data: {object: ... }} as an input' do
      expect do
        Var.conekta_webhook({})
      end.to raise_error "Malformed hash received"
    end

    it 'handles Cargo creado con tarjeta' do
      params = {"data":{"object":{"id":"5511d4ce2412294cf6000081","livemode":false,"created_at":1427231950,"status":"pending_payment","currency":"MXN","description":"Stogies","reference_id":"9839-wolf_pack","failure_code":nil,"failure_message":nil,"monthly_installments":nil,"object":"charge","amount":20000,"paid_at":nil,"fee":963,"customer_id":"","refunds":[],"payment_method":{"name":"Jorge Lopez","exp_month":"12","exp_year":"19","auth_code":nil,"object":"card_payment","last4":"4242","brand":"visa"},"details":{"name":nil,"phone":nil,"email":nil,"line_items":[]}},"previous_attributes":{}},"livemode":false,"webhook_status":"pending","id":"5511d4ce2412294cf6000084","object":"event","type":"charge.created","created_at":1427231950,"webhook_logs":[{"id":"webhl_nPzGMBeQmMUu7aQ","url":"http://requestb.in/1em0jsx1","failed_attempts":0,"last_http_response_status":-1,"object":"webhook_log","last_attempted_at":0}]}

      allow(Var).to receive(:find_charge).and_return chargable_product
      allow(chargable_product).to receive(:update_columns).and_return true
      allow(chargable_product).to receive(:var_payed?).and_return false
      allow(chargable_product).to receive(:var_id).and_return '5511d4ce2412294cf6000081'

      result = Var.conekta_webhook params
      expect(result.var_id).to eq('5511d4ce2412294cf6000081')

      # TODO: Define what is actually being teted
      
      pending
    end
    
    it 'handles Cargo pagado con tarjeta' do
      pending
    end

    it 'handles Cargo de OXXO creado' do
      pending
    end

    it 'handles Cargo de OXXO pagado' do
      pending
    end

    xit 'handles Cargo de SPEI creado' do
      pending
    end

    xit 'handles Cargo de SPEI pagado' do
      pending
    end

    xit 'handles Plan creado' do
      pending
    end

    xit 'handles Crear un customer sin tarjeta y sin plan' do
      pending
    end

    xit 'handles Customer creado con una tarjeta y sin plan' do
      pending
    end

    xit 'handles Customer creado con tarjeta y con plan (suscripción)' do
      pending
    end

    xit 'handles Suscripción creada' do
      pending
    end

    xit 'handles Suscripción pagada' do
      pending
    end

    xit 'handles Suscripción activa' do
      pending
    end

    xit 'handles Contracargo creado' do
      pending
    end

    xit 'handles Contracargo ganado' do
      pending
    end

    xit 'handles Contracargo perdido' do
      pending
    end
  end
end