recurring_test.gno
4.66 Kb ยท 138 lines
1package recurring
2
3import (
4 "chain"
5 "chain/runtime"
6 "testing"
7 "time"
8
9 "gno.land/p/nt/testutils"
10 "gno.land/p/nt/uassert"
11)
12
13var (
14 alice = testutils.TestAddress("alice")
15 bob = testutils.TestAddress("bob")
16 charlie = testutils.TestAddress("charlie")
17)
18
19func TestRecurringSubscription(t *testing.T) {
20 testing.SetRealm(testing.NewUserRealm(alice))
21 rs := NewRecurringSubscription(time.Hour*24, 1000)
22
23 testing.SetOriginSend([]chain.Coin{{Denom: "ugnot", Amount: 1000}})
24 err := rs.Subscribe()
25 uassert.NoError(t, err, "Expected ProcessPayment to succeed for Alice")
26
27 err = rs.HasValidSubscription(runtime.CurrentRealm().Address())
28 uassert.NoError(t, err, "Expected Alice to have access")
29
30 _, err = rs.GetExpiration(runtime.CurrentRealm().Address())
31 uassert.NoError(t, err, "Expected to get expiration for Alice")
32}
33
34func TestRecurringSubscriptionGift(t *testing.T) {
35 testing.SetRealm(testing.NewUserRealm(alice))
36 rs := NewRecurringSubscription(time.Hour*24, 1000)
37
38 testing.SetOriginSend([]chain.Coin{{Denom: "ugnot", Amount: 1000}})
39 err := rs.GiftSubscription(bob)
40 uassert.NoError(t, err, "Expected ProcessPaymentGift to succeed for Bob")
41
42 err = rs.HasValidSubscription(bob)
43 uassert.NoError(t, err, "Expected Bob to have access")
44
45 err = rs.HasValidSubscription(charlie)
46 uassert.Error(t, err, "Expected Charlie to fail access check")
47}
48
49func TestRecurringSubscriptionExpiration(t *testing.T) {
50 testing.SetRealm(testing.NewUserRealm(alice))
51 rs := NewRecurringSubscription(time.Hour, 1000)
52
53 testing.SetOriginSend([]chain.Coin{{Denom: "ugnot", Amount: 1000}})
54 err := rs.Subscribe()
55 uassert.NoError(t, err, "Expected ProcessPayment to succeed for Alice")
56
57 err = rs.HasValidSubscription(runtime.CurrentRealm().Address())
58 uassert.NoError(t, err, "Expected Alice to have access")
59
60 expiration := time.Now().Add(-time.Hour * 2)
61 rs.subs.Set(runtime.CurrentRealm().Address().String(), expiration)
62
63 err = rs.HasValidSubscription(runtime.CurrentRealm().Address())
64 uassert.Error(t, err, "Expected Alice's subscription to be expired")
65}
66
67func TestUpdateAmountAuthorization(t *testing.T) {
68 testing.SetRealm(testing.NewUserRealm(alice))
69 rs := NewRecurringSubscription(time.Hour*24, 1000)
70
71 err := rs.UpdateAmount(2000)
72 uassert.NoError(t, err, "Expected Alice to succeed in updating amount")
73
74 testing.SetRealm(testing.NewUserRealm(bob))
75 err = rs.UpdateAmount(3000)
76 uassert.Error(t, err, "Expected Bob to fail when updating amount")
77}
78
79func TestGetAmount(t *testing.T) {
80 testing.SetRealm(testing.NewUserRealm(alice))
81 rs := NewRecurringSubscription(time.Hour*24, 1000)
82
83 amount := rs.GetAmount()
84 uassert.Equal(t, amount, int64(1000), "Expected the initial amount to be 1000 ugnot")
85
86 err := rs.UpdateAmount(2000)
87 uassert.NoError(t, err, "Expected Alice to succeed in updating amount")
88
89 amount = rs.GetAmount()
90 uassert.Equal(t, amount, int64(2000), "Expected the updated amount to be 2000 ugnot")
91}
92
93func TestIncorrectPaymentAmount(t *testing.T) {
94 testing.SetOriginCaller(alice)
95 testing.SetRealm(testing.NewUserRealm(alice))
96 rs := NewRecurringSubscription(time.Hour*24, 1000)
97
98 testing.SetOriginSend([]chain.Coin{{Denom: "ugnot", Amount: 500}})
99 err := rs.Subscribe()
100 uassert.Error(t, err, "Expected payment with incorrect amount to fail")
101}
102
103func TestMultiplePaymentsForSameUser(t *testing.T) {
104 testing.SetOriginCaller(alice)
105 testing.SetRealm(testing.NewUserRealm(alice))
106 rs := NewRecurringSubscription(time.Hour*24, 1000)
107
108 testing.SetOriginSend([]chain.Coin{{Denom: "ugnot", Amount: 1000}})
109 err := rs.Subscribe()
110 uassert.NoError(t, err, "Expected first ProcessPayment to succeed for Alice")
111
112 testing.SetOriginSend([]chain.Coin{{Denom: "ugnot", Amount: 1000}})
113 err = rs.Subscribe()
114 uassert.Error(t, err, "Expected second ProcessPayment to fail for Alice due to existing subscription")
115}
116
117func TestRecurringSubscriptionWithMultiplePayments(t *testing.T) {
118 testing.SetOriginCaller(alice)
119 testing.SetRealm(testing.NewUserRealm(alice))
120 rs := NewRecurringSubscription(time.Hour, 1000)
121
122 testing.SetOriginSend([]chain.Coin{{Denom: "ugnot", Amount: 1000}})
123 err := rs.Subscribe()
124 uassert.NoError(t, err, "Expected first ProcessPayment to succeed for Alice")
125
126 err = rs.HasValidSubscription(runtime.CurrentRealm().Address())
127 uassert.NoError(t, err, "Expected Alice to have access after first payment")
128
129 expiration := time.Now().Add(-time.Hour * 2)
130 rs.subs.Set(runtime.CurrentRealm().Address().String(), expiration)
131
132 testing.SetOriginSend([]chain.Coin{{Denom: "ugnot", Amount: 1000}})
133 err = rs.Subscribe()
134 uassert.NoError(t, err, "Expected second ProcessPayment to succeed for Alice")
135
136 err = rs.HasValidSubscription(runtime.CurrentRealm().Address())
137 uassert.NoError(t, err, "Expected Alice to have access after second payment")
138}