1+ #![ cfg( test) ]
2+
3+ extern crate std;
4+ use soroban_sdk:: {
5+ testutils:: { Address as _, MockAuth } ,
6+ token,
7+ vec,
8+ Address , BytesN , Env , Symbol , IntoVal ,
9+ } ;
10+
11+ use crate :: {
12+ errors:: ContractError ,
13+ types:: { PlanType , Subscription , SubscriptionStatus } ,
14+ } ;
15+ //import shared helper
16+ use super :: common:: setup_test_environment;
17+
18+ // Subscription Test Cases
19+ fn test_subscription_creation ( ) {
20+ let ( env, client, _admin, token_client) =setup_test_environment ( ) ;
21+ let subscriber= Address :: generate ( & env) ;
22+ let sub_id = BytesN :: from_array ( & env, & [ 1 ; 32 ] ) ;
23+ let plan=PlanType :: Basic ;
24+ let amount=plan. get_price_7_decimal ( ) ;
25+
26+ // 1. Fund the subscriber and set allowance
27+ token_client. with_admin ( & Address :: generate ( & env) ) . mint ( & subscriber, & amount) ;
28+ token_client. with_source ( & subscribe) . approve ( & subscriber, & client_contract_id, & amount, & amount) ;
29+
30+ // 2. Create subscription
31+ let sub: Subsciption =client. mock_auths ( & [ MockAuth {
32+ address : subscriber. clone ( ) ,
33+ invoke : & vec ! [
34+ & env,
35+ (
36+ & token_client. contract_id( ) ,
37+ & Symbol :: new( & env, "transfer_from" ) ,
38+ vec![
39+ & env,
40+ subscriber. to_val( ) ,
41+ subscriber. to_val( ) ,
42+ client_contract_id. to_val( & env) ,
43+ amount. to_val( ) ,
44+ ] ,
45+ ) ,
46+ ] ,
47+ } ] )
48+ . create_subscription ( & sub_id, & subscriber, & plan, & token_client. contract_id ( ) , 30 ) ;
49+
50+ // 3. Assert properties
51+ assert_eq ! ( sub. id, sub_id) ;
52+ assert_eq ! ( sub. status, SubscriptionStatus :: Active ) ;
53+ assert_eq ! ( sub. start_date, 100 ) ;
54+ // 30 days*24h*60.*60s/5s/ledger=518400 ledgers
55+ assert_eq ! ( sub. end_date, 100 +518400 ) ;
56+
57+ // 4. Check contract balance(payment successful)
58+ assert_eq ! ( token_client. balance( & client. contract_id) , amount) ;
59+
60+ // 5. Try to create again(fails with SubscriptionAlreadyExists)
61+ let result=client
62+ . mock_auths ( & [ MockAuth {
63+ address : subscriber. clone ( ) ,
64+ invoke : & vec ! [
65+ & env,
66+ (
67+ & token_client. contract_id,
68+ & Symbol :: new( & env, "transfer_from" ) ,
69+ vec![
70+ & env,
71+ subscriber. to_val( ) ,
72+ subscriber. to_val( ) ,
73+ client_contract_id. to_val( & env) ,
74+ amount. to_val( ) ,
75+ ] ,
76+ ) ,
77+ ] ,
78+ } ] )
79+ . try_cancel_subscription ( & sub_id, & subscriber, & plan, & token_client. contract_id , 30 ) ;
80+
81+ assert_eq ! ( result. unwrap_err( ) . as_error( ) . unwrap( ) , ContractError :: SubscriptionNotActive . into( ) ) ;
82+
83+ }
84+
85+ #[ test]
86+ fn test_subscription_cancellation ( ) {
87+ let ( env, client, _admin, token_client) =setup_test_environment ( ) ;
88+ let subscriber= Address :: generate ( & env) ;
89+ let sub_id = BytesN :: from_array ( & env, & [ 2 ; 32 ] ) ;
90+ let plan=PlanType :: Premium ;
91+ let amount=plan. get_price_7_decimal ( ) ;
92+
93+ // 1. Create subscription
94+ token_client. with_admin ( & Address :: generate ( & env) ) . mint ( & subscriber, & amount) ;
95+ token_client. with_source ( & subscribe) . approve ( & subscriber, & client_contract_id, & amount) ;
96+
97+ client. mock_auths ( & [ MockAuth {
98+ address : subscriber. clone ( ) ,
99+ invoke : & vec ! [
100+ & env,
101+ (
102+ & token_client. contract_id( ) ,
103+ & Symbol :: new( & env, "transfer_from" ) ,
104+ vec![
105+ & env,
106+ subscriber. to_val( ) ,
107+ subscriber. to_val( ) ,
108+ client_contract_id. to_val( & env) ,
109+ amount. to_val( ) ,
110+ ] ,
111+ ) ,
112+ ] ,
113+ } ] )
114+ . create_subscription ( & sub_id, & subscriber, & plan, & token_client. contract_id ( ) , 30 ) ;
115+
116+ // Advance ledger sequence to simulate time passage
117+ env. ledger ( ) . set_sequence ( 200 ) ;
118+
119+ // 2. Cancel the subscription
120+ let cancelled_sub: Subscription =client
121+ . mock_auths ( & [ MockAuth {
122+ address : subscriber. clone ( ) ,
123+ invoke : & vec ! [ ] ,
124+ } ] )
125+ . cancel_subscription ( & sub_id) ;
126+
127+ // 3. Assert properties
128+ assert_eq ! ( cancelled_sub. status, SubscriptionStatus :: Cancelled ) ;
129+ assert_eq ! ( cancelled_sub. end_date, 200 ) ; //should be current ledger sequence
130+
131+
132+ let result=client
133+ . mock_auths ( & [ MockAuth {
134+ address : subscriber. clone ( ) ,
135+ invoke : & vec ! [ & env] ,
136+ } ] )
137+ . try_cancel_subscription ( & sub_id) ;
138+
139+ assert_eq ! ( result. unwrap_err( ) . as_error( ) . unwrap( ) , ContractError :: SubscriptionNotActive . into( ) ) ;
140+
141+ }
142+
143+ #[ test]
144+ fn test_get_subscription_not_found ( ) {
145+ let ( env, client, _admin, _token_client) = setup_test_environment ( ) ;
146+ let sub_id = BytesN :: from_array ( & env, & [ 3 ; 32 ] ) ;
147+
148+ // try to get a non-existent subscription
149+ let result = client. get_subscription ( & sub_id) ;
150+ assert_eq ! (
151+ result. unwrap_err( ) . as_error( ) . unwrap( ) ,
152+ ContractError :: SubscriptionNotFound . into( )
153+ ) ;
154+ }
0 commit comments