forked from QuickLendX/quicklendx-protocol
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_lock_time_limit_guard.rs
More file actions
105 lines (92 loc) · 3.89 KB
/
Copy pathtest_lock_time_limit_guard.rs
File metadata and controls
105 lines (92 loc) · 3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//! Lock-time-limit guard — "Within, at limit, past".
//!
//! Pins the time-window validation in
//! `ProtocolLimitsContract::validate_invoice` across three zones:
//!
//! | Zone | Lower bound | Upper bound |
//! |------------|------------------------------------|------------------------------------|
//! | **Within** | `due_date > current_time` | `due_date < max_due_date` |
//! | **At limit** | `due_date == current_time` | `due_date == max_due_date` |
//! | **Past** | `due_date < current_time` | `due_date > max_due_date` |
//!
//! Every test is gated only by `#[cfg(test)]` so it runs on every CI matrix
//! entry, not just when the `legacy-tests` feature is enabled.
#![cfg(test)]
use crate::errors::QuickLendXError;
use crate::protocol_limits::ProtocolLimitsContract;
use crate::QuickLendXContract;
use soroban_sdk::{
testutils::{Address as _, Ledger},
Address, Env,
};
const SECONDS_PER_DAY: u64 = 86_400;
fn setup_env() -> (Env, Address) {
let env = Env::default();
env.mock_all_auths();
env.ledger().set_timestamp(1_000_000);
let contract_id = env.register(QuickLendXContract, ());
(env, contract_id)
}
fn valid_amount() -> i128 {
100i128 // > DEFAULT_MIN_AMOUNT (10 in test builds)
}
// ---------------------------------------------------------------------------
// Lower bound: due_date <= current_time → InvoiceDueDateInvalid
// ---------------------------------------------------------------------------
#[test]
fn validate_invoice_rejects_due_date_past_lower_bound() {
let (env, contract_id) = setup_env();
let result = env.as_contract(&contract_id, || {
ProtocolLimitsContract::validate_invoice(env.clone(), valid_amount(), 999_999u64)
});
assert_eq!(result, Err(QuickLendXError::InvoiceDueDateInvalid));
}
#[test]
fn validate_invoice_rejects_due_date_at_lower_bound() {
let (env, contract_id) = setup_env();
let result = env.as_contract(&contract_id, || {
ProtocolLimitsContract::validate_invoice(env.clone(), valid_amount(), 1_000_000u64)
});
assert_eq!(result, Err(QuickLendXError::InvoiceDueDateInvalid));
}
#[test]
fn validate_invoice_accepts_due_date_within_lower_bound() {
let (env, contract_id) = setup_env();
let result = env.as_contract(&contract_id, || {
// due_date = current_time + 1, the first valid second
ProtocolLimitsContract::validate_invoice(env.clone(), valid_amount(), 1_000_001u64)
});
assert_eq!(result, Ok(()));
}
// ---------------------------------------------------------------------------
// Upper bound: due_date > max_due_date → InvoiceDueDateInvalid
// ---------------------------------------------------------------------------
#[test]
fn validate_invoice_accepts_due_date_within_upper_bound() {
let (env, contract_id) = setup_env();
let one_day_before_max = env.ledger().timestamp()
+ 365 * SECONDS_PER_DAY
- 1;
let result = env.as_contract(&contract_id, || {
ProtocolLimitsContract::validate_invoice(env.clone(), valid_amount(), one_day_before_max)
});
assert_eq!(result, Ok(()));
}
#[test]
fn validate_invoice_accepts_due_date_at_upper_bound() {
let (env, contract_id) = setup_env();
let max_due_date = env.ledger().timestamp() + 365 * SECONDS_PER_DAY;
let result = env.as_contract(&contract_id, || {
ProtocolLimitsContract::validate_invoice(env.clone(), valid_amount(), max_due_date)
});
assert_eq!(result, Ok(()));
}
#[test]
fn validate_invoice_rejects_due_date_past_upper_bound() {
let (env, contract_id) = setup_env();
let past_max = env.ledger().timestamp() + 365 * SECONDS_PER_DAY + 1;
let result = env.as_contract(&contract_id, || {
ProtocolLimitsContract::validate_invoice(env.clone(), valid_amount(), past_max)
});
assert_eq!(result, Err(QuickLendXError::InvoiceDueDateInvalid));
}