| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- package repository
- import (
- "context"
- "errors"
- "testing"
- "time"
- "github.com/alicebob/miniredis/v2"
- "github.com/redis/go-redis/v9"
- "github.com/stretchr/testify/require"
- )
- func TestAPIKeyCacheSubscriber_BlocksUntilContextCancellation(t *testing.T) {
- server := miniredis.RunT(t)
- client := redis.NewClient(&redis.Options{Addr: server.Addr()})
- defer func() { _ = client.Close() }()
- cache := NewAPIKeyCache(client)
- ctx, cancel := context.WithCancel(context.Background())
- received := make(chan string, 1)
- returned := make(chan error, 1)
- go func() {
- returned <- cache.SubscribeAuthCacheInvalidation(ctx, func(value string) { received <- value })
- }()
- var value string
- require.Eventually(t, func() bool {
- require.NoError(t, client.Publish(context.Background(), authCacheInvalidateChannel, "hash").Err())
- select {
- case value = <-received:
- return true
- default:
- return false
- }
- }, time.Second, 10*time.Millisecond)
- require.Equal(t, "hash", value)
- select {
- case err := <-returned:
- t.Fatalf("subscriber returned while connection was active: %v", err)
- default:
- }
- cancel()
- select {
- case err := <-returned:
- require.True(t, errors.Is(err, context.Canceled))
- case <-time.After(time.Second):
- t.Fatal("subscriber did not stop after context cancellation")
- }
- }
|