Aleksei received a bunch of notifications from their CI system, announcing a build failure. This was interesting, because no code had changed recently, so what was triggering the failure?
private BillingRun CreateTestBillingRun(int billingRunGroupId, DateTime? billingDate, int? statusId)
{
return new BillingRun
{
BillingRunGroupId = billingRunGroupId,
PeriodStart = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1),
BillingDate = billingDate ?? new DateTime(DateTime.Today.Year, DateTime.Today.Month, 15),
CreatedDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 30),
ItemsPreparedDate = new DateTime(2017, 4, 7),
CompletedDate = new DateTime(2017, 4, 8),
DueDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 13),
StatusId = statusId ?? BillingRunStatusConsts.Completed,
ErrorCode = "ERR_CODE",
Error = "Full error description",
ModifiedOn = new DateTime(2017, 1, 1)
};
}
Take a look at the instantiation of CreatedDate
. I imagine the developer’s internal monologue went something like this:
Okay, the Period Start is the beginning of the month, the Billing Date is the middle of the month, and Created Date is the end of the month. Um… okay, well, beginning is easy. That’s the 1st. Phew. Okay, but the middle of the month. That’s hard. Oh, wait, wait a second! It’s billing, so I bet the billing department has a day they always send out the bills. Let me send an email to Steve in billing… oh, look at that. It’s always the 15th. Great. Boy. This programming stuff is easy. Whew. Okay, so now the end of the month. This one’s tricky, because months have different lengths, sometimes 30 days, and sometimes 31. Let me ask Steve again, if they have any specific requirements there… oh, look at that. They don’t really care so long as it’s the last day or two of the month. Great. I’ll just use 30, then. Good thing there aren’t any months with a shorter length.
Y’know, I vaguely remember reading a thing that said tests should always use the same values, so that every run tests exactly the same combination of inputs. I think I saved a bookmark to read it later. Should I read it now? No! I should commit this code, let the CI build run, and then mark the requirement as complete.
Boy, this programming stuff is easy.