Skip to content

Bundles - QA Test Plan

The Bundles app allows instructors to package multiple courses together and offer them at a discounted bundle price. It depends on the Courses app for course data. Routes are under /business/apps/bundles/.

  • draft — Newly created, not yet published
  • published — Visible and purchasable by students
  • inactive — Taken down from the storefront

IDDescriptionPreconditionsStepsExpected ResultPriority
BN-001Dashboard loads with statsUser is logged in as instructorNavigate to /business/apps/bundlesPage shows stat cards: Total Bundles, Published, Total Sales, Revenue (USD formatted)P0
BN-002Bundle list rendersBundles existView dashboardEach bundle row shows thumbnail (or placeholder icon), title, course count, sales count, date, price, and status badgeP0
BN-003Status badges render correctlyBundles with draft/published/inactive statusesView listDraft = secondary, Published = default, Inactive = destructiveP1
BN-004Empty state when no bundlesNo bundles existView dashboard”No bundles yet” message shownP1
BN-005New Bundle button links correctlyUser is logged inClick “New Bundle” buttonNavigates to /business/apps/bundles/newP0
BN-006Bundle row links to detailBundles existClick on a bundle rowNavigates to /business/apps/bundles/{id}P0
BN-007Revenue displays correct currency formatStats have revenue dataView Revenue stat cardAmount formatted as USD (e.g., “$1,250.00”)P1

IDDescriptionPreconditionsStepsExpected ResultPriority
BN-010Create page loads with formUser is logged inNavigate to /business/apps/bundles/newForm shows Title, Description, Price, Compare Price, and Thumbnail URL fieldsP0
BN-011Create bundle with valid inputUser is logged in1. Enter title “Complete Web Dev Bundle” 2. Enter description 3. Set price to 49.99 4. Click “Create Bundle”Bundle is created; user redirected to /business/apps/bundles/{id}?new=1P0
BN-012Title is requiredUser is logged inLeave title empty, submitValidation error on title fieldP0
BN-013Price is required and numericUser is logged inLeave price empty or enter non-numeric, submitValidation error on price fieldP0
BN-014Compare price is optionalUser is logged inFill title and price, leave compare price empty, submitBundle created successfully without compare priceP1
BN-015Thumbnail URL is optionalUser is logged inFill required fields, leave thumbnail empty, submitBundle created with placeholder icon in listP1
BN-016Cancel returns to dashboardUser is on create pageClick “Cancel”Navigates to /business/apps/bundlesP2
BN-017Submit shows loading stateUser fills formClick “Create Bundle”Button shows “Creating…” with spinner; button disabledP1
BN-018Server error shows toastServer returns 500Submit form (simulated error)Error toast displays server error messageP1

IDDescriptionPreconditionsStepsExpected ResultPriority
BN-020Detail page loads for ownerBundle exists, user is ownerNavigate to /business/apps/bundles/{id}Page shows title, status badge, thumbnail, description, price, compare price (strikethrough), created date, stats, and included coursesP0
BN-021New bundle toast on creationRedirected with ?new=1Navigate with ?new=1Success toast “Bundle created!” appears; param is cleaned from URLP1
BN-022Price and compare price displayBundle has both price and compare_priceView detailPrice shown in USD format; compare price shown with strikethroughP0
BN-023Sales stats displayBundle has salesView detail pageTotal Sales count and Revenue stat cards render correctlyP1
BN-024Edit button links correctlyBundle detail loadedClick “Edit” buttonNavigates to /business/apps/bundles/{id}/editP0

IDDescriptionPreconditionsStepsExpected ResultPriority
BN-030Publish draft bundleBundle status is draftClick “Publish” buttonStatus changes to published; success toast; page refreshes; button changes to “Unpublish”P0
BN-031Unpublish published bundleBundle status is publishedClick “Unpublish” buttonStatus changes to draft/inactive; success toast; page refreshes; button changes to “Publish”P0
BN-032Publish shows loading spinnerUser clicks PublishObserve buttonSpinner shown, button disabled during requestP2
BN-033Publish failure shows toastServer errorClick Publish (simulated failure)Error toast “Failed to publish”P1

5. Course Management (Courses App Dependency)

Section titled “5. Course Management (Courses App Dependency)”
IDDescriptionPreconditionsStepsExpected ResultPriority
BN-040Included courses section displaysBundle has coursesView detail page”Included Courses” section shows courses with index number, thumbnail, title, type, and individual priceP0
BN-041Add course via picker dialogInstructor has courses not in bundle1. Click “Add Course” 2. Search or browse available courses 3. Click a courseCourse is added to bundle; success toast; dialog closes; list refreshesP0
BN-042Course picker search filters resultsInstructor has multiple coursesOpen picker, type search termOnly courses matching the search term are shownP1
BN-043Already-included courses hidden from pickerBundle has some coursesOpen course pickerCourses already in the bundle are not listed in available coursesP0
BN-044All courses in bundle messageAll instructor courses are addedOpen course picker with empty search”All your courses are already in this bundle” message shownP1
BN-045Remove course from bundleBundle has coursesClick trash icon on a course rowCourse is removed; success toast; list refreshesP0
BN-046Add course shows loading stateUser clicks a course in pickerObserve button/rowSpinner shown on the selected course rowP2
BN-047Remove course shows loading stateUser clicks removeObserve trash buttonSpinner replaces trash icon during requestP2
BN-048Empty courses stateBundle has no coursesView included courses section”No courses yet. Add courses to build your bundle.” dashed border messageP1

IDDescriptionPreconditionsStepsExpected ResultPriority
BN-050Edit page loads with current dataBundle exists, user is ownerNavigate to /business/apps/bundles/{id}/editForm pre-filled with current title, description, price, compare price, and thumbnail URLP0
BN-051Update bundle detailsUser changes title and priceEdit fields and click “Save Changes”Bundle is updated; success toast “Bundle updated!”P0
BN-052Update validation - title requiredUser clears titleClear title field, submitValidation error on titleP0
BN-053Update compare priceUser changes compare priceSet compare price to 99.99, saveCompare price updates and shows strikethrough on detail pageP1
BN-054Cancel returns to detail pageUser is on edit pageClick “Cancel”Navigates back to /business/apps/bundles/{id}P2

IDDescriptionPreconditionsStepsExpected ResultPriority
BN-060Delete bundle with confirmationBundle exists1. Click trash icon 2. Confirm in dialogBundle deleted; user redirected to /business/apps/bundlesP0
BN-061Cancel delete dialogDelete dialog shownClick “Cancel”Dialog closes; bundle remainsP2
BN-062Delete shows loading stateUser confirms deleteObserve dialog buttonSpinner on delete button; button disabledP2
BN-063Delete failure shows toastServer errorConfirm delete (simulated failure)Error toast “Failed to delete bundle”P1

IDDescriptionPreconditionsStepsExpected ResultPriority
BN-070Unauthenticated user redirected on createUser not logged inNavigate to /business/apps/bundles/newRedirected to /loginP0
BN-071Non-owner gets 403 on detailLogged in as different instructorNavigate to another instructor’s bundle403 error thrownP0
BN-072Non-existent bundle returns 404Invalid bundle IDNavigate to /business/apps/bundles/nonexistent404 “Bundle not found” errorP1
BN-073Non-owner gets 403 on editLogged in as different instructorNavigate to another instructor’s bundle edit page403 error thrownP0