drasl/config_test.go
Evan Goode 5c1f6c1cfa
Implement SSO via OIDC (#127)
Resolves https://github.com/unmojang/drasl/issues/39

* Use __Host- cookie prefix instead of setting Domain

See https://stackoverflow.com/a/64735551

* Unlinking OIDC accounts

* AllowPasswordLogin, OIDC docs, cleanup

* YggdrasilError

* Migrate existing password users without login

* API query/create/delete user OIDC identities

* test APICreateOIDCIdentity

* test APIDeleteeOIDCIdentity

* API Create users with OIDC identities

* OIDC: PKCE

* Use YggdrasilError in authlib-injector routes

* OIDC: AllowChoosingPlayerName

* recipes.md: Update for OIDC and deprecated config options

* OIDC: fix APICreateUser without password, validate oidcIdentities

* OIDC: error at complete-registration if no preferred player name

* Proper error pages

* MC_ prefix for Minecraft Tokens
2025-03-22 16:40:26 -04:00

150 lines
4.5 KiB
Go

package main
import (
"github.com/BurntSushi/toml"
"github.com/stretchr/testify/assert"
"os"
"testing"
)
func configTestConfig(stateDirectory string) *Config {
config := testConfig()
config.StateDirectory = stateDirectory
config.DataDirectory = "."
return config
}
func TestConfig(t *testing.T) {
t.Parallel()
sd := Unwrap(os.MkdirTemp("", "tmp"))
defer os.RemoveAll(sd)
config := configTestConfig(sd)
assert.Nil(t, CleanConfig(config))
config = configTestConfig(sd)
config.BaseURL = "https://drasl.example.com/"
assert.Nil(t, CleanConfig(config))
assert.Equal(t, "https://drasl.example.com", config.BaseURL)
config = configTestConfig(sd)
config.BaseURL = ""
assert.NotNil(t, CleanConfig(config))
config = configTestConfig(sd)
config.BaseURL = ":an invalid URL"
assert.NotNil(t, CleanConfig(config))
config = configTestConfig(sd)
config.DefaultPreferredLanguage = "xx"
assert.NotNil(t, CleanConfig(config))
config = configTestConfig(sd)
config.Domain = ""
assert.NotNil(t, CleanConfig(config))
config = configTestConfig(sd)
config.InstanceName = ""
assert.NotNil(t, CleanConfig(config))
config = configTestConfig(sd)
config.ListenAddress = ""
assert.NotNil(t, CleanConfig(config))
config = configTestConfig(sd)
config.DefaultMaxPlayerCount = Constants.MaxPlayerCountUseDefault
assert.NotNil(t, CleanConfig(config))
config = configTestConfig(sd)
config.DefaultMaxPlayerCount = Constants.MaxPlayerCountUnlimited
assert.Nil(t, CleanConfig(config))
config = configTestConfig(sd)
config.DataDirectory = "/tmp/DraslInvalidDataDirectoryNothingHere"
assert.NotNil(t, CleanConfig(config))
// Missing state directory should be ignored
config = configTestConfig(sd)
config.StateDirectory = "/tmp/DraslInvalidStateDirectoryNothingHere"
assert.Nil(t, CleanConfig(config))
config = configTestConfig(sd)
config.RegistrationExistingPlayer.Allow = true
config.ImportExistingPlayer.Allow = true
config.ImportExistingPlayer.Nickname = "Example"
config.ImportExistingPlayer.SessionURL = "https://drasl.example.com/"
config.ImportExistingPlayer.AccountURL = "https://drasl.example.com/"
assert.Nil(t, CleanConfig(config))
assert.Equal(t, "https://drasl.example.com", config.ImportExistingPlayer.SessionURL)
assert.Equal(t, "https://drasl.example.com", config.ImportExistingPlayer.AccountURL)
config = configTestConfig(sd)
config.RegistrationExistingPlayer.Allow = true
config.ImportExistingPlayer.Nickname = ""
assert.NotNil(t, CleanConfig(config))
config = configTestConfig(sd)
config.RegistrationExistingPlayer.Allow = true
config.ImportExistingPlayer.SessionURL = ""
assert.NotNil(t, CleanConfig(config))
config = configTestConfig(sd)
config.RegistrationExistingPlayer.Allow = true
config.ImportExistingPlayer.AccountURL = ""
assert.NotNil(t, CleanConfig(config))
config = configTestConfig(sd)
testFallbackAPIServer := FallbackAPIServer{
Nickname: "Nickname",
SessionURL: "https://drasl.example.com/",
AccountURL: "https://drasl.example.com/",
ServicesURL: "https://drasl.example.com/",
}
fb := testFallbackAPIServer
config.FallbackAPIServers = []FallbackAPIServer{fb}
assert.Nil(t, CleanConfig(config))
assert.Equal(t, "https://drasl.example.com", config.FallbackAPIServers[0].SessionURL)
assert.Equal(t, "https://drasl.example.com", config.FallbackAPIServers[0].AccountURL)
assert.Equal(t, "https://drasl.example.com", config.FallbackAPIServers[0].ServicesURL)
fb = testFallbackAPIServer
fb.Nickname = ""
config.FallbackAPIServers = []FallbackAPIServer{fb}
assert.NotNil(t, CleanConfig(config))
fb = testFallbackAPIServer
fb.SessionURL = ""
config.FallbackAPIServers = []FallbackAPIServer{fb}
assert.NotNil(t, CleanConfig(config))
fb = testFallbackAPIServer
fb.SessionURL = ":invalid URL"
config.FallbackAPIServers = []FallbackAPIServer{fb}
assert.NotNil(t, CleanConfig(config))
fb = testFallbackAPIServer
fb.AccountURL = ""
config.FallbackAPIServers = []FallbackAPIServer{fb}
assert.NotNil(t, CleanConfig(config))
fb = testFallbackAPIServer
fb.AccountURL = ":invalid URL"
config.FallbackAPIServers = []FallbackAPIServer{fb}
assert.NotNil(t, CleanConfig(config))
fb = testFallbackAPIServer
fb.ServicesURL = ""
config.FallbackAPIServers = []FallbackAPIServer{fb}
assert.NotNil(t, CleanConfig(config))
fb = testFallbackAPIServer
fb.ServicesURL = ":invalid URL"
config.FallbackAPIServers = []FallbackAPIServer{fb}
assert.NotNil(t, CleanConfig(config))
// Test that TEMPLATE_CONFIG_FILE is valid
var templateConfig Config
_, err := toml.Decode(TEMPLATE_CONFIG_FILE, &templateConfig)
assert.Nil(t, err)
}