Skip to content

Instantly share code, notes, and snippets.

@aaferrari
Created April 7, 2020 05:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aaferrari/4d9d94b2c3c45d3d29e7bfae7b0e2317 to your computer and use it in GitHub Desktop.
Save aaferrari/4d9d94b2c3c45d3d29e7bfae7b0e2317 to your computer and use it in GitHub Desktop.
Generador de códigos validos para http://testingchallenges.thetestingmap.org/challenge4.php Al ejecutarlo genera 5 códigos
# -*- coding: utf-8 -*-
from random import choice
from datetime import datetime
# Se asume que los extranjeros nacieron en el sigo XX
centuries = {"1": "19", "2": "19", "3": "18", "4": "18", "5": "20", "6": "20", "7": "20", "8": "20", "9": "20"}
def gencnp():
cnp = []
cnp.append(str(choice(range(1,10)))) # Primer dígito
cnp.append('{:02d}'.format(choice(range(0,100)))) # Segundo y tercer dígito (año)
cnp.append('{:02d}'.format(choice(range(1,13)))) # Cuarto y quinto dígito (mes)
valid_day = False
# Verificamos que la fecha sea valida antes de seguir
while valid_day == False:
try:
day = choice(range(1,13))
datetime(int(centuries[cnp[0]] + cnp[1]), int(cnp[2]), day)
cnp.append('{:02d}'.format(day)) # Sexto y séptimo dígito (día)
valid_day = True
except ValueError: pass
cnp.append('{:02d}'.format(choice(range(1,53)))) # Octavo y noveno dígito (código de área)
cnp.append('{:03d}'.format(choice(range(0,1000)))) # Décimo al décimo segundo (numero de orden)
# Generamos el ultimo dígito
multiplier =[int(digit) for digit in "279146358279"]
result = 0
for x, y in zip(list("".join(cnp)), multiplier):
result = result + (int(x)*y)
resto = result % 11
cnp.append(str(1 if resto == 10 else resto))
return "".join(cnp)
# Generamos algunos números para probar en http://testingchallenges.thetestingmap.org/challenge4.php
for x in range(5): print(gencnp())
"""
Casos positivos
===============
4611210253033
2720212010211
8470709092939
8090409134871
3240605148291
Casos negativos
===============
0590108464250: El primer dígito (siglo) es invalido, aunque se muestra el error de "Invalid length or content". Con otros números (excepto el 9) muestra "Invalid Control Number" y con el 5 aparece "Born year bigger than current year" seguido de "Invalid date"
7799912152753: Mes no valido (cuarto y quinto dígito).
1990255072867: Día del mes no valido (sexto y séptimo dígito).
2020403778166: Código de área no valido (octavo y noveno dígito).
2071001441030: Ultimo dígito (de control) no es valido.
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment