Skip to content

Commit

Permalink
Parser#address method.
Browse files Browse the repository at this point in the history
  • Loading branch information
prodis committed Nov 10, 2015
1 parent 3b9a4ae commit 9c92151
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 2 deletions.
18 changes: 16 additions & 2 deletions lib/correios/cep/parser.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
require 'ox'

module Correios
module CEP
class Parser
Expand All @@ -13,6 +11,18 @@ class Parser
'complemento2' => :complement2
}.freeze

ADDRESS_NOT_FOUND_ERROR = 'CEP NAO ENCONTRADO'

def address(xml)
address = Address.parse(xml)
return address if address.has_content?

error_message = extract_error_message(xml)
return nil if error_message == ADDRESS_NOT_FOUND_ERROR

raise error_message || 'Unknown error'
end

def hash(xml)
doc = Ox.parse(xml)

Expand All @@ -30,6 +40,10 @@ def hash(xml)

private

def extract_error_message(xml)
return $1 if xml =~ /<faultstring>(.*)<\/faultstring>/
end

def find_node(nodes, name)
node = nodes.last
return nil unless node.is_a?(Ox::Element)
Expand Down
41 changes: 41 additions & 0 deletions spec/correios/cep/parser_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,47 @@
require 'spec_helper'

describe Correios::CEP::Parser do
describe '#address' do
let(:expected_address) do
address = Correios::CEP::Address.new
address.street_address = 'Rua Fernando Amorim'
address.neighborhood = 'Cavaleiro'
address.city = 'Jaboatão dos Guararapes'
address.state = 'PE'
address.zipcode = '54250610'
address
end

context 'when address is found' do
let(:xml) { Fixture.load(:address) }

it 'returns address' do
expect(subject.address(xml)).to eq expected_address
end
end

context 'when address is not found' do
let(:xml) { Fixture.load(:address_not_found) }

it 'returns nil' do
expect(subject.address(xml)).to eq nil
end
end

context 'when there is an unexpected error' do
{ invalid_zipcode: 'BUSCA DEFINIDA COMO EXATA, 0 CEP DEVE TER 8 DIGITOS',
required_zipcode: 'CEP NAO INFORMADO',
whatever_error: 'QUALQUER OUTRO ERRO',
empty_response: 'Unknown error'
}.each do |name, message|
it 'raises RuntimeError exception' do
xml = Fixture.load(name)
expect { subject.address(xml) }.to raise_error(RuntimeError, message)
end
end
end
end

describe '#hash' do
let(:expected_address) do
{
Expand Down
Empty file.
11 changes: 11 additions & 0 deletions spec/fixtures/invalid_zipcode.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>BUSCA DEFINIDA COMO EXATA, 0 CEP DEVE TER 8 DIGITOS</faultstring>
<detail>
<ns2:SigepClienteException xmlns:ns2="http://cliente.bean.master.sigep.bsb.correios.com.br/">BUSCA DEFINIDA COMO EXATA, 0 CEP DEVE TER 8 DIGITOS</ns2:SigepClienteException>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
11 changes: 11 additions & 0 deletions spec/fixtures/required_zipcode.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>CEP NAO INFORMADO</faultstring>
<detail>
<ns2:SigepClienteException xmlns:ns2="http://cliente.bean.master.sigep.bsb.correios.com.br/">CEP NAO INFORMADO</ns2:SigepClienteException>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
11 changes: 11 additions & 0 deletions spec/fixtures/whatever_error.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>QUALQUER OUTRO ERRO</faultstring>
<detail>
<ns2:SigepClienteException xmlns:ns2="http://cliente.bean.master.sigep.bsb.correios.com.br/">QUALQUER OUTRO ERRO</ns2:SigepClienteException>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>

0 comments on commit 9c92151

Please sign in to comment.