Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}