228 lines
6.4 KiB
Python
228 lines
6.4 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import unittest
|
|
import warnings
|
|
import httpx
|
|
from uuid import UUID
|
|
|
|
|
|
URL_API = 'http://127.0.0.1:8000/api/{}'
|
|
PATH_CERT = 'certificados/comercio.{}'
|
|
CFDI_MINIMO = {
|
|
"comprobante": {
|
|
"TipoCambio": "1",
|
|
"Moneda": "MXN",
|
|
"TipoDeComprobante": "I",
|
|
"LugarExpedicion": "06850",
|
|
"SubTotal": "1000.00",
|
|
"Total": "1160.00",
|
|
"FormaPago": "03",
|
|
"MetodoPago": "PUE",
|
|
},
|
|
"emisor": {
|
|
"Rfc": "EKU9003173C9",
|
|
"RegimenFiscal": "601",
|
|
},
|
|
"receptor": {
|
|
"Rfc": "BASM740115RW0",
|
|
"UsoCFDI": "G01"
|
|
},
|
|
"conceptos": [
|
|
{
|
|
"ClaveProdServ": "60121001",
|
|
"Cantidad": "1.0",
|
|
"ClaveUnidad": "KGM",
|
|
"Descripcion": "Asesoría en desarrollo",
|
|
"ValorUnitario": "1000.00",
|
|
"Importe": "1000.00",
|
|
"impuestos": {
|
|
"traslados": [
|
|
{
|
|
"Base": "1000.00",
|
|
"Impuesto": "002",
|
|
"TipoFactor": "Tasa",
|
|
"TasaOCuota": "0.160000",
|
|
"Importe": "160.00"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"impuestos": {
|
|
"TotalImpuestosTrasladados": "160.00",
|
|
"traslados": [
|
|
{
|
|
"Impuesto": "002",
|
|
"TipoFactor": "Tasa",
|
|
"TasaOCuota": "0.160000",
|
|
"Importe": "160.00"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
|
|
CFDI_ISH = {
|
|
"comprobante": {
|
|
"TipoCambio": "1",
|
|
"Moneda": "MXN",
|
|
"TipoDeComprobante": "I",
|
|
"LugarExpedicion": "06850",
|
|
"SubTotal": "1409.64",
|
|
"Total": "1677.47",
|
|
"FormaPago": "03",
|
|
"MetodoPago": "PUE"
|
|
},
|
|
"emisor": {
|
|
"Rfc": "EKU9003173C9",
|
|
"RegimenFiscal": "601"
|
|
},
|
|
"receptor": {
|
|
"Rfc": "BASM740115RW0",
|
|
"UsoCFDI": "G01"
|
|
},
|
|
"conceptos": [
|
|
{
|
|
"ClaveProdServ": "81112106",
|
|
"Cantidad": "1.0",
|
|
"ClaveUnidad": "18",
|
|
"Descripcion": "Proveedores de servicios de aplicación",
|
|
"ValorUnitario": "1409.64",
|
|
"Importe": "1409.64",
|
|
"impuestos": {
|
|
"traslados": [
|
|
{
|
|
"Base": "1409.64",
|
|
"Impuesto": "002",
|
|
"TipoFactor": "Tasa",
|
|
"TasaOCuota": "0.160000",
|
|
"Importe": "225.54"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"impuestos": {
|
|
"TotalImpuestosTrasladados": "225.54",
|
|
"traslados": [
|
|
{
|
|
"Impuesto": "002",
|
|
"TipoFactor": "Tasa",
|
|
"TasaOCuota": "0.160000",
|
|
"Importe": "225.54"
|
|
}
|
|
]
|
|
},
|
|
"complementos": {
|
|
"impuestos_locales": {
|
|
"TotaldeTraslados": "42.29",
|
|
"TotaldeRetenciones": "0.00",
|
|
"traslados": [
|
|
{
|
|
"ImpLocTrasladado": "ISH",
|
|
"TasadeTraslado": "3.00",
|
|
"Importe": "42.29"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
def ignore_warnings(test_func):
|
|
def do_test(self, *args, **kwargs):
|
|
with warnings.catch_warnings():
|
|
warnings.simplefilter("ignore")
|
|
test_func(self, *args, **kwargs)
|
|
return do_test
|
|
|
|
|
|
class TestClients(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
print(f'In method: {self._testMethodName}')
|
|
self.url = URL_API.format('clients/')
|
|
|
|
def test_unauthorized_without_token(self):
|
|
expected = 401
|
|
result = httpx.post(self.url)
|
|
self.assertEqual(expected, result.status_code)
|
|
|
|
def test_unauthorized_with_token(self):
|
|
expected = 401
|
|
result = httpx.post(self.url, headers={'Token': '123'})
|
|
self.assertEqual(expected, result.status_code)
|
|
|
|
@ignore_warnings
|
|
def test_01_add_client(self):
|
|
expected = 201
|
|
headers = {'Token': '12345'}
|
|
data = {
|
|
'rfc': 'EKU9003173C9',
|
|
'password': '12345678a',
|
|
}
|
|
files = {
|
|
'cer': open(PATH_CERT.format('cer'), 'rb'),
|
|
'key': open(PATH_CERT.format('key'), 'rb'),
|
|
}
|
|
result = httpx.post(self.url, headers=headers, data=data, files=files)
|
|
self.assertEqual(expected, result.status_code)
|
|
|
|
def test_02_get_client(self):
|
|
expected = 200
|
|
headers = {'Token': '12345'}
|
|
params = {'rfc': 'EKU9003173C9'}
|
|
result = httpx.get(self.url, headers=headers, params=params)
|
|
self.assertEqual(expected, result.status_code)
|
|
|
|
def test_03_delete_client(self):
|
|
expected = 200
|
|
headers = {'Token': '12345'}
|
|
params = {'rfc': 'EKU9003173C9'}
|
|
result = httpx.delete(self.url, headers=headers, params=params)
|
|
self.assertEqual(expected, result.status_code)
|
|
|
|
def test_04_delete_client_not_exists(self):
|
|
expected = 202
|
|
headers = {'Token': '12345'}
|
|
params = {'rfc': 'EKU900317321'}
|
|
result = httpx.delete(self.url, headers=headers, params=params)
|
|
self.assertEqual(expected, result.status_code)
|
|
|
|
|
|
class TestCfdi(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
print(f'In method: {self._testMethodName}')
|
|
self.url = URL_API.format('cfdi/')
|
|
|
|
# ~ @unittest.skip('temp')
|
|
def test_stamp_cfdi_emisor_not_exists(self):
|
|
expected = 202
|
|
msg = 'Emisor no existe'
|
|
headers = {'Token': '12345'}
|
|
cfdi = CFDI_MINIMO.copy()
|
|
cfdi['emisor']['Rfc'] = 'No_exists'
|
|
result = httpx.post(self.url, headers=headers, json=cfdi)
|
|
self.assertEqual(result.text, msg)
|
|
self.assertEqual(expected, result.status_code)
|
|
|
|
def test_stamp_cfdi(self):
|
|
expected = 201
|
|
headers = {'Token': '12345'}
|
|
result = httpx.post(self.url, headers=headers, json=CFDI_MINIMO)
|
|
data = result.json()
|
|
self.assertEqual(expected, result.status_code)
|
|
self.assertTrue(bool(UUID(data['uuid'])))
|
|
|
|
def test_stamp_cfdi_ish(self):
|
|
expected = 201
|
|
headers = {'Token': '12345'}
|
|
result = httpx.post(self.url, headers=headers, json=CFDI_ISH)
|
|
data = result.json()
|
|
self.assertEqual(expected, result.status_code)
|
|
self.assertTrue(bool(UUID(data['uuid'])))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|