Files
go-telegram/dispatch/conversation/in_memory_test.go
T
lukaszraczylo 9072e9eafb Initial release of go-telegram
A fully-generated, strongly-typed Go client for the Telegram Bot API.

* 176 methods + 301 types generated from Bot API v10.0
* 1408 auto-generated tests (8 scenarios per method)
* Typed unions throughout — no 'any' in the public surface
* Pluggable HTTP transport and JSON codec (default goccy/go-json)
* Built-in retry middleware honouring Telegram's retry_after
* Generic dispatcher with filters and conversation handlers
* Self-verifying codegen pipeline (regen → audit → emit → run tests)
* 14 example bots covering common patterns
2026-05-09 13:09:27 +01:00

88 lines
2.0 KiB
Go

package conversation
import (
"context"
"sync"
"testing"
"github.com/stretchr/testify/require"
)
func TestMemoryStorage_GetSetDelete(t *testing.T) {
ctx := context.Background()
s := NewMemoryStorage()
// Get on empty key returns ErrKeyNotFound.
_, err := s.Get(ctx, "k1")
require.ErrorIs(t, err, ErrKeyNotFound)
// Set then Get returns the stored state.
require.NoError(t, s.Set(ctx, "k1", "step_a"))
v, err := s.Get(ctx, "k1")
require.NoError(t, err)
require.Equal(t, State("step_a"), v)
// Overwrite works.
require.NoError(t, s.Set(ctx, "k1", "step_b"))
v, err = s.Get(ctx, "k1")
require.NoError(t, err)
require.Equal(t, State("step_b"), v)
// Delete removes the key.
require.NoError(t, s.Delete(ctx, "k1"))
_, err = s.Get(ctx, "k1")
require.ErrorIs(t, err, ErrKeyNotFound)
// Delete of non-existent key is a no-op (no error).
require.NoError(t, s.Delete(ctx, "nonexistent"))
}
func TestMemoryStorage_MultipleKeys(t *testing.T) {
ctx := context.Background()
s := NewMemoryStorage()
require.NoError(t, s.Set(ctx, "a", "stateA"))
require.NoError(t, s.Set(ctx, "b", "stateB"))
va, err := s.Get(ctx, "a")
require.NoError(t, err)
require.Equal(t, State("stateA"), va)
vb, err := s.Get(ctx, "b")
require.NoError(t, err)
require.Equal(t, State("stateB"), vb)
// Delete one key; the other remains.
require.NoError(t, s.Delete(ctx, "a"))
_, err = s.Get(ctx, "a")
require.ErrorIs(t, err, ErrKeyNotFound)
vb, err = s.Get(ctx, "b")
require.NoError(t, err)
require.Equal(t, State("stateB"), vb)
}
func TestMemoryStorage_Concurrent(t *testing.T) {
// 20 goroutines hammering the same key concurrently — no data race.
ctx := context.Background()
s := NewMemoryStorage()
const goroutines = 20
var wg sync.WaitGroup
wg.Add(goroutines)
for i := 0; i < goroutines; i++ {
go func(i int) {
defer wg.Done()
key := "shared"
_ = s.Set(ctx, key, State("step"))
_, _ = s.Get(ctx, key)
if i%3 == 0 {
_ = s.Delete(ctx, key)
}
}(i)
}
wg.Wait()
// No assertion needed — race detector catches the bug if present.
}