github.com/infraboard/keyauth@v0.8.1/common/password/generator_test.go (about) 1 package password 2 3 import ( 4 "fmt" 5 "reflect" 6 "strings" 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 ) 11 12 func TestNew(t *testing.T) { 13 type args struct { 14 config *Config 15 } 16 tests := []struct { 17 name string 18 args args 19 want *Generator 20 wantErr error 21 }{ 22 { 23 name: "default config", 24 args: args{nil}, 25 want: func() *Generator { 26 cfg := &DefaultConfig 27 cfg.CharacterSet = buildCharacterSet(cfg) 28 cfg.Length = LengthStrong 29 return &Generator{cfg} 30 }(), 31 }, 32 { 33 name: "set config", 34 args: args{&Config{ 35 IncludeLowercaseLetters: true, 36 }}, 37 want: func() *Generator { 38 cfg := Config{IncludeLowercaseLetters: true} 39 cfg.CharacterSet = "abcdefghijklmnopqrstuvwxyz" 40 cfg.Length = LengthStrong 41 return &Generator{&cfg} 42 }(), 43 }, 44 } 45 for _, tt := range tests { 46 t.Run(tt.name, func(t *testing.T) { 47 got := New(tt.args.config) 48 if !reflect.DeepEqual(got, tt.want) { 49 t.Errorf("New() = %v, want %v", got, tt.want) 50 } 51 }) 52 } 53 } 54 55 func TestNewWithDefault(t *testing.T) { 56 tests := []struct { 57 name string 58 want *Generator 59 wantErr error 60 }{ 61 { 62 name: "default config", 63 want: func() *Generator { 64 cfg := &DefaultConfig 65 cfg.CharacterSet = buildCharacterSet(cfg) 66 return &Generator{cfg} 67 }(), 68 }, 69 } 70 for _, tt := range tests { 71 t.Run(tt.name, func(t *testing.T) { 72 got := NewWithDefault() 73 if !reflect.DeepEqual(got, tt.want) { 74 t.Errorf("NewWithDefault() = %v, want %v", got, tt.want) 75 } 76 }) 77 } 78 } 79 80 func Test_buildCharacterSet(t *testing.T) { 81 type args struct { 82 config *Config 83 } 84 tests := []struct { 85 name string 86 args args 87 want string 88 }{ 89 { 90 name: "exclude similar characters", 91 args: args{ 92 config: &Config{ 93 IncludeLowercaseLetters: true, 94 IncludeSymbols: true, 95 IncludeNumbers: true, 96 ExcludeSimilarCharacters: true, 97 ExcludeAmbiguousCharacters: true, 98 }, 99 }, 100 want: "abcdefghkmnpqrstuvwxyz23456789!$%^&*_+@#?.-=?", 101 }, 102 { 103 name: "exclude numbers", 104 args: args{ 105 config: &Config{ 106 IncludeLowercaseLetters: true, 107 IncludeSymbols: true, 108 IncludeNumbers: false, 109 ExcludeSimilarCharacters: true, 110 ExcludeAmbiguousCharacters: true, 111 }, 112 }, 113 want: "abcdefghkmnpqrstuvwxyz!$%^&*_+@#?.-=?", 114 }, 115 { 116 name: "full list", 117 args: args{ 118 config: &Config{ 119 IncludeLowercaseLetters: true, 120 IncludeSymbols: true, 121 IncludeNumbers: true, 122 ExcludeSimilarCharacters: false, 123 ExcludeAmbiguousCharacters: false, 124 }, 125 }, 126 want: "abcdefghijklmnopqrstuvwxyz0123456789!$%^&*()_+{}:@[];'#<>?,./|\\-=?", 127 }, 128 } 129 for _, tt := range tests { 130 t.Run(tt.name, func(t *testing.T) { 131 if got := buildCharacterSet(tt.args.config); got != tt.want { 132 t.Errorf("buildCharacterSet() = %v, want %v", got, tt.want) 133 } 134 }) 135 } 136 } 137 138 func TestGenerator_Generate(t *testing.T) { 139 type fields struct { 140 Config *Config 141 } 142 tests := []struct { 143 name string 144 fields fields 145 test func(*string, string) 146 wantErr error 147 }{ 148 { 149 name: "valid", 150 fields: fields{&DefaultConfig}, 151 test: func(pwd *string, characterSet string) { 152 assert.Len(t, *pwd, DefaultConfig.Length) 153 err := stringMatchesCharacters(*pwd, characterSet) 154 if err != nil { 155 t.Errorf("Generate() error = %v", err) 156 return 157 } 158 }, 159 }, 160 } 161 for _, tt := range tests { 162 t.Run(tt.name, func(t *testing.T) { 163 g := New(tt.fields.Config) 164 got, err := g.Generate() 165 if (err != nil) != (tt.wantErr != nil) || err != tt.wantErr { 166 t.Errorf("Generate() error = %v, wantErr %v", err, tt.wantErr) 167 return 168 } 169 tt.test(got, g.CharacterSet) 170 }) 171 } 172 } 173 174 func TestGenerator_GenerateMany(t *testing.T) { 175 type fields struct { 176 Config *Config 177 } 178 type args struct { 179 amount int 180 } 181 tests := []struct { 182 name string 183 args args 184 fields fields 185 test func([]string, string) 186 wantErr error 187 }{ 188 { 189 name: "valid", 190 args: args{amount: 5}, 191 fields: fields{Config: &DefaultConfig}, 192 test: func(pwds []string, characterSet string) { 193 assert.Len(t, pwds, 5) 194 195 for _, pwd := range pwds { 196 err := stringMatchesCharacters(pwd, characterSet) 197 if err != nil { 198 t.Errorf("Generate() error = %v", err) 199 return 200 } 201 } 202 }, 203 }, 204 } 205 for _, tt := range tests { 206 t.Run(tt.name, func(t *testing.T) { 207 g := New(tt.fields.Config) 208 got, err := g.GenerateMany(tt.args.amount) 209 if (err != nil) != (tt.wantErr != nil) || err != tt.wantErr { 210 t.Errorf("GenerateMany() error = %v, wantErr %v", err, tt.wantErr) 211 return 212 } 213 214 tt.test(got, g.CharacterSet) 215 }) 216 } 217 } 218 219 func stringMatchesCharacters(str, characters string) error { 220 set := strings.Split(characters, "") 221 strSet := strings.Split(str, "") 222 223 for _, strChr := range strSet { 224 found := false 225 for _, setChr := range set { 226 if strChr == setChr { 227 found = true 228 } 229 } 230 if !found { 231 return fmt.Errorf("%v should not be in the str", strChr) 232 } 233 } 234 235 return nil 236 } 237 238 func TestGenerator_GenerateWithLength(t *testing.T) { 239 type fields struct { 240 Config *Config 241 } 242 type args struct { 243 length int 244 } 245 tests := []struct { 246 name string 247 fields fields 248 args args 249 test func(*string, string) 250 wantErr error 251 }{ 252 { 253 name: "valid", 254 fields: fields{&DefaultConfig}, 255 args: args{length: 5}, 256 test: func(pwd *string, characterSet string) { 257 assert.Len(t, *pwd, 5) 258 err := stringMatchesCharacters(*pwd, characterSet) 259 if err != nil { 260 t.Errorf("Generate() error = %v", err) 261 return 262 } 263 }, 264 }, 265 } 266 for _, tt := range tests { 267 t.Run(tt.name, func(t *testing.T) { 268 g := New(tt.fields.Config) 269 got, err := g.GenerateWithLength(tt.args.length) 270 if (err != nil) != (tt.wantErr != nil) || err != tt.wantErr { 271 t.Errorf("GenerateWithLength() error = %v, wantErr %v", err, tt.wantErr) 272 return 273 } 274 tt.test(got, g.CharacterSet) 275 }) 276 } 277 } 278 279 func TestGenerator_GenerateManyWithLength(t *testing.T) { 280 type fields struct { 281 Config *Config 282 } 283 type args struct { 284 amount int 285 length int 286 } 287 tests := []struct { 288 name string 289 args args 290 fields fields 291 test func([]string, string) 292 wantErr error 293 }{ 294 { 295 name: "valid", 296 args: args{amount: 5, length: 5}, 297 fields: fields{Config: &DefaultConfig}, 298 test: func(pwds []string, characterSet string) { 299 assert.Len(t, pwds, 5) 300 301 for _, pwd := range pwds { 302 assert.Len(t, pwd, 5) 303 err := stringMatchesCharacters(pwd, characterSet) 304 if err != nil { 305 t.Errorf("Generate() error = %v", err) 306 return 307 } 308 } 309 }, 310 }, 311 } 312 for _, tt := range tests { 313 t.Run(tt.name, func(t *testing.T) { 314 g := New(tt.fields.Config) 315 316 got, err := g.GenerateManyWithLength(tt.args.amount, tt.args.length) 317 if (err != nil) != (tt.wantErr != nil) || err != tt.wantErr { 318 t.Errorf("GenerateManyWithLength() error = %v, wantErr %v", err, tt.wantErr) 319 return 320 } 321 322 tt.test(got, g.CharacterSet) 323 }) 324 } 325 }