Files
miti99bot/internal/modules/trading/format_test.go
T
tiennm99 b9b44bc7b2 feat(trading): VN stocks paper trading module — 5 commands + price engine
- Portfolio, holdings, prices, symbols packages with Telegram command handlers
- Handlers: trade_topup (add credits), trade_buy, trade_sell, trade_convert (coming-soon), trade_stats
- Per-user keylock for concurrency safety
- KBS (VN) as price source; ticker validation regex ^[A-Z0-9]{1,16}$
- Scope-trimmed: no SQL history, no retention cron, no daily refresh, no leaderboard, no forex
  (matches upstream miti99bot's current VN-stocks-only state)
- Full unit test coverage for format, portfolio, prices, symbols, handlers
2026-05-10 03:06:13 +07:00

62 lines
1.4 KiB
Go

package trading
import "testing"
func TestFormatVND(t *testing.T) {
cases := []struct {
in float64
want string
}{
{0, "0 VND"},
{1, "1 VND"},
{100, "100 VND"},
{1000, "1.000 VND"},
{15_000_000, "15.000.000 VND"},
{1_234_567_890, "1.234.567.890 VND"},
{-500, "-500 VND"},
{-1_500_000, "-1.500.000 VND"},
// rounding: half away from zero (math.Round)
{1.5, "2 VND"},
{-1.5, "-2 VND"},
}
for _, c := range cases {
if got := FormatVND(c.in); got != c.want {
t.Errorf("FormatVND(%v): got %q, want %q", c.in, got, c.want)
}
}
}
func TestFormatStock(t *testing.T) {
cases := []struct {
in float64
want string
}{
{0, "0"},
{1, "1"},
{100, "100"},
{99.9, "99"}, // floor for safety; we never store fractional shares anyway
}
for _, c := range cases {
if got := FormatStock(c.in); got != c.want {
t.Errorf("FormatStock(%v): got %q, want %q", c.in, got, c.want)
}
}
}
func TestFormatPnL(t *testing.T) {
cases := []struct {
current, invested float64
want string
}{
{1_500_000, 1_000_000, "+500.000 VND (+50.00%)"},
{800_000, 1_000_000, "-200.000 VND (-20.00%)"},
{1_000_000, 1_000_000, "+0 VND (+0.00%)"},
{500_000, 0, "+500.000 VND (+0.00%)"}, // invested=0 → pct=0, no NaN
}
for _, c := range cases {
if got := FormatPnL(c.current, c.invested); got != c.want {
t.Errorf("FormatPnL(%v,%v): got %q, want %q", c.current, c.invested, got, c.want)
}
}
}