correios_sigep 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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