Files
OliveTin/service/internal/config/config_reloader_user_test.go

169 lines
5.0 KiB
Go

package config
import (
"os"
"testing"
"github.com/knadh/koanf/parsers/yaml"
"github.com/knadh/koanf/providers/file"
"github.com/knadh/koanf/v2"
"github.com/stretchr/testify/assert"
)
func TestUserLoadingFromConfig(t *testing.T) {
// Create a temporary test config file
testConfig := `
authLocalUsers:
enabled: true
users:
- username: testuser1
usergroup: admin
password: password1
- username: testuser2
usergroup: guest
password: password2
actions:
- title: Test Action
shell: echo "test"
`
// Create temporary file
tmpFile, err := os.CreateTemp("", "test_config_*.yaml")
assert.NoError(t, err, "Should create temporary file")
defer os.Remove(tmpFile.Name())
// Write test config to file
_, err = tmpFile.WriteString(testConfig)
assert.NoError(t, err, "Should write test config to file")
tmpFile.Close()
// Load config using koanf
k := koanf.New(".")
err = k.Load(file.Provider(tmpFile.Name()), yaml.Parser())
assert.NoError(t, err, "Should load config file")
// Create config struct and load it
cfg := &Config{}
AppendSource(cfg, k, tmpFile.Name())
// Test that authLocalUsers was loaded correctly
assert.True(t, cfg.AuthLocalUsers.Enabled, "AuthLocalUsers should be enabled")
assert.Equal(t, 2, len(cfg.AuthLocalUsers.Users), "Should load 2 users")
// Test individual users
user1 := cfg.FindUserByUsername("testuser1")
assert.NotNil(t, user1, "Should find testuser1")
assert.Equal(t, "testuser1", user1.Username, "User1 should have correct username")
assert.Equal(t, "admin", user1.Usergroup, "User1 should have correct usergroup")
assert.Equal(t, "password1", user1.Password, "User1 should have correct password")
user2 := cfg.FindUserByUsername("testuser2")
assert.NotNil(t, user2, "Should find testuser2")
assert.Equal(t, "testuser2", user2.Username, "User2 should have correct username")
assert.Equal(t, "guest", user2.Usergroup, "User2 should have correct usergroup")
assert.Equal(t, "password2", user2.Password, "User2 should have correct password")
// Test non-existent user
assert.Nil(t, cfg.FindUserByUsername("nonexistent"), "Should return nil for non-existent user")
}
func TestUserLoadingWithEmptyUsers(t *testing.T) {
// Test config with enabled but no users
testConfig := `
authLocalUsers:
enabled: true
users: []
actions:
- title: Test Action
shell: echo "test"
`
tmpFile, err := os.CreateTemp("", "test_config_empty_*.yaml")
assert.NoError(t, err, "Should create temporary file")
defer os.Remove(tmpFile.Name())
_, err = tmpFile.WriteString(testConfig)
assert.NoError(t, err, "Should write test config to file")
tmpFile.Close()
k := koanf.New(".")
err = k.Load(file.Provider(tmpFile.Name()), yaml.Parser())
assert.NoError(t, err, "Should load config file")
cfg := &Config{}
AppendSource(cfg, k, tmpFile.Name())
assert.True(t, cfg.AuthLocalUsers.Enabled, "AuthLocalUsers should be enabled")
assert.Equal(t, 0, len(cfg.AuthLocalUsers.Users), "Should have 0 users")
assert.Nil(t, cfg.FindUserByUsername("anyuser"), "Should return nil for any user")
}
func TestUserLoadingWithDisabledAuth(t *testing.T) {
// Test config with disabled auth
testConfig := `
authLocalUsers:
enabled: false
users:
- username: testuser
usergroup: admin
password: password
actions:
- title: Test Action
shell: echo "test"
`
tmpFile, err := os.CreateTemp("", "test_config_disabled_*.yaml")
assert.NoError(t, err, "Should create temporary file")
defer os.Remove(tmpFile.Name())
_, err = tmpFile.WriteString(testConfig)
assert.NoError(t, err, "Should write test config to file")
tmpFile.Close()
k := koanf.New(".")
err = k.Load(file.Provider(tmpFile.Name()), yaml.Parser())
assert.NoError(t, err, "Should load config file")
cfg := &Config{}
AppendSource(cfg, k, tmpFile.Name())
assert.False(t, cfg.AuthLocalUsers.Enabled, "AuthLocalUsers should be disabled")
assert.Equal(t, 1, len(cfg.AuthLocalUsers.Users), "Should still load users even when disabled")
// User should still be findable even when auth is disabled
user := cfg.FindUserByUsername("testuser")
assert.NotNil(t, user, "Should find user even when auth is disabled")
}
func TestUserLoadingWithoutAuthSection(t *testing.T) {
// Test config without authLocalUsers section
testConfig := `
actions:
- title: Test Action
shell: echo "test"
`
tmpFile, err := os.CreateTemp("", "test_config_no_auth_*.yaml")
assert.NoError(t, err, "Should create temporary file")
defer os.Remove(tmpFile.Name())
_, err = tmpFile.WriteString(testConfig)
assert.NoError(t, err, "Should write test config to file")
tmpFile.Close()
k := koanf.New(".")
err = k.Load(file.Provider(tmpFile.Name()), yaml.Parser())
assert.NoError(t, err, "Should load config file")
cfg := &Config{}
AppendSource(cfg, k, tmpFile.Name())
// Should have default values
assert.False(t, cfg.AuthLocalUsers.Enabled, "AuthLocalUsers should be disabled by default")
assert.Equal(t, 0, len(cfg.AuthLocalUsers.Users), "Should have 0 users by default")
assert.Nil(t, cfg.FindUserByUsername("anyuser"), "Should return nil for any user")
}