Automated test status
Every change to this site must pass an automated test suite before it is allowed to deploy. The results below are from the most recent recorded run — this page shows that snapshot, it does not run the tests when you open it.
Registration flow (12)
| Test | Status | What it checks |
|---|---|---|
| Registration form renders | Passed |
DetailsThe registration form loads for an event, showing its name and key fields. |
| Successful registration is stored and confirmed | Passed |
DetailsA valid submission stores a row and redirects to the confirmation. |
| Confirmation page shows reference and details | Passed |
DetailsAfter registering, the confirmation page shows a reference number and the attendee's details. |
| Missing required fields shows errors and keeps input | Passed |
DetailsBad input re-renders the form with messages, keeping what was typed. |
| Invalid email is rejected | Passed |
DetailsA malformed email address is rejected with a clear message. |
| Duplicate email for same event is rejected | Passed |
DetailsThe partial unique index blocks a second confirmed registration. |
| Duplicate email check ignores letter case | Passed |
DetailsRegistering with the same email in a different case is still a duplicate. The email column uses COLLATE NOCASE, so the database treats Orla.Nolan@Example.com and orla.nolan@example.com as the same person. |
| Same email can register for a different event | Passed |
DetailsThe uniqueness rule is per event, not site-wide. |
| Full event rejects new registrations | Passed |
DetailsFilling the last two workshop places makes a third attempt fail. |
| Register form for a full event redirects | Passed |
DetailsOpening the form for a full event redirects instead of showing it. |
| Register form for unknown event returns 404 | Passed |
DetailsOpening the registration form for an event that does not exist returns 404. |
| Confirmation page is hidden for a cancelled registration | Passed |
DetailsA cancelled registration must not show a "You're registered!" page. Registration 19 is seeded as cancelled, so its confirmation URL 404s rather than reassuring someone whose place was cancelled. |
Organiser pages (24)
| Test | Status | What it checks |
|---|---|---|
| Registration list shows all registrations | Passed |
DetailsThe organiser list shows every registration, including a known attendee from each seeded event. |
| Admin root redirects to registration list | Passed |
DetailsThe bare /admin URL should redirect to the organiser list, not 404. |
| Registration list can filter by event | Passed |
Details?event=2 narrows the table to the careers evening only. |
| Registration list shows cancelled status | Passed |
DetailsSarah Lydon's seeded workshop registration is cancelled. |
| Registration list shows summary stats | Passed |
DetailsThe stat panel below the title reports the headline figures, all of them describing the seeded dataset as a whole. |
| Registration list shows the venue for each event | Passed |
DetailsEach row lists the event's venue under the event name. |
| Table can be sorted by a column | Passed |
DetailsA column header sorts the whole table on the server, and the direction flips between ascending and descending. |
| Invalid sort parameters fall back to newest first | Passed |
DetailsA hand-edited (or malicious) sort value is never trusted: an unknown column is ignored and the table falls back to its default newest-first order, with no error and no SQL reaching the database. |
| Sort links preserve the event filter | Passed |
DetailsSorting while filtered to one event keeps that filter in the links. |
| Registration detail shows all stored information | Passed |
DetailsA registration's detail page shows every stored field: reference, name, email, organisation, dietary needs and event. |
| Unknown registration returns 404 | Passed |
DetailsOpening a registration that does not exist returns a 404. |
| Edit form is prefilled with current values | Passed |
DetailsThe edit form arrives pre-filled with the registration's current details. |
| Edit saves changes | Passed |
DetailsEditing updates the stored row and reports success. |
| Edit rejects invalid input | Passed |
DetailsValidation applies to edits exactly as it does to new registrations. |
| Edit rejects email belonging to another registration | Passed |
DetailsChanging the email cannot collide with someone else on the event. |
| Cancel frees a place and keeps the row | Passed |
DetailsCancelling flips the status and the workshop gains a free place. |
| Cancelling twice is reported not repeated | Passed |
DetailsCancelling an already-cancelled registration is reported, not repeated. |
| Cancelled place can be taken by someone new | Passed |
DetailsAfter a cancellation the freed workshop place is usable again. |
| Registration rows link to manage | Passed |
DetailsThe per-row action on the list reads 'Manage', not 'View'. |
| Cancelled registration detail offers reinstate | Passed |
DetailsA cancelled registration (Sarah Lydon, id 19) shows a reinstate button and not the cancel button. |
| Reinstate restores a cancelled registration | Passed |
DetailsUn-cancelling flips the status back and the place is taken again. |
| Reinstating an active registration is rejected | Passed |
DetailsReinstate only applies to cancelled rows. |
| Reinstate is blocked when the event is full | Passed |
DetailsIf the freed place was taken meanwhile, the row cannot be reinstated. |
| Reinstate is blocked when the attendee re registered | Passed |
DetailsIf the attendee signed up again after cancelling, the cancelled row cannot also be reinstated — that would duplicate an active registration. |
Public pages & assets (13)
| Test | Status | What it checks |
|---|---|---|
| Home page lists all events | Passed |
DetailsThe home page shows every seeded event with its key details. |
| Home page shows places left | Passed |
DetailsCapacity maths on the cards: the workshop has 12 - 10 = 2 places. |
| Home page shows a fully booked event | Passed |
DetailsEvent 5 (the bootcamp) is seeded to capacity, so the home page shows the 'Fully booked' badge and the availability API reports no places left. |
| Event detail page shows event information | Passed |
DetailsThe event page carries the full description and practical details. |
| Event detail page shows remaining places | Passed |
DetailsThe event page shows how many places are left (2 of 12 for the workshop). |
| Unknown event returns 404 | Passed |
DetailsVisiting an event that does not exist shows a friendly 404 page. |
| Availability api returns correct numbers | Passed |
DetailsThe JSON endpoint used by the JavaScript availability widget. |
| Availability api unknown event returns 404 | Passed |
DetailsThe availability API returns 404 for an event that does not exist. |
| Static assets carry a cache busting version | Passed |
DetailsEvery static URL gets a ?v=<hash> marker so a redeploy never serves a returning visitor a stale stylesheet or script. A cached old stylesheet against new HTML was what once made the events view show the cards and the table at the same time. |
| Cache busting version matches file contents | Passed |
DetailsThe version is a content hash: it changes only when the file's bytes change, so an edited asset is re-fetched while unchanged ones stay cached. |
| Footer links to the database viewer | Passed |
DetailsThe footer offers a 'DB' link to the read-only database viewer at /db (served by nginx in production, alongside the 'Test status' link). |
| Home page shows an at a glance stat panel | Passed |
DetailsThe home page opens with a stat panel: 9 events across 3 venues, 3 of them free to attend, plus the total places still available. |
| Events table has sortable headers | Passed |
DetailsThe table view's headers carry the sort keys the JavaScript uses, and each row carries the values those sorts read (client-side sorting). |
Data model & venues (9)
| Test | Status | What it checks |
|---|---|---|
| Three venues are seeded | Passed |
DetailsThe seed data creates the three Galway venues, in order. |
| Every event references a real venue | Passed |
DetailsEach event's venue_id points at an existing venue (the foreign key). |
| Event capacity never exceeds its venue | Passed |
DetailsThe join lets us check an event never books beyond its venue's size. |
| Event page shows venue name and address | Passed |
DetailsVenue name and address both reach the event page through the join. |
| Venue page shows its details | Passed |
DetailsThe venue page shows the venue's name, address, capacity, description and its list of facilities. |
| Venue page offers directions to the address | Passed |
DetailsThe venue page links to Google Maps directions for the venue address. |
| Venue page lists the events held there | Passed |
DetailsThe venue page lists events held at that venue, and not events held elsewhere. |
| Unknown venue returns 404 | Passed |
DetailsRequesting a venue that does not exist returns a 404 page. |
| Home page links each venue to its page | Passed |
DetailsVenue names on the home page are links to that venue's detail page. |
This test-status page (5)
| Test | Status | What it checks |
|---|---|---|
| Status page shows the summary | Passed |
DetailsThe /tests page shows the headline totals, the run time and the commit. |
| Status page lists tests in plain english | Passed |
DetailsTest names are humanised and grouped under friendly headings. |
| Status page flags failures in red | Passed |
DetailsA failing test is shown with a red 'Failed' badge on the page. |
| Status page handles a missing report | Passed |
DetailsWith no report file, the page still loads and says so, not a 500. |
| Footer links to the test status page | Passed |
DetailsEvery page's footer links to the /tests status page. |