Functional Weave
Code in Rust

subscriptions.mrr-arr@1.1.0

vectors.json

6,335 bytes · view raw

[
  {"name": "one monthly plan at 49.00", "args": [[{"amount": {"minor": 4900, "currency": "GBP"}, "interval": "month", "intervalCount": 1, "status": "active"}], "GBP"], "expect": {"mrr": {"minor": 4900, "currency": "GBP"}, "arr": {"minor": 58800, "currency": "GBP"}, "counted": 1, "excluded": 0}},
  {"name": "one annual plan at 990.00 is 82.50 a month", "args": [[{"amount": {"minor": 99000, "currency": "GBP"}, "interval": "year", "intervalCount": 1, "status": "active"}], "GBP"], "expect": {"mrr": {"minor": 8250, "currency": "GBP"}, "arr": {"minor": 99000, "currency": "GBP"}, "counted": 1, "excluded": 0}},
  {"name": "an annual plan of 100.00 is 8.33 a month", "args": [[{"amount": {"minor": 10000, "currency": "GBP"}, "interval": "year", "intervalCount": 1, "status": "active"}], "GBP"], "expect": {"mrr": {"minor": 833, "currency": "GBP"}, "arr": {"minor": 10000, "currency": "GBP"}, "counted": 1, "excluded": 0}},
  {"name": "three annual plans of 100.00 are 25.00 of MRR, not 3 x 8.33 = 24.99", "args": [[{"amount": {"minor": 10000, "currency": "GBP"}, "interval": "year", "intervalCount": 1, "status": "active"}, {"amount": {"minor": 10000, "currency": "GBP"}, "interval": "year", "intervalCount": 1, "status": "active"}, {"amount": {"minor": 10000, "currency": "GBP"}, "interval": "year", "intervalCount": 1, "status": "active"}], "GBP"], "expect": {"mrr": {"minor": 2500, "currency": "GBP"}, "arr": {"minor": 30000, "currency": "GBP"}, "counted": 3, "excluded": 0}},
  {"name": "monthly, annual and quarterly plans together", "args": [[{"amount": {"minor": 4900, "currency": "GBP"}, "interval": "month", "intervalCount": 1, "status": "active"}, {"amount": {"minor": 10000, "currency": "GBP"}, "interval": "year", "intervalCount": 1, "status": "active"}, {"amount": {"minor": 3000, "currency": "GBP"}, "interval": "quarter", "intervalCount": 1, "status": "active"}], "GBP"], "expect": {"mrr": {"minor": 6733, "currency": "GBP"}, "arr": {"minor": 80800, "currency": "GBP"}, "counted": 3, "excluded": 0}},
  {"name": "a trial is left out of MRR and counted as excluded", "args": [[{"amount": {"minor": 4900, "currency": "GBP"}, "interval": "month", "intervalCount": 1, "status": "active"}, {"amount": {"minor": 9900, "currency": "GBP"}, "interval": "month", "intervalCount": 1, "status": "trialing"}], "GBP"], "expect": {"mrr": {"minor": 4900, "currency": "GBP"}, "arr": {"minor": 58800, "currency": "GBP"}, "counted": 1, "excluded": 1}},
  {"name": "past-due still counts; paused and canceled do not", "args": [[{"amount": {"minor": 4900, "currency": "GBP"}, "interval": "month", "intervalCount": 1, "status": "past-due"}, {"amount": {"minor": 2000, "currency": "GBP"}, "interval": "month", "intervalCount": 1, "status": "paused"}, {"amount": {"minor": 1500, "currency": "GBP"}, "interval": "month", "intervalCount": 1, "status": "canceled"}], "GBP"], "expect": {"mrr": {"minor": 4900, "currency": "GBP"}, "arr": {"minor": 58800, "currency": "GBP"}, "counted": 1, "excluded": 2}},
  {"name": "a weekly plan uses 52 weeks to the year", "args": [[{"amount": {"minor": 1000, "currency": "GBP"}, "interval": "week", "intervalCount": 1, "status": "active"}], "GBP"], "expect": {"mrr": {"minor": 4333, "currency": "GBP"}, "arr": {"minor": 52000, "currency": "GBP"}, "counted": 1, "excluded": 0}},
  {"name": "a daily plan uses 365 days to the year", "args": [[{"amount": {"minor": 100, "currency": "GBP"}, "interval": "day", "intervalCount": 1, "status": "active"}], "GBP"], "expect": {"mrr": {"minor": 3042, "currency": "GBP"}, "arr": {"minor": 36500, "currency": "GBP"}, "counted": 1, "excluded": 0}},
  {"name": "every six months: the price is earned twice a year", "args": [[{"amount": {"minor": 30000, "currency": "GBP"}, "interval": "month", "intervalCount": 6, "status": "active"}], "GBP"], "expect": {"mrr": {"minor": 5000, "currency": "GBP"}, "arr": {"minor": 60000, "currency": "GBP"}, "counted": 1, "excluded": 0}},
  {"name": "every two years: half the price each year", "args": [[{"amount": {"minor": 20000, "currency": "GBP"}, "interval": "year", "intervalCount": 2, "status": "active"}], "GBP"], "expect": {"mrr": {"minor": 833, "currency": "GBP"}, "arr": {"minor": 10000, "currency": "GBP"}, "counted": 1, "excluded": 0}},
  {"name": "half a minor unit of MRR rounds up", "args": [[{"amount": {"minor": 6, "currency": "GBP"}, "interval": "year", "intervalCount": 1, "status": "active"}], "GBP"], "expect": {"mrr": {"minor": 1, "currency": "GBP"}, "arr": {"minor": 6, "currency": "GBP"}, "counted": 1, "excluded": 0}},
  {"name": "no subscriptions is zero in the requested currency", "args": [[], "EUR"], "expect": {"mrr": {"minor": 0, "currency": "EUR"}, "arr": {"minor": 0, "currency": "EUR"}, "counted": 0, "excluded": 0}},
  {"name": "only trials: nothing counted", "args": [[{"amount": {"minor": 4900, "currency": "GBP"}, "interval": "month", "intervalCount": 1, "status": "trialing"}], "GBP"], "expect": {"mrr": {"minor": 0, "currency": "GBP"}, "arr": {"minor": 0, "currency": "GBP"}, "counted": 0, "excluded": 1}},
  {"name": "yen", "args": [[{"amount": {"minor": 12000, "currency": "JPY"}, "interval": "year", "intervalCount": 1, "status": "active"}, {"amount": {"minor": 980, "currency": "JPY"}, "interval": "month", "intervalCount": 1, "status": "active"}], "JPY"], "expect": {"mrr": {"minor": 1980, "currency": "JPY"}, "arr": {"minor": 23760, "currency": "JPY"}, "counted": 2, "excluded": 0}},
  {"name": "a subscription in another currency is an error", "args": [[{"amount": {"minor": 4900, "currency": "EUR"}, "interval": "month", "intervalCount": 1, "status": "active"}], "GBP"], "expectError": "currency mismatch"},
  {"name": "a negative amount is an error", "args": [[{"amount": {"minor": -4900, "currency": "GBP"}, "interval": "month", "intervalCount": 1, "status": "active"}], "GBP"], "expectError": "recurring amount must not be negative"},
  {"name": "an interval count of zero is an error", "args": [[{"amount": {"minor": 4900, "currency": "GBP"}, "interval": "month", "intervalCount": 0, "status": "active"}], "GBP"], "expectError": "interval count must be 1 or more"},
  {"name": "an unknown status is an error", "args": [[{"amount": {"minor": 4900, "currency": "GBP"}, "interval": "month", "intervalCount": 1, "status": "expired"}], "GBP"], "expectError": "unknown subscription status"}
]