Skip to content

Commit af7f9df

Browse files
committed
test: add XmlBuilderTest
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
1 parent 5c17f68 commit af7f9df

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

tests/Unit/Xml/XmlBuilderTest.php

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<?php
2+
3+
// SPDX-FileCopyrightText: 2026 LibreCode coop and contributors
4+
// SPDX-License-Identifier: AGPL-3.0-or-later
5+
6+
declare(strict_types=1);
7+
8+
namespace LibreCodeCoop\NfsePHP\Tests\Unit\Xml;
9+
10+
use LibreCodeCoop\NfsePHP\Dto\DpsData;
11+
use LibreCodeCoop\NfsePHP\Tests\TestCase;
12+
use LibreCodeCoop\NfsePHP\Xml\XmlBuilder;
13+
14+
/**
15+
* @covers \LibreCodeCoop\NfsePHP\Xml\XmlBuilder
16+
*/
17+
class XmlBuilderTest extends TestCase
18+
{
19+
private XmlBuilder $builder;
20+
21+
protected function setUp(): void
22+
{
23+
$this->builder = new XmlBuilder();
24+
}
25+
26+
public function testBuildDpsReturnsWellFormedXml(): void
27+
{
28+
$dps = $this->makeDps();
29+
$xml = $this->builder->buildDps($dps);
30+
31+
self::assertNotEmpty($xml);
32+
33+
$doc = new \DOMDocument();
34+
self::assertTrue($doc->loadXML($xml), 'Generated XML must be valid XML');
35+
}
36+
37+
public function testBuildDpsContainsCnpjPrestador(): void
38+
{
39+
$dps = $this->makeDps(cnpjPrestador: '29842527000145');
40+
$xml = $this->builder->buildDps($dps);
41+
42+
self::assertStringContainsString('29842527000145', $xml);
43+
}
44+
45+
public function testBuildDpsContainsMunicipioIbge(): void
46+
{
47+
$dps = $this->makeDps(municipioIbge: '3303302');
48+
$xml = $this->builder->buildDps($dps);
49+
50+
self::assertStringContainsString('3303302', $xml);
51+
}
52+
53+
public function testBuildDpsContainsValorServico(): void
54+
{
55+
$dps = $this->makeDps(valorServico: '1500.00');
56+
$xml = $this->builder->buildDps($dps);
57+
58+
self::assertStringContainsString('1500.00', $xml);
59+
}
60+
61+
public function testDiscriminacaoIsXmlEscaped(): void
62+
{
63+
$dps = $this->makeDps(discriminacao: 'Serviço de <consultoria> & TI');
64+
$xml = $this->builder->buildDps($dps);
65+
66+
// The raw characters must NOT appear unescaped
67+
self::assertStringNotContainsString('<consultoria>', $xml);
68+
self::assertStringContainsString('&lt;consultoria&gt;', $xml);
69+
}
70+
71+
public function testIssRetidoSetsTribCode(): void
72+
{
73+
$dpsRetido = $this->makeDps(issRetido: true);
74+
$dpsProprio = $this->makeDps(issRetido: false);
75+
76+
$xmlRetido = $this->builder->buildDps($dpsRetido);
77+
$xmlProprio = $this->builder->buildDps($dpsProprio);
78+
79+
self::assertStringContainsString('<tribISSQN>2</tribISSQN>', $xmlRetido);
80+
self::assertStringContainsString('<tribISSQN>1</tribISSQN>', $xmlProprio);
81+
}
82+
83+
// -------------------------------------------------------------------------
84+
85+
private function makeDps(
86+
string $cnpjPrestador = '29842527000145',
87+
string $municipioIbge = '3303302',
88+
string $itemListaServico = '0107',
89+
string $valorServico = '1000.00',
90+
string $aliquota = '5.00',
91+
string $discriminacao = 'Consultoria em TI',
92+
bool $issRetido = false,
93+
): DpsData {
94+
return new DpsData(
95+
cnpjPrestador: $cnpjPrestador,
96+
municipioIbge: $municipioIbge,
97+
itemListaServico: $itemListaServico,
98+
valorServico: $valorServico,
99+
aliquota: $aliquota,
100+
discriminacao: $discriminacao,
101+
issRetido: $issRetido,
102+
);
103+
}
104+
}

0 commit comments

Comments
 (0)