-
-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathsiat_codigos_service_test.go
More file actions
390 lines (332 loc) · 13.9 KB
/
siat_codigos_service_test.go
File metadata and controls
390 lines (332 loc) · 13.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
package services_test
import (
"context"
"log"
"os"
"testing"
"time"
"github.com/joho/godotenv"
"github.com/ron86i/go-siat/pkg/models"
"github.com/ron86i/go-siat/pkg/utils"
"github.com/ron86i/go-siat"
"github.com/stretchr/testify/assert"
)
// TestNotificaCertificadoRevocado valida que el servicio sea capaz de informar al SIAT
// sobre la revocación de un certificado digital.
// Requisitos: El certificado enviado debe ser el registrado previamente en el portal de Impuestos.
func TestNotificaCertificadoRevocado(t *testing.T) {
// Cargar configuración de integración desde el entorno (.env)
godotenv.Load()
// Parsear el NIT (Int64)
nit, err := utils.ParseInt64Safe(os.Getenv("SIAT_NIT"))
if err != nil {
t.Fatalf("la variable SIAT_NIT debe ser un número válido: %v", err)
}
codAmbiente, err := utils.ParseIntSafe(os.Getenv("SIAT_CODIGO_AMBIENTE"))
if err != nil {
t.Fatalf("la variable SIAT_CODIGO_AMBIENTE debe ser un número válido: %v", err)
}
config := siat.Config{
Token: os.Getenv("SIAT_TOKEN"),
}
siatClient, _ := siat.New(os.Getenv("SIAT_URL"), nil)
service := siatClient.Codigos()
fechaRevocacion := time.Now()
// Preparar la solicitud de notificación. Se requiere un certificado y una razón válida.
req := models.Codigos().NewNotificaCertificadoRevocadoBuilder().
WithCodigoAmbiente(codAmbiente).
WithCodigoSistema(os.Getenv("SIAT_CODIGO_SISTEMA")).
WithNit(nit).
WithCodigoSucursal(0).
WithCuis("197C8240").
WithFechaRevocacion(&fechaRevocacion).
WithRazonRevocacion("Prueba de revocación por sistema").
WithCertificado(`-----BEGIN CERTIFICATE-----
MIIEejCCA2KgA...alF2Tw0jIVieaeefsL78Yv8fA==
-----END CERTIFICATE-----`).
Build()
// Ejecutar la petición al SIAT y procesar el resultado de la revocación
resp, err := service.NotificaCertificadoRevocado(context.Background(), config, req)
// Validar que no existan errores de comunicación o de estructura SOAP
if !assert.NoError(t, err) {
t.Fatalf("Fallo en la comunicación con el SIAT: %v", err)
}
// Verificar la integridad de la respuesta y registrar el estado devuelto
if assert.NotNil(t, resp) {
resultado := resp.Body.Content.RespuestaNotificaRevocado
log.Printf("Resultado de Notificación Revocada: %v", resultado.Transaccion)
if len(resultado.MensajesList) > 0 {
for _, msg := range resultado.MensajesList {
log.Printf("Mensaje SIAT [%d]: %s", msg.Codigo, msg.Descripcion)
}
}
// En integración, validamos que la transacción sea reportada por el SIAT
assert.IsType(t, true, resultado.Transaccion)
}
}
// TestVerificarNit valida el flujo completo de verificación de un NIT directamente
// contra el servicio real del SIAT, asegurando que la configuración cargada sea válida
// y que la respuesta del servidor se procese correctamente sin predecir mensajes fijos.
func TestVerificarNit(t *testing.T) {
// Cargar configuración de integración desde el entorno (.env)
godotenv.Load()
codModalidad, err := utils.ParseIntSafe(os.Getenv("SIAT_CODIGO_MODALIDAD"))
if err != nil {
t.Fatalf("la variable SIAT_CODIGO_MODALIDAD debe ser un número válido: %v", err)
}
nit, err := utils.ParseInt64Safe(os.Getenv("SIAT_NIT"))
if err != nil {
t.Fatalf("la variable SIAT_NIT debe ser un número válido: %v", err)
}
codAmbiente, err := utils.ParseIntSafe(os.Getenv("SIAT_CODIGO_AMBIENTE"))
if err != nil {
t.Fatalf("la variable SIAT_CODIGO_AMBIENTE debe ser un número válido: %v", err)
}
config := siat.Config{
Token: os.Getenv("SIAT_TOKEN"),
}
siatClient, _ := siat.New(os.Getenv("SIAT_URL"), nil)
service := siatClient.Codigos()
// Preparar la solicitud de verificación. El CUIS debe ser válido para el NIT en ambiente de prueba.
req := models.Codigos().NewVerificarNitBuilder().
WithCodigoAmbiente(codAmbiente).
WithCodigoModalidad(codModalidad).
WithCodigoSistema(os.Getenv("SIAT_CODIGO_SISTEMA")).
WithNit(nit).
WithCodigoSucursal(0).
WithCuis("197C8240").
WithNitParaVerificacion(12345678). // Un NIT de prueba para validar la comunicación
Build()
// Ejecutar la petición al SIAT y procesar el resultado
resp, err := service.VerificarNit(context.Background(), config, req)
// Validar que no existan errores de comunicación o de serialización XML
if !assert.NoError(t, err) {
t.Fatalf("Fallo en la comunicación con el SIAT: %v", err)
}
// Verificar la integridad de la respuesta y registrar los mensajes devueltos por el servidor
if assert.NotNil(t, resp) {
resultado := resp.Body.Content.RespuestaVerificarNit
log.Printf("Resultado de Verificación NIT: %v", resultado.Transaccion)
if len(resultado.MensajesList) > 0 {
for _, msg := range resultado.MensajesList {
log.Printf("Mensaje SIAT [%d]: %s", msg.Codigo, msg.Descripcion)
}
}
// En integración, validamos que el tipo de datos sea el esperado para la transacción
assert.IsType(t, true, resultado.Transaccion)
}
}
// TestSolicitudCuis valida la obtención de un Código Único de Inicio de Sistemas (CUIS).
// El CUIS es fundamental para identificar un punto de venta y su sistema asociado ante el SIAT.
// Se recomienda renovar el CUIS periódicamente según la vigencia devuelta por el servidor.
func TestSolicitudCuis(t *testing.T) {
godotenv.Load()
codModalidad, err := utils.ParseIntSafe(os.Getenv("SIAT_CODIGO_MODALIDAD"))
if err != nil {
t.Fatalf("la variable SIAT_CODIGO_MODALIDAD debe ser un número válido: %v", err)
}
// Parsear el NIT (Int64)
nit, err := utils.ParseInt64Safe(os.Getenv("SIAT_NIT"))
if err != nil {
t.Fatalf("la variable SIAT_NIT debe ser un número válido: %v", err)
}
codAmbiente, err := utils.ParseIntSafe(os.Getenv("SIAT_CODIGO_AMBIENTE"))
if err != nil {
t.Fatalf("la variable SIAT_CODIGO_AMBIENTE debe ser un número válido: %v", err)
}
config := siat.Config{
Token: os.Getenv("SIAT_TOKEN"),
}
siatClient, _ := siat.New(os.Getenv("SIAT_URL"), nil)
service := siatClient.Codigos()
req := models.Codigos().NewCuisBuilder().
WithCodigoAmbiente(codAmbiente).
WithCodigoModalidad(codModalidad).
WithCodigoSistema(os.Getenv("SIAT_CODIGO_SISTEMA")).
WithNit(nit).
WithCodigoSucursal(0).
WithCodigoPuntoVenta(0).
Build()
resp, err := service.SolicitudCuis(context.Background(), config, req)
// Confirmar que la comunicación fue exitosa y se recibió un objeto de respuesta
if assert.NoError(t, err) && assert.NotNil(t, resp) {
resultado := resp.Body.Content.RespuestaCuis
// Registrar los datos obtenidos para facilitar la auditoría de los tests
log.Printf("Respuesta Cuis - Transacción: %v", resultado.Transaccion)
assert.NotEmpty(t, resultado.Codigo)
log.Printf("CUIS Obtenido: %s", resultado.Codigo)
}
}
// TestSolicitudCufd valida la obtención del Código Único de Facturación Diaria (CUFD).
// El CUFD debe solicitarse cada 24 horas o al inicio de operaciones del día.
// Requiere un CUIS vigente para ser procesado correctamente por el SIAT.
func TestSolicitudCufd(t *testing.T) {
// Cargar entorno de configuración para tests de integración
godotenv.Load()
codModalidad, err := utils.ParseIntSafe(os.Getenv("SIAT_CODIGO_MODALIDAD"))
if err != nil {
t.Fatalf("la variable SIAT_CODIGO_MODALIDAD debe ser un número válido: %v", err)
}
// Parsear el NIT (Int64)
nit, err := utils.ParseInt64Safe(os.Getenv("SIAT_NIT"))
if err != nil {
t.Fatalf("la variable SIAT_NIT debe ser un número válido: %v", err)
}
codAmbiente, err := utils.ParseIntSafe(os.Getenv("SIAT_CODIGO_AMBIENTE"))
if err != nil {
t.Fatalf("la variable SIAT_CODIGO_AMBIENTE debe ser un número válido: %v", err)
}
config := siat.Config{
Token: os.Getenv("SIAT_TOKEN"),
}
siatClient, _ := siat.New(os.Getenv("SIAT_URL"), nil)
service := siatClient.Codigos()
req := models.Codigos().NewCuisBuilder().
WithCodigoAmbiente(codAmbiente).
WithCodigoModalidad(codModalidad).
WithCodigoSistema(os.Getenv("SIAT_CODIGO_SISTEMA")).
WithNit(nit).
WithCodigoSucursal(0).
WithCodigoPuntoVenta(0).
Build()
respCuis, err := service.SolicitudCuis(context.Background(), config, req)
// Preparar la estructura de solicitud de CUFD con los datos de prueba
reqCufd := models.Codigos().NewCufdBuilder().
WithCodigoAmbiente(codAmbiente).
WithCodigoModalidad(codModalidad).
WithCodigoSistema(os.Getenv("SIAT_CODIGO_SISTEMA")).
WithNit(nit).
WithCodigoSucursal(0).
WithCodigoPuntoVenta(0).
WithCuis(respCuis.Body.Content.RespuestaCuis.Codigo). // Requiere un CUIS vigente para el NIT configurado
Build()
// Ejecutar la llamada al servicio de códigos del SIAT
resp, err := service.SolicitudCufd(context.Background(), config, reqCufd)
// Validar la recepción de la respuesta y registrar el estado de la transacción
if assert.NoError(t, err) && assert.NotNil(t, resp) {
res := resp.Body.Content.RespuestaCufd
log.Println("Respuesta de cufd:", res)
}
}
// TestSolicitudCufdMasivo verifica la obtención masiva de códigos CUFD para múltiples
// puntos de venta o sucursales en una sola operación.
func TestSolicitudCufdMasivo(t *testing.T) {
// Cargar configuración de integración real
godotenv.Load()
codModalidad, err := utils.ParseIntSafe(os.Getenv("SIAT_CODIGO_MODALIDAD"))
if err != nil {
t.Fatalf("la variable SIAT_CODIGO_MODALIDAD debe ser un número válido: %v", err)
}
codAmbiente, err := utils.ParseIntSafe(os.Getenv("SIAT_CODIGO_AMBIENTE"))
if err != nil {
t.Fatalf("la variable SIAT_CODIGO_AMBIENTE debe ser un número válido: %v", err)
}
nit, err := utils.ParseInt64Safe(os.Getenv("SIAT_NIT"))
if err != nil {
t.Fatalf("la variable SIAT_NIT debe ser un número válido: %v", err)
}
config := siat.Config{
Token: os.Getenv("SIAT_TOKEN"),
}
siatClient, err := siat.New(os.Getenv("SIAT_URL"), nil)
assert.NoError(t, err)
service := siatClient.Codigos()
cuis := []*models.SolicitudListaCufdDtoBuilder{}
cuis = append(cuis, models.Codigos().NewSolicitudListaCufdDtoBuilder().
WithCodigoSucursal(0).
WithCodigoPuntoVenta(0).
WithCuis("197C8240"))
// Configurar la lista de solicitudes masivas (por ejemplo, para la sucursal 0 y punto de venta 0)
req := models.Codigos().NewCufdMasivoBuilder().
WithCodigoAmbiente(codAmbiente).
WithCodigoModalidad(codModalidad).
WithCodigoSistema(os.Getenv("SIAT_CODIGO_SISTEMA")).
WithNit(nit).
WithDatosSolicitud(cuis...).
Build()
// Ejecutar la petición masiva al SIAT
resp, err := service.SolicitudCufdMasivo(context.Background(), config, req)
// Validar que la respuesta contenga datos y registrar el resultado de la operación masiva
if assert.NoError(t, err) && assert.NotNil(t, resp) {
res := resp.Body.Content.RespuestaCufdMasivo
log.Printf("Resultado Masivo - Transacción: %v", res.Transaccion)
if len(res.ListaRespuestasCufd) > 0 {
for _, item := range res.ListaRespuestasCufd {
log.Printf("CUFD Masivo Recibido para Sucursal %d: %v", *item.CodigoSucursal.Value, item)
}
}
}
}
// TestSolicitudCuisMasivo verifica la obtención masiva de códigos CUIS para múltiples
// puntos de venta en una única transacción, asegurando la eficiencia en configuraciones extensas.
func TestSolicitudCuisMasivo(t *testing.T) {
// Cargar configuración real del entorno para pruebas de integración
godotenv.Load()
codModalidad, err := utils.ParseIntSafe(os.Getenv("SIAT_CODIGO_MODALIDAD"))
if err != nil {
t.Fatalf("la variable SIAT_CODIGO_MODALIDAD debe ser un número válido: %v", err)
}
// Parsear el NIT (Int64)
nit, err := utils.ParseInt64Safe(os.Getenv("SIAT_NIT"))
if err != nil {
t.Fatalf("la variable SIAT_NIT debe ser un número válido: %v", err)
}
codAmbiente, err := utils.ParseIntSafe(os.Getenv("SIAT_CODIGO_AMBIENTE"))
if err != nil {
t.Fatalf("la variable SIAT_CODIGO_AMBIENTE debe ser un número válido: %v", err)
}
config := siat.Config{
Token: os.Getenv("SIAT_TOKEN"),
}
siatClient, _ := siat.New(os.Getenv("SIAT_URL"), nil)
service := siatClient.Codigos()
assert.NoError(t, err)
listCuis := []*models.SolicitudListaCuisDtoBuilder{}
listCuis = append(listCuis, models.Codigos().NewSolicitudListaCuisDtoBuilder().
WithCodigoSucursal(0).
WithCodigoPuntoVenta(0))
// Configurar la solicitud masiva de CUIS para un punto de venta específico
req := models.Codigos().NewCuisMasivoBuilder().
WithCodigoAmbiente(codAmbiente).
WithCodigoModalidad(codModalidad).
WithCodigoSistema(os.Getenv("SIAT_CODIGO_SISTEMA")).
WithNit(nit).
WithDatosSolicitud(listCuis...).
Build()
// Ejecutar la petición masiva al SIAT
resp, err := service.SolicitudCuisMasivo(context.Background(), config, req)
// Validar que la comunicación fue exitosa y registrar los resultados individuales obtenidos
if assert.NoError(t, err) && assert.NotNil(t, resp) {
res := resp.Body.Content.RespuestaCuisMasivo
log.Printf("Resultado Cuis Masivo - Transacción: %v", res.Transaccion)
if len(res.ListaRespuestasCuis) > 0 {
for _, item := range res.ListaRespuestasCuis {
log.Printf("CUIS Masivo Recibido para Sucursal %d: %s", *item.CodigoSucursal, item.Codigo)
}
}
}
}
// TestVerificarComunicacion valida la conectividad básica con los servidores del SIAT enviando una solicitud
// de verificación de comunicación. El servicio debe registrar la petición y retornar un código
// que confirme la recepción exitosa, asegurando que el canal SOAP esté operativo.
func TestVerificarComunicacion(t *testing.T) {
// Cargar configuración desde .env
godotenv.Load()
config := siat.Config{
Token: os.Getenv("SIAT_TOKEN"),
}
siatClient, err := siat.New(os.Getenv("SIAT_URL"), nil)
if err != nil {
t.Fatalf("Error al crear cliente SIAT: %v", err)
}
service := siatClient.Codigos()
ctx := context.Background()
req := models.Codigos().NewVerificarComunicacionCodigosBuilder().Build()
// Ejecutar la petición de verificación de comunicación
resp, err := service.VerificarComunicacion(ctx, config, req)
if err != nil {
t.Fatalf("Error en VerificarComunicacion: %v", err)
}
assert.NotNil(t, resp, "La respuesta no debería ser nula")
assert.True(t, resp.Body.Content.RespuestaComunicacion.Transaccion, "La prueba de comunicación debería ser exitosa")
}