Skip to content
Snippets Groups Projects
Commit e9762f8b authored by Fernando K's avatar Fernando K
Browse files

Revamp genLogin and add tests

parent e303dcc1
Branches
No related tags found
1 merge request!2Revamp genLogin and add tests
......@@ -214,47 +214,64 @@ func genGecos(u model.User) model.User {
return u
}
// honestly... i had 3 functions that had a similar algorithm
// and one that only redirected the flow. so i took it as a
// challenge to merge them into one :D this it the result.
// don't even bother trying to understand it, just go back
// a few commits and read there
func genLogin(name, grr, ltype string, variance int) string {
fix := 1
login := ""
var solo string
parts := formatName(name)
type LoginType int
if len(parts) <= 1 {
if ltype != "ini" || len(parts) == 0 {
return "_"
}
}
const (
Initials LoginType = iota
FirstName
LastName
)
if ltype == "first" {
login, parts, fix = parts[0], parts[1:], 0
variance++
func genLogin(name string, grr string, ltype LoginType, variance int) string {
parts := formatName(name)
if len(parts) == 0 {
return "_"
}
if ltype == "last" {
solo, parts = parts[len(parts)-1], parts[:len(parts)-1]
part_prefix_len := make([]int, len(parts))
if ltype == Initials {
// a primeira letra de cada parte deve aparecer
for i := 0; i < len(parts); i++ {
part_prefix_len[i] = 1
}
x := variance / len(parts)
y := variance % len(parts)
for i := range parts {
if y != 0 {
login += parts[i][:x+1+fix]
y--
} else if ltype == FirstName {
// a primeira parte inteira deve aparecer
part_prefix_len[0] = len(parts[0])
} else {
login += parts[i][:x+fix]
// a primeira letra de cada parte deve aparecer
for i := 0; i < len(parts); i++ {
part_prefix_len[i] = 1
}
// assim com a parte final do nome
part_prefix_len[len(parts)-1] = len(parts[len(parts)-1])
}
part_prefix_ix := 0
for i := 0; i < variance; i++ {
ok := false
for k := 0; k < len(parts) && !ok; k++ {
if part_prefix_len[part_prefix_ix] < len(parts[part_prefix_ix]) {
part_prefix_len[part_prefix_ix]++
ok = true
}
part_prefix_ix = (part_prefix_ix + 1) % len(parts)
}
if !ok {
// acabou o que fazer, vamos abandonar porque não vai mudar mais nada
break
}
}
if ltype == "ini" { login += grr[2:4] }
if ltype == "last" { login += solo }
login := ""
for i := 0; i < len(parts); i++ {
login += parts[i][:part_prefix_len[i]]
}
if login == "" {
return "_"
}
if ltype == Initials {
login += grr[2:4]
}
return login
}
......@@ -274,10 +291,18 @@ func formatName(name string) []string {
return parts
}
func genUniqueUID(name, grr, ltype string, users []model.User) (string, error) {
func genUniqueUID(name, grr string, ltypeString string, users []model.User) (string, error) {
var uid string
used, variance := true, 0
for used {
var ltype LoginType
if ltypeString == "ini" {
ltype = Initials
} else if ltypeString == "first" {
ltype = FirstName
} else {
ltype = LastName
}
uid = genLogin(name, grr, ltype, variance)
// already taken or alias for it exists :(
......@@ -517,6 +542,14 @@ func validateStatus(status string) error {
return nil
}
func validateLtype(ltype string) error {
if ltype != "ini" && ltype != "first" && ltype != "last" {
err := fmt.Errorf("Login type can only be \"ini\", \"first\" or \"last\"")
return err
}
return nil
}
func validateGRR(grr string) error {
// OK if empty, only "ini" login type requires it and we check :)
if grr == "_" { return nil }
......@@ -580,6 +613,11 @@ func validateInputs(opts model.Opts) error {
err = validateStatus(opts.Status)
if err != nil { return err }
err = validateLtype(opts.Ltype)
if err != nil {
return err
}
// it’s OK if UID is empty here, we generate it later :)
if opts.UID != "" {
err := validateUID(opts.UID)
......
package user
import (
"reflect"
"testing"
)
func assertEqual(t *testing.T, a any, b any) {
if !reflect.DeepEqual(a, b) {
t.Fatalf("%s != %s", a, b)
}
}
func TestGenLogin(t *testing.T) {
assertEqual(t, genLogin("", "20241982", Initials, 0), "_")
assertEqual(t, genLogin("", "20241982", Initials, 1), "_")
assertEqual(t, genLogin("", "20241982", Initials, 2), "_")
assertEqual(t, genLogin("", "20241982", Initials, 3), "_")
assertEqual(t, genLogin("", "20241982", FirstName, 0), "_")
assertEqual(t, genLogin("", "20241982", FirstName, 1), "_")
assertEqual(t, genLogin("", "20241982", FirstName, 2), "_")
assertEqual(t, genLogin("", "20241982", FirstName, 3), "_")
assertEqual(t, genLogin("", "20241982", LastName, 0), "_")
assertEqual(t, genLogin("", "20241982", LastName, 1), "_")
assertEqual(t, genLogin("", "20241982", LastName, 2), "_")
assertEqual(t, genLogin("", "20241982", LastName, 3), "_")
assertEqual(t, genLogin("de", "20241982", Initials, 0), "_")
assertEqual(t, genLogin("de", "20241982", Initials, 1), "_")
assertEqual(t, genLogin("de", "20241982", Initials, 2), "_")
assertEqual(t, genLogin("de", "20241982", Initials, 3), "_")
assertEqual(t, genLogin("de", "20241982", FirstName, 0), "_")
assertEqual(t, genLogin("de", "20241982", FirstName, 1), "_")
assertEqual(t, genLogin("de", "20241982", FirstName, 2), "_")
assertEqual(t, genLogin("de", "20241982", FirstName, 3), "_")
assertEqual(t, genLogin("de", "20241982", LastName, 0), "_")
assertEqual(t, genLogin("de", "20241982", LastName, 1), "_")
assertEqual(t, genLogin("de", "20241982", LastName, 2), "_")
assertEqual(t, genLogin("de", "20241982", LastName, 3), "_")
assertEqual(t, genLogin("da de", "20241982", Initials, 0), "_")
assertEqual(t, genLogin("da de", "20241982", Initials, 1), "_")
assertEqual(t, genLogin("da de", "20241982", Initials, 2), "_")
assertEqual(t, genLogin("da de", "20241982", Initials, 3), "_")
assertEqual(t, genLogin("da de", "20241982", FirstName, 0), "_")
assertEqual(t, genLogin("da de", "20241982", FirstName, 1), "_")
assertEqual(t, genLogin("da de", "20241982", FirstName, 2), "_")
assertEqual(t, genLogin("da de", "20241982", FirstName, 3), "_")
assertEqual(t, genLogin("da de", "20241982", LastName, 0), "_")
assertEqual(t, genLogin("da de", "20241982", LastName, 1), "_")
assertEqual(t, genLogin("da de", "20241982", LastName, 2), "_")
assertEqual(t, genLogin("da de", "20241982", LastName, 3), "_")
assertEqual(t, genLogin("Fabiano", "20241982", Initials, 0), "f24")
assertEqual(t, genLogin("Fabiano", "20241982", Initials, 1), "fa24")
assertEqual(t, genLogin("Fabiano", "20241982", Initials, 2), "fab24")
assertEqual(t, genLogin("Fabiano", "20241982", Initials, 3), "fabi24")
assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 0), "fabiano")
assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 1), "fabiano")
assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 2), "fabiano")
assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 3), "fabiano")
assertEqual(t, genLogin("Fabiano", "20241982", LastName, 0), "fabiano")
assertEqual(t, genLogin("Fabiano", "20241982", LastName, 1), "fabiano")
assertEqual(t, genLogin("Fabiano", "20241982", LastName, 2), "fabiano")
assertEqual(t, genLogin("Fabiano", "20241982", LastName, 3), "fabiano")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 0), "faps24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 1), "faaps24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 2), "faanps24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 3), "faanpes24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 14), "fabiaantunperesouz24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 18), "fabianantunepereisouza24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 19), "fabianantunepereirsouza24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 20), "fabianoantunepereirsouza24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 21), "fabianoantunespereirsouza24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 22), "fabianoantunespereirasouza24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 40), "fabianoantunespereirasouza24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 50), "fabianoantunespereirasouza24")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 0), "fabiano")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 1), "fabianoa")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 2), "fabianoap")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 3), "fabianoaps")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 4), "fabianoanps")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 16), "fabianoantunepereisouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 17), "fabianoantunepereirsouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 18), "fabianoantunespereirsouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 19), "fabianoantunespereirasouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 20), "fabianoantunespereirasouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 50), "fabianoantunespereirasouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 0), "fapsouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 1), "faapsouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 2), "faanpsouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 3), "faanpesouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 15), "fabianantunepereirsouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 16), "fabianoantunepereirsouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 17), "fabianoantunespereirsouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 18), "fabianoantunespereirasouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 19), "fabianoantunespereirasouza")
assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 100), "fabianoantunespereirasouza")
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment