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  }