104 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/tidwall/buntdb"
 | 
						|
)
 | 
						|
 | 
						|
func TestStoreUserHandling(t *testing.T) {
 | 
						|
	store, err := NewDBStore(":memory:")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("cannot create store: %v", err)
 | 
						|
	}
 | 
						|
	defer store.Close()
 | 
						|
 | 
						|
	t.Run("store should be empty initially", func(t *testing.T) {
 | 
						|
		users, err := store.GetUsers()
 | 
						|
		if err != nil {
 | 
						|
			t.Errorf("no error should have been returned: %v", err)
 | 
						|
		}
 | 
						|
		if len(users) != 0 {
 | 
						|
			t.Errorf("there should be no users")
 | 
						|
		}
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("user that doesn't exist should return error", func(t *testing.T) {
 | 
						|
		_, err := store.GetUser("someuser")
 | 
						|
		if err != ErrUserNotFound {
 | 
						|
			t.Errorf("unexpected error: %v", err)
 | 
						|
		}
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("adding users should work", func(t *testing.T) {
 | 
						|
		if err := store.AddUser(User{"myuser", "mypass", GlobalRoleUser}); err != nil {
 | 
						|
			t.Errorf("cannot add user: %v", err)
 | 
						|
		}
 | 
						|
 | 
						|
		t.Run("retrieving that single user should work", func(t *testing.T) {
 | 
						|
			user, err := store.GetUser("myuser")
 | 
						|
			if err != nil {
 | 
						|
				t.Errorf("cannot retrieve user: %v", err)
 | 
						|
			}
 | 
						|
			if user.Username != "myuser" {
 | 
						|
				t.Errorf("retrieved user contains unexpected username")
 | 
						|
			}
 | 
						|
			if user.Role != GlobalRoleUser {
 | 
						|
				t.Errorf("retrieved user contains unexpected role")
 | 
						|
			}
 | 
						|
		})
 | 
						|
 | 
						|
		t.Run("retrieving multiple users should work", func(t *testing.T) {
 | 
						|
			users, err := store.GetUsers()
 | 
						|
			if err != nil {
 | 
						|
				t.Errorf("cannot retrieve user list: %v", err)
 | 
						|
			}
 | 
						|
			if len(users) != 1 {
 | 
						|
				t.Errorf("there should be only one user")
 | 
						|
			}
 | 
						|
			if users[0].Username != "myuser" {
 | 
						|
				t.Errorf("retrieved user contains unexpected username")
 | 
						|
			}
 | 
						|
			if users[0].Role != GlobalRoleUser {
 | 
						|
				t.Errorf("retrieved user contains unexpected role")
 | 
						|
			}
 | 
						|
		})
 | 
						|
 | 
						|
		t.Run("deleting that user should work", func(t *testing.T) {
 | 
						|
			err := store.RemoveUser("myuser")
 | 
						|
			if err != nil {
 | 
						|
				t.Errorf("cannot delete user: %v", err)
 | 
						|
			}
 | 
						|
 | 
						|
			t.Run("user should no longer be found", func(t *testing.T) {
 | 
						|
				_, err := store.GetUser("myuser")
 | 
						|
				if err != ErrUserNotFound {
 | 
						|
					t.Errorf("unexpected error: %v", err)
 | 
						|
				}
 | 
						|
			})
 | 
						|
 | 
						|
			t.Run("user should no longer be listed", func(t *testing.T) {
 | 
						|
				users, err := store.GetUsers()
 | 
						|
				if err != nil {
 | 
						|
					t.Errorf("unexpected error: %v", err)
 | 
						|
				}
 | 
						|
				if len(users) != 0 {
 | 
						|
					t.Errorf("there should be no users")
 | 
						|
				}
 | 
						|
			})
 | 
						|
		})
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("database should be empty now", func(t *testing.T) {
 | 
						|
		// checks that we properly deleted all keys
 | 
						|
		if err := store.db.View(func(tx *buntdb.Tx) error {
 | 
						|
			return tx.Ascend("", func(key, value string) bool {
 | 
						|
				t.Errorf("there should be no keys left")
 | 
						|
				return false
 | 
						|
			})
 | 
						|
		}); err != nil {
 | 
						|
			t.Errorf("iterating keys failed: %v", err)
 | 
						|
		}
 | 
						|
	})
 | 
						|
}
 |