Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implements phone validator #28

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

tiagompalte
Copy link

Implementação de validação de número de celular e de telefone, retornando o UF referente ao DDD do número.

#21

@ArtusC
Copy link

ArtusC commented Feb 5, 2024

Opa, tudo bem @tiagompalte?

Eu estava dando uma olhada no seu código, você chegou a seguir alguma referência para a validação dos números de telefone? Outra dúvida, o seu código deveria validar também telefones residenciais?

Eu precisei fazer algo do tipo recentemente e segui esta referencia, que contém os padões para os números de telefone: https://www.teleco.com.br/num.asp

DIto isso, eu adicionei alguns testes e fiz algumas modificações no seu código a fim de seguir esse padrão.

Irei deixar essas modificações nesse comentário, a fim de que você avalie e veja se faz sentido implementá-las no seu PR 😁

  • phone_test.go
func TestIsPhone(t *testing.T) {
	for i, tc := range []struct {
		name          string
		expectedValid bool
		expectedUf    FederativeUnit
		v             string
	}{
		{"Valid_ShouldReturnTrueUfSP", true, SP, "+55(11)999999999"},
		{"Valid_ShouldReturnTrueUfSP", true, SP, "55(11)999999999"},
		{"Valid_ShouldReturnTrueUfPR", true, PR, "(41)999999999"},
		{"Valid_ShouldReturnTrueUfDF", true, DF, "(61)32222222"},
		{"Valid_ShouldReturnTrueUfAC", true, AC, "(68) 99988-1234"},
		{"Valid_ShouldReturnTrueUfPE", true, PE, "8198988888"},
		{"Valid_ShouldReturnTrueUfPE", true, PE, "558198988888"},
		{"Valid_ShouldReturnFalseUfAC", true, SP, "12 9999-9999"},
		{"InvalidDDI_ShouldReturnFalseUfAC", false, AC, "+01(11)999999999"},
		{"InvalidDDD_ShouldReturnFalseUfAC_1", false, AC, "(01)999999999"},
		{"InvalidDDD_ShouldReturnFalseUfAC_2", false, AC, "55(01)999999999"},
		{"InvalidPattern_ShouldReturnFalseUfAC_1", true, SP, "11 9999 9999"},
		{"InvalidPattern_ShouldReturnFalseUfAC_2", true, SP, "11 9 9999 9999"},
		{"InvalidPattern_ShouldReturnFalseUfAC_3", false, AC, "11.99999.9999"},
		{"InvalidPattern_ShouldReturnFalseUfAC_4", false, AC, "11 99999/9999"},
		{"InvalidPattern_ShouldReturnFalseUfAC_5", false, AC, "(11)9999999-99"},
		{"Teste_novo_1", true, SP, "+55 (11) 3340-2800"},
		{"Teste_novo_2", true, SP, "+55 (12) 3340 2801"},
		{"Teste_novo_3", true, SP, "+55 (13) 33402802"},
		{"Teste_novo_4", true, SP, "+55 (14)3340-2803"},
		{"Teste_novo_5", true, SP, "+55 (15)33402804"},
		{"Teste_novo_6", true, SP, "+55 (16)3340 2805"},
		{"Teste_novo_7", true, SP, "+55 (17) 9 6340-2806"},
		{"Teste_novo_8", true, SP, "+55 (18) 9 6340 2807"},
		{"Teste_novo_9", true, SP, "+55 (19) 9 63402808"},
		{"Teste_novo_10", true, RJ, "+55 (21)9 7340-2809"},
		{"Teste_novo_11", true, RJ, "+55 (22)9 73402810"},
		{"Teste_novo_12", true, RJ, "+55 (24)9 7340 2811"},
		{"Teste_novo_13", true, ES, "+55 (27) 98340-2812"},
		{"Teste_novo_14", true, ES, "+55 (28) 98340 2813"},
		{"Teste_novo_15", true, MG, "+55 (31) 983402814"},
		{"Teste_novo_16", true, MG, "+55 (32)99340-2815"},
		{"Teste_novo_17", true, MG, "+55 (33)993402816"},
		{"Teste_novo_18", true, MG, "+55 (34)99340 2817"},
		{"Teste_novo_19", true, MG, "+55 35 3340-2818"},
		{"Teste_novo_20", true, MG, "+55 37 33402819"},
		{"Teste_novo_21", true, MG, "+55 38 3340 2820"},
		{"Teste_novo_22", true, PR, "+55 41 9 6340-2821"},
		{"Teste_novo_23", true, PR, "+55 42 9 63402822"},
		{"Teste_novo_24", true, PR, "+55 43 9 6340 2823"},
		{"Teste_novo_25", true, PR, "+55 44 97340-2824"},
		{"Teste_novo_26", true, PR, "+55 45 973402825"},
		{"Teste_novo_27", true, PR, "+55 46 97340 2826"},
	} {
		t.Run(testName(i, tc.name), func(t *testing.T) {
			t.Helper()
			isValid, uf := IsPhone(tc.v)
			assertEqual(t, tc.expectedValid, isValid)
			assertEqual(t, tc.expectedUf, uf)
		})
	}
  • phone.go
// Reference to get the correct number: https://www.teleco.com.br/num.asp
var cellPhoneRegexp = regexp.MustCompile(`^(?:(?:\+|00)?(55)\s?)?(?:\(?([1-9][0-9])\)?\s?)(?:((?:9\s?\d|[6789]{1})\d{3})(?:(\-|\s|\.))?(\d{4}))$`)
var residencialPhoneRegexp = regexp.MustCompile(`^(?:(?:\+|00)?(55)\s?)?(?:\(?([1-9][0-9])\)?\s?)(?:((?:\s?\d|[2345]{1})\d{3})(?:(\-|\s|\.))?(\d{4}))$`)

var mapDDD = map[string]FederativeUnit{
	"61": DF,
	"62": GO,
	"64": GO,
	"65": MT,
	"66": MT,
	"67": MS,
	"82": AL,
	"71": BA,
	"73": BA,
	"74": BA,
	"75": BA,
	"77": BA,
	"85": CE,
	"88": CE,
	"98": MA,
	"99": MA,
	"83": PB,
	"81": PE,
	"87": PE,
	"86": PI,
	"89": PI,
	"84": RN,
	"79": SE,
	"68": AC,
	"96": AP,
	"92": AM,
	"97": AM,
	"91": PA,
	"93": PA,
	"94": PA,
	"69": RO,
	"95": RR,
	"63": TO,
	"27": ES,
	"28": ES,
	"31": MG,
	"32": MG,
	"33": MG,
	"34": MG,
	"35": MG,
	"37": MG,
	"38": MG,
	"21": RJ,
	"22": RJ,
	"24": RJ,
	"11": SP,
	"12": SP,
	"13": SP,
	"14": SP,
	"15": SP,
	"16": SP,
	"17": SP,
	"18": SP,
	"19": SP,
	"41": PR,
	"42": PR,
	"43": PR,
	"44": PR,
	"45": PR,
	"46": PR,
	"51": RS,
	"53": RS,
	"54": RS,
	"55": RS,
	"47": SC,
	"48": SC,
	"49": SC,
}

// IsPhone verifies if `phone` is a phone or residential valid number and return UF from DDD.
func IsPhone(phone string) (isValid bool, uf FederativeUnit) {
	if !cellPhoneRegexp.MatchString(phone) && !residencialPhoneRegexp.MatchString(phone) {
		isValid = false
		return
	}

	cellPhoneGroups := cellPhoneRegexp.FindStringSubmatch(phone)
	residencialPhoneGroups := residencialPhoneRegexp.FindStringSubmatch(phone)
	var groups []string

	if cellPhoneGroups == nil {
		groups = residencialPhoneGroups
	} else {
		groups = cellPhoneGroups
	}

	groupDDD := 2
	uf, isValid = mapDDD[groups[groupDDD]]

	return
}

@tiagompalte
Copy link
Author

Obrigado pela contribuição @ArtusC
Código mergeado

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants