(This info header needs to be at the beginning of each testing element inside your report)
| Test Date | Ex: 25/10/2025 |
| Tested App | Ex: Sutton Council’s Cultural Services |
| Tester Name | Ex: John Doe |
| App URL | Ex: https://libraries.sutton.gov.uk |
| Testing Device | Ex: Desktop Intel(R) Core(TM) i7 — Laptop — Tablet — Mobile — Library kiosk — etc. |
| Testing Module | Ex: Patron Journey, Usability, Accessibility, App Responsiveness, App Security, etc. |
| Testing OS and Version | Ex: Windows 11 Pro (24H2) |
| Page/Screen | Ex: Navbar — Home — Digital Content — Search — Events — Wildcard — Contact Us — Join the Library — User Account — Lists — General — Footer — etc. |
| Browser Name and Version | Ex: Chrome 130.x (Official Build) (64-bit) |
| Path | Ex: /bookshelf, /events, /search, /user/account, etc. |
| Word | Meaning |
| CMS | The library’s content management system, where the app settings, tabs and content are managed. |
| Dialogue box | A small window that opens on top of the page (for example, the login box). The page behind it is darkened and cannot be used until the box is closed. |
| Pop-up message | A short message that appears in a corner of the screen to confirm an action or report a problem, then disappears. |
| Carousel | A row of items (book covers, event cards, slides) that can be scrolled left and right with arrow buttons. |
| Book jacket | The cover image of a title shown in carousels, search results and lists. |
| Drop-down list | A box that opens a list of options to pick from. |
| Switch | An on/off control that slides left and right. |
| Three-dots menu | A button with three vertical dots (⋮) that opens a small menu of extra options. |
| Web address | The address shown in the browser’s address bar (also called the URL). |
| Linked accounts | Other library cards (for example, children’s cards) connected to the logged-in user so they can be managed together. |
| Kiosk | A shared touch-screen computer inside the library. |
| eContent | Digital titles such as eBooks and eAudiobooks provided by suppliers like BorrowBox or OverDrive. |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Main Navbar | The Brand (Logo on the left) | Any screen with no dialogue box or side menu open | Functionality test | Click the logo | - If no “Header Link” is set in the CMS: the app goes to the Home screen (the Bookshelf by default)
- If a “Header Link” is set in the CMS: the logo goes to that link (usually the library’s main website)
- The logo changes to the “sticky” logo version when the page is scrolled down
|
| Main Navbar | Bookshelf link | A tab branched from the Home Screen tab in the CMS of type Headers >> Bookshelf, Visibility set to Always | Existence and appearance | Set the tab icon only, or the icon and its colour, in the CMS. Refresh the page | - No tab = no Bookshelf link on large and small screens
- Changing the icon replaces the default icon on large and small screens
- Changing the icon colour changes the icon in the normal and sticky navbar and in the side menu
Note: this is the main tab linked to the Home screen. Without it the app will not work properly. |
| Main Navbar | Digital Content link | A tab of type Headers >> Digital-Content, Visibility set to Always | Existence and appearance | Set the tab icon / colour in the CMS. Refresh the page | - No tab = no link
- Icon and colour changes are shown
- Clicking the link opens the first visible Digital Content sub-tab
|
| Main Navbar | Events link | A tab of type Headers >> Events, Visibility set to Always | Existence and appearance | Set the tab icon / colour in the CMS. Refresh the page | - No tab = no link
- Icon and colour changes are shown
|
| Main Navbar | Wildcard (Blog) link | A tab of type Headers >> Blog, Visibility set to Always | Existence and appearance | Set the tab icon / colour in the CMS. Refresh the page | - No tab = no link
- Icon and colour changes are shown
|
| Main Navbar | Account (user menu button) | A tab of type Headers >> Account, Visibility set to Always | Existence and appearance | Set the tab icon / colour in the CMS. Log in / out. Refresh the page | - No tab = no user menu button on large screens
- Logged out: the button shows the tab title (e.g. “Account”)
- Logged in: the button shows the user’s first name and their avatar (picture or initials)
- See section 3 for the menu itself
|
| Main Navbar | Search icon | A tab of type “Library Search”, Visibility set to Always | Existence and appearance | Set the tab icon / colour in the CMS. Refresh the page | - No tab = no Search icon on large screens and no search field in the side menu
- Icon and colour changes are shown
|
| Main Navbar | Search field open / close | Search icon is visible on a large screen | Open and close the search field | Click the Search icon. Type text. Close it. Open it again. Press Enter with and without text | - First click opens the search field; second click closes it
- Closing the field clears any typed text
- Enter with text goes to the Search page with that text as the search term
- Enter with no text closes the field
- If “Search box expanded by default” is set in the CMS, the field is already open when the page loads
|
| Main Navbar | Search field — “Search field” drop-down | The library has search fields set up (e.g. Keyword, Title, Author) | Choose what to search in | Open the search field, pick a search field from the drop-down, type a term, press Enter | The Search page opens and the results match the chosen field (e.g. only author matches) |
| Main Navbar | Search suggestions | Search suggestions are switched on for the library | Suggestions while typing | Type the start of a title or author | - A list of suggestions appears under the field
- Choosing a suggestion runs a search for it
- The list can be moved through with the arrow keys
|
| Main Navbar | Advanced Search link | Advanced Search is switched on for the library and the user is logged in | Link visibility | Open the search field while logged out, then while logged in | - Logged out: no Advanced Search link
- Logged in: an “Advanced Search” link appears; clicking it opens the Advanced Search dialogue box (see section 13)
|
| Main Navbar | All links | All the tabs above exist; log in to test the Account link | Links go to the right pages | Click each link | (1) Search → /search?term={your text} (2) Bookshelf → /{bookshelf} (3) Digital Content → /{digital-content}/{first sub-tab} (4) Events → /{events} (5) Blog → /{blog} (6) Account → /user/account?tab=my-bookshelf The current page’s link is highlighted and cannot be clicked again |
| Main Navbar | Sticky navbar | Any page longer than the screen | Sticky navbar test | Scroll down a little, then scroll back to the top | - Scrolling down: the navbar stays at the top with a background colour and shadow
- Back at the top: the background disappears again
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Side Menu | Menu button (three lines) | Small screen, or make the browser window narrow | The button responds to the screen size | Resize the browser window from wide to narrow | The menu button shows on small screens; the full navbar shows on large screens |
| Side Menu | Open / close | Small screen | Open and close the side menu | Tap the menu button, then tap the X button | - The side menu slides in and the menu button changes to an X
- Tapping X closes the menu
- The page behind cannot be scrolled while the menu is open
|
| Side Menu | Search field | A “Library Search” tab exists | Search from the side menu | Type a term and press Enter (or tap the search button) | - The menu closes and the Search page opens with the results
- While already on the Search page, the search field is replaced by a highlighted “Search” item
|
| Side Menu | Menu items | All tabs exist | Items and order | Open the side menu while logged out, then while logged in | Items in order: Search field, Home (only for libraries with this option), Bookshelf, Digital Content, Events, Blog, Account (logged in), Switch account (logged in with linked accounts), Contact Us, Join the library (logged out), Login / Logout. Each item closes the menu and opens the right page |
| Side Menu | Join the library | Logged out; registration allowed in the CMS but the registration form has no fields set up | Error message | Tap “Join the library” | A pop-up message says: “Sorry, registration is not available yet, please try again later.” |
| Side Menu | Login / Logout | — | Login and logout from the menu | Tap Login while logged out; tap Logout while logged in | - Login opens the login dialogue box (not shown if already on the login page)
- Logout logs the user out
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Root Page | Root page switched off (default) | “Root Page” is not enabled in App Settings in the CMS | Going to the main address | Type the app’s main address with nothing after it (e.g. https://libraries.example.gov.uk/) | The app goes straight to the Bookshelf page (e.g. /bookshelf) |
| Root Page | Root page switched on — with custom content | “Root Page” is enabled; the Bookshelf tab has content in its “Prefix Content” box in the CMS | Custom landing page | Go to the main address | - The app stays on / and shows the custom content (text, images, links, layout)
- No hero carousel, book carousels, loans or reservations appear on this page
- Navbar and footer still work
|
| Root Page | Root page switched on — no custom content | “Root Page” is enabled; the Bookshelf tab’s Prefix Content is empty | Default landing page | Go to the main address | The page shows the heading “Home” and the text “Welcome to our library” (in the current language) |
| Root Page | Logo & Bookshelf link | “Root Page” is enabled | Navigation from the root page | Click the Bookshelf link, then the logo | The Bookshelf link opens the Bookshelf page; the logo goes back to / (unless a Header Link is set) |
| Root Page | No Bookshelf tab | No Bookshelf tab in the CMS | Missing home screen | Go to the main address | The “Lost in the library?” (page not found) page shows |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Home | Hero Carousel | A primary channel is selected in App Settings; at least one content item is scheduled in it with “App” selected in the Publish area | Carousel visibility | Go to the Home screen | - The carousel shows at the top with one or more slides on mobile, tablet and desktop
- It does not move on its own unless “Autoplay Carousel” is switched on in the CMS
- No scheduled items = no carousel (only an empty space under the navbar)
|
| Home | Hero Carousel | More than one slide | Left / right arrows | Click the arrows | - Arrows only show when there is more than one slide
- Left arrow goes to the previous slide; right arrow to the next
|
| Home | Hero Carousel | More than one slide | Play / Pause button | Click the button | - Switches between play and pause
- While playing, the slide changes every 8 seconds
- The carousel pauses while the mouse is over the slide
|
| Home | Hero Carousel | More than one slide | Dots under the carousel | Click a dot | - Goes straight to that slide with a smooth movement
- Dots are hidden on very small screens
|
| Home | Hero slide — content | A slide; fields edited in the Publish area of the content item | Title, subtitle, text and picture | Fill / clear: Published Title, Published Description, Info Bar Content, Thumbnail Image (200x200). Refresh | - Title: large and bold at the top
- Description: subtitle on the second line
- Info Bar Content: a paragraph under them
- Thumbnail: on the left, plus a blurred copy as the background
- If left empty for a Bib Record or Event, these are filled automatically (title, author/location, description, cover/event image)
|
| Home | Hero slide — More Info button | A slide | Button existence, text and action | Add / clear the “More Info URL” and “More Info Title”. Click the button | - URL set = button shows; empty = no button
- No title = button reads “More Info”; a title changes the button text
- The link opens in a new browser tab
|
| Home | Hero slide — types | One slide of each type | Clicking the slide area | Click each slide | - Bib item (Record ID or ISBN): opens the item dialogue box (section 8)
- Calendar Event: opens the event details dialogue box
- Live Web Page: opens the link in a new tab
- Picture: opens the picture full size in a viewer
- Video: opens a video dialogue box and the video plays
- PDF: opens the PDF
|
| Home | Hero Banner (instead of carousel) | A library set up with the “banner” style (e.g. Sunderland) — see section 49 | Banner display | Go to the Home screen and the Events page | - A single flat banner shows instead of the carousel, on both pages
- Clicking it follows its link in a new tab
|
| Home & Libraries | Digital Content bar | A Digital Content tab with sub-tabs set to Always | Bar existence | Refresh the Home and Digital Content pages | The sub-tab titles show in a row that can be scrolled left / right |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Home | Order of rows | Logged in user with loans and reservations | Row order | Refresh the Home screen | From top: “We Think You May Like”, the library’s carousels, “My Loans / Renewals”, “My Reservations”. Logged out: only the library’s carousels |
| Home | “We Think You May Like” | Logged in | Personal recommendations | Refresh the page | - Shows suggested titles if the user has borrowing history
- No suggestions = the row does not show at all
- A loading placeholder shows while the row loads
- When viewing a linked account, the title changes to “We Think {name} May Like”
- The three-dots menu has “Full Screen” (opens the full recommendations page in a new tab) and “Print”
|
| Home | Library carousels | The library has carousels set up | Carousel rows | Refresh the page; use the arrows | - Each carousel with a title shows as its own row; carousels without a title do not show
- Arrows scroll the row left / right
- Each row has a Share button (section 41) and a three-dots menu with “Full Screen” (opens /recommendations/{name} in a new tab) and “Print”
|
| Home | “My Loans / Renewals” | Logged in | Current loans row | Refresh the page with and without loans | - Loans show as book jackets with a coloured badge (e.g. “Due in 5 days”, “Due soon!”, “Today!”, “Overdue!”)
- The number next to the title matches the number of loans
- The reload button (two arrows) reloads the row
- “Show as table” switch changes the row to a table (section 26)
- “Renew All” button shows when there is at least one loan (section 28)
- If the user has loan history, a “My Loan History” tile shows at the end and opens the history on the account page
- No loans: “You don’t have any loans currently”
|
| Home | “My Reservations” | Logged in | Current reservations row | Place and cancel reservations; refresh the page | - Reservations show as book jackets with a badge (e.g. “Ready, can be collected”, “This item is suspended”)
- The number next to the title matches
- Reload button and “Show as table” switch work
- No reservations: “You don’t have any reservations currently”
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Book Jacket | Information box | Any carousel or search results | Hover / focus info | Move the mouse over a jacket, or move to it with the Tab key | A small box shows the Title, Author, Format and Publication Year |
| Book Jacket | Missing cover | A title with no cover picture | Placeholder | Find such a title | A placeholder cover with the title shows instead of a broken image |
| Book Jacket | Open the item | Any jacket | Click a jacket | Click the jacket | - The item dialogue box opens over the page
- The web address changes to /manifestations/{id}
- Loans and reservations open the loan / reservation details instead (section 27) and the address changes to /user/loans/{id} or /user/reservations/{id}
|
| Item Dialogue Box | Previous / next | Opened from a carousel with several items | Move between items | Click the left and right arrows in the dialogue box | The previous / next item in the same row shows, and the web address updates |
| Item Dialogue Box | Close | Dialogue box open | Close it | Click the X button; open again and press Escape | The box closes, the previous web address returns, and the page can be used again |
| Item Dialogue Box | Contents | Dialogue box open | What is shown | Look at the box | Cover, title, author, the rating / lists / share buttons, and the Available Formats area (section 9) |
| Item Dialogue Box | Like / Dislike (rating) | “Allow Ratings” is on for the library | Rate a title | Click Like / Dislike while logged out, then while logged in. Click several times. Reopen the item | - Logged out: buttons are disabled with a “Please log in…” tooltip
- Logged in: each click adds +1 or -1, from -2 up to +2, and the number shows on the icon
- The rating is remembered when the item is opened again (per account when viewing linked accounts)
|
| Item Dialogue Box | Lists panel (+ button) | — | Add to / remove from lists | Click the + button logged out, then logged in | - Logged out: the login dialogue box opens
- Logged in: a “Lists” panel opens listing the user’s lists
- Lists that already contain the title are marked (“This title is already on this list”) and offer “Remove”
- Clicking another list adds the title; a pop-up message confirms
- “New List” opens the “Create a new list” dialogue box and adds the title to the new list
- The + changes to − while the panel is open; clicking it closes the panel
|
| Badges | On loan / reservation jackets | A user with loans due in different periods, overdue loans, ready and suspended reservations | Status badges | Look at the jackets in My Loans / My Reservations | Badges such as “Due in X”, “Due soon!”, “Today!”, “Overdue!”, “Ready, can be collected”, “This item is suspended” with matching colours. eContent and printed items are named differently (“eContent item” / “Book item”) |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Item Page | Full page | A valid item ID | Open the item as a full page | Open an item, then refresh the browser (or paste a /manifestations/{id} address in a new tab) | The item shows as a full page with a blurred cover background, cover, title, author, rating / lists / share buttons and Available Formats |
| Item Page | Wrong ID | — | Page not found | Go to /manifestations/wrong-id | The “Lost in the library?” page shows |
| Available Formats | Formats carousel | A title that exists in several formats (e.g. Book, eBook, eAudiobook) | Choose a format | Use the arrows and click a format | - Each format shows with its icon and “#1 of 3 Available formats”-style counter
- Clicking a format shows its details and availability
|
| Available Formats | Format details | A format is selected | Details and links | Read the details. Click “Show More” / “Show Less”. Click an author or subject value | - Details such as publisher, year, ISBN, series, language show
- Long descriptions are shortened with “Show More” / “Show Less”
- Clicking an author / subject value closes the dialogue box and runs a new search for that value
|
| Available Formats | Copies | A printed format with copies in several libraries | Copies list | Open the “Copies” section. Switch on “Only Available”. Type a library name in the filter box | - The header shows e.g. “12 copies” or “3 / 12 copies available”
- Each copy shows its location, status and placement
- “Only Available” hides unavailable copies
- The filter box narrows the list by location
|
| Available Formats | Your loan / reservation notes | Logged in user who has this title on loan, reserved, or borrowed before | Personal notes | Open the title | Notes show: “Current Loan” with due date, “Current Reservation” with status (and queue position if the library shows it), or “Previously borrowed” with the last check-out date. For linked accounts the note names the person (e.g. “Anna’s Current Loan”) |
| Available Formats | “Spot something wrong?” | A catalogue email address is set for the library | Report wrong information | Click “Let us know” | The email program opens with the subject “Wrong catalogue info. Item: {title}” |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Reserve | “Place Reservation” button | A printed format that can be reserved | Logged out | Click “Place Reservation” while logged out | The login dialogue box opens; after logging in the user can continue |
| Reserve | Reservation dialogue box | Logged in | Place a reservation | Click “Place Reservation”, choose a pickup location, click “Reserve” | - A “Place Reservation” box opens with a “Pickup location” drop-down
- “Reserve” without a location shows “Please select a pickup location first.”
- Success: pop-up “The title reservation has been placed successfully” and the reservation appears in My Reservations
- The chosen location is pre-selected next time
- Failure: a pop-up message explains why
|
| Reserve | “Reserve for” | User with linked accounts | Reserve for someone else | Choose another account in “Reserve for” and reserve | The reservation appears under that person’s reservations |
| Reserve | “Select a copy” | A title with several volumes / copies | Choose a volume | Open the reservation box | A “Select a copy” drop-down shows (with “Loading available copies…” first). Reserving without choosing shows “Please select a copy to reserve.” |
| Reserve | Fees | The library charges for reservations; a fees link is set | Fee note and confirmation | Open the box; reserve a title that has a fee | - A note says you may be charged, with a link to the library website
- If a fee applies, a “Confirmation Required” box explains it; Ok places the reservation and updates My Charges; Cancel stops it
|
| Reserve | Not reservable | A title that cannot be reserved | Disabled button | Open the title | A greyed-out “Not Reservable!” button shows |
| eContent | Check out | An available eBook / eAudiobook | Check out an eTitle | Click “Check out “{format}”” logged out, then logged in | - Logged out: the login box opens
- Logged in with linked accounts: a box asks who is borrowing (“Borrower”)
- Success: pop-up “The title has checked out successfully”; the loan appears in My Loans; the reading link opens in a new tab (in kiosk mode a QR code shows instead)
|
| eContent | Supplier platform titles | A title that must be borrowed on the supplier’s own website | External check out | Click “Check out” | The supplier’s page opens in a new tab |
| eContent | Preview / Download | A title with a sample or download link | Extra buttons | Click “Preview” / “Download” | Each opens in a new tab |
| eContent | Reserve an eTitle | An eTitle with no copies available | Reserve with email | Click “Place Reservation” (logged in) | A box asks for an email address (pre-filled with the user’s email). Invalid email shows an error. Reserve places it; Cancel closes the box |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Search | Basic search | — | Search a term | Search for e.g. “harry” | - The page opens at /search?term=harry
- A line shows “Results for ‘harry’: showing 40 of 230”
- Results show as book jackets by default
|
| Search | Empty search | — | No search term | Go to /search with no term, logged out then logged in | - Logged out: the “Lost in the library?” page shows
- Logged in: the whole catalogue can be browsed
|
| Search Bar | Search term box | On the Search page | New search | Change the term and press Enter or click “Search” | A fresh search runs with the new term (an information tooltip explains this) |
| Search Bar | Search field / Search area / Search target | The library has these options set up | Narrow the search | Change each drop-down and search again | - Search field (e.g. KEYWORD, Title, Author) limits what is searched
- Search area (default “All locations”) limits results to one library
- Search target (default “All targets”) limits the collection searched
- Choices are kept in the web address and after refresh
|
| Search Bar | Sort By | Sort options set up | Change the order | Choose each sort option | Results re-order (Relevance, Title, Author, Publication year newest / oldest first) |
| Results | “View as” switch | Results showing | Thumbnail vs List view | Click the List View icon, then the Thumbnail View icon. Leave the page and come back | - List view: each result is a card with details, available formats, a Share button, a + (lists) button and a three-dots menu
- Thumbnail view: book jackets only
- The chosen view is remembered
|
| Results | “Load More” tile | Thumbnail view with more results than shown | Load more results | Click the “Load More” tile at the end | The tile spins, more results are added under the current ones, and the counter line updates. The tile disappears when everything is loaded |
| Results | Pages | List view with many results | Page numbers | Click page numbers | The next set of results shows; the line reads e.g. “showing 6 - 10 of 230” |
| Results | List view — three-dots menu | List view | Menu options | Open the three-dots menu on a card | - “Full Screen” opens the item dialogue box
- If ratings are on: a 5-star rating plus “Rate up” / “Rate down” (logged out opens the login box)
|
| Results | “Hide previously borrowed” | Logged in user whose results include titles they borrowed before; Thumbnail view | Hide past loans | Switch it on and off | - The switch only appears when such titles are in the results; a tooltip explains it
- On: previously borrowed titles are hidden
- Jackets of previously borrowed titles show “You last checked this item out on {date}”
|
| Results | No results | — | Nothing found | Search for nonsense text | - Message: “Sorry, we couldn’t find any results for {term} with the provided search criteria.”
- If “Suggest a Purchase” is on: “Can’t find what you are looking for? Suggest a purchase” link to the request page (section 39)
|
| Results | Loading & errors | Slow or broken connection | Feedback | Search on a slow connection | “Loading search results…” shows. If search fails, a friendly error message shows instead of a broken page |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Filters | “Show filters” button | Results showing | Open / close the panel | Click “Show filters”, then “Hide filters” (or the panel’s close button) | The panel opens at the side on large screens and full screen on small screens |
| Filters | Filter groups | Panel open | Groups and counts | Open each group (e.g. Format, Author, Language) | - Each group shows its total, e.g. “Format ( 2 / 8 )” when 2 are ticked
- Groups with no values are greyed out
- Each value shows its number of results
|
| Filters | Inside a group | A group with more than 6 values | Find and sort values | Type in “Filter {group} list”. Click “Show All” / “Show Few”. Click the sort button | - Typing narrows the list and highlights the match
- Show All / Show Few switch between the full and short list
- Sort switches between A–Z and Z–A
|
| Filters | Apply | Some values ticked | Apply filters | Click “Apply filters” | Results refresh with the filters; the web address keeps them, so refresh / sharing keeps the same results |
| Filters | “Clear all” | Filters ticked | Clear the panel | Click “Clear all” in the panel | All filters that are not pinned are cleared (a tooltip explains Clear All and Apply Filters) |
| Current filters | Filter chips | Filters applied | Remove a filter | Click the ✖ on a chip under “Current filters” | That filter is removed |
| Current filters | Pin a filter | Filters applied | Pinned filters stay | Click the pin icon on a chip. Run a completely new search. Close and reopen the browser | - The pin icon changes to “pinned”
- The pinned filter is automatically applied to new searches and stays after reopening the browser
- “Clear filters” does not remove pinned filters; click the pin again to unpin
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Featured Events | Carousel visibility | An Events tab; at least one upcoming event marked as featured in the events system | Carousel shows | Go to the Events page | - A carousel of featured events shows at the top of all Events pages (all, category, location, date)
- Up to 10 featured events show
- Events that have already ended are not shown
- No featured events = no carousel (only an empty space)
|
| Featured Events | Slide content | As above | What each slide shows | Look at each slide | Event picture (placeholder if none), blurred background, event name, date and time, location, category tags, and a short description (long text is shortened with “…”) |
| Featured Events | Arrows / Play / Dots | More than one featured event | Carousel controls | Use the arrows, play / pause and dots | Work the same as the Home hero carousel (section 6). Controls are hidden when there is only one event. Autoplay follows the CMS setting |
| Featured Events | Click a slide | As above | Open event details | Click the slide area | The event details dialogue box opens and the web address changes to /{events}?id={event id} |
| Featured Events | “Event Details” button | The event has a details page link | External event page | Click “Event Details” | The event’s page on the events / booking website opens in a new tab |
| Featured Events | Single event address | — | Carousel hidden for a single event | Open /{events}?id={event id} directly | The featured carousel is not shown; only the single event shows |
| Featured Events | Banner libraries | A library with the “banner” style | Banner instead | Go to the Events page | The library’s banner shows instead of the featured events carousel |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Events | All Events | Upcoming events exist | Events home | Go to /{events} | - An “All Upcoming Events” row shows event cards with a total count
- No events: “Sorry, there are no events currently to show”
|
| Events Bar | Top tabs | Category / location tabs set up in the CMS | Navigation tabs | Click each top tab | Tabs: “All Events”, “Events by Category”, “Events by Location”, “Events by Date”. The bar scrolls left / right on small screens |
| Events | By Category | Categories and sub-categories set up | Category filter | Choose a category, then a sub-category | - Only events in that category show, titled “Events in {category}”
- None: “Sorry, there are no events in ‘{category}’ category currently to show”
- Before choosing: an instruction to pick a category shows
|
| Events | By Location | Event locations set up | Location filter | Choose a location | - Only events at that location show, titled “Events at {location}”
- None: “Sorry, there are no events at {location} currently”
|
| Events | By Date — Today / This Week / This Month | Events on those dates | Date filters | Click each | Rows titled “Today’s Events”, “This Week’s Events”, “{Month}’s Events” with only matching events |
| Events | By Date — Calendar | — | Pick one date | Click “Calendar” and choose a date | “Events on {date}” shows; the date is kept in the web address |
| Events | By Date — Custom | — | Pick a date range | Click “Custom” and choose start and end dates | “Events between {start} and {end}” shows; the dates are kept in the web address |
| Events | Wrong address | — | Page not found | Go to /{events}/something-wrong or a wrong event id | The “Lost in the library?” page, or “Sorry we couldn’t find that Event for you…” |
| Event Card | Card content | Events of different kinds | Card details | Look at cards | - Picture, name, date / time, location
- Icons for “Featured Event”, “Online Event”, “Payable Event”
- “(Multiple sessions)” for multi-session events
- “FULL” for fully booked events; “Expired Event” / “Cancelled Event” tags
|
| Event Card | Card buttons | — | View, favourite, tickets | Click the card / view button, the heart, and the tickets button | - View opens the event details dialogue box
- Heart: logged out shows “Please log in to add … to your favourites”; logged in adds / removes the favourite
- Tickets button opens the booking page in a new tab (disabled “Fully Booked” when full)
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Event Details | Information | An upcoming event | Details shown | Open an event | Name, picture, main category, Date, Time, Venue, Cost (or “Free”), Booking (required / not required), Ages, Sponsor, Requirements, Description (or “No description could be found for this event.”) |
| Event Details | Multiple sessions | An event with several sessions | “View all dates” | Click / hover “View all dates” | A list of all sessions shows; fully booked sessions are marked |
| Event Details | Booking buttons | Events: bookable, fully booked, and one the user already booked | Correct button | Open each event (logged in for the booked one) | - Bookable: “Book Now” opens the booking page in a new tab
- Fully booked: “Join Waiting List” opens the waiting list in a new tab
- Already booked: “Edit My Booking” opens the event page in a new tab
|
| Event Details | Add to Calendar | An upcoming event | Calendar options | Click “Add to Calendar” | Options for Google, Outlook, Apple / iCal etc. show; the chosen calendar has the correct name, date, time and place |
| Event Details | Share & Favourite | An upcoming event | Buttons | Click Share and the heart | Share works as in section 41; the heart works as on the card |
| Event Details | Expired / cancelled | An event that has ended, and a cancelled one | Past events | Open them | - An “Expired Event” or “Cancelled Event” corner tag shows
- For expired events the date and time are crossed out, and there is no booking button, Add to Calendar or Share
|
| Event Details | Close | Opened as a dialogue box | Close | Click X or press Escape | The box closes and the previous page and web address return |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Digital Content | Landing | Digital Content tab with sub-tabs | Opening the section | Click the Digital Content link | The first visible sub-tab opens. If “Breadcrumb Navigation” is on in the CMS, a breadcrumb trail (Home > Section > Tab) shows and can be clicked |
| Digital Content | Levels | Sub-tabs with their own sub-tabs | Nested tabs | Click through tab levels | Each level shows its own row of tabs; the web address follows the path |
| Digital Content | Text content | A tab with Prefix Content or Content Text | HTML content | Open the tab | The text, pictures, links and layout show correctly; accordions (expand / collapse sections) open and close |
| Digital Content | Restricted content | A tab whose visibility does not allow the current user (e.g. Staff Only) | Content guard | Open the tab’s address as a patron / logged out | “Restricted content! Sorry, this content is not available to you at the moment. Please contact the library for more information.” |
| Digital Content | Library / location page (Channel tab) | A tab linked to a channel with address, opening hours, phone, email, website and map | Location details | Open the tab | - Address, Opening Hours (with “Closed” days), Telephone (tap-to-call), E-mail (opens email program), Website
- A map of the location shows
|
| Digital Content | Web link tab | A content tab of type Web URL | Redirect | Open the tab and wait | A note says “You will be redirected shortly to an external URL!”; after about 5 seconds the link opens. A link to open it manually is also shown |
| Digital Content | Picture / Video / PDF / Text tabs | One tab of each type | Content types | Open each | - Picture: shows and opens full size when clicked
- Video: plays with controls
- PDF: shows with a “Download file” button
- Text lines: show as text
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Blog | Posts list | A Blog tab with posts | List of posts | Go to /{blog} | Post cards show with picture, a tag (“{category} post” or “General”), title, “Last edited” date and “By” author, and a “Read More” button |
| Blog | Pages | More posts than fit on one page | Page numbers | Click page numbers; refresh | Other posts show; the page number is kept in the web address. The number of cards per page changes with screen width |
| Blog | Single post | A post | Read a post | Click a card / “Read More” | The post opens with its banner picture, title, subtitle, last edited date, full content, and breadcrumbs (Home > Blog > Post) |
| Blog | Share & Favourite | A post | Buttons | Click Share and the heart (logged out and in) | Share as in section 41. Heart: logged out asks to log in; logged in adds / removes the post from My Favourites |
| Blog | Wrong post address | — | Page not found | Go to /{blog}/no-such-post | The “Lost in the library?” page shows |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Login | Where to log in | Logged out | Login page and login box | Go to /user/login; also click Login in the user menu on another page | The login page shows the form; the menu Login opens the same form in a dialogue box over the current page |
| Login | Already logged in | Logged in | No access to the login page | Type /user/login in the address bar | The app goes to My Account > My Bookshelf instead |
| Login | Form fields | — | Field rules | Type in, clear and leave each field | - “Borrower number or username”: required, at least 4 characters
- “PIN or password”: required, at least 3 characters
- A clear error message shows under each wrong field
- A note explains fields with * are required
|
| Login | Show / hide PIN | PIN typed | Eye button | Click the eye button twice | The PIN switches between hidden dots and readable text |
| Login | “Remember me on this device” | Not a kiosk | Long login | Tick the box; log in; close and reopen the browser the next day | - Ticking shows a warning: “Use this option only on trusted devices…”
- Without it the user stays logged in for 1 hour; with it for 7 days
- The box is not shown in kiosk mode
|
| Login | Human check | Cloudflare Turnstile or Google reCAPTCHA is set up for the library | Bot protection | Load the form; try to log in | - Turnstile: a small check box / widget shows; Login stays disabled until it is complete (“Please complete the Turnstile verification”)
- reCAPTCHA: a note “This page is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.” shows, with links that open in new tabs
- After each attempt the check resets
|
| Login | Login button | — | Button state and result | Try with an invalid form, wrong details, then correct details | - Disabled while the form is invalid or busy (tooltip explains why)
- Wrong details: “Couldn’t log in: unknown username or PIN”; the fields stay filled
- Correct details: the user is logged in, their name / avatar shows in the navbar, and the app goes to My Account (or back to the page they wanted)
|
| Login | Clear / Cancel buttons | Fields filled | Other buttons | Click Clear; in the dialogue box click Cancel | Clear empties the form; Cancel closes the dialogue box |
| Login | Links | — | Forgot PIN / Join | Click “reset your pin or password” and “join the library” | They open the Reset PIN page and the Registration page. “Join the library” only shows when registration is allowed |
| Login | Return to wanted page | Logged out | Protected pages | Type /user/account in the address bar; log in | The login page opens first; after login the user is taken to My Account |
| Login | Login during an action | Logged out | Login box keeps the page | Click “Place Reservation” or the + lists button on an item; log in | The login box opens over the item; after logging in the item is still open so the user can continue |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Session | Normal time-out | Logged in without “Remember me” | Automatic logout | Leave the app open for just over 1 hour | - The user is logged out and a pop-up says “Your session has expired, please log in again.”
- If they were on My Account they are taken to the login page
- An open footer tray closes
|
| Session | Kiosk time-out warning | Kiosk mode (section 46); logged in | Warning before logout | Log in and do not touch the screen | - When 60 seconds are left, a “Session Expiring Soon” box shows with a live countdown
- “Yes, Keep me logged in” resets the timer and closes the box
- “No, Log me out” logs out straight away
- If nothing is pressed, the user is logged out when the countdown reaches 0
- Any tap, click or key press before the warning resets the timer
|
| Logout | Logout buttons | Logged in | Log out | Log out from the user menu, the side menu, and the “Logout” button in My Profile | - The user is logged out from each place
- The navbar shows the logged-out state; the footer tray disappears
- Typing /user/account afterwards goes to the login page
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Reset PIN | Page | Logged out | Form fields | Go to /user/reset | - “Your Borrower Number” field (letters, numbers, dots, dashes only; “Only numbers and letters are allowed” otherwise)
- “Your Email Address” field only if the library requires the email for resets
- The human check (Turnstile / reCAPTCHA) if set up
|
| Reset PIN | Send Request / Clear | Fields filled | Send the request | Click Clear; fill again and click “Send Request” | - Clear empties the fields
- Send Request shows: “The request was sent successfully! If there is a user associated with that Borrower Number, you will receive…” (the same message shows for unknown numbers, for privacy)
- A reset email arrives for a real user
|
| Reset PIN | From My Profile | Logged in | Reset PIN dialogue box | Click “Reset my PIN” in My Profile (or “Reset {name}’s PIN” for a linked account) | - A dialogue box opens with the borrower number (and email) already filled and locked
- No human check is needed
- After sending, the Cancel button changes to “Ok”
|
| New PIN | Link from the email | A reset email | New PIN page | Click the link in the email. Also try /user/pin with no code | The “New PIN” (or “New Password”) page opens. Without a valid code the “Lost in the library?” page shows |
| New PIN | Field rules | On the page | New and confirm fields | Type different values; type matching values; use the show / hide button | - PIN libraries: numbers only, with the library’s minimum / maximum length
- Password libraries: must contain at least three of: uppercase, lowercase, number, special character
- “Your two PINs do not match” until both match
- Show / hide reveals both fields
- Save is disabled until the form is valid; Clear empties both fields
|
| New PIN | Save | Valid form | Save the new PIN | Click Save; use the same link again | - “Success! you will be redirected shortly to login page.” and the login page opens; the new PIN works
- Using the link again: “Couldn’t reset your PIN, maybe you’ve used an expired or already used link…”
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Registration | Access to the page | A registered user who can log in | Access depends on login | Log in / out; go to /user/register | - Logged out: the form shows, with “Already have an account? Please login here”
- Logged in: the app goes to My Account instead; no Join links in the menus; the footer banner shows the library name only
- Registration not allowed in the CMS: the “Lost in the library?” page shows
- No form fields set up: “Sorry, no data found for the form! please try to refresh the page.”
|
| Registration | Form fields | — | Each field: correct content and required or not | Fill in and clear each field | - Text fields accept normal characters; disallowed content shows “contains characters that are not allowed”
- Number / phone fields accept numbers only
- Email must look like an email address
- Drop-downs start on “Please select”
- Marketing tick-boxes read “I agree”
- Required fields (*) show “Your {field} is required” after being touched and left empty
- Minimum / maximum lengths show their own messages
|
| Registration | Date of birth | A date of birth field | Date rules | Pick a future date; pick a date over 130 years ago | “Your date of birth cannot be in the future!” / “Your age can’t be over 130 years!” |
| Registration | PIN / Password + Confirm | A PIN or password field | Matching | Type different values, then the same; use show / hide | “Your PIN and confirm PIN do not match!” until they match; show / hide reveals both |
| Registration | Address finder | An address field (UK postcodes) | Find an address by postcode | Type a postcode and click “Find my Address”; choose an address. Try a wrong postcode | - “Searching for addresses…” then a list to “Please select your address”
- Near-matches show “Did you mean any of these?”
- Wrong postcode: “Postcode not found” / “No addresses found for this postcode”
- Choosing fills the address
|
| Registration | Edit / manual address | As above | Edit or type the address | Click “Edit my address”; then “Enter my address manually” | A form with Address Line 1–4, Town/City, Postcode, Country opens, with Save, Reset and Hide buttons. Saved values are used in the registration |
| Registration | Register button | Form partly or fully filled | Button follows the form | Hover / click the button | Disabled until all required fields are valid (and the human check is done); the tooltip says “The form is invalid!…” |
| Registration | Clear button | Form filled | Clear the form | Click Clear | All fields, the address and any errors are cleared |
| Registration | Submit | Valid form | Start registration | Click Register | The email verification box opens (section 23) |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Verify Email | Dialogue box | A valid registration was submitted | Code box and email | Check the box and the email inbox | - A “Verify Your Email Address” box shows the email address and the instructions (valid for 10 minutes, check spam, numbers only)
- An email with a 6-digit code arrives
|
| Verify Email | Entering the code | Box open | Six digit boxes | Type letters; type digits; paste a code | - Only numbers are accepted; the cursor moves to the next box automatically
- The code is checked as soon as the 6th digit is entered
|
| Verify Email | Wrong / expired code | Box open | Error | Enter a wrong code; wait 10 minutes and enter the right one | “Invalid OTP” / “OTP expired” shows under the boxes |
| Verify Email | Reset / Resend / Cancel | Box open | Buttons | Click Reset; wait for the timer and click Resend; click Cancel | - Reset clears the digits (only available after a check)
- Resend shows a countdown and is disabled until it ends; then a new code is emailed and the old one stops working
- Cancel (or X) closes the box; the form keeps its values
|
| Verify Email | Correct code | Box open | Finish registration | Enter the correct code | A success message shows, the new user is logged in automatically, and the app goes to My Account > My Bookshelf |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| My Account | Access | — | Logged out access | Go to /user/account while logged out | The login page opens; after login, My Account opens |
| My Account | Tabs | Logged in | Tabs and web address | Click each tab; refresh; use the browser Back button | - Tabs: My Bookshelf, My Lists, My Favourites (only if Events or Blog is set up), My Profile, Linked Accounts
- The web address shows ?tab=my-bookshelf / my-lists / my-favourites / my-profile / linked-accounts
- Refreshing keeps the same tab
- On mobile the tabs show icons
|
| My Account | Account selector (“Viewing”) | User with linked accounts | Choose whose items to see | On My Bookshelf or My Profile choose “All Accounts”, “Me”, then a linked person | - All Accounts: items of everyone, titles e.g. “All Accounts Loans”, and a “Borrower” column / label
- Me: only the main user’s items
- A person: only their items, titles e.g. “Anna’s Loans”, “Anna’s Profile”
- Empty messages name the person, e.g. “Anna doesn’t have any loans currently”
- Without linked accounts the selector does not show
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| My Bookshelf | Rows | Logged in | Rows shown | Open My Bookshelf | Rows: My Loans / Renewals, My Reservations, My Loan History, My Event Bookings (only if Events is set up) |
| My Bookshelf | Each row | Items in each row | Row controls | Use the reload button and the “Show as table” switch on each row; reload the page | - The number in brackets matches the items
- Reload refreshes that row only (it spins while loading)
- “Show as table” switches that row to a table (section 26); the choice is remembered for each row
|
| My Bookshelf | My Loan History | User with past loans (and loan history switched on) | History row | Look at the row | Past loans show with “Your last check out date”. None: “You don’t have any previous loans” |
| My Bookshelf | My Event Bookings | User with current and past event bookings | Bookings row | Look at the row; switch “Show all bookings” on and off | - Off (default): only upcoming bookings
- On: past bookings are included
- Each ticket shows the event name, date, cost (or Free) and status tags: Cancelled, Refunded, Checked-In, Expired Event, Cancelled Event
- None: “You don’t have any active bookings.”
|
| Loans page | /user/loans and /user/reservations | Logged in | Full-page lists | Go to /user/loans and /user/reservations (also logged out) | - All loans / reservations show as a grid with page numbers
- Logged out: the login page opens first
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Table | Columns | “Show as table” switched on | Columns per row type | Turn on the table for loans, reservations, history and a list | - Loans: cover, Title, Author, (Borrower), Times Renewed, Date Due (“12 days”, “Only 2 days left”, “Today!”, “Overdue”), Actions
- Reservations: cover, Title, Author, (Borrower), Status (“Pending” / “Pickup by {date}”), Pickup at, Expires, Place in queue (if the library shows it), Actions
- Loan History: cover, Title, Author, (Borrower), Returned, Actions
- Lists: cover, Title, Author, Actions
|
| Table | Filter box | Table on | Filter by title | Type part of a title in “Filter the {name} list by title” | Only matching rows show and the matching text is highlighted |
| Table | Sorting & pages | More than 5 rows | Sort and page | Click column headers; use the page arrows and “Rows per page” (5 / 10 / 25) | Rows sort ascending / descending; page buttons (first, previous, next, last) and rows per page work |
| Table | Title & author | Table on | Clicking text | Click a title; click an author | The title opens the item / loan / reservation dialogue box; the author runs a search for that author |
| Table | Loan actions | Loans table | Return / Renew / Read | Click each action where shown | - Return (only for returnable loans): asks “Are you sure you want to return this loan?”; Proceed returns it
- Renew: asks to confirm; success / failure pop-up; a fee may need confirming
- Read (eContent): opens the reader in a new tab; in kiosk mode shows a QR code to scan
|
| Table | Reservation actions | Reservations table | Change / Suspend / Resume / Cancel | Click each action where shown | Change and Suspend open the reservation details at that tab (section 27); Resume and Cancel ask to confirm, then show a pop-up result |
| Table | History action | Loan History table | Reborrow | Click “Reborrow” | The “Place Reservation” box opens for that title |
| Table | List actions | A list shown as a table | Remove / Move | Click Remove; click Move and choose a list | - Remove deletes the title from the list with a pop-up confirmation
- Move opens “Move Item to Another List” with “Select destination list” (or “No other lists available”)
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Loan Details | Opening | A loan | Details box | Click a loan jacket; also open /user/loans/{id} directly | A box (or full page) with tabs: Details, Return (only if allowed), Renew, Read (only for eContent). A wrong id shows the “Lost in the library?” page |
| Loan Details | Details tab | As above | Information | Read the Details tab; click “View item” | Title, Author, Format, (Borrower), Due in, Due date, Renewal cost, Renewal count, Renewals Remaining. “View item” opens the item details |
| Loan Details | Return tab | A returnable loan | Return | Click Proceed; open again and click Keep | Proceed: “Your loan has been returned successfully!” and it leaves My Loans. Keep: nothing changes |
| Loan Details | Renew tab | A renewable loan and a non-renewable loan | Renew | Open the tab for each | - Renewable: Proceed renews (“Your loan has been renewed successfully”) and the due date updates; Cancel shows “Loan renewal cancelled”
- Not renewable: “This loan cannot be renewed.” with the Reason (or “No specific reason provided.”)
|
| Loan Details | Read tab | An eContent loan | Open the title | Click Read | The reader opens in a new tab; in kiosk mode a QR code shows instead |
| Reservation Details | Details tab | A reservation | Information | Click a reservation jacket | Title, Author, Format, (Borrower), Pickup Location, Reservation Expiry, Pickup Expiry, Status (Pending / Ready), Suspend From / To, Position in the queue (if shown). Ready items show “The item is ready to be collected from {library}” |
| Reservation Details | Change tab | A reservation that can be changed | Change pickup location | Choose a new location and click Proceed | Proceed is disabled until a different location is chosen; then “Your reservation pickup location has been changed successfully” |
| Reservation Details | Suspend tab | A reservation that can be suspended | Suspend | Choose the dates (or end date) and click Proceed | - Depending on the library: a start / end date range, an end date only, or no dates
- Past dates cannot be chosen; Proceed is disabled until dates are chosen
- Success: “Your reservation has been suspended successfully”; the jacket shows “This item is suspended”
- Not possible: “Unable to suspend this reservation!”
|
| Reservation Details | Resume tab | A suspended reservation | Resume | Click Proceed | Shows Suspend Start / End, then “Your reservation has been resumed successfully” |
| Reservation Details | Cancel tab | A cancellable reservation | Cancel | Click Proceed; open again and click Keep | Proceed: “Your reservation has been cancelled successfully!”; Keep: nothing changes |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| My Lists | Tab | Logged in | Lists shown | Open the My Lists tab with and without lists | - “Loading your lists…” then one row per list with its name, item count and a lock icon (Private) or open lock (Public)
- No lists: “You don’t have any lists!”
- An empty list shows “No items found in this list”
|
| My Lists | “Create new list” | Logged in | Create a list | Click “Create new list”; try an empty name, 2 characters, special characters, then a valid name; choose Public / Private; click Create | - Errors: “You must enter a name”, “You must enter at least 3 characters”, “No special characters are allowed in the name”
- Success: “List {name} has been created successfully” and the list appears
- Clear empties the box; Cancel closes it (it reads “Ok” after creating)
|
| My Lists | “Show as table” | A list with items | Table view per list | Switch on for one list; reload the page | That list shows as a table (section 26); the choice is remembered per list |
| My Lists | Share button | A public and a private list | Share only public lists | Look at both rows | The Share button only shows on public lists (section 41) |
| My Lists | Three-dots menu | A list with items | Menu options | Open the three-dots menu on a list row | - “Full Screen” opens the list page in a new tab
- “Print” prints the list (section 31) — disabled when the list is empty
- “Reload” reloads the list (the icon spins)
- “Edit items” opens the list page in bulk-edit mode in a new tab (section 30) — disabled when empty
- “Edit list” opens the Edit List box
- “Delete” asks “Are you sure? This will delete ‘{name}’ and all its contents permanently.”
|
| My Lists | Edit list | A list | Rename and privacy | Open “Edit list”, change the name and / or Public / Private, click Save | “List {name} has been edited successfully”; the name and lock icon update. Clear resets the box |
| My Lists | Delete list | A list | Delete | Choose Delete; click Cancel; repeat and click Delete | Cancel keeps the list; Delete removes it with “Your list {name} deleted successfully.” |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| List Page | Owner view | Logged in owner of the list | Full list page | Open /lists/{id} (e.g. via “Full Screen”) | List name, item count, Public / Private label, all items as jackets, Share (public lists only) and a three-dots menu with Print, Edit items, Edit list, Delete |
| List Page | Visitor view | A public list; open it logged out or as another user | Read-only list | Open the shared list link | Items show; no Public / Private label and the three-dots menu only has Print. No editing is possible |
| List Page | Private list | A private list; open it logged out or as another user | No access | Open the list link | The “Lost in the library?” page shows |
| List Page | Empty list | A list with no items | Empty message | Open it | “There are no items in this list yet!”; Print and Edit items are disabled |
| Bulk Edit | Start editing | Owner; list with items | Enter edit mode | Choose “Edit items” in the three-dots menu (or open /lists/{id}?edit=true) | - A tick-box shows under each item; the web address gets ?edit=true
- Controls appear: “Select all”, “Move selected” drop-down, “Delete selected”, “Finish editing”
- Clicking a jacket does not open the item while editing
- “Edit items”, “Edit list” and “Delete” are disabled in the menu while editing
|
| Bulk Edit | Selecting | Edit mode | Tick-boxes | Tick some items; click Select all; click it again | - Select all ticks every item; clicking again unticks all
- With only some ticked, Select all shows a partly-ticked state
- “Move selected” and “Delete selected” stay disabled until at least one item is ticked
|
| Bulk Edit | Move selected | Edit mode; items ticked; user has other lists | Move items to another list | Choose a list in “Move selected”; click Cancel; repeat and click Ok | - A box asks: “Are you sure you want to move the {N} selected items from ‘{A}’ list to ‘{B}’ list?”
- Cancel: nothing moves and the selection is cleared
- Ok: items move; pop-up “Successfully moved {N} items to another list”; both lists update
- “Move selected” only shows if the user has another list
|
| Bulk Edit | Move — duplicates | Some ticked items already exist in the target list | Duplicate handling | Move them | Warnings: “Moved X item(s). Y item(s) already exist in target list and were not moved.” or “All X item(s) already exist in the target list. No items were moved.” |
| Bulk Edit | Move to a new list | Edit mode; items ticked | Create a list while moving | Choose “Create new list” at the bottom of “Move selected”; enter a name; Create | The new list is created and the ticked items are moved into it |
| Bulk Edit | Delete selected | Edit mode; items ticked | Remove items | Click “Delete selected”; Cancel; repeat and Ok | - Asks: “Are you sure you want to delete the {N} selected item(s) from ‘{list}’ list?”
- Ok removes them with “Successfully deleted {N} items from the list”
- A loading sign shows while it works
|
| Bulk Edit | Finish editing | Edit mode | Leave edit mode | Click “Finish editing” | Tick-boxes and edit controls disappear, ?edit=true is removed from the address, and jackets can be clicked again |
| Bulk Edit | Partial failure | Poor connection | Error messages | Move / delete while the connection drops | A message such as “Some operations completed successfully, but others failed” or “Failed to move items between lists” |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| QR Codes | “Share with QR Codes” button | My Lists tab | Button state | Look at the button with and without public lists | Disabled when the user has no public lists |
| QR Codes | “Share My Public Lists” box | At least one public list | Choose lists | Click the button; untick / tick lists; use Select All / Deselect All | - All public lists are ticked at first, each with its item count
- “{X} of {Y} lists selected” updates
- Select All shows a partly-ticked state when only some are ticked
|
| QR Codes | Print | Box open | Print the QR page | Leave “Document Title” empty; then type a title and click Print | - Print is disabled until a title is typed and at least one list is ticked
- The print window opens with an A4 page: library logo, the title, and a QR code with the name of each chosen list
- Scanning a QR code with a phone opens that list
- Works on desktop and mobile browsers; Cancel closes the box
|
| Print | Print a list or recommendations | A list or a recommendation carousel with items | Printable document | Choose “Print” in the three-dots menu | “Preparing document” / “Loading images” shows, then the print window opens with the library logo, the list name and each item’s cover, title, author, publication year and ISBN |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| My Profile | Details | Logged in | Profile information | Open the My Profile tab | The user’s details from the library system show (e.g. name, date of birth, member since, email, phone, borrower number, home library). Read-only details have no pencil icon |
| My Profile | Edit a detail | A detail with a pencil icon | Edit dialogue box | Click the pencil; change the value; Save. Try Reset and Cancel | - An “Edit {field}” box opens with the current value
- Save updates the profile; Reset restores the value; Cancel closes the box
- For dates, choosing the same date shows “Please select a different date.”
|
| My Profile | Avatar | Logged in | Choose an avatar | Click “Update my avatar”; pick one; Save. Try Clear, Undo and Cancel | - The “User Avatar Selector” box shows the current avatar and a gallery
- Save updates the avatar in the profile, the navbar and the Linked Accounts card
- Clear removes the avatar (initials show instead); Undo goes back to the saved one; Cancel closes
|
| My Profile | Reset PIN / Logout buttons | Logged in | Buttons | Click “Reset my PIN”; click “Logout” | Reset PIN opens the reset box (section 21); Logout logs the user out |
| My Profile | Linked account selected | User with linked accounts; one selected in “Viewing” | Profile of another person | Choose a linked person | Titles and buttons use their name (“Anna’s Profile”, “Update Anna’s avatar”, “Reset Anna’s PIN”), and their details show |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| My Membership | Current / Next membership | A library and user with paid memberships | Membership details | Open My Profile | - “Current Membership” and “Next Membership” with Category, Service Period, Payment Type, Amount (incl. VAT) and Payment Date (if paid)
- If the next category is different: “Your membership category will be updated at the end of the current period.”
- Users without memberships: the section has no details
|
| My Membership | Pay buttons | An unpaid membership with a payment link | Pay | Click “Pay membership” / “Pay next membership”; complete or cancel the payment | The payment page opens; afterwards the user returns to My Profile. The button disappears once paid |
| My Charges | No charges | User with no charges | Empty state | Open My Profile | “No charges” |
| My Charges | Charges list | User with charges | Charges shown | Open My Profile | “Current Fines/Blocks: {number}”, “Total Due”, and a list with Title/Explanation and Amount |
| My Charges | “Pay Now” link | A general payment link is set for the library (no per-charge payment) | External payment | Click “Pay Now” | The library’s payment page opens in a new tab |
| My Charges | Select charges to pay | Per-charge payment is available | Choose and pay | Tick charges; use Select all; click “Pay charges” | - A “Pay” column with tick-boxes shows only for payable charges
- “Total to be paid” updates as charges are ticked
- “Pay charges” is greyed out until something payable is ticked, then opens the payment page
|
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Preferences | Boxes shown | Logged in, viewing “Me” or “All Accounts” | Which boxes appear | Open My Profile > My Preferences | Colour Theme, Genres, Formats, Pop-up Messages, plus Notifications and Marketing (if the library uses marketing options) and Loan History (if the library supports it) |
| Preferences | Edit / Save / Cancel | As above | Editing a box | Click Edit on one box; try to edit another; click Cancel; edit again and Save | - Only one box can be edited at a time
- Cancel restores the saved choice
- Save stores it and shows a success pop-up; the choice stays after logging out and in
|
| Preferences | Colour Theme | The library has more than one theme | Change theme | Choose “Auto (Library default)” and each theme; Save | The app colours change straight away and are kept after refresh. “Please select one!” if nothing is chosen |
| Preferences | Genres | — | Favourite genres | Tick one genre and Save; then tick two or more and Save | One genre: “Please select at least two of your favourite genres or categories.” Two or more: “Genres has been saved successfully!” |
| Preferences | Formats | — | Preferred formats | Untick all and Save; then tick Read / Listen / Watch / Attend and Save | None: “Please select ONE at least!”; otherwise “Formats has been saved successfully!” |
| Preferences | Pop-up Messages | — | How long pop-ups stay | Choose “I will close the messages manually”, then “…disappear automatically after” and move the slider; click “Try Now”; Save | - “Try Now” shows a sample pop-up: “This pop-up message will last for {X} seconds” or “…will last for ever unless you click on it.”
- After saving, all app pop-ups follow the chosen setting
|
| Preferences | Notifications | Library uses marketing options | How the library contacts the user | Choose an option and Save | The choice is saved in the library system; “Notifications preference has been saved successfully!” |
| Preferences | Marketing | Library uses marketing options | Marketing consent | Choose Yes / No and Save | “Marketing consent has been saved successfully!”; without an answer: “Please select an answer.” |
| Preferences | Loan History | Library supports loan history | Keep borrowing history | Choose Yes / No and Save | - A note explains the library will save the borrowing history for personal use
- Yes: the Loan History row fills over time; No: history is not kept
|
| Preferences | Linked person selected | A linked person chosen in “Viewing” | Their preferences | Open My Profile | A “{name}’s Preferences” section shows only Notifications, Marketing and Loan History for that person. Colour Theme, Genres, Formats and Pop-up Messages are hidden (they belong to the main user) |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Linked Accounts | Tab content | Linked accounts are enabled for the user | Cards | Open the Linked Accounts tab | - “Primary Account” card (the login account) with avatar, borrower number, name and email
- “Linked Accounts” cards for each linked person, or “You don’t have any linked accounts.”
- A “Link Account” button
- If linked accounts are not enabled, the tab content is empty
|
| Linked Accounts | Link an account | The borrower number and PIN of another card | Link Account box | Click “Link Account”; try your own number, an already linked one, wrong PIN, then a correct one | - The box asks for the borrower number and PIN (show / hide PIN, Clear, Cancel)
- Own / already linked: “This account is already linked or is your own account.”
- Wrong details: “Failed to link account”
- Correct: the new card appears, and the “Viewing” selector and “Switch account” menu item appear
|
| Linked Accounts | Select / Deselect | At least one linked account | Choose whose items to view | Click “Select” on a card, then “Deselect” | The selected card gets a coloured border and the app shows that person’s items everywhere; Deselect goes back to “All Accounts”. The primary card’s Select is disabled when there are no linked accounts |
| Linked Accounts | Unlink | A linked account | Remove a link | Click “Unlink” | The card disappears and that person’s items are removed from the bookshelf |
| Linked Accounts | Switch account | Linked accounts exist | From the menus | Choose “Switch account” in the user menu / side menu; pick a person; click Ok | A box with the “Viewing” selector opens; the choice applies across the app |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Footer Tray | Visibility | — | Where it shows | Look at the bottom of the screen logged out, logged in, and on My Account | - Logged out: no tray
- Logged in: a bar fixed at the bottom of every page except My Account
- Hidden while the side menu or the full-screen filters panel is open
|
| Footer Tray | Open / close | Logged in | Toggle | Click the arrow button; click it again; open it and click the dark area above it | - The tray slides up showing My Bookshelf first; the web address gets ?drawer=open&tab=my-bookshelf
- The page behind cannot be scrolled while open
- The arrow or the dark area closes it and removes those parts of the address
|
| Footer Tray | Tabs | Tray shown | Tab buttons | Click each tab; click the active tab again | - Tabs: My Bookshelf, My Lists, My Favourites (if Events / Blog), My Profile, Linked Accounts — icons only on mobile
- Each tab shows the same content as on My Account
- Clicking the active tab closes the tray
|
| Footer Tray | Direct link | Logged in | Open from address | Add ?drawer=open&tab=my-lists to any page address | The page opens with the tray already open on My Lists |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Contact Us | Page | No external Contact Link; Contact Us not hidden for the library | Page content | Go to /contact-us logged out and logged in | Heading “Contact {library}”, the line “Hello, {first name} how can we help?” (name only when logged in), “For all enquiries, please email us using the form below”, and the form |
| Contact Us | External link / hidden | A Contact Link set in the CMS; or a library with Contact Us hidden | Page not used | Go to /contact-us | External link set: the browser goes to that link. Contact Us hidden: the “Lost in the library?” page |
| Contact Us | Form fields | — | Each field: correct content and required or not | Fill in and clear each field | - Text fields (e.g. Name, Library Number, Subject) accept normal characters
- Email accepts email format only
- Drop-downs (e.g. Library) start on “Please select”
- Message is a large text box
- Required fields (*) show errors when touched and left empty
|
| Contact Us | Filled automatically | Logged in | User details | Log in / out; refresh the page | - Logged in: Name, Email and Library Number are filled and locked; the Library drop-down is pre-selected and locked if the home library is in the list
- Logged out: those fields are empty and editable
|
| Contact Us | Send button | Form partly or fully filled | Button state | Hover / click the button | Disabled until all required fields are valid, something was changed, and the human check is complete (if set up for logged-out users) |
| Contact Us | Clear button | Form filled | Clear the form | Click Clear logged out, then logged in | Logged out: all fields clear. Logged in: only Subject and Message clear (the user’s details stay) |
| Contact Us | Sending | An admin email address set in App Settings | Send a message | Click Send | - Success pop-up: “Thank you! Your message has been sent successfully. Someone will be in touch with you shortly.”; the form clears
- Failure pop-up: “Sorry, there was a problem sending your message…”
- The message arrives in the admin’s inbox
|
| Contact Us | No form set up | No contact form fields set up | Empty state | Go to /contact-us | “No data found for the form!” |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Request Item | Access | “Suggest Purchase Form” on / off in the CMS | Page availability | Go to /request-item; also use the “Suggest a purchase” link on a search with no results | On: the “Suggest/Request An Item” page shows. Off: the “Lost in the library?” page and no link on the search page |
| Request Item | Form fields | Page open | Your details + item details | Fill in and clear each field | - The user’s details (e.g. Name, E-Mail, Library card number) follow the library’s setup
- “Item Details”: Title, Author/Artist, Media Type (Book, Audiobook, CD, Blu-ray Disc), Year Published/Edition, More Information
- Required fields show errors when left empty
|
| Request Item | Send / Clear | Form filled | Send a request | Click Clear; fill again and click Send | Clear empties the form. Send (after the human check, if set up) shows a success or failure pop-up, and the request arrives by email |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Share | Share menu | An item, event, blog post, public list or recommendation carousel | Open / close | Click the Share button; click it again | A small menu opens with: Copy link, Email, Facebook, X (Twitter), WhatsApp; clicking again closes it |
| Share | Copy link | Menu open | Copy | Click Copy link; paste it in a new tab | Pop-up: “A shareable link to the item has been copied successfully to the clipboard”. The link opens the same item / event / post / list / recommendations page |
| Share | Email / Facebook / X / WhatsApp | Menu open | Share options | Click each option | Each opens the email program or the social site in a new window with a ready-made message, e.g. “Check this title ‘{title}’ from {library}” |
| Share | Link preview | Shared link pasted into a social site or messaging app | Preview | Paste a shared link | The preview shows the correct title, description and picture |
| Share | Kiosk | Kiosk mode | Hidden | Look for Share buttons | No Share buttons show anywhere |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Cookies | First visit — with analytics | Cookie consent on; the library uses analytics (tracking consent wanted); use a private / incognito window | Cookie panel | Open the app | - A panel “Our use of cookies” covers the page with sections for Essential cookies and Analytics cookies
- If Turnstile / reCAPTCHA is used, a paragraph explains the human verification cookie
- Buttons: “I only accept essential cookies” and “I accept all cookies”
- The page behind cannot be used until a choice is made
|
| Cookies | Accept all | Panel showing | Accept | Click “I accept all cookies” | The page reloads, the panel does not show again, and analytics is active |
| Cookies | Essential only | Panel showing | Decline analytics | Click “I only accept essential cookies” | The page reloads, any analytics cookies are removed, and the panel does not show again |
| Cookies | First visit — no analytics | Cookie consent on; no analytics used | Simple panel | Open the app in a private window | A shorter panel with one button “I accept the website cookies”, which closes it |
| Cookies | “C” icon | After a choice | Change preferences | Click the “C” icon in the lower-left corner | The panel opens again and a new choice can be made. The icon moves up when the footer tray is shown and is hidden when the side menu or tray is open |
| Cookies | Cookie consent off | Cookie consent off in the CMS | No panel | Open the app in a private window | No panel and no “C” icon |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Tabs across the whole app | Visibility | - A Patron user and a Staff user who can log in
- At least one tab branched from the Home-Screen tab
| Tab visibility tests | Change the tab’s Visibility in the CMS. Log in / out. Refresh the page | - “Always”: the tab always shows
- “Pre-Login”: only before login (any user)
- “Post-Login”: only after login (any user)
- “Staff Only”: only after a Staff user logs in
- “Never”: never shows
- Typing the address of a hidden tab shows “Lost in the library?” or the “Restricted content!” message
This applies to navbar tabs, Digital Content tabs, events tabs and blog tabs. |
| Tabs across the whole app | Name and URL Fragment | At least one tab | Rename | Change the tab title or its URL Fragment in the CMS and refresh | - Changing the title changes the tab name
- Changing the URL Fragment changes the tab’s part of the web address
Notes: 1- Changing the title in the CMS changes the URL Fragment automatically while typing; please double-check both before saving. 2- The Account tab address is fixed (/user/account); only its title can be changed. |
| Tabs across the whole app | Icons | A tab with a custom icon and colour | Icons | Set an icon and colour for event / Digital Content tabs | The custom icon and colour show in the tab bars; tabs without an icon show a default picture |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Back to Top button | — | Any long page | Button shows and works | Scroll down; click the button | - After scrolling down about one screen-height (1000 pixels), a small arrow button with “Top” appears in the lower-right corner
- Scrolling back near the top hides it
- Clicking it scrolls smoothly to the top
- It sits higher when the footer tray is shown
|
| Skip to the content | — | Any page | Keyboard shortcut link | Load a page and press Tab once; press Enter | A “Skip to the content” link appears at the top; Enter jumps past the navbar to the page content |
| Pop-up messages | — | Any action with a result (login, reserve, renew, list changes) | Messages | Do several actions | Green for success, red for errors, orange for warnings, blue for information. They close after the time chosen in My Preferences, or when clicked |
| Dialogue boxes | — | Any dialogue box | General behaviour | Open a dialogue box; press Tab many times; press Escape; click the X | - The page behind is darkened and cannot be scrolled
- Tab only moves between items inside the box
- Escape and X close it (where allowed), and focus goes back to the button that opened it
|
| Loading screens | — | Slow connection (e.g. browser set to slow 3G) | Placeholders | Open pages | Grey placeholder shapes matching the page layout show while content loads, then are replaced by the real content |
| Page not found | — | — | Wrong address | Go to /this-page-does-not-exist | “Lost in the library?” — “It looks like that page doesn’t exist, please check the URL and try again.” with the navbar and footer still working |
| Error page | — | An unexpected error happens | Friendly error | (A technical tester can trigger this) | “Oops!” with an explanation, a “Reload the page” button and a link to the Contact Us form |
| Website unavailable | — | The app’s settings cannot be loaded (e.g. during maintenance) | Maintenance message | Open the app during maintenance | A friendly page such as “Website Under Maintenance”, “Configuration in Progress” or “Website Temporarily Unavailable” with advice to try later |
| JavaScript off | — | JavaScript switched off in the browser | Warning | Open the app | A message says JavaScript is disabled and some functionality may not work |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Footer | Join The Library banner | Registration allowed in the CMS | Banner changes with login | Refresh any page; log in / out | - Logged out: “Join {library}” with a “Join” button
- Logged in: only the library name shows (no Join button)
- Registration not allowed: no banner
|
| Footer | Join button | Logged out | Button works | Click Join | The Registration page opens |
| Footer | Custom content | A primary channel with text in its “Description Text” box (Mobile Channel Settings) | Custom footer | Refresh any page | The footer shows that content (titles, links, images, layout) instead of the automatic footer |
| Footer | Automatic — library name, address, phone, email | Primary channel with an empty Description Text; Published Title, Address, Phone, Email set | Automatic details | Refresh any page | - Library name in bold in the middle column
- Address under it
- Phone (tap-to-call) and email (opens email program); on desktop prefixed “T:” and “E:”
|
| Footer | Automatic — opening hours | Empty Description Text; opening hours set | Opening hours | Refresh on desktop, tablet and mobile | - Desktop only (hidden on tablet / mobile), on the left with the title “Opening Hours”
- 7 rows; closed days say “Closed”
- The first day of the week follows the library’s locale
|
| Footer | Automatic — social media | Empty Description Text; at least one of Facebook, X (Twitter), Instagram, YouTube, TikTok links set | Social icons | Refresh; click each icon | Each link set adds the right icon; each opens in a new tab |
| Footer | Automatic — map | Empty Description Text; latitude and longitude set in the primary channel | Map | Refresh on desktop and mobile | A map centred on the library shows on the right. Without a Google Maps key set, the map shows on desktop only |
| Footer | Copyright line | — | Version | Look at the very bottom | “© {current year} LUCi by SOLUS - v 1.7.3.6” |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Themes | Library theme | Themes set up in the CMS | Default theme | Open the app logged out | The library’s colours and logos are used everywhere (navbar, buttons, links, footer) |
| Themes | Dark themes | A dark theme | Readability | Choose a dark theme in My Preferences | All text, icons, dialogue boxes, tables and forms stay readable; dialogue boxes get a border |
| Themes | Custom CSS | Custom CSS set in the CMS | Library styling | Refresh any page | The custom styles are applied |
| Languages | Full translation | More than one language | No untranslated text | Switch to each language and visit every section | All app text is translated (no codes such as “components.login.title” show); dates follow the language |
| Languages | Right-to-left | Arabic available | Layout mirrors | Switch to Arabic | The whole layout is mirrored right-to-left (navbar, carousels, arrows, forms, side menu, share menu) and Arabic fonts load |
| Languages | Default language | — | First visit | Open the app in a private window | The library’s default language is used |
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| Customisations | Sunderland (live and preview) | Testing the Sunderland app | Special layout | Visit Home, Events and the navbar / menus | - A flat hero banner instead of carousels on Home and Events
- Text-only navbar (no icons); the search sits at the end of the navbar as a simple item; no avatar in the user menu
- No Contact Us in the menus, and /contact-us shows the “Lost in the library?” page
- A “Home” link in the navbar and side menu that opens the library’s main website in a new tab
|
| Customisations | Hamburg (live and test) | Testing the Hamburg app; Suggest Purchase on | Request form | Open /request-item | The form has: Name (required, at least 2 characters), E-Mail (optional), Library card number (optional), plus the item details |
| Customisations | All other libraries | Any other app | Standard behaviour | Visit the same areas | Standard carousels, icons, Contact Us and request form from the CMS |
These checks need browser developer tools or technical knowledge. They can be skipped by non-technical testers and handed to the development team.
| Test ID | Element | Sub-Element | Prerequisites | The test(s) | Action Required | Expected Result |
| SEO | Page titles | — | Browser tab titles | Visit pages and read the browser tab title | Each page has a meaningful title, e.g. “{Page} | {Library}”; item pages use the title name; events and posts use their names |
| SEO | robots.txt / sitemap.xml | Live and preview sites | Search engine files | Open /robots.txt and /sitemap.xml | - Live: search engines are allowed except /user/account
- Preview: search engines are blocked
- The sitemap lists public pages
|
| SEO | Item data | An item page | Structured data | View the page source of /manifestations/{id} | Book information (name, author, ISBN, image, address) is included for search engines; expired events are marked not to be indexed |
| Security | Protected pages | Logged out | Redirect to login | Open /user/account, /user/loans, /user/reservations, /recommendations/user | Each redirects to /user/login |
| Security | Security headers | — | Content-Security-Policy | Check the response headers in developer tools | A Content-Security-Policy header is present; no console errors about blocked scripts on normal use |
| Security | Domain redirects | Alias domains / redirects set up for the library | Redirects | Open an alias domain or an old redirected address | The browser is sent permanently to the main domain / new address |
| Security | Test pages | Live site | Developer pages hidden | Open /test-pages | Not available on the live site |
| Security | Missing files | — | Quick not-found | Open /service-worker.js or /apple-touch-icon-precomposed.png | A plain “not found” response, not the full app page |
| Security | Forms without verification | Turnstile / reCAPTCHA set up | Bot protection | Submit login, registration, contact, request and reset forms with the check expired | “Security verification expired or invalid. Please refresh and try again.” |
| Health | /api/health | — | Service health | Open /api/health | A status report shows the app version and that its connections are working |
| Analytics | Consent respected | Analytics set up | Tracking only after consent | Check network requests before and after accepting cookies | No analytics requests before accepting; analytics loads only after “I accept all cookies” |