Files
vikunja/pkg/modules/dump/restore_test.go
Tobias a31255707e fix "null" in project views (#1158)
Co-authored-by: kolaente <k@knt.li>
2025-07-22 17:43:04 +00:00

153 lines
5.5 KiB
Go

// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-present Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package dump
import (
"encoding/base64"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestConvertFieldValue(t *testing.T) {
t.Run("Float field conversions", func(t *testing.T) {
t.Run("should return float64 as-is", func(t *testing.T) {
result, err := convertFieldValue("position", 123.45, true)
require.NoError(t, err)
assert.InEpsilon(t, 123.45, result, 0.0001)
})
t.Run("should convert int to float64", func(t *testing.T) {
result, err := convertFieldValue("position", 42, true)
require.NoError(t, err)
assert.InEpsilon(t, 42.0, result, 0.0001)
})
t.Run("should decode base64 string and convert to float", func(t *testing.T) {
encoded := base64.StdEncoding.EncodeToString([]byte("123.45"))
result, err := convertFieldValue("position", encoded, true)
require.NoError(t, err)
assert.InEpsilon(t, 123.45, result, 0.0001)
})
t.Run("should handle non-base64 string and convert to float", func(t *testing.T) {
result, err := convertFieldValue("position", "67.89", true)
require.NoError(t, err)
assert.InEpsilon(t, 67.89, result, 0.0001)
})
t.Run("should return error for invalid float string", func(t *testing.T) {
_, err := convertFieldValue("position", "not-a-number", true)
require.Error(t, err)
assert.Contains(t, err.Error(), "could not parse double value")
})
t.Run("should return error for unexpected type", func(t *testing.T) {
_, err := convertFieldValue("position", []int{1, 2, 3}, true)
require.Error(t, err)
assert.Contains(t, err.Error(), "unexpected type for float field")
})
})
t.Run("JSON field conversions", func(t *testing.T) {
t.Run("should decode base64 string", func(t *testing.T) {
jsonData := `{"key": "value"}`
encoded := base64.StdEncoding.EncodeToString([]byte(jsonData))
result, err := convertFieldValue("permissions", encoded, false)
require.NoError(t, err)
assert.JSONEq(t, jsonData, result.(string))
})
t.Run("should handle non-base64 string", func(t *testing.T) {
jsonData := `{"key": "value"}`
result, err := convertFieldValue("permissions", jsonData, false)
require.NoError(t, err)
assert.JSONEq(t, jsonData, result.(string))
})
t.Run("should return nil for 'null' string", func(t *testing.T) {
result, err := convertFieldValue("bucket_configuration", "null", false)
require.NoError(t, err)
assert.Nil(t, result)
})
t.Run("should return nil for 'NULL' string", func(t *testing.T) {
result, err := convertFieldValue("bucket_configuration", "NULL", false)
require.NoError(t, err)
assert.Nil(t, result)
})
t.Run("should return nil for 'Null' string", func(t *testing.T) {
result, err := convertFieldValue("bucket_configuration", "Null", false)
require.NoError(t, err)
assert.Nil(t, result)
})
t.Run("should return error for non-string type", func(t *testing.T) {
_, err := convertFieldValue("permissions", 123, false)
require.Error(t, err)
assert.Contains(t, err.Error(), "expected string for JSON field")
})
})
t.Run("Base64 error handling", func(t *testing.T) {
t.Run("should handle base64 decode error for float field", func(t *testing.T) {
invalidBase64 := "invalid base64 with spaces and special chars!!!"
result, err := convertFieldValue("position", invalidBase64, true)
// Should not error on decode, but should error on parse float
require.Error(t, err)
assert.Contains(t, err.Error(), "could not parse double value")
assert.Nil(t, result)
})
t.Run("should handle base64 decode error for JSON field", func(t *testing.T) {
// For JSON fields, CorruptInputError just returns the raw string
invalidBase64 := "invalid base64 with spaces and special chars!!!"
result, err := convertFieldValue("permissions", invalidBase64, false)
require.NoError(t, err)
assert.Equal(t, invalidBase64, result)
})
})
t.Run("Edge cases", func(t *testing.T) {
t.Run("should handle empty string for JSON field", func(t *testing.T) {
result, err := convertFieldValue("permissions", "", false)
require.NoError(t, err)
assert.Empty(t, result)
})
t.Run("should handle empty string for float field", func(t *testing.T) {
_, err := convertFieldValue("position", "", true)
require.Error(t, err)
assert.Contains(t, err.Error(), "could not parse double value")
})
t.Run("should handle zero float value", func(t *testing.T) {
result, err := convertFieldValue("position", 0.0, true)
require.NoError(t, err)
assert.InDelta(t, 0.0, result, 0.0001)
})
t.Run("should handle negative float value", func(t *testing.T) {
result, err := convertFieldValue("position", -123.45, true)
require.NoError(t, err)
assert.InEpsilon(t, -123.45, result, 0.0001)
})
})
}