rastrillo / abono Public

Clone
git clone https://amadan.net/rastrillo/abono

Plain git — no account needed to clone.

Download

Download this file

1package abono_test
2
3import (
4 "testing"
5 "time"
6
7 "amadan.net/rastrillo/abono"
8)
9
10func TestDescribe(t *testing.T) {
11 now := t0
12 end := now.Add(10 * day)
13 past := now.Add(-5 * day)
14 ptr := func(v time.Time) *time.Time { return &v }
15
16 for _, c := range []struct {
17 name string
18 h abono.Holding
19 key string
20 tone string
21 date *time.Time
22 }{
23 {"active, no date known",
24 abono.Holding{Source: abono.SourceSubscription, Status: "active"},
25 "abono.status.active", "positive", nil},
26 {"renews",
27 abono.Holding{Source: abono.SourceSubscription, Status: "active", Until: &end},
28 "abono.status.renews", "positive", &end},
29 {"trialing renews",
30 abono.Holding{Source: abono.SourceSubscription, Status: "trialing", Until: &end},
31 "abono.status.renews", "positive", &end},
32 {"cancelling",
33 abono.Holding{Source: abono.SourceSubscription, Status: "active", Until: &end, CancelAtPeriodEnd: true},
34 "abono.status.cancelling", "warning", &end},
35 // failing (ruling R21): access stops 30 days after the unpaid
36 // period started, whatever its end says.
37 {"failing, before the period start",
38 abono.Holding{Source: abono.SourceSubscription, Status: "past_due", PeriodStart: &end, Until: ptr(end.AddDate(1, 0, 0))},
39 "abono.status.failing", "warning", ptr(end.Add(30 * day))},
40 {"failing, held by the backstop",
41 abono.Holding{Source: abono.SourceSubscription, Status: "past_due", PeriodStart: &past, Until: ptr(past.AddDate(1, 0, 0))},
42 "abono.status.failing", "warning", ptr(past.Add(30 * day))},
43 {"failing and cancelling reads as failing",
44 abono.Holding{Source: abono.SourceSubscription, Status: "past_due", PeriodStart: &past, Until: ptr(past.AddDate(1, 0, 0)), CancelAtPeriodEnd: true},
45 "abono.status.failing", "warning", ptr(past.Add(30 * day))},
46 // R30: with no period start the 30 days count from the period end.
47 {"failing with no period start counts from the period end",
48 abono.Holding{Source: abono.SourceSubscription, Status: "past_due", Until: &end},
49 "abono.status.failing", "warning", ptr(end.Add(30 * day))},
50 {"failing and cancelling stops at the period end when that is sooner",
51 abono.Holding{Source: abono.SourceSubscription, Status: "past_due", PeriodStart: ptr(end.Add(-20 * day)), Until: &end, CancelAtPeriodEnd: true},
52 "abono.status.failing", "warning", &end},
53 {"ended, past_due with no period at all",
54 abono.Holding{Source: abono.SourceSubscription, Status: "past_due"},
55 "abono.status.ended", "neutral", nil},
56 {"failing one second before start+30d",
57 abono.Holding{Source: abono.SourceSubscription, Status: "past_due", PeriodStart: ptr(now.Add(-30*day + time.Second)), Until: ptr(now.AddDate(1, 0, 0))},
58 "abono.status.failing", "warning", ptr(now.Add(time.Second))},
59 {"ended, past_due at exactly start+30d",
60 abono.Holding{Source: abono.SourceSubscription, Status: "past_due", PeriodStart: ptr(now.Add(-30 * day)), Until: ptr(now.AddDate(1, 0, 0))},
61 "abono.status.ended", "neutral", nil},
62 {"ended, cancelling and its period is over",
63 abono.Holding{Source: abono.SourceSubscription, Status: "active", Until: &past, CancelAtPeriodEnd: true},
64 "abono.status.ended", "neutral", nil},
65 {"ended, cancelling trial at its period end",
66 abono.Holding{Source: abono.SourceSubscription, Status: "trialing", Until: &now, CancelAtPeriodEnd: true},
67 "abono.status.ended", "neutral", nil},
68 {"ended, canceled",
69 abono.Holding{Source: abono.SourceSubscription, Status: "canceled", Until: &past},
70 "abono.status.ended", "neutral", nil},
71 {"ended, past_due beyond the backstop",
72 abono.Holding{Source: abono.SourceSubscription, Status: "past_due", PeriodStart: ptr(now.Add(-31 * day)), Until: ptr(now.AddDate(1, 0, 0))},
73 "abono.status.ended", "neutral", nil},
74 {"ended, a comp past its end",
75 abono.Holding{Source: abono.SourceComp, Status: "active", Until: &past},
76 "abono.status.ended", "neutral", nil},
77 {"ended, a canceled comp",
78 abono.Holding{Source: abono.SourceComp, Status: "canceled"},
79 "abono.status.ended", "neutral", nil},
80 {"comp",
81 abono.Holding{Source: abono.SourceComp, Status: "active"},
82 "abono.status.comp", "positive", nil},
83 {"comp until",
84 abono.Holding{Source: abono.SourceComp, Status: "active", Until: &end},
85 "abono.status.comp_until", "positive", &end},
86 } {
87 t.Run(c.name, func(t *testing.T) {
88 got := abono.Describe(c.h, now)
89 if got.Key != c.key || got.Tone != c.tone {
90 t.Errorf("Describe = %s/%s, want %s/%s", got.Key, got.Tone, c.key, c.tone)
91 }
92 if (got.Date == nil) != (c.date == nil) || (got.Date != nil && !got.Date.Equal(*c.date)) {
93 t.Errorf("Date = %v, want %v", got.Date, c.date)
94 }
95 })
96 }
97}
98