correios_sigep 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +7 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +31 -0
  10. data/Rakefile +5 -0
  11. data/bin/rake +16 -0
  12. data/correios_sigep.gemspec +30 -0
  13. data/lib/correios_sigep.rb +38 -0
  14. data/lib/correios_sigep/builders/xml/authentication.rb +36 -0
  15. data/lib/correios_sigep/builders/xml/collect.rb +33 -0
  16. data/lib/correios_sigep/builders/xml/collect_objects.rb +25 -0
  17. data/lib/correios_sigep/builders/xml/product.rb +21 -0
  18. data/lib/correios_sigep/builders/xml/recipient.rb +30 -0
  19. data/lib/correios_sigep/builders/xml/request_collect_number.rb +16 -0
  20. data/lib/correios_sigep/builders/xml/sender.rb +34 -0
  21. data/lib/correios_sigep/configuration.rb +6 -0
  22. data/lib/correios_sigep/logistic_reverse/base_client.rb +32 -0
  23. data/lib/correios_sigep/logistic_reverse/request_collect_number.rb +53 -0
  24. data/lib/correios_sigep/models/collect.rb +27 -0
  25. data/lib/correios_sigep/models/correios_response_codes.rb +12 -0
  26. data/lib/correios_sigep/models/errors/collect_not_answered_for_the_zipcode.rb +8 -0
  27. data/lib/correios_sigep/models/errors/inexistent_zipcode.rb +8 -0
  28. data/lib/correios_sigep/models/errors/ticket_already_used.rb +8 -0
  29. data/lib/correios_sigep/models/errors/unavailable_house_collect.rb +8 -0
  30. data/lib/correios_sigep/models/errors/unavailable_service.rb +8 -0
  31. data/lib/correios_sigep/models/errors/unknown_error.rb +8 -0
  32. data/lib/correios_sigep/models/logistic_reverse.rb +23 -0
  33. data/lib/correios_sigep/models/object.rb +16 -0
  34. data/lib/correios_sigep/models/product.rb +14 -0
  35. data/lib/correios_sigep/models/recipient.rb +25 -0
  36. data/lib/correios_sigep/models/sender.rb +30 -0
  37. data/lib/correios_sigep/version.rb +3 -0
  38. data/spec/correios_sigep/builders/xml/request_collect_number_spec.rb +22 -0
  39. data/spec/correios_sigep/configuration_spec.rb +84 -0
  40. data/spec/correios_sigep/logistic_reverse/base_client_spec.rb +25 -0
  41. data/spec/correios_sigep/logistic_reverse/request_collect_number_spec.rb +101 -0
  42. data/spec/correios_sigep/models/collect_spec.rb +149 -0
  43. data/spec/correios_sigep/models/logistic_reverse_spec.rb +62 -0
  44. data/spec/correios_sigep/models/object_spec.rb +53 -0
  45. data/spec/correios_sigep/models/product_spec.rb +37 -0
  46. data/spec/correios_sigep/models/recipient_spec.rb +108 -0
  47. data/spec/correios_sigep/models/sender_spec.rb +141 -0
  48. data/spec/correios_sigep_spec.rb +41 -0
  49. data/spec/fixtures/correios/response_already_in_use.xml +14 -0
  50. data/spec/fixtures/correios/response_inexistent_zipcode.xml +14 -0
  51. data/spec/fixtures/correios/response_not_answered_for_zipcode.xml +14 -0
  52. data/spec/fixtures/correios/response_success.xml +27 -0
  53. data/spec/fixtures/correios/response_unavailable_house_collect.xml +14 -0
  54. data/spec/fixtures/correios/response_unavailable_service.xml +14 -0
  55. data/spec/fixtures/correios/response_unexpected.xml +14 -0
  56. data/spec/fixtures/correios/wsdl.xml +188 -0
  57. data/spec/spec_helper.rb +38 -0
  58. data/spec/support/fixture_helper.rb +5 -0
  59. data/spec/support/logistic_reverse_helper.rb +15 -0
  60. metadata +240 -0
@@ -0,0 +1,53 @@
1
+ module CorreiosSigep
2
+ module LogisticReverse
3
+ class RequestCollectNumber < BaseClient
4
+ def initialize(logistic_reverse)
5
+ @logistic_reverse = logistic_reverse
6
+ super()
7
+ end
8
+
9
+ def process
10
+ xml = Builders::XML::RequestCollectNumber.build_xml(@logistic_reverse)
11
+ response = invoke(:solicitar_postagem_reversa, xml)
12
+ process_response response
13
+ end
14
+
15
+ private
16
+
17
+ def process_response(response)
18
+ response_xml = response.to_xml.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
19
+ response_doc = Nokogiri::XML.parse(response_xml)
20
+ code = response_doc.search('//cod-erro | //cod_erro').text.to_i rescue nil
21
+ handle_errors code, response_doc
22
+ end
23
+
24
+ def handle_errors code, response_doc
25
+ result_string = '//resultado-solicitacao | //resultado_solicitacao'
26
+ result_node = response_doc.search(result_string)
27
+
28
+ case code
29
+
30
+ when Models::CorreiosResponseCodes::SUCCESS
31
+ result = result_node.search('//numero-coleta | //numero_coleta')
32
+ if node = result.first
33
+ collect_number = node.text
34
+ end
35
+ when Models::CorreiosResponseCodes::TICKET_ALREADY_USED
36
+ raise Models::Errors::TicketAlreadyUsed.new result_node
37
+ .search('//msg_erro | //msg_erro').text
38
+ when Models::CorreiosResponseCodes::UNAVAILABLE_SERVICE
39
+ raise Models::Errors::UnavailableService
40
+ when Models::CorreiosResponseCodes::INEXISTENT_ZIPCODE
41
+ raise Models::Errors::InexistentZipcode
42
+ when Models::CorreiosResponseCodes::UNAVAILABLE_HOUSE_COLLECT
43
+ raise Models::Errors::UnavailableHouseCollect
44
+ when Models::CorreiosResponseCodes::COLLECT_NOT_ANSWERED_FOR_THE_ZIPCODE
45
+ raise Models::Errors::CollectNotAnsweredForTheZipcode
46
+ else
47
+ raise Models::Errors::UnknownError.new result_node
48
+ .search('//msg_erro | //msg_erro').text
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,27 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ class Collect
4
+ attr_accessor :aditional_service, :ag, :ar, :card, :checklist,
5
+ :declared_value, :description, :number, :objects, :product,
6
+ :product_params, :type, :sender, :sender_params, :client_id
7
+
8
+ def initialize(options={})
9
+ @aditional_service = options[:aditional_service]
10
+ @ag = options[:ag]
11
+ @ar = options[:ar]
12
+ @card = options[:card]
13
+ @checklist = options[:checklist]
14
+ @client_id = options[:client_id]
15
+ @declared_value = options[:declared_value]
16
+ @description = options[:description]
17
+ @number = options[:number]
18
+ @type = options[:type]
19
+
20
+ @product = options[:product] || Product.new(options.fetch(:product_params, {}))
21
+ @sender = options[:sender] || Sender.new(options.fetch(:sender_params, {}))
22
+ @objects = options.fetch(:objects, [])
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ module CorreiosResponseCodes
4
+ SUCCESS = 0
5
+ TICKET_ALREADY_USED = 195
6
+ UNAVAILABLE_SERVICE = 210
7
+ INEXISTENT_ZIPCODE = 113
8
+ UNAVAILABLE_HOUSE_COLLECT = 111
9
+ COLLECT_NOT_ANSWERED_FOR_THE_ZIPCODE = 117
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ module Errors
4
+ class CollectNotAnsweredForTheZipcode < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ module Errors
4
+ class InexistentZipcode < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ module Errors
4
+ class TicketAlreadyUsed < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ module Errors
4
+ class UnavailableHouseCollect < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ module Errors
4
+ class UnavailableService < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ module Errors
4
+ class UnknownError < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ class LogisticReverse
4
+ attr_accessor :collect, :recipient
5
+
6
+ def initialize(options={})
7
+ @collect = options[:collect] || Models::Collect.new
8
+ @recipient = options[:recipient] || Models::Recipient.new
9
+ end
10
+
11
+ def to_xml
12
+ builder = Nokogiri::XML::Builder.new do |xml|
13
+ xml.root do
14
+ Builders::XML::Recipient.new(xml, recipient).build_xml
15
+ Builders::XML::Collect.new(xml, collect).build_xml
16
+ end
17
+ end
18
+ builder.to_xml
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ class Object
4
+ attr_accessor :description, :id, :item, :num, :ship
5
+
6
+ def initialize(options={})
7
+ @description = options[:description]
8
+ @id = options[:id]
9
+ @item = options[:item]
10
+ @num = options[:num]
11
+ @ship = options[:ship]
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ class Product
4
+ attr_accessor :code, :type, :quantity
5
+
6
+ def initialize(options={})
7
+ @code = options[:code]
8
+ @type = options[:type]
9
+ @quantity = options[:quantity]
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ class Recipient
4
+ attr_accessor :address, :area_code, :city, :complement, :email, :name,
5
+ :neighborhood, :number, :phone, :postal_code, :reference,
6
+ :state
7
+
8
+ def initialize(options={})
9
+ @address = options[:address]
10
+ @area_code = options[:area_code]
11
+ @city = options[:city]
12
+ @complement = options[:complement]
13
+ @email = options[:email]
14
+ @name = options[:name]
15
+ @neighborhood = options[:neighborhood]
16
+ @number = options[:number]
17
+ @phone = options[:phone]
18
+ @postal_code = options[:postal_code]
19
+ @reference = options[:reference]
20
+ @state = options[:state]
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ module CorreiosSigep
2
+ module Models
3
+ class Sender
4
+ attr_accessor :address, :area_code, :city, :complement, :email,
5
+ :identification, :mobile_area_code, :mobile_phone, :name,
6
+ :neighborhood, :number, :phone, :postal_code, :reference,
7
+ :sms, :state
8
+
9
+ def initialize(options={})
10
+ @area_code = options[:area_code]
11
+ @address = options[:address]
12
+ @city = options[:city]
13
+ @complement = options[:complement]
14
+ @email = options[:email]
15
+ @identification = options[:identification]
16
+ @mobile_area_code = options[:mobile_area_code]
17
+ @mobile_phone = options[:mobile_phone]
18
+ @name = options[:name]
19
+ @neighborhood = options[:neighborhood]
20
+ @number = options[:number]
21
+ @phone = options[:phone]
22
+ @postal_code = options[:postal_code]
23
+ @reference = options[:reference]
24
+ @sms = options[:sms]
25
+ @state = options[:state]
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ module CorreiosSigep
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ module CorreiosSigep
4
+ module Builders
5
+ module XML
6
+ describe RequestCollectNumber do
7
+ describe '.build_xml' do
8
+ let(:logistic_reverse) { CorreiosSigep::Models::LogisticReverse.new }
9
+ let(:expected_xml) do
10
+ "<cartao>0057018901</cartao><codigo_servico>41076</codigo_servico><contrato>9912208555</contrato><codAdministrativo>08082650</codAdministrativo><senha>8o8otn</senha><usuario>60618043</usuario>\n <destinatario>\n <nome>ESTABELECIMENT W*M</nome>\n <logradouro>ESTRADA DE ACESSO A JANDIRA</logradouro>\n <numero>1400</numero>\n <complemento>G4</complemento>\n <bairro>FAZENDA ITAQUI</bairro>\n <referencia>REFERENCE</referencia>\n <cidade>BARUERI</cidade>\n <uf>SP</uf>\n <cep>06442130</cep>\n <ddd>11</ddd>\n <telefone>21683228</telefone>\n <email>teste@example.com</email>\n </destinatario>\n <coletas_solicitadas>\n <tipo>CA</tipo>\n <id_cliente>1405670</id_cliente>\n <valor_declarado>100.5</valor_declarado>\n <descricao>teste</descricao>\n <cklist>cklist</cklist>\n <numero>1</numero>\n <ag>1</ag>\n <cartao>1234</cartao>\n <servico_adicional>20.5</servico_adicional>\n <ar>2</ar>\n <remetente>\n <nome>JEFERSON VAZ DOS SANTOS</nome>\n <logradouro>RUA BLA BLA BLA</logradouro>\n <numero>666</numero>\n <complemento>APT 100</complemento>\n <bairro>PINHEIROS</bairro>\n <reference>REFERENCE</reference>\n <cidade>S&#xC3;O PAULO</cidade>\n <uf>SP</uf>\n <cep>05427020</cep>\n <ddd>16</ddd>\n <telefone>41606809</telefone>\n <email>jeff@example.com</email>\n <identificacao/>\n <ddd_celular/>\n <celular/>\n <sms/>\n </remetente>\n <produto>\n <codigo>code</codigo>\n <tipo>type</tipo>\n <qtd>3</qtd>\n </produto>\n <obj_col>\n <obj>\n <item>127078</item>\n <id>1405670</id>\n <desc>Pen Drive SAndisk 16GB SDCZ50-016G-A95</desc>\n <ship>ship</ship>\n <num>1</num>\n </obj>\n <obj>\n <item>277574</item>\n <id>1405670</id>\n <desc>Chip unico claro Pre pago</desc>\n <ship>ship</ship>\n <num>2</num>\n </obj>\n </obj_col>\n </coletas_solicitadas>\n\n"
11
+ end
12
+ subject { described_class.build_xml(logistic_reverse) }
13
+ before :each do
14
+ seed_logistic_reverse(logistic_reverse)
15
+ end
16
+
17
+ it { should eq expected_xml }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,84 @@
1
+ module CorreiosSigep
2
+ describe Configuration do
3
+ subject { described_class.new }
4
+
5
+ describe '#administrative_code' do
6
+ it 'return nil when unset' do
7
+ expect(subject.administrative_code).to_not be
8
+ end
9
+ end
10
+
11
+ describe '#administrative_code=' do
12
+ it 'can set the administrative code in configuration' do
13
+ subject.administrative_code = '12345'
14
+ expect(subject.administrative_code).to eq '12345'
15
+ end
16
+ end
17
+
18
+ describe '#card' do
19
+ it 'return nil when unset' do
20
+ expect(subject.card).to_not be
21
+ end
22
+ end
23
+
24
+ describe '#card=' do
25
+ it 'can set the card in configuration' do
26
+ subject.card = 'card'
27
+ expect(subject.card).to eq 'card'
28
+ end
29
+ end
30
+
31
+ describe '#contract' do
32
+ it 'return nil when unset' do
33
+ expect(subject.contract).to_not be
34
+ end
35
+ end
36
+
37
+ describe '#contract=' do
38
+ it 'can set the contract in configuration' do
39
+ subject.contract = 'contract'
40
+ expect(subject.contract).to eq 'contract'
41
+ end
42
+ end
43
+
44
+ describe '#password' do
45
+ it 'return nil when unset' do
46
+ expect(subject.password).to_not be
47
+ end
48
+ end
49
+
50
+ describe '#password=' do
51
+ it 'can set the password in configuration' do
52
+ subject.password = 'password'
53
+ expect(subject.password).to eq 'password'
54
+ end
55
+ end
56
+
57
+
58
+ describe '#service_code' do
59
+ it 'return nil when unset' do
60
+ expect(subject.service_code).to_not be
61
+ end
62
+ end
63
+
64
+ describe '#service_code=' do
65
+ it 'can set the password in configuration' do
66
+ subject.service_code = 'service_code'
67
+ expect(subject.service_code).to eq 'service_code'
68
+ end
69
+ end
70
+
71
+ describe '#user' do
72
+ it 'return nil when unset' do
73
+ expect(subject.user).to_not be
74
+ end
75
+ end
76
+
77
+ describe '#user=' do
78
+ it 'can set the user in configuration' do
79
+ subject.user = 'user'
80
+ expect(subject.user).to eq 'user'
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ module CorreiosSigep
4
+ module LogisticReverse
5
+ describe BaseClient do
6
+ describe '#wsdl' do
7
+ subject { described_class.new.wsdl }
8
+ context 'in a test environment' do
9
+ it 'return the staging url' do
10
+ allow(ENV).to receive(:[]).with('GEM_ENV').and_return 'test'
11
+ expect(subject).to eq 'http://webservicescolhomologacao.correios.com.br/ScolWeb/WebServiceScol?wsdl'
12
+ end
13
+ end
14
+
15
+ context 'in other environment' do
16
+ it 'return the production url' do
17
+ allow(ENV).to receive(:[]).with('GEM_ENV').and_return 'prod'
18
+ expect(subject).to eq 'http://webservicescol.correios.com.br/ScolWeb/WebServiceScol?wsdl'
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+
3
+ module CorreiosSigep
4
+ module LogisticReverse
5
+ describe RequestCollectNumber do
6
+ let(:logistic_reverse) { Models::LogisticReverse.new }
7
+ let(:request_collect) { described_class.new logistic_reverse }
8
+
9
+ before do
10
+ seed_logistic_reverse(logistic_reverse)
11
+ stub_request(:get, "http://webservicescolhomologacao.correios.com.br/ScolWeb/WebServiceScol?wsdl").
12
+ with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}).
13
+ to_return(:status => 200, :body => correios_fixture('wsdl.xml'), :headers => {})
14
+ end
15
+
16
+ describe '.process' do
17
+ subject { request_collect.process }
18
+
19
+ context 'with success response' do
20
+ it 'should return the collect number' do
21
+ stub_request(:post, "http://webservicescolhomologacao.correios.com.br/ScolWeb/WebServiceScol").
22
+ with(:body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:tns=\"http://webservice.scol.correios.com.br/\" xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"><env:Body><tns:solicitarPostagemReversa><cartao>0057018901</cartao><codigo_servico>41076</codigo_servico><contrato>9912208555</contrato><codAdministrativo>08082650</codAdministrativo><senha>8o8otn</senha><usuario>60618043</usuario>\n <destinatario>\n <nome>ESTABELECIMENT W*M</nome>\n <logradouro>ESTRADA DE ACESSO A JANDIRA</logradouro>\n <numero>1400</numero>\n <complemento>G4</complemento>\n <bairro>FAZENDA ITAQUI</bairro>\n <referencia>REFERENCE</referencia>\n <cidade>BARUERI</cidade>\n <uf>SP</uf>\n <cep>06442130</cep>\n <ddd>11</ddd>\n <telefone>21683228</telefone>\n <email>teste@example.com</email>\n </destinatario>\n <coletas_solicitadas>\n <tipo>CA</tipo>\n <id_cliente>1405670</id_cliente>\n <valor_declarado>100.5</valor_declarado>\n <descricao>teste</descricao>\n <cklist>cklist</cklist>\n <numero>1</numero>\n <ag>1</ag>\n <cartao>1234</cartao>\n <servico_adicional>20.5</servico_adicional>\n <ar>2</ar>\n <remetente>\n <nome>JEFERSON VAZ DOS SANTOS</nome>\n <logradouro>RUA BLA BLA BLA</logradouro>\n <numero>666</numero>\n <complemento>APT 100</complemento>\n <bairro>PINHEIROS</bairro>\n <reference>REFERENCE</reference>\n <cidade>S&#xC3;O PAULO</cidade>\n <uf>SP</uf>\n <cep>05427020</cep>\n <ddd>16</ddd>\n <telefone>41606809</telefone>\n <email>jeff@example.com</email>\n <identificacao/>\n <ddd_celular/>\n <celular/>\n <sms/>\n </remetente>\n <produto>\n <codigo>code</codigo>\n <tipo>type</tipo>\n <qtd>3</qtd>\n </produto>\n <obj_col>\n <obj>\n <item>127078</item>\n <id>1405670</id>\n <desc>Pen Drive SAndisk 16GB SDCZ50-016G-A95</desc>\n <ship>ship</ship>\n <num>1</num>\n </obj>\n <obj>\n <item>277574</item>\n <id>1405670</id>\n <desc>Chip unico claro Pre pago</desc>\n <ship>ship</ship>\n <num>2</num>\n </obj>\n </obj_col>\n </coletas_solicitadas>\n\n</tns:solicitarPostagemReversa></env:Body></env:Envelope>",
23
+ :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Length'=>'2306', 'Content-Type'=>'text/xml;charset=UTF-8', 'Soapaction'=>'"solicitarPostagemReversa"', 'User-Agent'=>'Ruby'}).
24
+ to_return(:status => 200, :body => correios_fixture('response_success.xml'), :headers => {})
25
+
26
+ expect(subject).to eq '373533437'
27
+ end
28
+ end
29
+
30
+ context 'with ticket already in use' do
31
+ it 'should raise TicketAlreadyUsed error' do
32
+ stub_request(:post, "http://webservicescolhomologacao.correios.com.br/ScolWeb/WebServiceScol").
33
+ with(:body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:tns=\"http://webservice.scol.correios.com.br/\" xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"><env:Body><tns:solicitarPostagemReversa><cartao>0057018901</cartao><codigo_servico>41076</codigo_servico><contrato>9912208555</contrato><codAdministrativo>08082650</codAdministrativo><senha>8o8otn</senha><usuario>60618043</usuario>\n <destinatario>\n <nome>ESTABELECIMENT W*M</nome>\n <logradouro>ESTRADA DE ACESSO A JANDIRA</logradouro>\n <numero>1400</numero>\n <complemento>G4</complemento>\n <bairro>FAZENDA ITAQUI</bairro>\n <referencia>REFERENCE</referencia>\n <cidade>BARUERI</cidade>\n <uf>SP</uf>\n <cep>06442130</cep>\n <ddd>11</ddd>\n <telefone>21683228</telefone>\n <email>teste@example.com</email>\n </destinatario>\n <coletas_solicitadas>\n <tipo>CA</tipo>\n <id_cliente>1405670</id_cliente>\n <valor_declarado>100.5</valor_declarado>\n <descricao>teste</descricao>\n <cklist>cklist</cklist>\n <numero>1</numero>\n <ag>1</ag>\n <cartao>1234</cartao>\n <servico_adicional>20.5</servico_adicional>\n <ar>2</ar>\n <remetente>\n <nome>JEFERSON VAZ DOS SANTOS</nome>\n <logradouro>RUA BLA BLA BLA</logradouro>\n <numero>666</numero>\n <complemento>APT 100</complemento>\n <bairro>PINHEIROS</bairro>\n <reference>REFERENCE</reference>\n <cidade>S&#xC3;O PAULO</cidade>\n <uf>SP</uf>\n <cep>05427020</cep>\n <ddd>16</ddd>\n <telefone>41606809</telefone>\n <email>jeff@example.com</email>\n <identificacao/>\n <ddd_celular/>\n <celular/>\n <sms/>\n </remetente>\n <produto>\n <codigo>code</codigo>\n <tipo>type</tipo>\n <qtd>3</qtd>\n </produto>\n <obj_col>\n <obj>\n <item>127078</item>\n <id>1405670</id>\n <desc>Pen Drive SAndisk 16GB SDCZ50-016G-A95</desc>\n <ship>ship</ship>\n <num>1</num>\n </obj>\n <obj>\n <item>277574</item>\n <id>1405670</id>\n <desc>Chip unico claro Pre pago</desc>\n <ship>ship</ship>\n <num>2</num>\n </obj>\n </obj_col>\n </coletas_solicitadas>\n\n</tns:solicitarPostagemReversa></env:Body></env:Envelope>",
34
+ :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Length'=>'2306', 'Content-Type'=>'text/xml;charset=UTF-8', 'Soapaction'=>'"solicitarPostagemReversa"', 'User-Agent'=>'Ruby'}).
35
+ to_return(:status => 200, :body => correios_fixture('response_already_in_use.xml'), :headers => {})
36
+
37
+ expect{subject}.to raise_error(Models::Errors::TicketAlreadyUsed)
38
+ end
39
+ end
40
+
41
+ context 'when service is unavailable' do
42
+ it 'should raise UnvailableService error' do
43
+ stub_request(:post, "http://webservicescolhomologacao.correios.com.br/ScolWeb/WebServiceScol").
44
+ with(:body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:tns=\"http://webservice.scol.correios.com.br/\" xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"><env:Body><tns:solicitarPostagemReversa><cartao>0057018901</cartao><codigo_servico>41076</codigo_servico><contrato>9912208555</contrato><codAdministrativo>08082650</codAdministrativo><senha>8o8otn</senha><usuario>60618043</usuario>\n <destinatario>\n <nome>ESTABELECIMENT W*M</nome>\n <logradouro>ESTRADA DE ACESSO A JANDIRA</logradouro>\n <numero>1400</numero>\n <complemento>G4</complemento>\n <bairro>FAZENDA ITAQUI</bairro>\n <referencia>REFERENCE</referencia>\n <cidade>BARUERI</cidade>\n <uf>SP</uf>\n <cep>06442130</cep>\n <ddd>11</ddd>\n <telefone>21683228</telefone>\n <email>teste@example.com</email>\n </destinatario>\n <coletas_solicitadas>\n <tipo>CA</tipo>\n <id_cliente>1405670</id_cliente>\n <valor_declarado>100.5</valor_declarado>\n <descricao>teste</descricao>\n <cklist>cklist</cklist>\n <numero>1</numero>\n <ag>1</ag>\n <cartao>1234</cartao>\n <servico_adicional>20.5</servico_adicional>\n <ar>2</ar>\n <remetente>\n <nome>JEFERSON VAZ DOS SANTOS</nome>\n <logradouro>RUA BLA BLA BLA</logradouro>\n <numero>666</numero>\n <complemento>APT 100</complemento>\n <bairro>PINHEIROS</bairro>\n <reference>REFERENCE</reference>\n <cidade>S&#xC3;O PAULO</cidade>\n <uf>SP</uf>\n <cep>05427020</cep>\n <ddd>16</ddd>\n <telefone>41606809</telefone>\n <email>jeff@example.com</email>\n <identificacao/>\n <ddd_celular/>\n <celular/>\n <sms/>\n </remetente>\n <produto>\n <codigo>code</codigo>\n <tipo>type</tipo>\n <qtd>3</qtd>\n </produto>\n <obj_col>\n <obj>\n <item>127078</item>\n <id>1405670</id>\n <desc>Pen Drive SAndisk 16GB SDCZ50-016G-A95</desc>\n <ship>ship</ship>\n <num>1</num>\n </obj>\n <obj>\n <item>277574</item>\n <id>1405670</id>\n <desc>Chip unico claro Pre pago</desc>\n <ship>ship</ship>\n <num>2</num>\n </obj>\n </obj_col>\n </coletas_solicitadas>\n\n</tns:solicitarPostagemReversa></env:Body></env:Envelope>",
45
+ :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Length'=>'2306', 'Content-Type'=>'text/xml;charset=UTF-8', 'Soapaction'=>'"solicitarPostagemReversa"', 'User-Agent'=>'Ruby'}).
46
+ to_return(:status => 200, :body => correios_fixture('response_unavailable_service.xml'), :headers => {})
47
+
48
+ expect{subject}.to raise_error(Models::Errors::UnavailableService)
49
+ end
50
+ end
51
+
52
+ context 'when zipcode not exist' do
53
+ it 'should raise InexistentZipcode error' do
54
+ stub_request(:post, "http://webservicescolhomologacao.correios.com.br/ScolWeb/WebServiceScol").
55
+ with(:body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:tns=\"http://webservice.scol.correios.com.br/\" xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"><env:Body><tns:solicitarPostagemReversa><cartao>0057018901</cartao><codigo_servico>41076</codigo_servico><contrato>9912208555</contrato><codAdministrativo>08082650</codAdministrativo><senha>8o8otn</senha><usuario>60618043</usuario>\n <destinatario>\n <nome>ESTABELECIMENT W*M</nome>\n <logradouro>ESTRADA DE ACESSO A JANDIRA</logradouro>\n <numero>1400</numero>\n <complemento>G4</complemento>\n <bairro>FAZENDA ITAQUI</bairro>\n <referencia>REFERENCE</referencia>\n <cidade>BARUERI</cidade>\n <uf>SP</uf>\n <cep>06442130</cep>\n <ddd>11</ddd>\n <telefone>21683228</telefone>\n <email>teste@example.com</email>\n </destinatario>\n <coletas_solicitadas>\n <tipo>CA</tipo>\n <id_cliente>1405670</id_cliente>\n <valor_declarado>100.5</valor_declarado>\n <descricao>teste</descricao>\n <cklist>cklist</cklist>\n <numero>1</numero>\n <ag>1</ag>\n <cartao>1234</cartao>\n <servico_adicional>20.5</servico_adicional>\n <ar>2</ar>\n <remetente>\n <nome>JEFERSON VAZ DOS SANTOS</nome>\n <logradouro>RUA BLA BLA BLA</logradouro>\n <numero>666</numero>\n <complemento>APT 100</complemento>\n <bairro>PINHEIROS</bairro>\n <reference>REFERENCE</reference>\n <cidade>S&#xC3;O PAULO</cidade>\n <uf>SP</uf>\n <cep>05427020</cep>\n <ddd>16</ddd>\n <telefone>41606809</telefone>\n <email>jeff@example.com</email>\n <identificacao/>\n <ddd_celular/>\n <celular/>\n <sms/>\n </remetente>\n <produto>\n <codigo>code</codigo>\n <tipo>type</tipo>\n <qtd>3</qtd>\n </produto>\n <obj_col>\n <obj>\n <item>127078</item>\n <id>1405670</id>\n <desc>Pen Drive SAndisk 16GB SDCZ50-016G-A95</desc>\n <ship>ship</ship>\n <num>1</num>\n </obj>\n <obj>\n <item>277574</item>\n <id>1405670</id>\n <desc>Chip unico claro Pre pago</desc>\n <ship>ship</ship>\n <num>2</num>\n </obj>\n </obj_col>\n </coletas_solicitadas>\n\n</tns:solicitarPostagemReversa></env:Body></env:Envelope>",
56
+ :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Length'=>'2306', 'Content-Type'=>'text/xml;charset=UTF-8', 'Soapaction'=>'"solicitarPostagemReversa"', 'User-Agent'=>'Ruby'}).
57
+ to_return(:status => 200, :body => correios_fixture('response_inexistent_zipcode.xml'), :headers => {})
58
+
59
+ expect{subject}.to raise_error(Models::Errors::InexistentZipcode)
60
+ end
61
+ end
62
+
63
+ context 'when collect is not available for the house' do
64
+ it 'should raise UnavailableHouseCollect error' do
65
+ stub_request(:post, "http://webservicescolhomologacao.correios.com.br/ScolWeb/WebServiceScol").
66
+ with(:body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:tns=\"http://webservice.scol.correios.com.br/\" xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"><env:Body><tns:solicitarPostagemReversa><cartao>0057018901</cartao><codigo_servico>41076</codigo_servico><contrato>9912208555</contrato><codAdministrativo>08082650</codAdministrativo><senha>8o8otn</senha><usuario>60618043</usuario>\n <destinatario>\n <nome>ESTABELECIMENT W*M</nome>\n <logradouro>ESTRADA DE ACESSO A JANDIRA</logradouro>\n <numero>1400</numero>\n <complemento>G4</complemento>\n <bairro>FAZENDA ITAQUI</bairro>\n <referencia>REFERENCE</referencia>\n <cidade>BARUERI</cidade>\n <uf>SP</uf>\n <cep>06442130</cep>\n <ddd>11</ddd>\n <telefone>21683228</telefone>\n <email>teste@example.com</email>\n </destinatario>\n <coletas_solicitadas>\n <tipo>CA</tipo>\n <id_cliente>1405670</id_cliente>\n <valor_declarado>100.5</valor_declarado>\n <descricao>teste</descricao>\n <cklist>cklist</cklist>\n <numero>1</numero>\n <ag>1</ag>\n <cartao>1234</cartao>\n <servico_adicional>20.5</servico_adicional>\n <ar>2</ar>\n <remetente>\n <nome>JEFERSON VAZ DOS SANTOS</nome>\n <logradouro>RUA BLA BLA BLA</logradouro>\n <numero>666</numero>\n <complemento>APT 100</complemento>\n <bairro>PINHEIROS</bairro>\n <reference>REFERENCE</reference>\n <cidade>S&#xC3;O PAULO</cidade>\n <uf>SP</uf>\n <cep>05427020</cep>\n <ddd>16</ddd>\n <telefone>41606809</telefone>\n <email>jeff@example.com</email>\n <identificacao/>\n <ddd_celular/>\n <celular/>\n <sms/>\n </remetente>\n <produto>\n <codigo>code</codigo>\n <tipo>type</tipo>\n <qtd>3</qtd>\n </produto>\n <obj_col>\n <obj>\n <item>127078</item>\n <id>1405670</id>\n <desc>Pen Drive SAndisk 16GB SDCZ50-016G-A95</desc>\n <ship>ship</ship>\n <num>1</num>\n </obj>\n <obj>\n <item>277574</item>\n <id>1405670</id>\n <desc>Chip unico claro Pre pago</desc>\n <ship>ship</ship>\n <num>2</num>\n </obj>\n </obj_col>\n </coletas_solicitadas>\n\n</tns:solicitarPostagemReversa></env:Body></env:Envelope>",
67
+ :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Length'=>'2306', 'Content-Type'=>'text/xml;charset=UTF-8', 'Soapaction'=>'"solicitarPostagemReversa"', 'User-Agent'=>'Ruby'}).
68
+ to_return(:status => 200, :body => correios_fixture('response_unavailable_house_collect.xml'), :headers => {})
69
+
70
+ expect{subject}.to raise_error(Models::Errors::UnavailableHouseCollect)
71
+ end
72
+ end
73
+
74
+
75
+ context 'when collect is for a not answered zipcode' do
76
+ it 'should raise CollectNotAnsweredForTheZipcode error' do
77
+ stub_request(:post, "http://webservicescolhomologacao.correios.com.br/ScolWeb/WebServiceScol").
78
+ with(:body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:tns=\"http://webservice.scol.correios.com.br/\" xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"><env:Body><tns:solicitarPostagemReversa><cartao>0057018901</cartao><codigo_servico>41076</codigo_servico><contrato>9912208555</contrato><codAdministrativo>08082650</codAdministrativo><senha>8o8otn</senha><usuario>60618043</usuario>\n <destinatario>\n <nome>ESTABELECIMENT W*M</nome>\n <logradouro>ESTRADA DE ACESSO A JANDIRA</logradouro>\n <numero>1400</numero>\n <complemento>G4</complemento>\n <bairro>FAZENDA ITAQUI</bairro>\n <referencia>REFERENCE</referencia>\n <cidade>BARUERI</cidade>\n <uf>SP</uf>\n <cep>06442130</cep>\n <ddd>11</ddd>\n <telefone>21683228</telefone>\n <email>teste@example.com</email>\n </destinatario>\n <coletas_solicitadas>\n <tipo>CA</tipo>\n <id_cliente>1405670</id_cliente>\n <valor_declarado>100.5</valor_declarado>\n <descricao>teste</descricao>\n <cklist>cklist</cklist>\n <numero>1</numero>\n <ag>1</ag>\n <cartao>1234</cartao>\n <servico_adicional>20.5</servico_adicional>\n <ar>2</ar>\n <remetente>\n <nome>JEFERSON VAZ DOS SANTOS</nome>\n <logradouro>RUA BLA BLA BLA</logradouro>\n <numero>666</numero>\n <complemento>APT 100</complemento>\n <bairro>PINHEIROS</bairro>\n <reference>REFERENCE</reference>\n <cidade>S&#xC3;O PAULO</cidade>\n <uf>SP</uf>\n <cep>05427020</cep>\n <ddd>16</ddd>\n <telefone>41606809</telefone>\n <email>jeff@example.com</email>\n <identificacao/>\n <ddd_celular/>\n <celular/>\n <sms/>\n </remetente>\n <produto>\n <codigo>code</codigo>\n <tipo>type</tipo>\n <qtd>3</qtd>\n </produto>\n <obj_col>\n <obj>\n <item>127078</item>\n <id>1405670</id>\n <desc>Pen Drive SAndisk 16GB SDCZ50-016G-A95</desc>\n <ship>ship</ship>\n <num>1</num>\n </obj>\n <obj>\n <item>277574</item>\n <id>1405670</id>\n <desc>Chip unico claro Pre pago</desc>\n <ship>ship</ship>\n <num>2</num>\n </obj>\n </obj_col>\n </coletas_solicitadas>\n\n</tns:solicitarPostagemReversa></env:Body></env:Envelope>",
79
+ :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Length'=>'2306', 'Content-Type'=>'text/xml;charset=UTF-8', 'Soapaction'=>'"solicitarPostagemReversa"', 'User-Agent'=>'Ruby'}).
80
+ to_return(:status => 200, :body => correios_fixture('response_not_answered_for_zipcode.xml'), :headers => {})
81
+
82
+ expect{subject}.to raise_error(Models::Errors::CollectNotAnsweredForTheZipcode)
83
+ end
84
+ end
85
+
86
+
87
+ context 'when correios answer with another code' do
88
+ it 'should raise UnknownError error' do
89
+ stub_request(:post, "http://webservicescolhomologacao.correios.com.br/ScolWeb/WebServiceScol").
90
+ with(:body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:tns=\"http://webservice.scol.correios.com.br/\" xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"><env:Body><tns:solicitarPostagemReversa><cartao>0057018901</cartao><codigo_servico>41076</codigo_servico><contrato>9912208555</contrato><codAdministrativo>08082650</codAdministrativo><senha>8o8otn</senha><usuario>60618043</usuario>\n <destinatario>\n <nome>ESTABELECIMENT W*M</nome>\n <logradouro>ESTRADA DE ACESSO A JANDIRA</logradouro>\n <numero>1400</numero>\n <complemento>G4</complemento>\n <bairro>FAZENDA ITAQUI</bairro>\n <referencia>REFERENCE</referencia>\n <cidade>BARUERI</cidade>\n <uf>SP</uf>\n <cep>06442130</cep>\n <ddd>11</ddd>\n <telefone>21683228</telefone>\n <email>teste@example.com</email>\n </destinatario>\n <coletas_solicitadas>\n <tipo>CA</tipo>\n <id_cliente>1405670</id_cliente>\n <valor_declarado>100.5</valor_declarado>\n <descricao>teste</descricao>\n <cklist>cklist</cklist>\n <numero>1</numero>\n <ag>1</ag>\n <cartao>1234</cartao>\n <servico_adicional>20.5</servico_adicional>\n <ar>2</ar>\n <remetente>\n <nome>JEFERSON VAZ DOS SANTOS</nome>\n <logradouro>RUA BLA BLA BLA</logradouro>\n <numero>666</numero>\n <complemento>APT 100</complemento>\n <bairro>PINHEIROS</bairro>\n <reference>REFERENCE</reference>\n <cidade>S&#xC3;O PAULO</cidade>\n <uf>SP</uf>\n <cep>05427020</cep>\n <ddd>16</ddd>\n <telefone>41606809</telefone>\n <email>jeff@example.com</email>\n <identificacao/>\n <ddd_celular/>\n <celular/>\n <sms/>\n </remetente>\n <produto>\n <codigo>code</codigo>\n <tipo>type</tipo>\n <qtd>3</qtd>\n </produto>\n <obj_col>\n <obj>\n <item>127078</item>\n <id>1405670</id>\n <desc>Pen Drive SAndisk 16GB SDCZ50-016G-A95</desc>\n <ship>ship</ship>\n <num>1</num>\n </obj>\n <obj>\n <item>277574</item>\n <id>1405670</id>\n <desc>Chip unico claro Pre pago</desc>\n <ship>ship</ship>\n <num>2</num>\n </obj>\n </obj_col>\n </coletas_solicitadas>\n\n</tns:solicitarPostagemReversa></env:Body></env:Envelope>",
91
+ :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Length'=>'2306', 'Content-Type'=>'text/xml;charset=UTF-8', 'Soapaction'=>'"solicitarPostagemReversa"', 'User-Agent'=>'Ruby'}).
92
+ to_return(:status => 200, :body => correios_fixture('response_unexpected.xml'), :headers => {})
93
+
94
+ expect{subject}.to raise_error(Models::Errors::UnknownError)
95
+ end
96
+ end
97
+
98
+ end
99
+ end
100
+ end
101
+ end