89 lines
2.6 KiB
Go
89 lines
2.6 KiB
Go
package flags_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/veylant/ia-gateway/internal/flags"
|
|
)
|
|
|
|
// TestMemFlagStore_Set_Get tests basic create and retrieve.
|
|
func TestMemFlagStore_Set_Get(t *testing.T) {
|
|
store := flags.NewMemFlagStore()
|
|
ctx := context.Background()
|
|
|
|
f, err := store.Set(ctx, "tenant-a", "ner_enabled", true)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "tenant-a", f.TenantID)
|
|
assert.Equal(t, "ner_enabled", f.Name)
|
|
assert.True(t, f.IsEnabled)
|
|
|
|
got, err := store.Get(ctx, "tenant-a", "ner_enabled")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, f.ID, got.ID)
|
|
assert.True(t, got.IsEnabled)
|
|
}
|
|
|
|
// TestMemFlagStore_IsEnabled_TenantOverridesGlobal verifies tenant-specific
|
|
// flag takes precedence over global.
|
|
func TestMemFlagStore_IsEnabled_TenantOverridesGlobal(t *testing.T) {
|
|
store := flags.NewMemFlagStore()
|
|
ctx := context.Background()
|
|
|
|
// Global flag: enabled
|
|
_, err := store.Set(ctx, "", "ner_enabled", true)
|
|
require.NoError(t, err)
|
|
|
|
// Tenant-specific: disabled
|
|
_, err = store.Set(ctx, "tenant-a", "ner_enabled", false)
|
|
require.NoError(t, err)
|
|
|
|
// Tenant A should see disabled (tenant-specific wins)
|
|
enabled, err := store.IsEnabled(ctx, "tenant-a", "ner_enabled")
|
|
require.NoError(t, err)
|
|
assert.False(t, enabled)
|
|
|
|
// Tenant B has no specific flag → falls back to global (enabled)
|
|
enabled, err = store.IsEnabled(ctx, "tenant-b", "ner_enabled")
|
|
require.NoError(t, err)
|
|
assert.True(t, enabled)
|
|
}
|
|
|
|
// TestMemFlagStore_IsEnabled_NotFound returns false (no error) for unknown flag.
|
|
func TestMemFlagStore_IsEnabled_NotFound(t *testing.T) {
|
|
store := flags.NewMemFlagStore()
|
|
enabled, err := store.IsEnabled(context.Background(), "tenant-a", "nonexistent")
|
|
require.NoError(t, err)
|
|
assert.False(t, enabled)
|
|
}
|
|
|
|
// TestMemFlagStore_Set_Update tests idempotent upsert behaviour.
|
|
func TestMemFlagStore_Set_Update(t *testing.T) {
|
|
store := flags.NewMemFlagStore()
|
|
ctx := context.Background()
|
|
|
|
f1, _ := store.Set(ctx, "t1", "flag_x", true)
|
|
f2, err := store.Set(ctx, "t1", "flag_x", false)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, f1.ID, f2.ID, "upsert must not create a new entry")
|
|
assert.False(t, f2.IsEnabled)
|
|
}
|
|
|
|
// TestMemFlagStore_Delete removes a flag and returns ErrNotFound on second delete.
|
|
func TestMemFlagStore_Delete(t *testing.T) {
|
|
store := flags.NewMemFlagStore()
|
|
ctx := context.Background()
|
|
|
|
_, err := store.Set(ctx, "t1", "to_delete", true)
|
|
require.NoError(t, err)
|
|
|
|
err = store.Delete(ctx, "t1", "to_delete")
|
|
require.NoError(t, err)
|
|
|
|
err = store.Delete(ctx, "t1", "to_delete")
|
|
assert.ErrorIs(t, err, flags.ErrNotFound)
|
|
}
|