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  }