mirror of
https://github.com/hanzoai/base.git
synced 2026-10-21 03:41:50 +00:00
# Conflicts: # core/record_field_resolver_multi_match.go # ui/dist/assets/AuthMethodsDocs-ChShXLwE.js # ui/dist/assets/AuthMethodsDocs-Cqvl0T_l.js # ui/dist/assets/AuthMethodsDocs-DIqhS7qY.js # ui/dist/assets/AuthRefreshDocs-CHakkNnn.js # ui/dist/assets/AuthRefreshDocs-DLb1qree.js # ui/dist/assets/AuthRefreshDocs-DXgrlMdk.js # ui/dist/assets/AuthWithOAuth2Docs-Bl8VRxNv.js # ui/dist/assets/AuthWithOAuth2Docs-DVBOel22.js # ui/dist/assets/AuthWithOAuth2Docs-I213UiJ7.js # ui/dist/assets/AuthWithOtpDocs-B9tL6gIN.js # ui/dist/assets/AuthWithOtpDocs-C2PPm9-Z.js # ui/dist/assets/AuthWithOtpDocs-qEMoMG3D.js # ui/dist/assets/AuthWithPasswordDocs-B8JWDbPL.js # ui/dist/assets/AuthWithPasswordDocs-BTHeYJwE.js # ui/dist/assets/AuthWithPasswordDocs-D9rqgLpO.js # ui/dist/assets/BatchApiDocs-BV4PYYXn.js # ui/dist/assets/BatchApiDocs-DXa997am.js # ui/dist/assets/BatchApiDocs-Di2Qe2dV.js # ui/dist/assets/DeleteApiDocs-C3IINRwz.js # ui/dist/assets/DeleteApiDocs-LfmVp4Uf.js # ui/dist/assets/DeleteApiDocs-SU4XdGhJ.js # ui/dist/assets/EmailChangeDocs-COx1USU5.js # ui/dist/assets/EmailChangeDocs-D-qNHT_P.js # ui/dist/assets/EmailChangeDocs-DpfXIE_V.js # ui/dist/assets/FieldsQueryParam-BYe9ZK-G.js # ui/dist/assets/FieldsQueryParam-L8vpHeF4.js # ui/dist/assets/FieldsQueryParam-z0dGQ6uY.js # ui/dist/assets/ListApiDocs-BCTT-AOz.js # ui/dist/assets/ListApiDocs-C0_GwI7k.js # ui/dist/assets/ListApiDocs-T9_aO-pW.js # ui/dist/assets/PageInstaller-B22bivaN.js # ui/dist/assets/PageInstaller-C0BBhyBx.js # ui/dist/assets/PageInstaller-IYSwJhZW.js # ui/dist/assets/PageOAuth2RedirectFailure-BjbpqlFj.js # ui/dist/assets/PageOAuth2RedirectFailure-COyNF79R.js # ui/dist/assets/PageOAuth2RedirectFailure-DPmGG9zv.js # ui/dist/assets/PageOAuth2RedirectSuccess-6cMXLFAX.js # ui/dist/assets/PageOAuth2RedirectSuccess-CdkCarGH.js # ui/dist/assets/PageOAuth2RedirectSuccess-DSEIHeQL.js # ui/dist/assets/PageRecordConfirmEmailChange-BYW-6ASg.js # ui/dist/assets/PageRecordConfirmEmailChange-Bm1CIYvq.js # ui/dist/assets/PageRecordConfirmEmailChange-BpaqOT4u.js # ui/dist/assets/PageRecordConfirmPasswordReset--wx_u2lI.js # ui/dist/assets/PageRecordConfirmPasswordReset-CoeY2Z_C.js # ui/dist/assets/PageRecordConfirmPasswordReset-Ptya5bfe.js # ui/dist/assets/PageRecordConfirmVerification-6xjF3T0O.js # ui/dist/assets/PageRecordConfirmVerification-C1UTIIJh.js # ui/dist/assets/PageRecordConfirmVerification-C4LixXvA.js # ui/dist/assets/PageSuperuserConfirmPasswordReset-19z2IFg4.js # ui/dist/assets/PageSuperuserConfirmPasswordReset-DwNi0ugQ.js # ui/dist/assets/PageSuperuserConfirmPasswordReset-SMnDTRNi.js # ui/dist/assets/PageSuperuserRequestPasswordReset-BpDW217f.js # ui/dist/assets/PageSuperuserRequestPasswordReset-DK63qE6z.js # ui/dist/assets/PageSuperuserRequestPasswordReset-bG02qLIM.js # ui/dist/assets/PasswordResetDocs-CE67mLC0.js # ui/dist/assets/PasswordResetDocs-CHAK0vma.js # ui/dist/assets/PasswordResetDocs-Dap-N4rx.js # ui/dist/assets/RealtimeApiDocs-BooTSQCb.js # ui/dist/assets/RealtimeApiDocs-CoHmYVEx.js # ui/dist/assets/RealtimeApiDocs-D7ds3fHt.js # ui/dist/assets/VerificationDocs-B42AIoCQ.js # ui/dist/assets/VerificationDocs-BS7b11zH.js # ui/dist/assets/VerificationDocs-ZhkdFVIl.js # ui/dist/assets/ViewApiDocs-BXmRLHZ1.js # ui/dist/assets/ViewApiDocs-DM5JJQjh.js # ui/dist/assets/ViewApiDocs-DRpxcuJR.js # ui/public/fonts/source-sans-pro/source-sans-pro-v18-latin_cyrillic-700.woff2 # ui/public/fonts/ubuntu-mono/ubuntu-mono-v17-cyrillic_latin-700.woff2
252 lines
5.1 KiB
Go
252 lines
5.1 KiB
Go
package subscriptions_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/hanzoai/base/tools/subscriptions"
|
|
)
|
|
|
|
func TestNewDefaultClient(t *testing.T) {
|
|
c := subscriptions.NewDefaultClient()
|
|
|
|
if c.Channel() == nil {
|
|
t.Errorf("Expected channel to be initialized")
|
|
}
|
|
|
|
if c.Subscriptions() == nil {
|
|
t.Errorf("Expected subscriptions map to be initialized")
|
|
}
|
|
|
|
if c.Id() == "" {
|
|
t.Errorf("Expected unique id to be set")
|
|
}
|
|
}
|
|
|
|
func TestId(t *testing.T) {
|
|
clients := []*subscriptions.DefaultClient{
|
|
subscriptions.NewDefaultClient(),
|
|
subscriptions.NewDefaultClient(),
|
|
subscriptions.NewDefaultClient(),
|
|
subscriptions.NewDefaultClient(),
|
|
}
|
|
|
|
ids := map[string]struct{}{}
|
|
for i, c := range clients {
|
|
// check uniqueness
|
|
if _, ok := ids[c.Id()]; ok {
|
|
t.Errorf("(%d) Expected unique id, got %v", i, c.Id())
|
|
} else {
|
|
ids[c.Id()] = struct{}{}
|
|
}
|
|
|
|
// check length
|
|
if len(c.Id()) != 40 {
|
|
t.Errorf("(%d) Expected unique id to have 40 chars length, got %v", i, c.Id())
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestChannel(t *testing.T) {
|
|
c := subscriptions.NewDefaultClient()
|
|
|
|
if c.Channel() == nil {
|
|
t.Fatalf("Expected channel to be initialized, got")
|
|
}
|
|
}
|
|
|
|
func TestSubscriptions(t *testing.T) {
|
|
c := subscriptions.NewDefaultClient()
|
|
|
|
if len(c.Subscriptions()) != 0 {
|
|
t.Fatalf("Expected subscriptions to be empty")
|
|
}
|
|
|
|
c.Subscribe("sub1", "sub11", "sub2")
|
|
|
|
scenarios := []struct {
|
|
prefixes []string
|
|
expected []string
|
|
}{
|
|
{nil, []string{"sub1", "sub11", "sub2"}},
|
|
{[]string{"missing"}, nil},
|
|
{[]string{"sub1"}, []string{"sub1", "sub11"}},
|
|
{[]string{"sub2"}, []string{"sub2"}}, // with extra query start char
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
t.Run(strings.Join(s.prefixes, ","), func(t *testing.T) {
|
|
subs := c.Subscriptions(s.prefixes...)
|
|
|
|
if len(subs) != len(s.expected) {
|
|
t.Fatalf("Expected %d subscriptions, got %d", len(s.expected), len(subs))
|
|
}
|
|
|
|
for _, s := range s.expected {
|
|
if _, ok := subs[s]; !ok {
|
|
t.Fatalf("Missing subscription %q in \n%v", s, subs)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestSubscribe(t *testing.T) {
|
|
c := subscriptions.NewDefaultClient()
|
|
|
|
subs := []string{"", "sub1", "sub2", "sub3"}
|
|
expected := []string{"sub1", "sub2", "sub3"}
|
|
|
|
c.Subscribe(subs...) // empty string should be skipped
|
|
|
|
if len(c.Subscriptions()) != 3 {
|
|
t.Fatalf("Expected 3 subscriptions, got %v", c.Subscriptions())
|
|
}
|
|
|
|
for i, s := range expected {
|
|
if !c.HasSubscription(s) {
|
|
t.Errorf("(%d) Expected sub %s", i, s)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSubscribeOptions(t *testing.T) {
|
|
c := subscriptions.NewDefaultClient()
|
|
|
|
sub1 := "test1"
|
|
sub2 := `test2?options={"query":{"name":123},"headers":{"X-Token":456}}`
|
|
|
|
c.Subscribe(sub1, sub2)
|
|
|
|
subs := c.Subscriptions()
|
|
|
|
scenarios := []struct {
|
|
name string
|
|
expectedOptions string
|
|
}{
|
|
{sub1, `{"query":{},"headers":{}}`},
|
|
{sub2, `{"query":{"name":"123"},"headers":{"x_token":"456"}}`},
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
t.Run(s.name, func(t *testing.T) {
|
|
options, ok := subs[s.name]
|
|
if !ok {
|
|
t.Fatalf("Missing subscription \n%q \nin \n%v", s.name, subs)
|
|
}
|
|
|
|
rawBytes, err := json.Marshal(options)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
rawStr := string(rawBytes)
|
|
|
|
if rawStr != s.expectedOptions {
|
|
t.Fatalf("Expected options\n%v\ngot\n%v", s.expectedOptions, rawStr)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUnsubscribe(t *testing.T) {
|
|
c := subscriptions.NewDefaultClient()
|
|
|
|
c.Subscribe("sub1", "sub2", "sub3")
|
|
|
|
c.Unsubscribe("sub1")
|
|
|
|
if c.HasSubscription("sub1") {
|
|
t.Fatalf("Expected sub1 to be removed")
|
|
}
|
|
|
|
c.Unsubscribe( /* all */ )
|
|
if len(c.Subscriptions()) != 0 {
|
|
t.Fatalf("Expected all subscriptions to be removed, got %v", c.Subscriptions())
|
|
}
|
|
}
|
|
|
|
func TestHasSubscription(t *testing.T) {
|
|
c := subscriptions.NewDefaultClient()
|
|
|
|
if c.HasSubscription("missing") {
|
|
t.Error("Expected false, got true")
|
|
}
|
|
|
|
c.Subscribe("sub")
|
|
|
|
if !c.HasSubscription("sub") {
|
|
t.Error("Expected true, got false")
|
|
}
|
|
}
|
|
|
|
func TestSetAndGet(t *testing.T) {
|
|
c := subscriptions.NewDefaultClient()
|
|
|
|
c.Set("demo", 1)
|
|
|
|
result, _ := c.Get("demo").(int)
|
|
|
|
if result != 1 {
|
|
t.Errorf("Expected 1, got %v", result)
|
|
}
|
|
}
|
|
|
|
func TestDiscard(t *testing.T) {
|
|
c := subscriptions.NewDefaultClient()
|
|
|
|
if v := c.IsDiscarded(); v {
|
|
t.Fatal("Expected false, got true")
|
|
}
|
|
|
|
c.Discard()
|
|
|
|
if v := c.IsDiscarded(); !v {
|
|
t.Fatal("Expected true, got false")
|
|
}
|
|
}
|
|
|
|
func TestSend(t *testing.T) {
|
|
var mu sync.Mutex
|
|
|
|
c := subscriptions.NewDefaultClient()
|
|
|
|
received := []string{}
|
|
go func() {
|
|
for m := range c.Channel() {
|
|
mu.Lock()
|
|
received = append(received, m.Name)
|
|
mu.Unlock()
|
|
}
|
|
}()
|
|
|
|
c.Send(subscriptions.Message{Name: "m1"})
|
|
c.Send(subscriptions.Message{Name: "m2"})
|
|
c.Discard()
|
|
c.Send(subscriptions.Message{Name: "m3"})
|
|
c.Send(subscriptions.Message{Name: "m4"})
|
|
time.Sleep(5 * time.Millisecond)
|
|
|
|
expected := []string{"m1", "m2"}
|
|
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
if len(received) != len(expected) {
|
|
t.Fatalf("Expected %d messages, got %d", len(expected), len(received))
|
|
}
|
|
for _, name := range expected {
|
|
var exists bool
|
|
for _, n := range received {
|
|
if n == name {
|
|
exists = true
|
|
break
|
|
}
|
|
}
|
|
if !exists {
|
|
t.Fatalf("Missing expected %q message, got %v", name, received)
|
|
}
|
|
}
|
|
}
|