Skip to content

Commit 7c3dfa9

Browse files
committed
- Adicionado projeto de teste com XUnit para biblioteca NFe.Utils.
- Adicionados alguns testes unitários para classe Enderecador; - Refatorado alguns métodos da classe Enderecador para melhorar a testabilidade.
1 parent f5f3935 commit 7c3dfa9

File tree

4 files changed

+169
-18
lines changed

4 files changed

+169
-18
lines changed

NFe.Utils.Testes/EnderecadorTestes.cs

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
using System;
2+
using System.Linq;
3+
using DFe.Classes.Entidades;
4+
using DFe.Classes.Flags;
5+
using NFe.Classes.Informacoes.Identificacao.Tipos;
6+
using NFe.Classes.Servicos.Tipos;
7+
using NFe.Utils.Enderecos;
8+
using Xunit;
9+
10+
namespace NFe.Utils.Testes
11+
{
12+
public class EnderecadorTestes
13+
{
14+
[Theory(DisplayName = "NFe -> Normal -> Autorização -> 4.0")]
15+
[ClassData(typeof(EstadosData))]
16+
public void DeveCadaUfTerServicoDeAutorizacaoParaNFe4(Estado uf, TipoAmbiente tipoAmbiente, ServicoNFe servicoAutorizacao)
17+
{
18+
var lista = Enderecador.ObterEnderecoServicosMaisRecentes(VersaoServico.ve400, uf, tipoAmbiente, ModeloDocumento.NFe, TipoEmissao.teNormal);
19+
Assert.Equal(1, lista.Count(n => n.ServicoNFe == servicoAutorizacao));
20+
}
21+
22+
[Theory(DisplayName = "NFe -> SVC-AN -> Autorização -> 4.0")]
23+
[ClassData(typeof(SvcAnData))]
24+
public void DeveUfSvcAnTerServicoDeAutorizacaoParaNFe4(Estado uf, TipoAmbiente tipoAmbiente, ServicoNFe servicoAutorizacao)
25+
{
26+
var lista = Enderecador.ObterEnderecoServicosMaisRecentes(VersaoServico.ve400, uf, tipoAmbiente, ModeloDocumento.NFe, TipoEmissao.teSVCAN);
27+
Assert.Equal(1, lista.Count(n => n.ServicoNFe == servicoAutorizacao));
28+
}
29+
30+
[Theory(DisplayName = "NFe -> SVC-RS -> Autorização -> 4.0")]
31+
[ClassData(typeof(SvcRsData))]
32+
public void DeveUfSvcRsTerServicoDeAutorizacaoParaNFe4(Estado uf, TipoAmbiente tipoAmbiente, ServicoNFe servicoAutorizacao)
33+
{
34+
var lista = Enderecador.ObterEnderecoServicosMaisRecentes(VersaoServico.ve400, uf, tipoAmbiente, ModeloDocumento.NFe, TipoEmissao.teSVCRS);
35+
Assert.Equal(1, lista.Count(n => n.ServicoNFe == servicoAutorizacao));
36+
}
37+
38+
[Fact]
39+
public void DeveUrlAmEstarCorretaParaNFeAutorizacaoVersao4()
40+
{
41+
var url = Enderecador.ObterUrlServico(ServicoNFe.NFeAutorizacao, VersaoServico.ve400, Estado.AM,
42+
TipoAmbiente.Producao, ModeloDocumento.NFe, TipoEmissao.teNormal);
43+
Assert.Equal("https://nfe.sefaz.am.gov.br/services2/services/NfeAutorizacao4", url);
44+
}
45+
46+
[Fact]
47+
public void DeveUrlBaEstarCorretaParaNFeAutorizacaoVersao4()
48+
{
49+
var url = Enderecador.ObterUrlServico(ServicoNFe.NFeAutorizacao, VersaoServico.ve400, Estado.BA,
50+
TipoAmbiente.Producao, ModeloDocumento.NFe, TipoEmissao.teNormal);
51+
Assert.Equal("https://nfe.sefaz.ba.gov.br/webservices/NFeAutorizacao4/NFeAutorizacao4.asmx", url);
52+
}
53+
54+
[Fact]
55+
public void DeveUrlSpEstarCorretaParaNFeAutorizacaoVersao4()
56+
{
57+
var url = Enderecador.ObterUrlServico(ServicoNFe.NFeAutorizacao, VersaoServico.ve400, Estado.SP,
58+
TipoAmbiente.Producao, ModeloDocumento.NFe, TipoEmissao.teNormal);
59+
Assert.Equal("https://nfe.fazenda.sp.gov.br/ws/nfeautorizacao4.asmx", url);
60+
}
61+
}
62+
63+
public class EstadosData : TheoryData<Estado, TipoAmbiente, ServicoNFe>
64+
{
65+
public EstadosData()
66+
{
67+
var todosOsEstados = Enum.GetValues(typeof(Estado)).Cast<Estado>().ToList();
68+
todosOsEstados.Remove(Estado.AN);
69+
todosOsEstados.Remove(Estado.EX);
70+
71+
var tiposAmbiente = Enum.GetValues(typeof(TipoAmbiente)).Cast<TipoAmbiente>().ToList();
72+
var servicosAutorizacao = new[] {ServicoNFe.NFeAutorizacao, ServicoNFe.NFeRetAutorizacao};
73+
74+
foreach (var tipoAmbiente in tiposAmbiente)
75+
foreach (var estado in todosOsEstados)
76+
foreach (var servico in servicosAutorizacao)
77+
Add(estado, tipoAmbiente, servico);
78+
79+
}
80+
}
81+
82+
public class SvcAnData : TheoryData<Estado, TipoAmbiente, ServicoNFe>
83+
{
84+
public SvcAnData()
85+
{
86+
var tiposAmbiente = Enum.GetValues(typeof(TipoAmbiente)).Cast<TipoAmbiente>().ToList();
87+
var servicosAutorizacao = new[] { ServicoNFe.NFeAutorizacao, ServicoNFe.NFeRetAutorizacao };
88+
89+
foreach (var tipoAmbiente in tiposAmbiente)
90+
foreach (var estado in Enderecador.EstadosQueUsamSvcAnParaNfe())
91+
foreach (var servico in servicosAutorizacao)
92+
Add(estado, tipoAmbiente, servico);
93+
}
94+
}
95+
96+
public class SvcRsData : TheoryData<Estado, TipoAmbiente, ServicoNFe>
97+
{
98+
public SvcRsData()
99+
{
100+
var tiposAmbiente = Enum.GetValues(typeof(TipoAmbiente)).Cast<TipoAmbiente>().ToList();
101+
var servicosAutorizacao = new[] { ServicoNFe.NFeAutorizacao, ServicoNFe.NFeRetAutorizacao };
102+
103+
foreach (var tipoAmbiente in tiposAmbiente)
104+
foreach (var estado in Enderecador.EstadosQueUsamSvcRsParaNfe())
105+
foreach (var servico in servicosAutorizacao)
106+
Add(estado, tipoAmbiente, servico);
107+
}
108+
}
109+
}
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netcoreapp2.0</TargetFramework>
5+
6+
<IsPackable>false</IsPackable>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
11+
<PackageReference Include="xunit" Version="2.3.1" />
12+
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
13+
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
14+
</ItemGroup>
15+
16+
<ItemGroup>
17+
<ProjectReference Include="..\NFe.Utils\NFe.Utils.csproj" />
18+
</ItemGroup>
19+
20+
</Project>

Shared.NFe.Utils/Enderecos/Enderecador.cs

+33-18
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ public static List<Estado> EstadosQueUsamSvcAnParaNfe()
6363
return new List<Estado> { Estado.AC, Estado.AL, Estado.AP, Estado.DF, Estado.ES, Estado.MG, Estado.PB, Estado.RJ, Estado.RN, Estado.RO, Estado.RR, Estado.RS, Estado.SC, Estado.SE, Estado.SP, Estado.TO };
6464
}
6565

66+
/// <summary>
67+
/// Lista de <see cref="Estado"/> que utilizam SVC-RS para NF-e
68+
/// </summary>
69+
/// <returns></returns>
70+
public static List<Estado> EstadosQueUsamSvcRsParaNfe()
71+
{
72+
return new List<Estado> { Estado.AM, Estado.BA, Estado.CE, Estado.GO, Estado.MA, Estado.MS, Estado.MT, Estado.PA, Estado.PE, Estado.PR };
73+
}
74+
6675
/// <summary>
6776
/// Lista de <see cref="Estado"/> que usam SVAN para NF-e
6877
/// </summary>
@@ -133,7 +142,7 @@ private static List<EnderecoServico> CarregarEnderecosServicos()
133142

134143
var svcanEstados = EstadosQueUsamSvcAnParaNfe();
135144

136-
var svcRsEstados = new List<Estado> { Estado.AM, Estado.BA, Estado.CE, Estado.GO, Estado.MA, Estado.MS, Estado.MT, Estado.PA, Estado.PE, Estado.PI, Estado.PR };
145+
var svcRsEstados = EstadosQueUsamSvcRsParaNfe();
137146

138147
var todosOsEstados = Enum.GetValues(typeof(Estado)).Cast<Estado>().ToList();
139148

@@ -1641,34 +1650,40 @@ private static List<EnderecoServico> CarregarEnderecosServicos()
16411650
/// Obtém uma string com a mensagem de erro.
16421651
/// Essa função é acionada quando não é encontrada uma url para os parâmetros informados na função ObterUrlServico.
16431652
/// </summary>
1644-
/// <param name="servico"></param>
1645-
/// <param name="cfgServico"></param>
16461653
/// <returns></returns>
1647-
private static string Erro(ServicoNFe servico, ConfiguracaoServico cfgServico)
1654+
private static string Erro(ServicoNFe servico, VersaoServico versaoServico, Estado estado, TipoAmbiente tipoAmbiente, TipoEmissao tipoEmissao, ModeloDocumento modeloDocumento)
16481655
{
1649-
return "Serviço " + servico + ", versão " + servico.VersaoServicoParaString(servico.ObterVersaoServico(cfgServico)) + ", não disponível para a UF " + cfgServico.cUF + ", no ambiente de " + cfgServico.tpAmb.TpAmbParaString() +
1650-
" para emissão tipo " + cfgServico.tpEmis.TipoEmissaoParaString() + ", documento: " + cfgServico.ModeloDocumento.ModeloDocumentoParaString() + "!";
1656+
return "Serviço " + servico + ", versão " + servico.VersaoServicoParaString(versaoServico) + ", não disponível para a UF " + estado + ", no ambiente de " + tipoAmbiente.TpAmbParaString() +
1657+
" para emissão tipo " + tipoEmissao.TipoEmissaoParaString() + ", documento: " + modeloDocumento.ModeloDocumentoParaString() + "!";
16511658
}
16521659

16531660
/// <summary>
16541661
/// Obtém uma url a partir de uma lista armazenada em enderecoServico e povoada dinamicamente no create desta classe
16551662
/// </summary>
1656-
/// <param name="servico"></param>
1657-
/// <param name="cfgServico"></param>
16581663
/// <returns></returns>
16591664
public static string ObterUrlServico(ServicoNFe servico, ConfiguracaoServico cfgServico)
16601665
{
1661-
var definicao = from d in ListaEnderecos
1662-
where d.Estado == cfgServico.cUF && d.ServicoNFe == servico && d.TipoAmbiente == cfgServico.tpAmb && d.TipoEmissao == cfgServico.tpEmis && d.VersaoServico == ObterVersaoServico(servico, cfgServico) && d.ModeloDocumento == cfgServico.ModeloDocumento
1663-
select d.Url;
1664-
var listaRetorno = definicao as IList<string> ?? definicao.ToList();
1665-
var qtdeRetorno = listaRetorno.Count();
1666-
1667-
if (qtdeRetorno == 0)
1668-
throw new Exception(Erro(servico, cfgServico));
1669-
if (qtdeRetorno > 1)
1666+
var versaoServico = ObterVersaoServico(servico, cfgServico);
1667+
if (versaoServico == null)
1668+
throw new Exception(string.Format("Não foi possível obter a versão do serviço {0}!", servico));
1669+
return ObterUrlServico(servico, versaoServico.GetValueOrDefault(), cfgServico.cUF, cfgServico.tpAmb,
1670+
cfgServico.ModeloDocumento, cfgServico.tpEmis);
1671+
}
1672+
1673+
/// <summary>
1674+
/// Obtém uma url a partir de uma lista armazenada em enderecoServico e povoada dinamicamente no create desta classe
1675+
/// </summary>
1676+
/// <returns></returns>
1677+
public static string ObterUrlServico(ServicoNFe servico, VersaoServico versaoServico, Estado estado, TipoAmbiente tipoAmbiente, ModeloDocumento modeloDocumento, TipoEmissao tipoEmissao)
1678+
{
1679+
var urls = ObterEnderecoServicosMaisRecentes(versaoServico, estado, tipoAmbiente, modeloDocumento, tipoEmissao).Where(n => n.ServicoNFe == servico)
1680+
.Select(n => n.Url).ToList();
1681+
1682+
if (!urls.Any())
1683+
throw new Exception(Erro(servico, versaoServico, estado, tipoAmbiente, tipoEmissao, modeloDocumento));
1684+
if (urls.Count > 1)
16701685
throw new Exception("A função ObterUrlServico obteve mais de um resultado!");
1671-
return listaRetorno.FirstOrDefault();
1686+
return urls.FirstOrDefault();
16721687
}
16731688

16741689
/// <summary>

Zeus NFe.sln

+7
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Shared.NFe.Servicos", "Shar
9696
EndProject
9797
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Shared.NFe.Utils", "Shared.NFe.Utils\Shared.NFe.Utils.shproj", "{E7A4800F-B2ED-4495-B847-C4BF5654E24E}"
9898
EndProject
99+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NFe.Utils.Testes", "NFe.Utils.Testes\NFe.Utils.Testes.csproj", "{10E0CB25-B295-4624-BF3D-CA038B73CCCA}"
100+
EndProject
99101
Global
100102
GlobalSection(SharedMSBuildProjectFiles) = preSolution
101103
Shared.NFe.Classes\Shared.NFe.Classes.projitems*{29ca1da2-440d-484b-951a-cf1b2eb27984}*SharedItemsImports = 4
@@ -237,6 +239,10 @@ Global
237239
{744D38A4-773E-4EA3-9DAB-30394AD65678}.Debug|Any CPU.Build.0 = Debug|Any CPU
238240
{744D38A4-773E-4EA3-9DAB-30394AD65678}.Release|Any CPU.ActiveCfg = Release|Any CPU
239241
{744D38A4-773E-4EA3-9DAB-30394AD65678}.Release|Any CPU.Build.0 = Release|Any CPU
242+
{10E0CB25-B295-4624-BF3D-CA038B73CCCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
243+
{10E0CB25-B295-4624-BF3D-CA038B73CCCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
244+
{10E0CB25-B295-4624-BF3D-CA038B73CCCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
245+
{10E0CB25-B295-4624-BF3D-CA038B73CCCA}.Release|Any CPU.Build.0 = Release|Any CPU
240246
EndGlobalSection
241247
GlobalSection(SolutionProperties) = preSolution
242248
HideSolutionNode = FALSE
@@ -277,6 +283,7 @@ Global
277283
{A802BD59-CC36-4CB1-95B1-64CD72E1DC0C} = {F981A8AC-E660-492B-8BF3-CBF70B66E392}
278284
{57631341-C61B-49C6-A6ED-317EC42B1581} = {A802BD59-CC36-4CB1-95B1-64CD72E1DC0C}
279285
{E7A4800F-B2ED-4495-B847-C4BF5654E24E} = {A802BD59-CC36-4CB1-95B1-64CD72E1DC0C}
286+
{10E0CB25-B295-4624-BF3D-CA038B73CCCA} = {164EF13E-7F27-4BC8-92A4-A82B1696B279}
280287
EndGlobalSection
281288
GlobalSection(ExtensibilityGlobals) = postSolution
282289
SolutionGuid = {C8C4D9F7-EF86-49A2-83AF-13FA5D4E8DBB}

0 commit comments

Comments
 (0)