 * Serving Flask app 'laundry_counter'
 * Debug mode: off
PASS  A1   the price list is public
PASS  A2   a visitor asking for /customers is sent to /login
PASS  A3   a wrong password and an unknown e-mail get the same answer
PASS  A4   registration refuses two different passwords
PASS  A5   registration refuses a malformed phone number
PASS  A6   a new customer registers and is sent to the login page
PASS  A7   she logs in (e-mail in any case) and sees her own, empty, bill list
PASS  A8   a customer may not open the staff grid
PASS  A9   logging out ends the session
PASS  B1   the cashier logs in and lands on the grid
PASS  B2   every cookie set at login is HttpOnly and SameSite
PASS  B3   the first page is sorted by name
PASS  B4   sorting by credit, highest first
PASS  B5   searching 'wijaya' finds 8 customers
PASS  B6   searching a name with an apostrophe works
PASS  B7   a page beyond the end shows the last page
PASS  B8   an unknown sort column falls back to name
PASS  B9   a customer with a malformed phone is refused
PASS  B10  a valid customer is added as C0258
PASS  B11  a cashier's edit is saved, but a posted Credit is ignored
PASS  B12  a customer who has bills cannot be deleted
PASS  B13  a customer without bills can be deleted
PASS  C1   quantity 0 and rack Z99 are refused, each with its own message
PASS  C2   a bill for a customer who does not exist is refused
PASS  C3   a valid bill is priced by the server: 5 kg x Rp 8.000
PASS  C4   a bill moves queued -> finished -> departed, and no further
PASS  C5   the cashier's recently viewed bills, newest first
PASS  C6   a form without its anti-forgery token is refused
PASS  C7   a cashier may not edit prices or read the revenue report
PASS  D1   the owner's page shows his outlet's queue and no one else's recent bills
PASS  D2   a price of 0 is refused
PASS  D3   the owner raises S0001 to Rp 9.000
PASS  D4   the bill written earlier keeps the price it was charged
PASS  D5   the revenue report: page 3 of 3, with a page total and the month total
PASS  D6   a month that does not exist is refused
PASS  D7   a bill that does not exist is 'not found'
PASS  D8   staff may not open a customer's page
37 of 37 checks passed
