Skip to content

Commit aa27078

Browse files
committed
update getter
1 parent c6881b2 commit aa27078

File tree

4 files changed

+215
-5
lines changed

4 files changed

+215
-5
lines changed

referral/global_keeper.gno

+22
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package referral
22

3+
import "std"
4+
35
// gReferralKeeper is the global instance of the referral keeper
46
var gReferralKeeper ReferralKeeper
57

@@ -17,3 +19,23 @@ func init() {
1719
func GetKeeper() ReferralKeeper {
1820
return gReferralKeeper
1921
}
22+
23+
func GetReferral(addr string) string {
24+
referral, err := gReferralKeeper.get(std.Address(addr))
25+
if err != nil {
26+
panic(err)
27+
}
28+
return referral.String()
29+
}
30+
31+
func HasReferral(addr string) bool {
32+
referral, err := gReferralKeeper.get(std.Address(addr))
33+
if err != nil {
34+
return false
35+
}
36+
return referral != zeroAddress
37+
}
38+
39+
func IsEmpty() bool {
40+
return gReferralKeeper.isEmpty()
41+
}

referral/keeper.gno

+11-2
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ func (k *keeper) setReferral(addr, refAddr std.Address, eventType string) error
6363
k.store.Set(addr.String(), refAddr.String())
6464
std.Emit(
6565
eventType,
66-
"my_address", addr.String(),
67-
"ref_address", refAddr.String(),
66+
"myAddress", addr.String(),
67+
"refAddress", refAddr.String(),
6868
)
6969

7070
return nil
@@ -131,3 +131,12 @@ func (k *keeper) get(addr std.Address) (std.Address, error) {
131131

132132
return std.Address(refAddr), nil
133133
}
134+
135+
func (k *keeper) isEmpty() bool {
136+
empty := true
137+
k.store.Iterate("", "", func(key string, value interface{}) bool {
138+
empty = false
139+
return true // stop iteration on first item
140+
})
141+
return empty
142+
}

referral/keeper_test.gno

+176
Original file line numberDiff line numberDiff line change
@@ -643,3 +643,179 @@ func TestStress(t *testing.T) {
643643
}
644644
}
645645
}
646+
647+
func TestIsEmpty(t *testing.T) {
648+
tests := []struct {
649+
name string
650+
setupState func(*keeper)
651+
want bool
652+
}{
653+
{
654+
name: "new keeper must empty",
655+
setupState: func(k *keeper) {},
656+
want: true,
657+
},
658+
{
659+
name: "keeper with data must not be empty",
660+
setupState: func(k *keeper) {
661+
k.store.Set(validAddr1.String(), validAddr2.String())
662+
},
663+
want: false,
664+
},
665+
{
666+
name: "keeper with all data removed must be empty",
667+
setupState: func(k *keeper) {
668+
k.store.Set(validAddr1.String(), validAddr2.String())
669+
k.store.Remove(validAddr1.String())
670+
},
671+
want: true,
672+
},
673+
}
674+
675+
for _, tt := range tests {
676+
t.Run(tt.name, func(t *testing.T) {
677+
k := setupKeeper()
678+
tt.setupState(k)
679+
680+
if got := k.isEmpty(); got != tt.want {
681+
t.Errorf("isEmpty() = %v, want %v", got, tt.want)
682+
}
683+
})
684+
}
685+
}
686+
687+
/* Getter Tests */
688+
689+
func TestGetReferral(t *testing.T) {
690+
tests := []struct {
691+
name string
692+
addr string
693+
setupState func()
694+
want string
695+
shouldPanic bool
696+
}{
697+
{
698+
name: "retrieve existing referral",
699+
addr: validAddr1.String(),
700+
setupState: func() {
701+
gReferralKeeper = NewKeeper()
702+
cleanup := mockValidCaller()
703+
defer cleanup()
704+
gReferralKeeper.register(validAddr1, validAddr2)
705+
},
706+
want: validAddr2.String(),
707+
shouldPanic: false,
708+
},
709+
{
710+
name: "retrieve non-existent referral",
711+
addr: validAddr1.String(),
712+
setupState: func() {
713+
gReferralKeeper = NewKeeper()
714+
},
715+
shouldPanic: true,
716+
},
717+
}
718+
719+
for _, tt := range tests {
720+
t.Run(tt.name, func(t *testing.T) {
721+
tt.setupState()
722+
723+
if tt.shouldPanic {
724+
defer func() {
725+
if r := recover(); r == nil {
726+
t.Error("GetReferral() function did not panic")
727+
}
728+
}()
729+
}
730+
731+
got := GetReferral(tt.addr)
732+
if !tt.shouldPanic && got != tt.want {
733+
t.Errorf("GetReferral() = %v, want %v", got, tt.want)
734+
}
735+
})
736+
}
737+
}
738+
739+
func TestHasReferral(t *testing.T) {
740+
tests := []struct {
741+
name string
742+
addr string
743+
setupState func()
744+
want bool
745+
}{
746+
{
747+
name: "referral exists",
748+
addr: validAddr1.String(),
749+
setupState: func() {
750+
gReferralKeeper = NewKeeper()
751+
cleanup := mockValidCaller()
752+
defer cleanup()
753+
gReferralKeeper.register(validAddr1, validAddr2)
754+
},
755+
want: true,
756+
},
757+
{
758+
name: "referral does not exist",
759+
addr: validAddr1.String(),
760+
setupState: func() {
761+
gReferralKeeper = NewKeeper()
762+
},
763+
want: false,
764+
},
765+
{
766+
name: "zero address referral",
767+
addr: validAddr1.String(),
768+
setupState: func() {
769+
gReferralKeeper = NewKeeper()
770+
cleanup := mockValidCaller()
771+
defer cleanup()
772+
gReferralKeeper.register(validAddr1, zeroAddress)
773+
},
774+
want: false,
775+
},
776+
}
777+
778+
for _, tt := range tests {
779+
t.Run(tt.name, func(t *testing.T) {
780+
tt.setupState()
781+
if got := HasReferral(tt.addr); got != tt.want {
782+
t.Errorf("HasReferral() = %v, want %v", got, tt.want)
783+
}
784+
})
785+
}
786+
}
787+
788+
func TestGlobalIsEmpty(t *testing.T) {
789+
tests := []struct {
790+
name string
791+
setupState func()
792+
want bool
793+
}{
794+
{
795+
name: "new global keeper must be empty",
796+
setupState: func() {
797+
gReferralKeeper = NewKeeper()
798+
},
799+
want: true,
800+
},
801+
{
802+
name: "keeper with data must not be empty",
803+
setupState: func() {
804+
gReferralKeeper = NewKeeper()
805+
cleanup := mockValidCaller()
806+
defer cleanup()
807+
gReferralKeeper.register(validAddr1, validAddr2)
808+
},
809+
want: false,
810+
},
811+
}
812+
813+
for _, tt := range tests {
814+
t.Run(tt.name, func(t *testing.T) {
815+
tt.setupState()
816+
if got := IsEmpty(); got != tt.want {
817+
t.Errorf("IsEmpty() = %v, want %v", got, tt.want)
818+
}
819+
})
820+
}
821+
}

referral/type.gno

+6-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ var zeroAddress = std.Address("")
77

88
// Event types for each referral actions.
99
const (
10-
EventTypeRegister = "register_referral"
11-
EventTypeUpdate = "update_referral"
12-
EventTypeRemove = "remove_referral"
10+
EventTypeRegister = "RegisterReferral"
11+
EventTypeUpdate = "UpdateReferral"
12+
EventTypeRemove = "RemoveReferral"
1313
)
1414

1515
// ReferralKeeper defines the interface for managing referral relationships.
@@ -32,4 +32,7 @@ type ReferralKeeper interface {
3232
// get retrieves the referral address for a given address.
3333
// returns an error if the address is invalid or if the referral relationship does not exist.
3434
get(addr std.Address) (std.Address, error)
35+
36+
// isEmpty checks if the referral relationship is empty.
37+
isEmpty() bool
3538
}

0 commit comments

Comments
 (0)