{"ns":"provingground","title":"Proving Ground","version":"1.0","summary":"Proving Ground is a small practice site for people learning test automation. It offers a practice login page with inline errors, a success page with log out, a practice index, placeholder site pages and a static courses table. Login is validated in the browser only, after a short delay, and needs no account.","problem":"Learners need a stable, predictable target where positive, negative and boundary behaviour is documented exactly, so they can practise writing reliable checks.","personas":[{"name":"Learner","need":"A page with clear, repeatable success and error behaviour to practise login and table checks."},{"name":"Instructor","need":"Fixed content (messages, headings, table rows) that exercises can assert against."}],"goals":["Every message, heading and table cell is stable and exactly as documented.","Login rules are simple and deterministic: exact match, fixed check order.","All navigation targets resolve."],"features":[{"id":"LGN","title":"Practice login","summary":"Login form validated in the browser, with a hint showing the practice credentials.","reqs":[{"id":"FR-LGN-01","weight":"Must","text":"The login page presents a labelled form and the practice credentials; submitting the credentials shown leads to the success page.","accept":["Path /provingground/practice-test-login/, heading \"Test login\", hint \"Username: <name> Password: <password>\" (values as displayed on the page)","Valid credentials redirect to /provingground/logged-in-successfully/ with heading \"Logged In Successfully\"","Tab title \"Logged In Successfully | Proving Ground\""]},{"id":"FR-LGN-02","weight":"Must","text":"A wrong username shows the alert \"Your username is invalid!\" and the page does not navigate.","accept":["Username \"incorrectUser\" with the correct password: red alert \"Your username is invalid!\"; URL unchanged"]},{"id":"FR-LGN-03","weight":"Must","text":"A wrong password with a correct username shows the alert \"Your password is invalid!\" and the page does not navigate.","accept":["Correct username with password \"incorrectPassword\": red alert \"Your password is invalid!\"; URL unchanged"]},{"id":"FR-LGN-04","weight":"Should","text":"The username is checked before the password: when both are wrong, or both empty, only the username message is shown.","accept":["Wrong username and wrong password: \"Your username is invalid!\" only","Both fields empty: \"Your username is invalid!\""]},{"id":"FR-LGN-05","weight":"Should","text":"Credentials must match exactly: comparison is case-sensitive and values are not trimmed.","accept":["Username with a capital first letter: \"Your username is invalid!\"","Password in lower case: \"Your password is invalid!\"","Username with a trailing space: \"Your username is invalid!\""]},{"id":"FR-LGN-06","weight":"Could","text":"Each submit hides any previous alert and, after about 300 ms, shows the result of that attempt only; one message is shown at a time.","accept":["After a wrong username then a wrong password, the alert is briefly hidden and then reads \"Your password is invalid!\"; never both messages at once"]},{"id":"FR-LGN-07","weight":"Could","text":"Fields are labelled, the password is masked and the error container is an alert region hidden until a failed submit.","accept":["\"Username\" is a text input #username and \"Password\" a password input #password","#error has role \"alert\" and is not visible before a failed submit"]}]},{"id":"OUT","title":"Success page and log out","summary":"Confirmation after login with a way back.","reqs":[{"id":"FR-OUT-01","weight":"Should","text":"The success page greets the user and offers Log out, which returns to an empty login form.","accept":["Message \"Congratulations <username>. You successfully logged in!\" and a \"Log out\" button","Log out goes to /provingground/practice-test-login/ with heading \"Test login\" and both fields empty"]}]},{"id":"NAV","title":"Navigation","summary":"Practice index and primary menu.","reqs":[{"id":"FR-NAV-01","weight":"Should","text":"The Practice page lists the practice pages and each link opens its page.","accept":["Home has a \"Practice\" button leading to heading \"Practice\" with links \"Test Login Page\" and \"Test Table\"","Test Login Page opens \"Test login\"; Test Table opens \"Test Table\""]},{"id":"FR-NAV-02","weight":"Could","text":"Every primary menu item resolves; placeholder pages say they are coming soon and the brand returns home.","accept":["Courses, Blog and Contact show headings \"Courses\", \"Blog\", \"Contact\", each with \"Coming soon.\"","Clicking \"Proving Ground\" opens Home with heading \"Hello\"","Menu: Home, Practice, Courses, Blog, Contact"]}]},{"id":"TBL","title":"Courses table","summary":"Static table for reading and assertion exercises.","reqs":[{"id":"FR-TBL-01","weight":"Must","text":"The table #courses_table lists exactly five courses with fixed columns and content.","accept":["Columns: ID, Course Name, Language, Level, Enrollments","1 WebDriver with Java for beginners, Java, Beginner, 28,000+","2 WebDriver with Java: Advanced, Java, Advanced, 12,000+","3 Browser automation with TypeScript, TypeScript, Intermediate, 9,000+","4 End-to-end testing fundamentals, JavaScript, Beginner, 15,000+","5 Python browser automation, Python, Intermediate, 18,000+","Most enrolments: course 1"]},{"id":"FR-TBL-02","weight":"Should","text":"Filtering by reading yields a predictable result for Level.","accept":["Level \"Beginner\": exactly \"WebDriver with Java for beginners\" (Java) and \"End-to-end testing fundamentals\" (JavaScript)"]}]}],"nfr":[],"glossary":[{"term":"Practice credentials","meaning":"The username and password shown on the login page for learners to use."}],"outOfScope":["Server-side authentication","Blog and course content"]}