github.com/wrgl/wrgl@v0.14.0/pkg/auth/fs/authn_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright © 2022 Wrangle Ltd 3 4 package authfs 5 6 import ( 7 "fmt" 8 "net/http" 9 "os" 10 "path/filepath" 11 "testing" 12 "time" 13 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 "github.com/wrgl/wrgl/pkg/local" 17 "github.com/wrgl/wrgl/pkg/testutils" 18 ) 19 20 func TestAuthnStore(t *testing.T) { 21 dir, err := testutils.TempDir("", "test_flatdb") 22 require.NoError(t, err) 23 defer os.RemoveAll(dir) 24 rd, err := local.NewRepoDir(dir, "") 25 require.NoError(t, err) 26 defer rd.Close() 27 28 s, err := NewAuthnStore(rd, 0) 29 require.NoError(t, err) 30 31 peoples := map[string][]string{} 32 for i := 0; i < 10; i++ { 33 email := fmt.Sprintf("%s@%s.com", testutils.BrokenRandomLowerAlphaString(8), testutils.BrokenRandomLowerAlphaString(8)) 34 pass := testutils.BrokenRandomAlphaNumericString(10) 35 name := testutils.BrokenRandomLowerAlphaString(5) 36 peoples[email] = []string{name, pass} 37 require.NoError(t, s.SetPassword(email, pass)) 38 require.NoError(t, s.SetName(email, name)) 39 assert.True(t, s.Exist(email)) 40 } 41 t.Logf("peoples: %v", peoples) 42 43 tokens := map[string]string{} 44 for email, sl := range peoples { 45 pass := sl[1] 46 ts, err := s.Authenticate(email, pass) 47 require.NoError(t, err) 48 tokens[email] = ts 49 _, err = s.Authenticate(email, testutils.BrokenRandomAlphaNumericString(10)) 50 assert.Error(t, err) 51 } 52 users, err := s.ListUsers() 53 require.NoError(t, err) 54 assert.Len(t, users, 10) 55 for _, sl := range users { 56 email, name := sl[0], sl[1] 57 sl, ok := peoples[email] 58 assert.True(t, ok) 59 assert.Equal(t, name, sl[0]) 60 } 61 62 t.Logf("internal slice: %v", s.sl) 63 require.NoError(t, s.Flush()) 64 65 s, err = NewAuthnStore(rd, 0) 66 require.NoError(t, err) 67 for email, sl := range peoples { 68 name := sl[0] 69 require.True(t, s.Exist(email), "email not found: %s", email) 70 r, err := http.NewRequest(http.MethodGet, "/", nil) 71 require.NoError(t, err) 72 req, c, err := s.CheckToken(r, tokens[email]) 73 assert.Equal(t, r, req) 74 require.NoError(t, err) 75 assert.Equal(t, email, c.Email) 76 assert.Equal(t, name, c.Name) 77 } 78 79 for email, sl := range peoples { 80 pass := sl[1] 81 require.NoError(t, s.RemoveUser(email)) 82 _, err = s.Authenticate(email, pass) 83 assert.Error(t, err) 84 assert.False(t, s.Exist(email)) 85 } 86 require.NoError(t, s.Flush()) 87 88 s, err = NewAuthnStore(rd, 0) 89 require.NoError(t, err) 90 for email, sl := range peoples { 91 pass := sl[1] 92 _, err = s.Authenticate(email, pass) 93 assert.Error(t, err) 94 assert.False(t, s.Exist(email)) 95 } 96 } 97 98 func TestAuthnStoreWatchFile(t *testing.T) { 99 dir, err := testutils.TempDir("", "test_flatdb") 100 require.NoError(t, err) 101 defer os.RemoveAll(dir) 102 rd, err := local.NewRepoDir(dir, "") 103 require.NoError(t, err) 104 defer rd.Close() 105 106 s, err := NewAuthnStore(rd, 0) 107 require.NoError(t, err) 108 defer s.Close() 109 110 f, err := os.Create(filepath.Join(dir, "authn.csv")) 111 require.NoError(t, err) 112 _, err = f.Write([]byte("john.doe@domain.com,John Doe,password")) 113 require.NoError(t, err) 114 require.NoError(t, f.Close()) 115 116 testutils.Retry(t, 100*time.Millisecond, 10, func() bool { 117 sl, err := s.ListUsers() 118 require.NoError(t, err) 119 return assert.ObjectsAreEqual([][]string{ 120 {"john.doe@domain.com", "John Doe"}, 121 }, sl) 122 }, "") 123 }