merge v0.23.0-rc changes

This commit is contained in:
Gani Georgiev
2024-09-29 19:23:19 +03:00
parent ad92992324
commit 844f18cac3
753 changed files with 85141 additions and 63396 deletions
+163 -5
View File
@@ -3,6 +3,8 @@ package store_test
import (
"bytes"
"encoding/json"
"slices"
"strconv"
"testing"
"github.com/pocketbase/pocketbase/tools/store"
@@ -137,11 +139,41 @@ func TestGet(t *testing.T) {
{"missing", 0}, // should auto fallback to the zero value
}
for i, scenario := range scenarios {
val := s.Get(scenario.key)
if val != scenario.expect {
t.Errorf("(%d) Expected %v, got %v", i, scenario.expect, val)
}
for _, scenario := range scenarios {
t.Run(scenario.key, func(t *testing.T) {
val := s.Get(scenario.key)
if val != scenario.expect {
t.Fatalf("Expected %v, got %v", scenario.expect, val)
}
})
}
}
func TestGetOk(t *testing.T) {
s := store.New(map[string]int{"test1": 0, "test2": 1})
scenarios := []struct {
key string
expectValue int
expectOk bool
}{
{"test1", 0, true},
{"test2", 1, true},
{"missing", 0, false}, // should auto fallback to the zero value
}
for _, scenario := range scenarios {
t.Run(scenario.key, func(t *testing.T) {
val, ok := s.GetOk(scenario.key)
if ok != scenario.expectOk {
t.Fatalf("Expected ok %v, got %v", scenario.expectOk, ok)
}
if val != scenario.expectValue {
t.Fatalf("Expected %v, got %v", scenario.expectValue, val)
}
})
}
}
@@ -173,6 +205,27 @@ func TestGetAll(t *testing.T) {
}
}
func TestValues(t *testing.T) {
data := map[string]int{
"a": 1,
"b": 2,
}
values := store.New(data).Values()
expected := []int{1, 2}
if len(values) != len(expected) {
t.Fatalf("Expected %d values, got %d", len(expected), len(values))
}
for _, v := range expected {
if !slices.Contains(values, v) {
t.Fatalf("Missing value %v in\n%v", v, values)
}
}
}
func TestSet(t *testing.T) {
s := store.Store[int]{}
@@ -196,6 +249,37 @@ func TestSet(t *testing.T) {
}
}
func TestGetOrSet(t *testing.T) {
s := store.New(map[string]int{
"test1": 0,
"test2": 1,
"test3": 3,
})
scenarios := []struct {
key string
value int
expected int
}{
{"test2", 20, 1},
{"test3", 2, 3},
{"test_new", 20, 20},
{"test_new", 50, 20}, // should return the previously inserted value
}
for _, scenario := range scenarios {
t.Run(scenario.key, func(t *testing.T) {
result := s.GetOrSet(scenario.key, func() int {
return scenario.value
})
if result != scenario.expected {
t.Fatalf("Expected %v, got %v", scenario.expected, result)
}
})
}
}
func TestSetIfLessThanLimit(t *testing.T) {
s := store.Store[int]{}
@@ -230,3 +314,77 @@ func TestSetIfLessThanLimit(t *testing.T) {
}
}
}
func TestUnmarshalJSON(t *testing.T) {
s := store.Store[string]{}
s.Set("b", "old") // should be overwritten
s.Set("c", "test3") // ensures that the old values are not removed
raw := []byte(`{"a":"test1", "b":"test2"}`)
if err := json.Unmarshal(raw, &s); err != nil {
t.Fatal(err)
}
if v := s.Get("a"); v != "test1" {
t.Fatalf("Expected store.a to be %q, got %q", "test1", v)
}
if v := s.Get("b"); v != "test2" {
t.Fatalf("Expected store.b to be %q, got %q", "test2", v)
}
if v := s.Get("c"); v != "test3" {
t.Fatalf("Expected store.c to be %q, got %q", "test3", v)
}
}
func TestMarshalJSON(t *testing.T) {
s := &store.Store[string]{}
s.Set("a", "test1")
s.Set("b", "test2")
expected := []byte(`{"a":"test1", "b":"test2"}`)
result, err := json.Marshal(s)
if err != nil {
t.Fatal(err)
}
if bytes.Equal(result, expected) {
t.Fatalf("Expected\n%s\ngot\n%s", expected, result)
}
}
func TestShrink(t *testing.T) {
s := &store.Store[int]{}
total := 1000
for i := 0; i < total; i++ {
s.Set(strconv.Itoa(i), i)
}
if s.Length() != total {
t.Fatalf("Expected %d items, got %d", total, s.Length())
}
// trigger map "shrink"
for i := 0; i < store.ShrinkThreshold; i++ {
s.Remove(strconv.Itoa(i))
}
// ensure that after the deletion, the new map was copied properly
if s.Length() != total-store.ShrinkThreshold {
t.Fatalf("Expected %d items, got %d", total-store.ShrinkThreshold, s.Length())
}
for k := range s.GetAll() {
kInt, err := strconv.Atoi(k)
if err != nil {
t.Fatalf("failed to convert %s into int: %v", k, err)
}
if kInt < store.ShrinkThreshold {
t.Fatalf("Key %q should have been deleted", k)
}
}
}