2022-11-26 14:42:45 +02:00
package settings_test
2022-07-06 23:19:05 +02:00
import (
"encoding/json"
2022-08-14 18:30:45 +02:00
"fmt"
2022-07-06 23:19:05 +02:00
"strings"
"testing"
2022-08-14 18:30:45 +02:00
validation "github.com/go-ozzo/ozzo-validation/v4"
2022-11-26 14:42:45 +02:00
"github.com/pocketbase/pocketbase/models/settings"
2022-07-06 23:19:05 +02:00
"github.com/pocketbase/pocketbase/tools/auth"
2022-12-13 11:45:59 +02:00
"github.com/pocketbase/pocketbase/tools/mailer"
2022-07-06 23:19:05 +02:00
)
func TestSettingsValidate ( t * testing . T ) {
2022-11-26 14:42:45 +02:00
s := settings . New ( )
2022-07-06 23:19:05 +02:00
// set invalid settings data
s . Meta . AppName = ""
s . Logs . MaxDays = - 10
s . Smtp . Enabled = true
s . Smtp . Host = ""
s . S3 . Enabled = true
s . S3 . Endpoint = "invalid"
s . AdminAuthToken . Duration = - 10
s . AdminPasswordResetToken . Duration = - 10
2022-10-30 10:28:14 +02:00
s . RecordAuthToken . Duration = - 10
s . RecordPasswordResetToken . Duration = - 10
s . RecordEmailChangeToken . Duration = - 10
s . RecordVerificationToken . Duration = - 10
2022-07-06 23:19:05 +02:00
s . GoogleAuth . Enabled = true
s . GoogleAuth . ClientId = ""
s . FacebookAuth . Enabled = true
s . FacebookAuth . ClientId = ""
s . GithubAuth . Enabled = true
s . GithubAuth . ClientId = ""
s . GitlabAuth . Enabled = true
s . GitlabAuth . ClientId = ""
2022-08-21 18:38:42 +02:00
s . DiscordAuth . Enabled = true
s . DiscordAuth . ClientId = ""
2022-09-01 15:46:06 +02:00
s . TwitterAuth . Enabled = true
s . TwitterAuth . ClientId = ""
2022-10-31 21:17:10 +02:00
s . MicrosoftAuth . Enabled = true
s . MicrosoftAuth . ClientId = ""
2022-11-01 17:06:06 +02:00
s . SpotifyAuth . Enabled = true
s . SpotifyAuth . ClientId = ""
2022-11-13 13:05:06 +02:00
s . KakaoAuth . Enabled = true
s . KakaoAuth . ClientId = ""
2022-11-13 14:20:11 +02:00
s . TwitchAuth . Enabled = true
s . TwitchAuth . ClientId = ""
2022-12-31 02:21:41 +02:00
s . StravaAuth . Enabled = true
s . StravaAuth . ClientId = ""
2022-12-31 11:46:36 +02:00
s . GiteeAuth . Enabled = true
s . GiteeAuth . ClientId = ""
2022-07-06 23:19:05 +02:00
// check if Validate() is triggering the members validate methods.
err := s . Validate ( )
if err == nil {
t . Fatalf ( "Expected error, got nil" )
}
expectations := [ ] string {
` "meta": { ` ,
` "logs": { ` ,
` "smtp": { ` ,
` "s3": { ` ,
` "adminAuthToken": { ` ,
` "adminPasswordResetToken": { ` ,
2022-10-30 10:28:14 +02:00
` "recordAuthToken": { ` ,
` "recordPasswordResetToken": { ` ,
` "recordEmailChangeToken": { ` ,
` "recordVerificationToken": { ` ,
2022-07-06 23:19:05 +02:00
` "googleAuth": { ` ,
` "facebookAuth": { ` ,
` "githubAuth": { ` ,
` "gitlabAuth": { ` ,
2022-08-21 18:38:42 +02:00
` "discordAuth": { ` ,
2022-10-30 10:28:14 +02:00
` "twitterAuth": { ` ,
2022-10-31 21:17:10 +02:00
` "microsoftAuth": { ` ,
2022-11-01 17:06:06 +02:00
` "spotifyAuth": { ` ,
2022-11-13 13:05:06 +02:00
` "kakaoAuth": { ` ,
2022-11-13 14:20:11 +02:00
` "twitchAuth": { ` ,
2022-12-31 02:21:41 +02:00
` "stravaAuth": { ` ,
2022-12-31 11:46:36 +02:00
` "giteeAuth": { ` ,
2022-07-06 23:19:05 +02:00
}
errBytes , _ := json . Marshal ( err )
jsonErr := string ( errBytes )
for _ , expected := range expectations {
if ! strings . Contains ( jsonErr , expected ) {
t . Errorf ( "Expected error key %s in %v" , expected , jsonErr )
}
}
}
func TestSettingsMerge ( t * testing . T ) {
2022-11-26 14:42:45 +02:00
s1 := settings . New ( )
2022-07-06 23:19:05 +02:00
s1 . Meta . AppUrl = "old_app_url"
2022-11-26 14:42:45 +02:00
s2 := settings . New ( )
2022-07-06 23:19:05 +02:00
s2 . Meta . AppName = "test"
s2 . Logs . MaxDays = 123
s2 . Smtp . Host = "test"
s2 . Smtp . Enabled = true
s2 . S3 . Enabled = true
s2 . S3 . Endpoint = "test"
s2 . AdminAuthToken . Duration = 1
s2 . AdminPasswordResetToken . Duration = 2
2022-10-30 10:28:14 +02:00
s2 . RecordAuthToken . Duration = 3
s2 . RecordPasswordResetToken . Duration = 4
s2 . RecordEmailChangeToken . Duration = 5
s2 . RecordVerificationToken . Duration = 6
2022-07-06 23:19:05 +02:00
s2 . GoogleAuth . Enabled = true
s2 . GoogleAuth . ClientId = "google_test"
s2 . FacebookAuth . Enabled = true
s2 . FacebookAuth . ClientId = "facebook_test"
s2 . GithubAuth . Enabled = true
s2 . GithubAuth . ClientId = "github_test"
s2 . GitlabAuth . Enabled = true
s2 . GitlabAuth . ClientId = "gitlab_test"
2022-08-21 18:38:42 +02:00
s2 . DiscordAuth . Enabled = true
s2 . DiscordAuth . ClientId = "discord_test"
2022-09-01 15:46:06 +02:00
s2 . TwitterAuth . Enabled = true
s2 . TwitterAuth . ClientId = "twitter_test"
2022-10-31 21:17:10 +02:00
s2 . MicrosoftAuth . Enabled = true
s2 . MicrosoftAuth . ClientId = "microsoft_test"
2022-11-01 17:06:06 +02:00
s2 . SpotifyAuth . Enabled = true
s2 . SpotifyAuth . ClientId = "spotify_test"
2022-11-13 13:05:06 +02:00
s2 . KakaoAuth . Enabled = true
s2 . KakaoAuth . ClientId = "kakao_test"
2022-11-13 14:20:11 +02:00
s2 . TwitchAuth . Enabled = true
s2 . TwitchAuth . ClientId = "twitch_test"
2022-12-31 02:21:41 +02:00
s2 . StravaAuth . Enabled = true
s2 . StravaAuth . ClientId = "strava_test"
2022-12-31 11:46:36 +02:00
s2 . GiteeAuth . Enabled = true
s2 . GiteeAuth . ClientId = "gitee_test"
2022-07-06 23:19:05 +02:00
if err := s1 . Merge ( s2 ) ; err != nil {
t . Fatal ( err )
}
s1Encoded , err := json . Marshal ( s1 )
if err != nil {
t . Fatal ( err )
}
s2Encoded , err := json . Marshal ( s2 )
if err != nil {
t . Fatal ( err )
}
if string ( s1Encoded ) != string ( s2Encoded ) {
t . Fatalf ( "Expected the same serialization, got %v VS %v" , string ( s1Encoded ) , string ( s2Encoded ) )
}
}
func TestSettingsClone ( t * testing . T ) {
2022-11-26 14:42:45 +02:00
s1 := settings . New ( )
2022-07-06 23:19:05 +02:00
s2 , err := s1 . Clone ( )
if err != nil {
t . Fatal ( err )
}
s1Bytes , err := json . Marshal ( s1 )
if err != nil {
t . Fatal ( err )
}
s2Bytes , err := json . Marshal ( s2 )
if err != nil {
t . Fatal ( err )
}
if string ( s1Bytes ) != string ( s2Bytes ) {
t . Fatalf ( "Expected equivalent serialization, got %v VS %v" , string ( s1Bytes ) , string ( s2Bytes ) )
}
// verify that it is a deep copy
s1 . Meta . AppName = "new"
if s1 . Meta . AppName == s2 . Meta . AppName {
t . Fatalf ( "Expected s1 and s2 to have different Meta.AppName, got %s" , s1 . Meta . AppName )
}
}
func TestSettingsRedactClone ( t * testing . T ) {
2022-11-26 14:42:45 +02:00
s1 := settings . New ( )
2022-07-06 23:19:05 +02:00
s1 . Meta . AppName = "test123" // control field
s1 . Smtp . Password = "test123"
s1 . Smtp . Tls = true
s1 . S3 . Secret = "test123"
s1 . AdminAuthToken . Secret = "test123"
s1 . AdminPasswordResetToken . Secret = "test123"
2022-10-30 10:28:14 +02:00
s1 . RecordAuthToken . Secret = "test123"
s1 . RecordPasswordResetToken . Secret = "test123"
s1 . RecordEmailChangeToken . Secret = "test123"
s1 . RecordVerificationToken . Secret = "test123"
2022-07-06 23:19:05 +02:00
s1 . GoogleAuth . ClientSecret = "test123"
s1 . FacebookAuth . ClientSecret = "test123"
s1 . GithubAuth . ClientSecret = "test123"
s1 . GitlabAuth . ClientSecret = "test123"
2022-08-21 18:38:42 +02:00
s1 . DiscordAuth . ClientSecret = "test123"
2022-09-01 15:46:06 +02:00
s1 . TwitterAuth . ClientSecret = "test123"
2022-10-31 21:17:10 +02:00
s1 . MicrosoftAuth . ClientSecret = "test123"
2022-11-01 17:06:06 +02:00
s1 . SpotifyAuth . ClientSecret = "test123"
2022-11-13 13:05:06 +02:00
s1 . KakaoAuth . ClientSecret = "test123"
2022-11-13 14:20:11 +02:00
s1 . TwitchAuth . ClientSecret = "test123"
2022-12-31 02:21:41 +02:00
s1 . StravaAuth . ClientSecret = "test123"
2022-12-31 11:46:36 +02:00
s1 . GiteeAuth . ClientSecret = "test123"
2022-07-06 23:19:05 +02:00
s2 , err := s1 . RedactClone ( )
if err != nil {
t . Fatal ( err )
}
encoded , err := json . Marshal ( s2 )
if err != nil {
t . Fatal ( err )
}
2022-12-31 11:46:36 +02:00
expected := ` { "meta": { "appName":"test123","appUrl":"http://localhost:8090","hideControls":false,"senderName":"Support","senderAddress":"support@example.com","verificationTemplate": { "body":"\u003cp\u003eHello,\u003c/p\u003e\n\u003cp\u003eThank you for joining us at { APP_NAME}.\u003c/p\u003e\n\u003cp\u003eClick on the button below to verify your email address.\u003c/p\u003e\n\u003cp\u003e\n \u003ca class=\"btn\" href=\" { ACTION_URL}\" target=\"_blank\" rel=\"noopener\"\u003eVerify\u003c/a\u003e\n\u003c/p\u003e\n\u003cp\u003e\n Thanks,\u003cbr/\u003e\n { APP_NAME} team\n\u003c/p\u003e","subject":"Verify your { APP_NAME} email","actionUrl":" { APP_URL}/_/#/auth/confirm-verification/ { TOKEN}"},"resetPasswordTemplate": { "body":"\u003cp\u003eHello,\u003c/p\u003e\n\u003cp\u003eClick on the button below to reset your password.\u003c/p\u003e\n\u003cp\u003e\n \u003ca class=\"btn\" href=\" { ACTION_URL}\" target=\"_blank\" rel=\"noopener\"\u003eReset password\u003c/a\u003e\n\u003c/p\u003e\n\u003cp\u003e\u003ci\u003eIf you didn't ask to reset your password, you can ignore this email.\u003c/i\u003e\u003c/p\u003e\n\u003cp\u003e\n Thanks,\u003cbr/\u003e\n { APP_NAME} team\n\u003c/p\u003e","subject":"Reset your { APP_NAME} password","actionUrl":" { APP_URL}/_/#/auth/confirm-password-reset/ { TOKEN}"},"confirmEmailChangeTemplate": { "body":"\u003cp\u003eHello,\u003c/p\u003e\n\u003cp\u003eClick on the button below to confirm your new email address.\u003c/p\u003e\n\u003cp\u003e\n \u003ca class=\"btn\" href=\" { ACTION_URL}\" target=\"_blank\" rel=\"noopener\"\u003eConfirm new email\u003c/a\u003e\n\u003c/p\u003e\n\u003cp\u003e\u003ci\u003eIf you didn't ask to change your email address, you can ignore this email.\u003c/i\u003e\u003c/p\u003e\n\u003cp\u003e\n Thanks,\u003cbr/\u003e\n { APP_NAME} team\n\u003c/p\u003e","subject":"Confirm your { APP_NAME} new email address","actionUrl":" { APP_URL}/_/#/auth/confirm-email-change/ { TOKEN}"}},"logs": { "maxDays":5},"smtp": { "enabled":false,"host":"smtp.example.com","port":587,"username":"","password":"******","authMethod":"","tls":true},"s3": { "enabled":false,"bucket":"","region":"","endpoint":"","accessKey":"","secret":"******","forcePathStyle":false},"adminAuthToken": { "secret":"******","duration":1209600},"adminPasswordResetToken": { "secret":"******","duration":1800},"recordAuthToken": { "secret":"******","duration":1209600},"recordPasswordResetToken": { "secret":"******","duration":1800},"recordEmailChangeToken": { "secret":"******","duration":1800},"recordVerificationToken": { "secret":"******","duration":604800},"emailAuth": { "enabled":false,"exceptDomains":null,"onlyDomains":null,"minPasswordLength":0},"googleAuth": { "enabled":false,"clientSecret":"******"},"facebookAuth": { "enabled":false,"clientSecret":"******"},"githubAuth": { "enabled":false,"clientSecret":"******"},"gitlabAuth": { "enabled":false,"clientSecret":"******"},"discordAuth": { "enabled":false,"clientSecret":"******"},"twitterAuth": { "enabled":false,"clientSecret":"******"},"microsoftAuth": { "enabled":false,"clientSecret":"******"},"spotifyAuth": { "enabled":false,"clientSecret":"******"},"kakaoAuth": { "enabled":false,"clientSecret":"******"},"twitchAuth": { "enabled":false,"clientSecret":"******"},"stravaAuth": { "enabled":false,"clientSecret":"******"},"giteeAuth": { "enabled":false,"clientSecret":"******"}} `
2022-07-06 23:19:05 +02:00
if encodedStr := string ( encoded ) ; encodedStr != expected {
2022-10-30 10:28:14 +02:00
t . Fatalf ( "Expected\n%v\ngot\n%v" , expected , encodedStr )
2022-07-06 23:19:05 +02:00
}
}
func TestNamedAuthProviderConfigs ( t * testing . T ) {
2022-11-26 14:42:45 +02:00
s := settings . New ( )
2022-07-06 23:19:05 +02:00
s . GoogleAuth . ClientId = "google_test"
s . FacebookAuth . ClientId = "facebook_test"
s . GithubAuth . ClientId = "github_test"
s . GitlabAuth . ClientId = "gitlab_test"
s . GitlabAuth . Enabled = true
2022-08-21 18:38:42 +02:00
s . DiscordAuth . ClientId = "discord_test"
2022-09-01 15:46:06 +02:00
s . TwitterAuth . ClientId = "twitter_test"
2022-10-31 21:17:10 +02:00
s . MicrosoftAuth . ClientId = "microsoft_test"
2022-11-01 17:06:06 +02:00
s . SpotifyAuth . ClientId = "spotify_test"
2022-11-13 13:05:06 +02:00
s . KakaoAuth . ClientId = "kakao_test"
2022-11-13 14:20:11 +02:00
s . TwitchAuth . ClientId = "twitch_test"
2022-12-31 02:21:41 +02:00
s . StravaAuth . ClientId = "strava_test"
2022-12-31 11:46:36 +02:00
s . GiteeAuth . ClientId = "gitee_test"
2022-07-06 23:19:05 +02:00
result := s . NamedAuthProviderConfigs ( )
encoded , err := json . Marshal ( result )
if err != nil {
t . Fatal ( err )
}
2022-11-13 13:05:06 +02:00
encodedStr := string ( encoded )
expectedParts := [ ] string {
` "discord": { "enabled":false,"clientId":"discord_test"} ` ,
` "facebook": { "enabled":false,"clientId":"facebook_test"} ` ,
` "github": { "enabled":false,"clientId":"github_test"} ` ,
` "gitlab": { "enabled":true,"clientId":"gitlab_test"} ` ,
` "google": { "enabled":false,"clientId":"google_test"} ` ,
` "microsoft": { "enabled":false,"clientId":"microsoft_test"} ` ,
` "spotify": { "enabled":false,"clientId":"spotify_test"} ` ,
` "twitter": { "enabled":false,"clientId":"twitter_test"} ` ,
` "kakao": { "enabled":false,"clientId":"kakao_test"} ` ,
2022-11-13 14:20:11 +02:00
` "twitch": { "enabled":false,"clientId":"twitch_test"} ` ,
2022-12-31 02:21:41 +02:00
` "strava": { "enabled":false,"clientId":"strava_test"} ` ,
2022-12-31 11:46:36 +02:00
` "gitee": { "enabled":false,"clientId":"gitee_test"} ` ,
2022-11-13 13:05:06 +02:00
}
for _ , p := range expectedParts {
if ! strings . Contains ( encodedStr , p ) {
t . Fatalf ( "Expected \n%s \nin \n%s" , p , encodedStr )
}
2022-07-06 23:19:05 +02:00
}
}
func TestTokenConfigValidate ( t * testing . T ) {
scenarios := [ ] struct {
2022-11-26 14:42:45 +02:00
config settings . TokenConfig
2022-07-06 23:19:05 +02:00
expectError bool
} {
// zero values
{
2022-11-26 14:42:45 +02:00
settings . TokenConfig { } ,
2022-07-06 23:19:05 +02:00
true ,
} ,
// invalid data
{
2022-11-26 14:42:45 +02:00
settings . TokenConfig {
2022-08-25 09:57:50 +02:00
Secret : strings . Repeat ( "a" , 5 ) ,
2022-07-06 23:19:05 +02:00
Duration : 4 ,
} ,
true ,
} ,
2022-08-25 09:57:50 +02:00
// valid secret but invalid duration
{
2022-11-26 14:42:45 +02:00
settings . TokenConfig {
2022-08-25 09:57:50 +02:00
Secret : strings . Repeat ( "a" , 30 ) ,
Duration : 63072000 + 1 ,
} ,
true ,
} ,
2022-07-06 23:19:05 +02:00
// valid data
{
2022-11-26 14:42:45 +02:00
settings . TokenConfig {
2022-08-25 09:57:50 +02:00
Secret : strings . Repeat ( "a" , 30 ) ,
2022-07-06 23:19:05 +02:00
Duration : 100 ,
} ,
false ,
} ,
}
for i , scenario := range scenarios {
result := scenario . config . Validate ( )
if result != nil && ! scenario . expectError {
t . Errorf ( "(%d) Didn't expect error, got %v" , i , result )
}
if result == nil && scenario . expectError {
t . Errorf ( "(%d) Expected error, got nil" , i )
}
}
}
func TestSmtpConfigValidate ( t * testing . T ) {
scenarios := [ ] struct {
2022-11-26 14:42:45 +02:00
config settings . SmtpConfig
2022-07-06 23:19:05 +02:00
expectError bool
} {
// zero values (disabled)
{
2022-11-26 14:42:45 +02:00
settings . SmtpConfig { } ,
2022-07-06 23:19:05 +02:00
false ,
} ,
// zero values (enabled)
{
2022-11-26 14:42:45 +02:00
settings . SmtpConfig { Enabled : true } ,
2022-07-06 23:19:05 +02:00
true ,
} ,
// invalid data
{
2022-11-26 14:42:45 +02:00
settings . SmtpConfig {
2022-07-06 23:19:05 +02:00
Enabled : true ,
Host : "test:test:test" ,
Port : - 10 ,
} ,
true ,
} ,
2022-12-13 11:45:59 +02:00
// invalid auth method
{
settings . SmtpConfig {
Enabled : true ,
Host : "example.com" ,
Port : 100 ,
AuthMethod : "example" ,
} ,
true ,
} ,
// valid data (no explicit auth method)
2022-07-06 23:19:05 +02:00
{
2022-11-26 14:42:45 +02:00
settings . SmtpConfig {
2022-07-06 23:19:05 +02:00
Enabled : true ,
Host : "example.com" ,
Port : 100 ,
Tls : true ,
} ,
false ,
} ,
2022-12-13 11:45:59 +02:00
// valid data (explicit auth method - login)
{
settings . SmtpConfig {
Enabled : true ,
Host : "example.com" ,
Port : 100 ,
AuthMethod : mailer . SmtpAuthLogin ,
} ,
false ,
} ,
2022-07-06 23:19:05 +02:00
}
for i , scenario := range scenarios {
result := scenario . config . Validate ( )
if result != nil && ! scenario . expectError {
t . Errorf ( "(%d) Didn't expect error, got %v" , i , result )
}
if result == nil && scenario . expectError {
t . Errorf ( "(%d) Expected error, got nil" , i )
}
}
}
func TestS3ConfigValidate ( t * testing . T ) {
scenarios := [ ] struct {
2022-11-26 14:42:45 +02:00
config settings . S3Config
2022-07-06 23:19:05 +02:00
expectError bool
} {
// zero values (disabled)
{
2022-11-26 14:42:45 +02:00
settings . S3Config { } ,
2022-07-06 23:19:05 +02:00
false ,
} ,
// zero values (enabled)
{
2022-11-26 14:42:45 +02:00
settings . S3Config { Enabled : true } ,
2022-07-06 23:19:05 +02:00
true ,
} ,
// invalid data
{
2022-11-26 14:42:45 +02:00
settings . S3Config {
2022-07-06 23:19:05 +02:00
Enabled : true ,
Endpoint : "test:test:test" ,
} ,
true ,
} ,
2022-07-11 20:00:17 +02:00
// valid data (url endpoint)
{
2022-11-26 14:42:45 +02:00
settings . S3Config {
2022-07-11 20:00:17 +02:00
Enabled : true ,
Endpoint : "https://localhost:8090" ,
Bucket : "test" ,
Region : "test" ,
AccessKey : "test" ,
Secret : "test" ,
} ,
false ,
} ,
// valid data (hostname endpoint)
2022-07-06 23:19:05 +02:00
{
2022-11-26 14:42:45 +02:00
settings . S3Config {
2022-07-06 23:19:05 +02:00
Enabled : true ,
Endpoint : "example.com" ,
Bucket : "test" ,
Region : "test" ,
AccessKey : "test" ,
Secret : "test" ,
} ,
false ,
} ,
}
for i , scenario := range scenarios {
result := scenario . config . Validate ( )
if result != nil && ! scenario . expectError {
t . Errorf ( "(%d) Didn't expect error, got %v" , i , result )
}
if result == nil && scenario . expectError {
t . Errorf ( "(%d) Expected error, got nil" , i )
}
}
}
func TestMetaConfigValidate ( t * testing . T ) {
2022-11-26 14:42:45 +02:00
invalidTemplate := settings . EmailTemplate {
2022-08-14 18:30:45 +02:00
Subject : "test" ,
ActionUrl : "test" ,
Body : "test" ,
}
2022-11-26 14:42:45 +02:00
noPlaceholdersTemplate := settings . EmailTemplate {
2022-08-14 18:30:45 +02:00
Subject : "test" ,
ActionUrl : "http://example.com" ,
Body : "test" ,
}
2022-11-26 14:42:45 +02:00
withPlaceholdersTemplate := settings . EmailTemplate {
2022-08-14 18:30:45 +02:00
Subject : "test" ,
2022-11-26 14:42:45 +02:00
ActionUrl : "http://example.com" + settings . EmailPlaceholderToken ,
Body : "test" + settings . EmailPlaceholderActionUrl ,
2022-08-14 18:30:45 +02:00
}
2022-07-06 23:19:05 +02:00
scenarios := [ ] struct {
2022-11-26 14:42:45 +02:00
config settings . MetaConfig
2022-07-06 23:19:05 +02:00
expectError bool
} {
// zero values
{
2022-11-26 14:42:45 +02:00
settings . MetaConfig { } ,
2022-07-06 23:19:05 +02:00
true ,
} ,
// invalid data
{
2022-11-26 14:42:45 +02:00
settings . MetaConfig {
2022-08-14 18:30:45 +02:00
AppName : strings . Repeat ( "a" , 300 ) ,
AppUrl : "test" ,
SenderName : strings . Repeat ( "a" , 300 ) ,
SenderAddress : "invalid_email" ,
VerificationTemplate : invalidTemplate ,
ResetPasswordTemplate : invalidTemplate ,
ConfirmEmailChangeTemplate : invalidTemplate ,
2022-07-06 23:19:05 +02:00
} ,
true ,
} ,
// invalid data (missing required placeholders)
{
2022-11-26 14:42:45 +02:00
settings . MetaConfig {
2022-08-14 18:30:45 +02:00
AppName : "test" ,
AppUrl : "https://example.com" ,
SenderName : "test" ,
SenderAddress : "test@example.com" ,
VerificationTemplate : noPlaceholdersTemplate ,
ResetPasswordTemplate : noPlaceholdersTemplate ,
ConfirmEmailChangeTemplate : noPlaceholdersTemplate ,
2022-07-06 23:19:05 +02:00
} ,
true ,
} ,
// valid data
{
2022-11-26 14:42:45 +02:00
settings . MetaConfig {
2022-08-14 18:30:45 +02:00
AppName : "test" ,
AppUrl : "https://example.com" ,
SenderName : "test" ,
SenderAddress : "test@example.com" ,
VerificationTemplate : withPlaceholdersTemplate ,
ResetPasswordTemplate : withPlaceholdersTemplate ,
ConfirmEmailChangeTemplate : withPlaceholdersTemplate ,
2022-07-06 23:19:05 +02:00
} ,
false ,
} ,
}
for i , scenario := range scenarios {
result := scenario . config . Validate ( )
if result != nil && ! scenario . expectError {
t . Errorf ( "(%d) Didn't expect error, got %v" , i , result )
}
if result == nil && scenario . expectError {
t . Errorf ( "(%d) Expected error, got nil" , i )
}
}
}
2022-08-14 18:30:45 +02:00
func TestEmailTemplateValidate ( t * testing . T ) {
scenarios := [ ] struct {
2022-11-26 14:42:45 +02:00
emailTemplate settings . EmailTemplate
2022-08-14 18:30:45 +02:00
expectedErrors [ ] string
} {
// require values
{
2022-11-26 14:42:45 +02:00
settings . EmailTemplate { } ,
2022-08-14 18:30:45 +02:00
[ ] string { "subject" , "actionUrl" , "body" } ,
} ,
// missing placeholders
{
2022-11-26 14:42:45 +02:00
settings . EmailTemplate {
2022-08-14 18:30:45 +02:00
Subject : "test" ,
ActionUrl : "test" ,
Body : "test" ,
} ,
[ ] string { "actionUrl" , "body" } ,
} ,
// valid data
{
2022-11-26 14:42:45 +02:00
settings . EmailTemplate {
2022-08-14 18:30:45 +02:00
Subject : "test" ,
2022-11-26 14:42:45 +02:00
ActionUrl : "test" + settings . EmailPlaceholderToken ,
Body : "test" + settings . EmailPlaceholderActionUrl ,
2022-08-14 18:30:45 +02:00
} ,
[ ] string { } ,
} ,
}
for i , s := range scenarios {
result := s . emailTemplate . Validate ( )
// parse errors
errs , ok := result . ( validation . Errors )
if ! ok && result != nil {
t . Errorf ( "(%d) Failed to parse errors %v" , i , result )
continue
}
// check errors
if len ( errs ) > len ( s . expectedErrors ) {
t . Errorf ( "(%d) Expected error keys %v, got %v" , i , s . expectedErrors , errs )
}
for _ , k := range s . expectedErrors {
if _ , ok := errs [ k ] ; ! ok {
t . Errorf ( "(%d) Missing expected error key %q in %v" , i , k , errs )
}
}
}
}
func TestEmailTemplateResolve ( t * testing . T ) {
2022-11-26 14:42:45 +02:00
allPlaceholders := settings . EmailPlaceholderActionUrl + settings . EmailPlaceholderToken + settings . EmailPlaceholderAppName + settings . EmailPlaceholderAppUrl
2022-08-14 18:30:45 +02:00
scenarios := [ ] struct {
2022-11-26 14:42:45 +02:00
emailTemplate settings . EmailTemplate
2022-08-14 18:30:45 +02:00
expectedSubject string
expectedBody string
expectedActionUrl string
} {
// no placeholders
{
2022-11-26 14:42:45 +02:00
emailTemplate : settings . EmailTemplate {
2022-08-14 18:30:45 +02:00
Subject : "subject:" ,
Body : "body:" ,
ActionUrl : "/actionUrl////" ,
} ,
expectedSubject : "subject:" ,
expectedActionUrl : "/actionUrl/" ,
expectedBody : "body:" ,
} ,
// with placeholders
{
2022-11-26 14:42:45 +02:00
emailTemplate : settings . EmailTemplate {
2022-08-14 18:30:45 +02:00
ActionUrl : "/actionUrl////" + allPlaceholders ,
Subject : "subject:" + allPlaceholders ,
Body : "body:" + allPlaceholders ,
} ,
expectedActionUrl : fmt . Sprintf (
"/actionUrl/%%7BACTION_URL%%7D%s%s%s" ,
"token_test" ,
"name_test" ,
"url_test" ,
) ,
expectedSubject : fmt . Sprintf (
"subject:%s%s%s%s" ,
2022-11-26 14:42:45 +02:00
settings . EmailPlaceholderActionUrl ,
settings . EmailPlaceholderToken ,
2022-08-14 18:30:45 +02:00
"name_test" ,
"url_test" ,
) ,
expectedBody : fmt . Sprintf (
"body:%s%s%s%s" ,
fmt . Sprintf (
"/actionUrl/%%7BACTION_URL%%7D%s%s%s" ,
"token_test" ,
"name_test" ,
"url_test" ,
) ,
"token_test" ,
"name_test" ,
"url_test" ,
) ,
} ,
}
for i , s := range scenarios {
subject , body , actionUrl := s . emailTemplate . Resolve ( "name_test" , "url_test" , "token_test" )
if s . expectedSubject != subject {
t . Errorf ( "(%d) Expected subject %q got %q" , i , s . expectedSubject , subject )
}
if s . expectedBody != body {
t . Errorf ( "(%d) Expected body \n%v got \n%v" , i , s . expectedBody , body )
}
if s . expectedActionUrl != actionUrl {
t . Errorf ( "(%d) Expected actionUrl \n%v got \n%v" , i , s . expectedActionUrl , actionUrl )
}
}
}
2022-07-06 23:19:05 +02:00
func TestLogsConfigValidate ( t * testing . T ) {
scenarios := [ ] struct {
2022-11-26 14:42:45 +02:00
config settings . LogsConfig
2022-07-06 23:19:05 +02:00
expectError bool
} {
// zero values
{
2022-11-26 14:42:45 +02:00
settings . LogsConfig { } ,
2022-07-06 23:19:05 +02:00
false ,
} ,
// invalid data
{
2022-11-26 14:42:45 +02:00
settings . LogsConfig { MaxDays : - 10 } ,
2022-07-06 23:19:05 +02:00
true ,
} ,
// valid data
{
2022-11-26 14:42:45 +02:00
settings . LogsConfig { MaxDays : 1 } ,
2022-07-06 23:19:05 +02:00
false ,
} ,
}
for i , scenario := range scenarios {
result := scenario . config . Validate ( )
if result != nil && ! scenario . expectError {
t . Errorf ( "(%d) Didn't expect error, got %v" , i , result )
}
if result == nil && scenario . expectError {
t . Errorf ( "(%d) Expected error, got nil" , i )
}
}
}
func TestAuthProviderConfigValidate ( t * testing . T ) {
scenarios := [ ] struct {
2022-11-26 14:42:45 +02:00
config settings . AuthProviderConfig
2022-07-06 23:19:05 +02:00
expectError bool
} {
// zero values (disabled)
{
2022-11-26 14:42:45 +02:00
settings . AuthProviderConfig { } ,
2022-07-06 23:19:05 +02:00
false ,
} ,
// zero values (enabled)
{
2022-11-26 14:42:45 +02:00
settings . AuthProviderConfig { Enabled : true } ,
2022-07-06 23:19:05 +02:00
true ,
} ,
// invalid data
{
2022-11-26 14:42:45 +02:00
settings . AuthProviderConfig {
2022-07-06 23:19:05 +02:00
Enabled : true ,
ClientId : "" ,
ClientSecret : "" ,
AuthUrl : "test" ,
TokenUrl : "test" ,
UserApiUrl : "test" ,
} ,
true ,
} ,
// valid data (only the required)
{
2022-11-26 14:42:45 +02:00
settings . AuthProviderConfig {
2022-07-06 23:19:05 +02:00
Enabled : true ,
ClientId : "test" ,
ClientSecret : "test" ,
} ,
false ,
} ,
// valid data (fill all fields)
{
2022-11-26 14:42:45 +02:00
settings . AuthProviderConfig {
2022-07-06 23:19:05 +02:00
Enabled : true ,
ClientId : "test" ,
ClientSecret : "test" ,
AuthUrl : "https://example.com" ,
TokenUrl : "https://example.com" ,
UserApiUrl : "https://example.com" ,
} ,
false ,
} ,
}
for i , scenario := range scenarios {
result := scenario . config . Validate ( )
if result != nil && ! scenario . expectError {
t . Errorf ( "(%d) Didn't expect error, got %v" , i , result )
}
if result == nil && scenario . expectError {
t . Errorf ( "(%d) Expected error, got nil" , i )
}
}
}
func TestAuthProviderConfigSetupProvider ( t * testing . T ) {
provider := auth . NewGithubProvider ( )
// disabled config
2022-11-26 14:42:45 +02:00
c1 := settings . AuthProviderConfig { Enabled : false }
2022-07-06 23:19:05 +02:00
if err := c1 . SetupProvider ( provider ) ; err == nil {
t . Errorf ( "Expected error, got nil" )
}
2022-11-26 14:42:45 +02:00
c2 := settings . AuthProviderConfig {
2022-07-06 23:19:05 +02:00
Enabled : true ,
ClientId : "test_ClientId" ,
ClientSecret : "test_ClientSecret" ,
AuthUrl : "test_AuthUrl" ,
UserApiUrl : "test_UserApiUrl" ,
TokenUrl : "test_TokenUrl" ,
}
if err := c2 . SetupProvider ( provider ) ; err != nil {
t . Error ( err )
}
2022-10-30 10:28:14 +02:00
if provider . ClientId ( ) != c2 . ClientId {
t . Fatalf ( "Expected ClientId %s, got %s" , c2 . ClientId , provider . ClientId ( ) )
2022-07-06 23:19:05 +02:00
}
2022-10-30 10:28:14 +02:00
if provider . ClientSecret ( ) != c2 . ClientSecret {
t . Fatalf ( "Expected ClientSecret %s, got %s" , c2 . ClientSecret , provider . ClientSecret ( ) )
2022-07-06 23:19:05 +02:00
}
2022-10-30 10:28:14 +02:00
if provider . AuthUrl ( ) != c2 . AuthUrl {
t . Fatalf ( "Expected AuthUrl %s, got %s" , c2 . AuthUrl , provider . AuthUrl ( ) )
}
2022-07-06 23:19:05 +02:00
2022-10-30 10:28:14 +02:00
if provider . UserApiUrl ( ) != c2 . UserApiUrl {
t . Fatalf ( "Expected UserApiUrl %s, got %s" , c2 . UserApiUrl , provider . UserApiUrl ( ) )
}
2022-07-06 23:19:05 +02:00
2022-10-30 10:28:14 +02:00
if provider . TokenUrl ( ) != c2 . TokenUrl {
t . Fatalf ( "Expected TokenUrl %s, got %s" , c2 . TokenUrl , provider . TokenUrl ( ) )
2022-07-06 23:19:05 +02:00
}
}