da647e87d0
The trust boundary is zenmoney, not maven — they already hold his bank sessions. So the poller reads /v8/diff/ and writes totals as facts(kind=env, source=poll:zenmoney); core reads those back when he asks and never sees the token. internal/zenmoney sums transactions per currency over a window, skipping tombstoned rows and transfers between his own accounts, and refuses to encode a summary built from zero transactions. That refusal is the whole design: a failed or empty read writes nothing and leaves the last good total alone, because a zero recited as fact is worse than silence. No currency conversion either — a figure he can check against his bank beats one he cannot. Off unless configured, and the token is read from a FILE rather than a flag so it never lands in `ps`, in docker-compose.yml, or in shell history. Nothing about the money is search input, no tick rule reads the keys, and the log lines name keys, never figures. The live-credential half is BLOCKED: there is no zenmoney account or token here, so everything is verified against a recorded diff fixture.
32 lines
1.1 KiB
Go
32 lines
1.1 KiB
Go
package router
|
|
|
|
import "testing"
|
|
|
|
func TestParseMoneyQuery(t *testing.T) {
|
|
cases := []struct {
|
|
in string
|
|
window MoneyWindow
|
|
ok bool
|
|
}{
|
|
{"сколько я потратил сегодня?", MoneyToday, true},
|
|
{"сколько я потратил в этом месяце?", MoneyMonth, true},
|
|
{"сколько я потратил?", MoneyMonth, true}, // month-to-date by default
|
|
{"покажи мои траты", MoneyMonth, true},
|
|
{"какие у меня расходы за месяц", MoneyMonth, true},
|
|
{"how much did I spend today", MoneyToday, true},
|
|
{"сколько я заработал в этом месяце", MoneyMonth, true},
|
|
// Not about money.
|
|
{"я потратил весь день на это", MoneyNone, false},
|
|
{"потратил много сил", MoneyNone, false},
|
|
{"какая погода?", MoneyNone, false},
|
|
{"я купил молоко", MoneyNone, false},
|
|
{"", MoneyNone, false},
|
|
}
|
|
for _, c := range cases {
|
|
w, ok := ParseMoneyQuery(c.in)
|
|
if ok != c.ok || w != c.window {
|
|
t.Errorf("ParseMoneyQuery(%q) = (%v, %v), want (%v, %v)", c.in, w, ok, c.window, c.ok)
|
|
}
|
|
}
|
|
}
|