Skip to content
Snippets Groups Projects
Commit f7a9abb4 authored by Theo's avatar Theo :troll:
Browse files

Merge branch 'revamp-genLogin' into 'main'

Revamp genLogin and add tests

See merge request tss24/useradm!2
parents e303dcc1 e9762f8b
Branches
No related tags found
1 merge request!2Revamp genLogin and add tests
...@@ -214,47 +214,64 @@ func genGecos(u model.User) model.User { ...@@ -214,47 +214,64 @@ func genGecos(u model.User) model.User {
return u return u
} }
// honestly... i had 3 functions that had a similar algorithm type LoginType int
// 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)
if len(parts) <= 1 { const (
if ltype != "ini" || len(parts) == 0 { Initials LoginType = iota
return "_" FirstName
} LastName
} )
if ltype == "first" { func genLogin(name string, grr string, ltype LoginType, variance int) string {
login, parts, fix = parts[0], parts[1:], 0 parts := formatName(name)
variance++ if len(parts) == 0 {
return "_"
} }
if ltype == "last" { part_prefix_len := make([]int, len(parts))
solo, parts = parts[len(parts)-1], parts[:len(parts)-1] if ltype == Initials {
// a primeira letra de cada parte deve aparecer
for i := 0; i < len(parts); i++ {
part_prefix_len[i] = 1
} }
} else if ltype == FirstName {
x := variance / len(parts) // a primeira parte inteira deve aparecer
y := variance % len(parts) part_prefix_len[0] = len(parts[0])
for i := range parts {
if y != 0 {
login += parts[i][:x+1+fix]
y--
} else { } 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] } login := ""
if ltype == "last" { login += solo } 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 return login
} }
...@@ -274,10 +291,18 @@ func formatName(name string) []string { ...@@ -274,10 +291,18 @@ func formatName(name string) []string {
return parts 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 var uid string
used, variance := true, 0 used, variance := true, 0
for used { 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) uid = genLogin(name, grr, ltype, variance)
// already taken or alias for it exists :( // already taken or alias for it exists :(
...@@ -517,6 +542,14 @@ func validateStatus(status string) error { ...@@ -517,6 +542,14 @@ func validateStatus(status string) error {
return nil 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 { func validateGRR(grr string) error {
// OK if empty, only "ini" login type requires it and we check :) // OK if empty, only "ini" login type requires it and we check :)
if grr == "_" { return nil } if grr == "_" { return nil }
...@@ -580,6 +613,11 @@ func validateInputs(opts model.Opts) error { ...@@ -580,6 +613,11 @@ func validateInputs(opts model.Opts) error {
err = validateStatus(opts.Status) err = validateStatus(opts.Status)
if err != nil { return err } 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 :) // it’s OK if UID is empty here, we generate it later :)
if opts.UID != "" { if opts.UID != "" {
err := validateUID(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