Compare View
Commits (2)
Diff
Showing 1 changed file Inline Diff
TestCases.tex
View file @
bd1f4d1
\documentclass[letterpaper]{scrartcl} % or whatever | 1 | 1 | \documentclass[letterpaper]{scrartcl} % or whatever | |
\usepackage{tgpagella} | 2 | 2 | \usepackage{tgpagella} | |
\setkomafont{disposition}{\normalfont\bfseries} | 3 | 3 | \setkomafont{disposition}{\normalfont\bfseries} | |
%\usepackage[markuppercase]{scrpage2} | 4 | 4 | %\usepackage[markuppercase]{scrpage2} | |
\title{\huge System Test Plan} | 5 | 5 | \title{\huge System Test Plan} | |
\date{\today} | 6 | 6 | \date{\today} | |
\author{\Large Students With A Goal (S.W.A.G.)} | 7 | 7 | \author{\Large Students With A Goal (S.W.A.G.)} | |
\usepackage[pass]{geometry} | 8 | 8 | \usepackage[pass]{geometry} | |
\usepackage{hyperref} | 9 | 9 | \usepackage{hyperref} | |
\usepackage{graphicx} | 10 | 10 | \usepackage{graphicx} | |
\usepackage{enumitem} | 11 | 11 | \usepackage{enumitem} | |
\setlist[description]{style=multiline,leftmargin=3cm,font=\normalfont\textbf} | 12 | 12 | \setlist[description]{style=multiline,leftmargin=3cm,font=\normalfont\textbf} | |
\setlistdepth{9} | 13 | 13 | \setlistdepth{9} | |
14 | 14 | |||
\setlist[itemize,1]{label=$\bullet$} | 15 | 15 | \setlist[itemize,1]{label=$\bullet$} | |
\setlist[itemize,2]{label=$\bullet$} | 16 | 16 | \setlist[itemize,2]{label=$\bullet$} | |
\setlist[itemize,3]{label=$\bullet$} | 17 | 17 | \setlist[itemize,3]{label=$\bullet$} | |
\setlist[itemize,4]{label=$\bullet$} | 18 | 18 | \setlist[itemize,4]{label=$\bullet$} | |
\setlist[itemize,5]{label=$\bullet$} | 19 | 19 | \setlist[itemize,5]{label=$\bullet$} | |
\setlist[itemize,6]{label=$\bullet$} | 20 | 20 | \setlist[itemize,6]{label=$\bullet$} | |
\setlist[itemize,7]{label=$\bullet$} | 21 | 21 | \setlist[itemize,7]{label=$\bullet$} | |
\setlist[itemize,8]{label=$\bullet$} | 22 | 22 | \setlist[itemize,8]{label=$\bullet$} | |
\setlist[itemize,9]{label=$\bullet$} | 23 | 23 | \setlist[itemize,9]{label=$\bullet$} | |
\renewlist{itemize}{itemize}{9} | 24 | 24 | \renewlist{itemize}{itemize}{9} | |
\begin{document} | 25 | 25 | \begin{document} | |
\maketitle | 26 | 26 | \maketitle | |
\begin{center} | 27 | 27 | \begin{center} | |
\includegraphics[width=12cm]{../swag_logo.png}\\ | 28 | 28 | \includegraphics[width=12cm]{../swag_logo.png}\\ | |
29 | 29 | |||
\begin{tabular}{l r} | 30 | 30 | \begin{tabular}{l r} | |
Melody Jeng & System Architect \\ | 31 | 31 | Melody Jeng & System Architect \\ | |
Arno Gau & Senior System Analyst \\ | 32 | 32 | Arno Gau & Senior System Analyst \\ | |
Rachel Lee & Software Development Lead \\ | 33 | 33 | Rachel Lee & Software Development Lead \\ | |
Laura Hawkins & Project Manager \\ | 34 | 34 | Laura Hawkins & Project Manager \\ | |
Rohan Rangray & Algorithms Specialist\\ | 35 | 35 | Rohan Rangray & Algorithms Specialist\\ | |
Andrew Buss & Database Specialist \\ | 36 | 36 | Andrew Buss & Database Specialist \\ | |
Nam Phuong Tran & Quality Assurance Lead \\ | 37 | 37 | Nam Phuong Tran & Quality Assurance Lead \\ | |
Chung Kang Wang & Business Analyst\\ | 38 | 38 | Chung Kang Wang & Business Analyst\\ | |
Masud Rahman & User Interface Specialist\\ | 39 | 39 | Masud Rahman & User Interface Specialist\\ | |
Kevin Mach & User Interface Specialist\\ | 40 | 40 | Kevin Mach & User Interface Specialist\\ | |
\end{tabular} | 41 | 41 | \end{tabular} | |
\end{center} | 42 | 42 | \end{center} | |
\newpage | 43 | 43 | \newpage | |
\tableofcontents | 44 | 44 | \tableofcontents | |
\newpage | 45 | 45 | \newpage | |
46 | 46 | |||
\section{Testing Notes} | 47 | 47 | \section{Testing Notes} | |
\subsection{Testing Accounts} | 48 | 48 | \subsection{Testing Accounts} | |
UserX\\ | 49 | 49 | UserX\\ | |
- email: UserX@flashy.cards\\ | 50 | 50 | - email: UserX@flashy.cards\\ | |
- password: mynameisuserx | 51 | 51 | - password: mynameisuserx | |
\\ | 52 | 52 | \\ | |
UserY\\ | 53 | 53 | UserY\\ | |
- email: UserY@flashy.cards\\ | 54 | 54 | - email: UserY@flashy.cards\\ | |
- password: mynameisusery | 55 | 55 | - password: mynameisusery | |
56 | 56 | |||
\subsection{Fixtures} | 57 | 57 | \subsection{Fixtures} | |
Fixtures are provided to reset the database to a known state before running each test case. This isolates the effects of each test case and simplifies resolution of preconditions. Each test case specifies a test fixture which may be applied by running the command \texttt{scripts/apply-test-fixture.sh <fixture name>} in the root of the backend directory. Once a fixture has been applied, reload the page, log back in (if required by the test case) and continue running the test case. | 58 | 58 | Fixtures are provided to reset the database to a known state before running each test case. This isolates the effects of each test case and simplifies resolution of preconditions. Each test case specifies a test fixture which may be applied by running the command \texttt{scripts/apply-test-fixture.sh <fixture name>} in the root of the backend directory. Once a fixture has been applied, reload the page, log back in (if required by the test case) and continue running the test case. | |
\subsection{Testing Multiple Users} | 59 | 59 | \subsection{Testing Multiple Users} | |
Some test cases relating to real-time functionality require two users simultaneously logged into the the application. This requires two separate browser sessions. Refer to browser documentation for this. | 60 | 60 | Some test cases relating to real-time functionality require two users simultaneously logged into the the application. This requires two separate browser sessions. Refer to browser documentation for this. | |
\subsection{Supported Browser} | 61 | 61 | \subsection{Supported Browser} | |
Flashy officially supports Chrome version 42 on Windows and Linux. Frontend functionality may be degraded on other browsers. | 62 | 62 | Flashy officially supports Chrome version 42 on Windows and Linux. Frontend functionality may be degraded on other browsers. | |
63 | 63 | |||
\subsection{Sent Emails in Development} | 64 | 64 | \subsection{Sent Emails in Development} | |
As noted in the backend README, when run as a local development server for testing, Flashy does not actually send email except in a production environment. Sending email requires an AWS SES key that we do not want to bundle with our application's source. Instead they are printed out to the server console. When any reference is made to an email being sent, check the console. Example: | 65 | 65 | As noted in the backend README, when run as a local development server for testing, Flashy does not actually send email except in a production environment. Sending email requires an AWS SES key that we do not want to bundle with our application's source. Instead they are printed out to the server console. When any reference is made to an email being sent, check the console. Example: | |
66 | 66 | |||
\includegraphics[width=4in]{../doc_screenshots/console_backend.png} | 67 | 67 | \includegraphics[width=4in]{../doc_screenshots/console_backend.png} | |
68 | 68 | |||
\newpage | 69 | 69 | \newpage | |
70 | 70 | |||
71 | 71 | |||
\section{Accounts} | 72 | 72 | \section{Accounts} | |
73 | 73 | |||
\subsection{[A1] User Registration} | 74 | 74 | \subsection{[A1] User Registration} | |
\begin{description}[style=multiline,leftmargin=3cm] | 75 | 75 | \begin{description}[style=multiline,leftmargin=3cm] | |
76 | 76 | |||
\item[Description:]{This test case outlines the presentation layer step | 77 | 77 | \item[Description:]{This test case outlines the presentation layer step | |
process of a user registering for an account with our application.} | 78 | 78 | process of a user registering for an account with our application.} | |
79 | 79 | |||
\item[Desired Outcome:]{An account will be created for the User from the | 80 | 80 | \item[Desired Outcome:]{An account will be created for the User from the | |
specified username, password, email. The User will be able to log into | 81 | 81 | specified username, password, email. The User will be able to log into | |
the aforementioned account.} | 82 | 82 | the aforementioned account.} | |
83 | 83 | |||
\item[User Goals:]{The User shall have an account to participate in the | 84 | 84 | \item[User Goals:]{The User shall have an account to participate in the | |
website's activities.} | 85 | 85 | website's activities.} | |
86 | 86 | |||
\item[Dependency Use Cases:]{None} | 87 | 87 | \item[Dependency Use Cases:]{None} | |
\\ | 88 | 88 | \\ | |
89 | 89 | |||
\item[Priority Level:]{``Must''} | 90 | 90 | \item[Priority Level:]{``Must''} | |
91 | 91 | |||
\item[Status:]{Implemented} | 92 | 92 | \item[Status:]{Implemented} | |
93 | 93 | |||
\item[Preconditions:] | 94 | 94 | \item[Preconditions:] | |
\begin{itemize} | 95 | 95 | \begin{itemize} | |
\itemsep1pt\parskip0pt\parsep0pt | 96 | 96 | \itemsep1pt\parskip0pt\parsep0pt | |
\item | 97 | 97 | \item | |
{None} | 98 | 98 | {None} | |
\end{itemize} | 99 | 99 | \end{itemize} | |
100 | 100 | |||
\item[Postconditions:] | 101 | 101 | \item[Postconditions:] | |
\begin{itemize} | 102 | 102 | \begin{itemize} | |
\itemsep1pt\parskip0pt\parsep0pt | 103 | 103 | \itemsep1pt\parskip0pt\parsep0pt | |
\item | 104 | 104 | \item | |
{The User has an account registered with the system.} | 105 | 105 | {The User has an account registered with the system.} | |
\end{itemize} | 106 | 106 | \end{itemize} | |
107 | 107 | |||
\item[Trigger:]{UserX wants to start creating flashcards for a class.} | 108 | 108 | \item[Trigger:]{UserX wants to start creating flashcards for a class.} | |
109 | 109 | |||
\item[Workflow:] | 110 | 110 | \item[Workflow:] | |
111 | 111 | \begin{enumerate} | ||
\begin{enumerate} | 112 | 112 | \item | |
\item | 113 | 113 | {UserX shall click the ``Sign Up'' button.} | |
{UserX shall click the ``Sign Up'' button.} | 114 | 114 | \item | |
\item | 115 | 115 | {The System shall display a registration form.} | |
{The System shall display a registration form.} | 116 | 116 | \item | |
\item | 117 | 117 | {UserX shall fill in the form with email UserX@flashy.cards and password ``mynameisuserx''.} | |
{UserX shall fill in the form with email testuser@flashy.cards and password ``test''.} | 118 | 118 | \item | |
\item | 119 | 119 | {The System shall successfully receive the correct credentials and send an | |
{The System shall successfully receive the correct credentials and send an email to the User's address with a link to validate the User's email address and displays the Add Class page to the User.} | 120 | 120 | email to the User's address with a link to validate the User's email address | |
\item | 121 | 121 | and displays the Add Class page to the User.} | |
{UserX receives an email with a link to verify their email. The | 122 | 122 | \item | |
User clicks the link.} | 123 | 123 | {The System shall display a toast ``Please verify your email address! RESEND | |
\item | 124 | 124 | VERIFICATION EMAIL''.} | |
{The Server marks the user's email as valid and saves the User object | 125 | 125 | \item | |
again.} | 126 | 126 | {UserX receives an email with a link to verify their email. The | |
\end{enumerate} | 127 | 127 | User clicks the link (see Testing Notes).} | |
128 | 128 | \item | ||
\item [Expected Results:]{UserX's account is now active (registered with the system).} | 129 | 129 | {The System shall mark UserX's email as valid.} | |
130 | 130 | \item | ||
\end{description} | 131 | 131 | {UserX shall click ``Logout'' (power button) in the top left corner.} | |
\newpage | 132 | 132 | \item | |
133 | 133 | {The System shall present UserX Login screen.} | ||
{} | 134 | 134 | \item | |
135 | 135 | {UserX shall once again login with ``UserX@flashy.cards'' and ``mynameisuserx''.} | ||
\subsection{[A2] User Login} | 136 | 136 | \end{enumerate} | |
137 | 137 | |||
\begin{description} | 138 | 138 | \item [Expected Result:]{UserX shall see Add Class page without a toast asking | |
\item[Description:]{This test case outlines the presentation layering step | 139 | 139 | UserX to verify their email.} | |
process of a user logging into the application.} | 140 | 140 | ||
141 | 141 | \end{description} | ||
\item[Desired Outcome:]{The User shall be able to provide their email address and | 142 | 142 | \newpage | |
password to access their courses and flash cards. The User shall gain | 143 | 143 | ||
access to the list of the courses they have added, and be able to review | 144 | 144 | {} | |
the flash cards they have added to their decks.} | 145 | 145 | ||
146 | 146 | \subsection{[A2] User Login} | ||
\item[User Goals:]{The User wants to resume use of the site on another | 147 | 147 | ||
device, or use the site after logging out.} | 148 | 148 | \begin{description} | |
149 | 149 | \item[Description:]{This test case outlines the presentation layering step | ||
\item[Dependency Use Cases:]{[A1] User Registration} | 150 | 150 | process of a user logging into the application.} | |
\\ | 151 | 151 | ||
152 | 152 | \item[Desired Outcome:]{The User shall be able to provide their email address and | ||
\item[Priority Level:]{``Must''} | 153 | 153 | password to access their courses and flash cards. The User shall gain | |
154 | 154 | access to the list of the courses they have added, and be able to review | ||
\item[Status:]{Implemented} | 155 | 155 | the flashcards they have added to their decks.} | |
156 | 156 | |||
\item[Preconditions:] | 157 | 157 | \item[User Goals:]{The User wants to resume use of the site on another | |
\begin{itemize} | 158 | 158 | device, or use the site after logging out.} | |
\item | 159 | 159 | ||
{The User has created an account before with email ``testuser@flashy.cards'' with password ``test''.} | 160 | 160 | \item[Dependency Use Cases:]{[A1] User Registration} | |
\end{itemize} | 161 | 161 | \\ | |
162 | 162 | |||
\item[Postconditions:] | 163 | 163 | \item[Priority Level:]{``Must''} | |
\begin{itemize} | 164 | 164 | ||
\itemsep1pt\parskip0pt\parsep0pt | 165 | 165 | \item[Status:]{Implemented} | |
\item | 166 | 166 | ||
{The user can navigate the site and see their data.} | 167 | 167 | \item[Preconditions:] | |
\end{itemize} | 168 | 168 | \begin{itemize} | |
169 | 169 | \item | ||
\item[Trigger:]{UserX wants to view, add, or create cards for a class or classes.} | 170 | 170 | {The User has created an account before with email ``UserX@flashy.cards'' with | |
171 | 171 | password ``mynameisuserx''.} | ||
\item[Workflow:] | 172 | 172 | \end{itemize} | |
\begin{enumerate} | 173 | 173 | ||
\itemsep1pt\parskip0pt\parsep0pt | 174 | 174 | \item[Postconditions:] | |
\item | 175 | 175 | \begin{itemize} | |
{UserX shall enter their email ``testuser@flashy.cards'' and password ``test''.} | 176 | 176 | \itemsep1pt\parskip0pt\parsep0pt | |
\item | 177 | 177 | \item | |
{The System shall authenticate UserX's email and password and checks if UserX is active.} | 178 | 178 | {The user can navigate the site and see their data.} | |
\item | 179 | 179 | \end{itemize} | |
{The System shall receive the credentials and display the ``Add Class'' page to the User.} | 180 | 180 | ||
\end{enumerate} | 181 | 181 | \item[Trigger:]{UserX wants to view, add, or create cards for a class or classes.} | |
\item [Expected Result:] | 182 | 182 | ||
{The User is brought to the page ``Add Class''.}\\ | 183 | 183 | \item[Workflow:] | |
184 | 184 | \begin{enumerate} | ||
\item [Alternate Workflow:] | 185 | 185 | \itemsep1pt\parskip0pt\parsep0pt | |
\begin{enumerate} | 186 | 186 | \item | |
\item | 187 | 187 | {UserX shall enter their email ``UserX@flashy.cards'' and password ``mynameisuserx''.} | |
{UserX accidentally puts in the wrong credentials and clicks the ``Login'' button.} | 188 | 188 | \item | |
\item | 189 | 189 | {The System shall authenticate UserX's email and password and checks if UserX is active.} | |
{The System shows UserX the site login page with a text message reading ``Invalid username or password!!'' displayed in the log in text box.} | 190 | 190 | \item | |
\end {enumerate} | 191 | 191 | {The System shall receive the credentials and display the ``Add Class'' page to the User.} | |
192 | 192 | \end{enumerate} | ||
\item [Expected Result:] | 193 | 193 | \item [Expected Result:] | |
{The User is not able to login.} \\ | 194 | 194 | {The User is brought to the page ``Add Class''.}\\ | |
195 | 195 | |||
\end{description} | 196 | 196 | \item [Alternate Workflow A:] | |
\newpage | 197 | 197 | \begin{enumerate} | |
198 | 198 | \item | ||
{} | 199 | 199 | {UserX accidentally puts in the credentials ``UserX@flashy.cards'', | |
200 | 200 | ``hahahaha'' and clicks the ``Login'' button.} | ||
\subsection{[A3] Add a Class} | 201 | 201 | \item | |
\begin{description} | 202 | 202 | {The System shows UserX the site login page with a message reading | |
\item[Description:]{This test case outlines the presentation layer step | 203 | 203 | ``Invalid username or password!!''.} | |
process of a user adding a class.} | 204 | 204 | \end {enumerate} | |
205 | 205 | |||
\item[Desired Outcome:]{The class shall be linked with the student's account | 206 | 206 | \item [Expected Result:] | |
and the student shall have the ability to read and publish flashcards | 207 | 207 | {The User is not able to login.} \\ | |
for this class.} | 208 | 208 | ||
209 | 209 | \item [Alternate Workflow B:] | ||
\item[User Goals:]{The User wants to publish flashcards for this class and | 210 | 210 | \begin{enumerate} | |
read the flashcards for this class that are published by other users.} | 211 | 211 | \item | |
212 | 212 | {UserX accidentally puts in the credentials ``NotUserX@flashy.cards'', | ||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} | 213 | 213 | ``mynameisuserx'' and clicks the ``Login'' button.} | |
\\ | 214 | 214 | \item | |
215 | 215 | {The System shows UserX the site login page with a message reading | ||
\item[Priority Level:]{``Must''} | 216 | 216 | ``Invalid username or password!!''.} | |
217 | 217 | \end {enumerate} | ||
\item[Status:]{Implemented} | 218 | 218 | ||
219 | 219 | \item [Expected Result:] | ||
\item[Preconditions:] | 220 | 220 | {The User is not able to login.} \\ | |
\begin{itemize} | 221 | 221 | ||
\itemsep1pt\parskip0pt\parsep0pt | 222 | 222 | \item [Alternate Workflow C:] | |
\item | 223 | 223 | \begin{enumerate} | |
{The User is logged in as UserX.} | 224 | 224 | \item | |
\item | 225 | 225 | {UserX accidentally puts in the credentials ``theflash@flashy.cards'', | |
{The User is whitelisted for class TEST 101.} | 226 | 226 | ``MyNameIsUserX'' and clicks the ``Login'' button.} | |
\item | 227 | 227 | \item | |
{The User is not whitelisted for class TEST 102.} | 228 | 228 | {The System shows UserX the site login page with a message reading | |
\item | 229 | 229 | ``Invalid username or password!!''.} | |
{The class TEST 103 has no whitelist.} | 230 | 230 | \end {enumerate} | |
\end{itemize} | 231 | 231 | ||
232 | 232 | \item [Expected Result:] | ||
\item[Postconditions:] | 233 | 233 | {The User is not able to login.} \\ | |
\begin{itemize} | 234 | 234 | ||
\itemsep1pt\parskip0pt\parsep0pt | 235 | 235 | \end{description} | |
\item | 236 | 236 | \newpage | |
{The User can read the flashcards being published for the class and | 237 | 237 | ||
add them to their deck.} | 238 | 238 | {} | |
\item | 239 | 239 | ||
{The User can publish flashcards to be viewed and added by other users | 240 | 240 | \subsection{[A3] Add a Class} | |
in the same class.} | 241 | 241 | \begin{description} | |
\end{itemize} | 242 | 242 | \item[Description:]{This test case outlines the presentation layer step | |
243 | 243 | process of a user adding a class.} | ||
\item[Trigger:]{UserX wants to view the Live Feed and have a flashcard deck for a class.} | 244 | 244 | ||
245 | 245 | \item[Desired Outcome:]{The class shall be linked with the student's account | ||
\item[Workflow:] | 246 | 246 | and the student shall have the ability to read and publish flashcards | |
\begin{enumerate} | 247 | 247 | for this class.} | |
\itemsep1pt\parskip0pt\parsep0pt | 248 | 248 | ||
\item | 249 | 249 | \item[User Goals:]{The User wants to publish flashcards for this class and | |
{UserX shall click ``Add Class'' on the classes dropdown from the navigation bar.} | 250 | 250 | read the flashcards for this class that are published by other users.} | |
\item | 251 | 251 | ||
{The System shall show the user ``Add Class'' page.} | 252 | 252 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} | |
\item | 253 | 253 | \\ | |
{UserX shall begin to type ``TEST 101''.} | 254 | 254 | ||
\item | 255 | 255 | \item[Priority Level:]{``Must''} | |
{The System shall show suggestions as a user types.} | 256 | 256 | ||
\item | 257 | 257 | \item[Status:]{Implemented} | |
{The System shall check if there is a whitelist for each class in the suggestions.} | 258 | 258 | ||
\item | 259 | 259 | \item[Preconditions:] | |
{The System shall ensure that UserX is on the whitelist for each section.} | 260 | 260 | \begin{itemize} | |
\item | 261 | 261 | \itemsep1pt\parskip0pt\parsep0pt | |
{UserX shall click on ``TEST 101'', which should not have a lock icon.} | 262 | 262 | \item | |
\item | 263 | 263 | {The User is logged in as UserX.} | |
{UserX shall click on the ``Add'' button.} | 264 | 264 | \item | |
\item | 265 | 265 | {The User is whitelisted for class TEST 101.} | |
{The System shall add UserX to the specified class TEST 101.} | 266 | 266 | \item | |
\end{enumerate} | 267 | 267 | {The User is not whitelisted for class TEST 102.} | |
268 | 268 | \item | ||
\item[Expected Result:] {UserX has added the section and sees the Live Feed | 269 | 269 | {The class TEST 103 has no whitelist.} | |
for TEST 101.} | 270 | 270 | \end{itemize} | |
271 | 271 | |||
\item[Alternate Workflow A:] | 272 | 272 | \item[Postconditions:] | |
\begin{enumerate} | 273 | 273 | \begin{itemize} | |
\setcounter{enumi}{3} | 274 | 274 | \itemsep1pt\parskip0pt\parsep0pt | |
\itemsep1pt\parskip0pt\parsep0pt | 275 | 275 | \item | |
\item | 276 | 276 | {The User can read the flashcards being published for the class and | |
{UserX shall begin to type ``TEST 102''.} | 277 | 277 | add them to their deck.} | |
\item | 278 | 278 | \item | |
{The System shall show suggestions as a user types.} | 279 | 279 | {The User can publish flashcards to be viewed and added by other users | |
\item | 280 | 280 | in the same class.} | |
{The System shall check if there is a whitelist for each class in the suggestions.} | 281 | 281 | \end{itemize} | |
\item | 282 | 282 | ||
{The System shall see that UserX is not on the whitelist.} | 283 | 283 | \item[Trigger:]{UserX wants to view the Live Feed and have a flashcard deck for a class.} | |
\item | 284 | 284 | ||
{UserX shall see a lock icon in the suggestions for TEST 102.} | 285 | 285 | \item[Workflow:] | |
\item | 286 | 286 | \begin{enumerate} | |
{UserX shall click on ``TEST 102'', which has a lock icon.} | 287 | 287 | \itemsep1pt\parskip0pt\parsep0pt | |
\item | 288 | 288 | \item | |
{The System shall disable the ``Add'' button.} | 289 | 289 | {UserX shall click ``Add Class'' on the classes dropdown from the navigation bar.} | |
\end{enumerate} | 290 | 290 | \item | |
291 | 291 | {The System shall show the user ``Add Class'' page.} | ||
\item[Expected Result:] {UserX cannot add the specified TEST 102 and cannot | 292 | 292 | \item | |
view contents related to this class.} | 293 | 293 | {UserX shall begin to type ``TEST 101''.} | |
294 | 294 | \item | ||
\item[Alternate Workflow B:] | 295 | 295 | {The System shall show suggestions as a user types.} | |
\begin{enumerate} | 296 | 296 | \item | |
\setcounter{enumi}{3} | 297 | 297 | {The System shall check if there is a whitelist for each class in the suggestions.} | |
\itemsep1pt\parskip0pt\parsep0pt | 298 | 298 | \item | |
\item | 299 | 299 | {The System shall ensure that UserX is on the whitelist for each section.} | |
{UserX shall begin to type ``TEST 103''.} | 300 | 300 | \item | |
\item | 301 | 301 | {UserX shall click on ``TEST 101'', which should not have a lock icon.} | |
{The System shall show suggestions as UserX types.} | 302 | 302 | \item | |
\item | 303 | 303 | {UserX shall click on the ``Add'' button.} | |
{The System shall check if there is a whitelist for each class in the suggestions.} | 304 | 304 | \item | |
\item | 305 | 305 | {The System shall add UserX to the specified class TEST 101.} | |
{The System shall see there is no whitelist for TEST 103.} | 306 | 306 | \end{enumerate} | |
\item | 307 | 307 | ||
{UserX shall click on ``TEST 103'', which should not have a lock icon.} | 308 | 308 | \item[Expected Result:] {UserX has added the section and sees the Live Feed | |
\item | 309 | 309 | for TEST 101.} | |
{UserX shall click on the ``Add'' button.} | 310 | 310 | ||
\item | 311 | 311 | \item[Alternate Workflow A:] | |
{The System shall add UserX to TEST 103.} | 312 | 312 | \begin{enumerate} | |
\end{enumerate} | 313 | 313 | \setcounter{enumi}{3} | |
314 | 314 | \itemsep1pt\parskip0pt\parsep0pt | ||
\item[Expected Result:] {UserX has added the section and sees the Live Feed | 315 | 315 | \item | |
for TEST 103.} | 316 | 316 | {UserX shall begin to type ``TEST 102''.} | |
\end{description} | 317 | 317 | \item | |
\newpage | 318 | 318 | {The System shall show suggestions as a user types.} | |
319 | 319 | \item | ||
{} | 320 | 320 | {The System shall check if there is a whitelist for each class in the suggestions.} | |
321 | 321 | \item | ||
\subsection{[A4] Drop a Class} | 322 | 322 | {The System shall see that UserX is not on the whitelist.} | |
323 | 323 | \item | ||
\begin{description} | 324 | 324 | {UserX shall see a lock icon in the suggestions for TEST 102.} | |
\item[Description:]{This test case outlines the presentation layer step process of a user dropping a class.} | 325 | 325 | \item | |
326 | 326 | {UserX shall click on ``TEST 102'', which has a lock icon.} | ||
\item[Desired Outcome:]{The User has dropped the class and no longer needs | 327 | 327 | \item | |
access to the flashcards for the dropped class. They can no longer | 328 | 328 | {The System shall disable the ``Add'' button.} | |
see the flashcards associated to the class that they dropped.} | 329 | 329 | \end{enumerate} | |
330 | 330 | |||
\item[User Goals:]{The User shall not have access to a class and the | 331 | 331 | \item[Expected Result:] {UserX cannot add the specified TEST 102 and cannot | |
flashcards associated with that class. They will no longer see the class | 332 | 332 | view contents related to this class.} | |
listed in their list of ``Enrolled Classes''.} | 333 | 333 | ||
334 | 334 | \item[Alternate Workflow B:] | ||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class} | 335 | 335 | \begin{enumerate} | |
\\ | 336 | 336 | \setcounter{enumi}{3} | |
337 | 337 | \itemsep1pt\parskip0pt\parsep0pt | ||
\item[Priority Level:]{``Should''} | 338 | 338 | \item | |
339 | 339 | {UserX shall begin to type ``TEST 103''.} | ||
\item[Status:]{Implemented} | 340 | 340 | \item | |
341 | 341 | {The System shall show suggestions as UserX types.} | ||
\item[Preconditions:] | 342 | 342 | \item | |
\begin{itemize} | 343 | 343 | {The System shall check if there is a whitelist for each class in the suggestions.} | |
\itemsep1pt\parskip0pt\parsep0pt | 344 | 344 | \item | |
\item | 345 | 345 | {The System shall see there is no whitelist for TEST 103.} | |
{The User is logged in as UserX.} | 346 | 346 | \item | |
\item | 347 | 347 | {UserX shall click on ``TEST 103'', which should not have a lock icon.} | |
{The User has enrolled in TEST 101.} | 348 | 348 | \item | |
\item | 349 | 349 | {UserX shall click on the ``Add'' button.} | |
{The User is at Settings page.} | 350 | 350 | \item | |
\end{itemize} | 351 | 351 | {The System shall add UserX to TEST 103.} | |
352 | 352 | \end{enumerate} | ||
\item[Postconditions:] | 353 | 353 | ||
\begin{itemize} | 354 | 354 | \item[Expected Result:] {UserX has added the section and sees the Live Feed | |
\itemsep1pt\parskip0pt\parsep0pt | 355 | 355 | for TEST 103.} | |
\item | 356 | 356 | \end{description} | |
{The User shall no longer have access to TEST 101, or associated flashcards.} | 357 | 357 | \newpage | |
\end{itemize} | 358 | 358 | ||
359 | 359 | {} | ||
\item[Trigger:]{UserX wants to stop seeing the class's Live Feed and remove | 360 | 360 | ||
all of their flashcards.} | 361 | 361 | \subsection{[A4] Drop a Class} | |
362 | 362 | |||
\item[Workflow:] | 363 | 363 | \begin{description} | |
\begin{enumerate} | 364 | 364 | \item[Description:]{This test case outlines the presentation layer step process of a user dropping a class.} | |
\itemsep1pt\parskip0pt\parsep0pt | 365 | 365 | ||
\item | 366 | 366 | \item[Desired Outcome:]{The User has dropped the class and no longer needs | |
{UserX shall click ``X'' icon next to TEST 101 in ``Enrolled Classes'' table.} | 367 | 367 | access to the flashcards for the dropped class. They can no longer | |
\item | 368 | 368 | see the flashcards associated to the class that they dropped.} | |
{The System shall remove UserX from TEST 101.} | 369 | 369 | ||
\item | 370 | 370 | \item[User Goals:]{The User shall not have access to a class and the | |
{The System shall display a toast indicating that a class has been dropped.} | 371 | 371 | flashcards associated with that class. They will no longer see the class | |
\end{enumerate} | 372 | 372 | listed in their list of ``Enrolled Classes''.} | |
373 | 373 | |||
\item[Expected Result:] {UserX no longer has access to any content related to TEST 101.} | 374 | 374 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class} | |
\end{description} | 375 | 375 | \\ | |
\newpage | 376 | 376 | ||
377 | 377 | \item[Priority Level:]{``Should''} | ||
{} | 378 | 378 | ||
379 | 379 | \item[Status:]{Implemented} | ||
\subsection{[A5] Password Change} | 380 | 380 | ||
381 | 381 | \item[Preconditions:] | ||
\begin{description} | 382 | 382 | \begin{itemize} | |
\item[Description:]{The User shall be able to change the password for their | 383 | 383 | \itemsep1pt\parskip0pt\parsep0pt | |
account in the account settings. This requires that they are logged in.} | 384 | 384 | \item | |
385 | 385 | {The User is logged in as UserX.} | ||
\item[Desired Outcome:]{The User's password shall be changed and the user | 386 | 386 | \item | |
shall be able to log in with the new password in the future.} | 387 | 387 | {The User has enrolled in TEST 101.} | |
388 | 388 | \item | ||
\item[User Goals:]{The User wants to use a different password in the future.} | 389 | 389 | {The User is at Settings page.} | |
390 | 390 | \end{itemize} | ||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} | 391 | 391 | ||
\\ | 392 | 392 | \item[Postconditions:] | |
393 | 393 | \begin{itemize} | ||
\item[Details:]{The user provides their current password and a new password | 394 | 394 | \itemsep1pt\parskip0pt\parsep0pt | |
in a form. If the current password is correct, the system updates their | 395 | 395 | \item | |
password to the requested new password.} | 396 | 396 | {The User shall no longer have access to TEST 101, or associated flashcards.} | |
397 | 397 | \end{itemize} | ||
\item[Priority Level:]{``Must''} | 398 | 398 | ||
399 | 399 | \item[Trigger:]{UserX wants to stop seeing the class's Live Feed and remove | ||
\item[Status:]{Implemented} | 400 | 400 | all of their flashcards.} | |
401 | 401 | |||
\item[Preconditions:] | 402 | 402 | \item[Workflow:] | |
\begin{itemize} | 403 | 403 | \begin{enumerate} | |
\itemsep1pt\parskip0pt\parsep0pt | 404 | 404 | \itemsep1pt\parskip0pt\parsep0pt | |
\item | 405 | 405 | \item | |
{The User is logged in as UserX.} | 406 | 406 | {UserX shall click ``X'' icon next to TEST 101 in ``Enrolled Classes'' table.} | |
\item | 407 | 407 | \item | |
{The User knows the current password (``oldPassword'').} | 408 | 408 | {The System shall remove UserX from TEST 101.} | |
\item | 409 | 409 | \item | |
{The User is at the Settings page.} | 410 | 410 | {The System shall display a toast indicating that a class has been dropped.} | |
\end{itemize} | 411 | 411 | \end{enumerate} | |
412 | 412 | |||
\item[Postconditions:] | 413 | 413 | \item[Expected Result:] {UserX no longer has access to any content related to TEST 101.} | |
\begin{itemize} | 414 | 414 | \end{description} | |
\itemsep1pt\parskip0pt\parsep0pt | 415 | 415 | \newpage | |
\item | 416 | 416 | ||
{The User's password is changed} | 417 | 417 | {} | |
\item | 418 | 418 | ||
{The User can log in with the new password} | 419 | 419 | \subsection{[A5] Password Change} | |
\end{itemize} | 420 | 420 | ||
421 | 421 | \begin{description} | ||
\item[Trigger:]{UserX is dissatisfied with their current password and wishes | 422 | 422 | \item[Description:]{The User shall be able to change the password for their | |
to change it.} | 423 | 423 | account in the account settings. This requires that they are logged in.} | |
424 | 424 | |||
\item[Workflow:] | 425 | 425 | \item[Desired Outcome:]{The User's password shall be changed and the user | |
\begin{enumerate} | 426 | 426 | shall be able to log in with the new password in the future.} | |
\itemsep1pt\parskip0pt\parsep0pt | 427 | 427 | ||
\item | 428 | 428 | \item[User Goals:]{The User wants to use a different password in the future.} | |
{UserX shall enter their current password ``oldPassword'' and the desired | 429 | 429 | ||
new password ``newPassword'' (twice) in the ``Change Password'' form.} | 430 | 430 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} | |
\item | 431 | 431 | \\ | |
{UserX shall click the ``Submit'' button.} | 432 | 432 | ||
\item | 433 | 433 | \item[Details:]{The user provides their current password and a new password | |
{The System shall check UserX's current password.} | 434 | 434 | in a form. If the current password is correct, the system updates their | |
\item | 435 | 435 | password to the requested new password.} | |
{The System shall update the UserX's current password ``oldPassword'' to the new password ``newPassword''.} | 436 | 436 | ||
\end{enumerate} | 437 | 437 | \item[Priority Level:]{``Must''} | |
438 | 438 | |||
\item[Expected Result:] {User's password is changed from ``oldPasswrd'' to ``newPassword''.} | 439 | 439 | \item[Status:]{Implemented} | |
\end{description} | 440 | 440 | ||
\newpage | 441 | 441 | \item[Preconditions:] | |
442 | 442 | \begin{itemize} | ||
{} | 443 | 443 | \itemsep1pt\parskip0pt\parsep0pt | |
444 | 444 | \item | ||
\subsection{[A6] Password Reset} | 445 | 445 | {The User is logged in as UserX.} | |
446 | 446 | \item | ||
\begin{description} | 447 | 447 | {The User knows the current password (``oldPassword'').} | |
\item[Description:]{The User shall be able to reset their password without | 448 | 448 | \item | |
being logged in } | 449 | 449 | {The User is at the Settings page.} | |
450 | 450 | \end{itemize} | ||
\item[Desired Outcome:]{The User's password shall be changed to one that | 451 | 451 | ||
they remember} | 452 | 452 | \item[Postconditions:] | |
\\ | 453 | 453 | \begin{itemize} | |
454 | 454 | \itemsep1pt\parskip0pt\parsep0pt | ||
\item[User Goals:]{The User does not know their current password but wants | 455 | 455 | \item | |
to log into the site} | 456 | 456 | {The User's password is changed} | |
457 | 457 | \item | ||
\item[Dependency Use Cases:]{[A1] User Registration} | 458 | 458 | {The User can log in with the new password} | |
\\ | 459 | 459 | \end{itemize} | |
460 | 460 | |||
\item[Details:]{The User provides their email in a password reset form. If | 461 | 461 | \item[Trigger:]{UserX is dissatisfied with their current password and wishes | |
the address is valid, the site sends a password reset link with a random | 462 | 462 | to change it.} | |
token to that address. If the address is invalid, the site does not send | 463 | 463 | ||
a link. For security reasons, we do not reveal to the user whether the | 464 | 464 | \item[Workflow:] | |
email address was valid, and we expire the link after 24 hours. When a | 465 | 465 | \begin{enumerate} | |
user visits the link emailed to them, they are able to specify a new | 466 | 466 | \itemsep1pt\parskip0pt\parsep0pt | |
password in a form. When they submit the form, their password is updated | 467 | 467 | \item | |
if the token is correct. } | 468 | 468 | {UserX shall enter their current password ``oldPassword'' and the desired | |
469 | 469 | new password ``newPassword'' (twice) in the ``Change Password'' form.} | ||
\item[Priority Level:]{``Must''} | 470 | 470 | \item | |
471 | 471 | {UserX shall click the ``Submit'' button.} | ||
\item[Status]{Implemented} | 472 | 472 | \item | |
473 | 473 | {The System shall check UserX's current password.} | ||
\item[Preconditions:] | 474 | 474 | \item | |
\begin{itemize} | 475 | 475 | {The System shall update the UserX's current password ``oldPassword'' to the new password ``newPassword''.} | |
\itemsep1pt\parskip0pt\parsep0pt | 476 | 476 | \end{enumerate} | |
\item | 477 | 477 | ||
{Account for UserX has been created.} | 478 | 478 | \item[Expected Result:] {User's password is changed from ``oldPasswrd'' to ``newPassword''.} | |
\end{itemize} | 479 | 479 | \end{description} | |
480 | 480 | \newpage | ||
\item[Postconditions:] | 481 | 481 | ||
\begin{itemize} | 482 | 482 | {} | |
\itemsep1pt\parskip0pt\parsep0pt | 483 | 483 | ||
\item | 484 | 484 | \subsection{[A6] Password Reset} | |
{UserX's password is changed.} | 485 | 485 | ||
\item | 486 | 486 | \begin{description} | |
{UserX can log in with the new password.} | 487 | 487 | \item[Description:]{The User shall be able to reset their password without | |
\end{itemize} | 488 | 488 | being logged in } | |
489 | 489 | |||
\item[Trigger]{UserX forgot their password and wants to access the site.} | 490 | 490 | \item[Desired Outcome:]{The User's password shall be changed to one that | |
491 | 491 | they remember} | ||
\item[Workflow:] | 492 | 492 | \\ | |
493 | 493 | |||
\begin{enumerate} | 494 | 494 | \item[User Goals:]{The User does not know their current password but wants | |
\itemsep1pt\parskip0pt\parsep0pt | 495 | 495 | to log into the site} | |
\item | 496 | 496 | ||
{UserX shall click the ``Forgot Password'' hyperlink.} | 497 | 497 | \item[Dependency Use Cases:]{[A1] User Registration} | |
\item | 498 | 498 | \\ | |
{The System shall prompt the user for their current email.} | 499 | 499 | ||
\item | 500 | 500 | \item[Details:]{The User provides their email in a password reset form. If | |
{UserX shall submit their email ``UserX@flashy.cards''.} | 501 | 501 | the address is valid, the site sends a password reset link with a random | |
\item | 502 | 502 | token to that address. If the address is invalid, the site does not send | |
{The System shall check if an account exists with the email entered by UserX.} | 503 | 503 | a link. For security reasons, we do not reveal to the user whether the | |
\item | 504 | 504 | email address was valid, and we expire the link after 24 hours. When a | |
{The System shall create a new password reset token for UserX.} | 505 | 505 | user visits the link emailed to them, they are able to specify a new | |
\item | 506 | 506 | password in a form. When they submit the form, their password is updated | |
{The System shall send an email to UserX with a link containing the token and the | 507 | 507 | if the token is correct. } | |
user's ID.} | 508 | 508 | ||
\item | 509 | 509 | \item[Priority Level:]{``Must''} | |
{UserX shall click the link in the email to visit /app/password\_reset.} | 510 | 510 | ||
\item | 511 | 511 | \item[Status]{Implemented} | |
{The System shall render a form that will prompt the user for a new password.} | 512 | 512 | ||
\item | 513 | 513 | \item[Preconditions:] | |
{UserX shall provide a new password, ``newPassword'', in the form.} | 514 | 514 | \begin{itemize} | |
\item | 515 | 515 | \itemsep1pt\parskip0pt\parsep0pt | |
{The System shall change the password associated with the user's email.} | 516 | 516 | \item | |
\item | 517 | 517 | {Account for UserX has been created.} | |
{UserX shall navigate back to the login page and enter ``UserX@flashy.cards'' | 518 | 518 | \end{itemize} | |
with the old password ``mynameisuserx''.} | 519 | 519 | ||
\item | 520 | 520 | \item[Postconditions:] | |
{The System shall display ``Invalid username or password!''} | 521 | 521 | \begin{itemize} | |
\item | 522 | 522 | \itemsep1pt\parskip0pt\parsep0pt | |
{UserX shall login as ``UserX@flashy.cards'' with the password ``newPassword''.} | 523 | 523 | \item | |
\end{enumerate} | 524 | 524 | {UserX's password is changed.} | |
525 | 525 | \item | ||
\item[Expected Result:] {The login shall succeed.} | 526 | 526 | {UserX can log in with the new password.} | |
527 | 527 | \end{itemize} | ||
\item[Alternate Workflow:] | 528 | 528 | ||
\begin{enumerate} | 529 | 529 | \item[Trigger]{UserX forgot their password and wants to access the site.} | |
\setcounter{enumi}{4} | 530 | 530 | ||
\itemsep1pt\parskip0pt\parsep0pt | 531 | 531 | \item[Workflow:] | |
\item | 532 | 532 | ||
{If no such account exists, the System shall display a modal display ``Cannot find account.'' to UserX.} | 533 | 533 | \begin{enumerate} | |
\end{enumerate} | 534 | 534 | \itemsep1pt\parskip0pt\parsep0pt | |
535 | 535 | \item | ||
\item[Expected Result:] {UserX's password will not be reset.} | 536 | 536 | {UserX shall click the ``Forgot Password'' hyperlink.} | |
\end{description} | 537 | 537 | \item | |
\newpage | 538 | 538 | {The System shall prompt the user for their current email.} | |
539 | 539 | \item | ||
{} | 540 | 540 | {UserX shall submit their email ``UserX@flashy.cards''.} | |
541 | 541 | \item | ||
\subsection{[A7] Student Prevented From Accessing A Restricted Course} | 542 | 542 | {The System shall check if an account exists with the email entered by UserX.} | |
543 | 543 | \item | ||
\begin{description} | 544 | 544 | {The System shall create a new password reset token for UserX.} | |
\item[Description:]{The User shall not be able to access a restricted course.} | 545 | 545 | \item | |
546 | 546 | {The System shall send an email to UserX with a link containing the token and the | ||
\item[Desired Outcome:]{The class will have limited access and only those | 547 | 547 | user's ID.} | |
users who are whitelisted may enroll in the class.} | 548 | 548 | \item | |
549 | 549 | {UserX shall click the link in the email to visit /app/password\_reset.} | ||
\item[User Goals:]{The instructor wants to limit access to his class so only | 550 | 550 | \item | |
the students who are actually in his class participate, and nobody | 551 | 551 | {The System shall render a form that will prompt the user for a new password.} | |
else.} | 552 | 552 | \item | |
553 | 553 | {UserX shall provide a new password, ``newPassword'', in the form.} | ||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} | 554 | 554 | \item | |
\\ | 555 | 555 | {The System shall change the password associated with the user's email.} | |
556 | 556 | \item | ||
\item[Priority Level:]{``Should''} | 557 | 557 | {UserX shall navigate back to the login page and enter ``UserX@flashy.cards'' | |
558 | 558 | with the old password ``mynameisuserx''.} | ||
\item[Status:]{Implemented} | 559 | 559 | \item | |
560 | 560 | {The System shall display ``Invalid username or password!''} | ||
\item[Preconditions:] | 561 | 561 | \item | |
\begin{itemize} | 562 | 562 | {UserX shall login as ``UserX@flashy.cards'' with the password ``newPassword''.} | |
\itemsep1pt\parskip0pt\parsep0pt | 563 | 563 | \end{enumerate} | |
\item | 564 | 564 | ||
{UserX has valid instructor's account} | 565 | 565 | \item[Expected Result:] {The login shall succeed.} | |
\end{itemize} | 566 | 566 | ||
567 | 567 | \item[Alternate Workflow:] | ||
\item[Postconditions:] | 568 | 568 | \begin{enumerate} | |
\begin{itemize} | 569 | 569 | \setcounter{enumi}{4} | |
\itemsep1pt\parskip0pt\parsep0pt | 570 | 570 | \itemsep1pt\parskip0pt\parsep0pt | |
\item | 571 | 571 | \item | |
{Only those users who were whitelisted may add the class.} | 572 | 572 | {If no such account exists, the System shall display a modal display ``Cannot find account.'' to UserX.} | |
\end{itemize} | 573 | 573 | \end{enumerate} | |
574 | 574 | |||
\item[Trigger:]{The instructor emails the administrator and requests to | 575 | 575 | \item[Expected Result:] {UserX's password will not be reset.} | |
limit access to his class.} | 576 | 576 | \end{description} | |
577 | 577 | \newpage | ||
\item[Workflow:] | 578 | 578 | ||
\begin{enumerate} | 579 | 579 | {} | |
\itemsep1pt\parskip0pt\parsep0pt | 580 | 580 | ||
\item | 581 | 581 | \subsection{[A7] Student Prevented From Accessing A Restricted Course} | |
{The instructor, ``INSTR1'', shall email the administrators from his UCSD email address | 582 | 582 | ||
and requests to limit access to his course.} | 583 | 583 | \begin{description} | |
\item | 584 | 584 | \item[Description:]{The User shall not be able to access a restricted course.} | |
{ INSTR1 shall provide a list of | 585 | 585 | ||
emails of the students that are to be whitelisted.} | 586 | 586 | \item[Desired Outcome:]{The class will have limited access and only those | |
\item | 587 | 587 | users who are whitelisted may enroll in the class.} | |
{The administrators shall visit a custom admin page, select the course, and | 588 | 588 | ||
paste the list of emails.} | 589 | 589 | \item[User Goals:]{The instructor wants to limit access to his class so only | |
\item | 590 | 590 | the students who are actually in his class participate, and nobody | |
{The administrators shall submit the page directly to the System.} | 591 | 591 | else.} | |
\item | 592 | 592 | ||
{The System shall create a WhitelistedAddress for each provided email, | 593 | 593 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} | |
attaching it to the section taught by INST1.} | 594 | 594 | \\ | |
\item | 595 | 595 | ||
{The System shall add any existing users whose email addresses appear | 596 | 596 | \item[Priority Level:]{``Should''} | |
in the whitelist to the class. } | 597 | 597 | ||
\end{enumerate} | 598 | 598 | \item[Status:]{Implemented} | |
599 | 599 | |||
\item[Expected Result:] {A whitelist is added to a section.} | 600 | 600 | \item[Preconditions:] | |
\end{description} | 601 | 601 | \begin{itemize} | |
\newpage | 602 | 602 | \itemsep1pt\parskip0pt\parsep0pt | |
603 | 603 | \item | ||
{} | 604 | 604 | {UserX has valid instructor's account} | |
605 | 605 | \end{itemize} | ||
\subsection{[A8] User Logout} | 606 | 606 | ||
607 | 607 | \item[Postconditions:] | ||
\begin{description} | 608 | 608 | \begin{itemize} | |
\item[Description:]{The User shall be able to log out of his/her account on | 609 | 609 | \itemsep1pt\parskip0pt\parsep0pt | |
the site.} | 610 | 610 | \item | |
611 | 611 | {Only those users who were whitelisted may add the class.} | ||
\item[Desired Outcome:]{The User's information and data will no longer be | 612 | 612 | \end{itemize} | |
accessible after logging out. } | 613 | 613 | ||
614 | 614 | \item[Trigger:]{The instructor emails the administrator and requests to | ||
\item[User Goals:]{The User is done with his/her session of using the | 615 | 615 | limit access to his class.} | |
website, and wants to make sure others cannot access the data in his/her | 616 | 616 | ||
account.} | 617 | 617 | \item[Workflow:] | |
618 | 618 | \begin{enumerate} | ||
\item[Dependency Use Cases:] {[A1] User Registration, [A2] User Login} | 619 | 619 | \itemsep1pt\parskip0pt\parsep0pt | |
\\ | 620 | 620 | \item | |
621 | 621 | {The instructor, ``INSTR1'', shall email the administrators from his UCSD email address | ||
\item[Priority Level:]{``Must''} | 622 | 622 | and requests to limit access to his course.} | |
623 | 623 | \item | ||
\item[Status:]{Implemented} | 624 | 624 | { INSTR1 shall provide a list of | |
625 | 625 | emails of the students that are to be whitelisted.} | ||
\item[Preconditions:]{The user is logged into their account.} | 626 | 626 | \item | |
627 | 627 | {The administrators shall visit a custom admin page, select the course, and | ||
\item[Postconditions:]{The user's data can no longer be accessed.} | 628 | 628 | paste the list of emails.} | |
629 | 629 | \item | ||
\item[Trigger:] | 630 | 630 | {The administrators shall submit the page directly to the System.} | |
631 | 631 | \item | ||
\item[Workflow:] | 632 | 632 | {The System shall create a WhitelistedAddress for each provided email, | |
633 | 633 | attaching it to the section taught by INST1.} | ||
\begin{enumerate} | 634 | 634 | \item | |
\itemsep1pt\parskip0pt\parsep0pt | 635 | 635 | {The System shall add any existing users whose email addresses appear | |
\item | 636 | 636 | in the whitelist to the class. } | |
{UserX shall click the ``Logout'' button.} | 637 | 637 | \end{enumerate} | |
\item | 638 | 638 | ||
{The System shall logs out UserX.} | 639 | 639 | \item[Expected Result:] {A whitelist is added to a section.} | |
\item | 640 | 640 | \end{description} | |
{The System shall redirect UserX to the login page.} | 641 | 641 | \newpage | |
\end{enumerate} | 642 | 642 | ||
643 | 643 | {} | ||
\item[Expected Result:] {User is logged out and is redirected to the login page.} | 644 | 644 | ||
\end{description} | 645 | 645 | \subsection{[A8] User Logout} | |
\newpage | 646 | 646 | ||
647 | 647 | \begin{description} | ||
{} | 648 | 648 | \item[Description:]{The User shall be able to log out of his/her account on | |
649 | 649 | the site.} | ||
\subsection{[A9] Contact Admin} | 650 | 650 | ||
651 | 651 | \item[Desired Outcome:]{The User's information and data will no longer be | ||
\begin{description} | 652 | 652 | accessible after logging out. } | |
\item[Description]{The User shall be able to contact the admin.} | 653 | 653 | ||
654 | 654 | \item[User Goals:]{The User is done with his/her session of using the | ||
\item[Desired Outcome]{The User shall send a message to the admin; the | 655 | 655 | website, and wants to make sure others cannot access the data in his/her | |
admin shall receive the message.} | 656 | 656 | account.} | |
657 | 657 | |||
\item[User Goals:]{The User sends a message to the admin.} | 658 | 658 | \item[Dependency Use Cases:] {[A1] User Registration, [A2] User Login} | |
659 | 659 | \\ | ||
\item[Dependency Use Cases]{None} | 660 | 660 | ||
\\ | 661 | 661 | \item[Priority Level:]{``Must''} | |
662 | 662 | |||
\item[Priority Level]{``Must''} | 663 | 663 | \item[Status:]{Implemented} | |
664 | 664 | |||
\item[Status]{Not Implemented and Deferred} | 665 | 665 | \item[Preconditions:]{The user is logged into their account.} | |
666 | 666 | |||
\item[Pre-conditions]{None.} | 667 | 667 | \item[Postconditions:]{The user's data can no longer be accessed.} | |
668 | 668 | |||
\item[Post-conditions]{The admin receives the user's message.} | 669 | 669 | \item[Trigger:] | |
670 | 670 | |||
\item[Trigger]{UserX wants to contact the administrators of our application.} | 671 | 671 | \item[Workflow:] | |
672 | 672 | |||
\item[Workflow] | 673 | 673 | \begin{enumerate} | |
\begin{enumerate} | 674 | 674 | \itemsep1pt\parskip0pt\parsep0pt | |
\itemsep1pt\parskip0pt\parsep0pt | 675 | 675 | \item | |
\item | 676 | 676 | {UserX shall click the ``Logout'' button.} | |
{The System shall display the admin email address on every page in the | 677 | 677 | \item | |
application.} | 678 | 678 | {The System shall logs out UserX.} | |
\end{enumerate} | 679 | 679 | \item | |
680 | 680 | {The System shall redirect UserX to the login page.} | ||
\item[Expected Result:] {The admin's email address can be seen by UserX on every page.} | 681 | 681 | \end{enumerate} | |
\end{description} | 682 | 682 | ||
\newpage | 683 | 683 | \item[Expected Result:] {User is logged out and is redirected to the login page.} | |
684 | 684 | \end{description} | ||
{} | 685 | 685 | \newpage | |
686 | 686 | |||
\subsection{[A10] Configure Account Notifications} | 687 | 687 | {} | |
\begin{description} | 688 | 688 | ||
\item[Description]{This test case outlines the presentation layering step process of a user configuring notification settings.} | 689 | 689 | \subsection{[A9] Contact Admin} | |
690 | 690 | |||
\item[Desired Outcome]{The User shall only receive notifications at the | 691 | 691 | \begin{description} | |
times that were specified.} | 692 | 692 | \item[Description]{The User shall be able to contact the admin.} | |
\\ | 693 | 693 | ||
694 | 694 | \item[Desired Outcome]{The User shall send a message to the admin; the | ||
\item[User Goals]{The User shall not be bothered needlessly or at | 695 | 695 | admin shall receive the message.} | |
inconvenient times.} | 696 | 696 | ||
697 | 697 | \item[User Goals:]{The User sends a message to the admin.} | ||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} | 698 | 698 | ||
\\ | 699 | 699 | \item[Dependency Use Cases]{None} | |
700 | 700 | \\ | ||
\item[Priority Level]{``Must''} | 701 | 701 | ||
702 | 702 | \item[Priority Level]{``Must''} | ||
\item[Status]{Deferred} | 703 | 703 | ||
704 | 704 | \item[Status]{Not Implemented and Deferred} | ||
\item[Preconditions:] | 705 | 705 | ||
\begin{itemize} | 706 | 706 | \item[Pre-conditions]{None.} | |
\itemsep1pt\parskip0pt\parsep0pt | 707 | 707 | ||
\item | 708 | 708 | \item[Post-conditions]{The admin receives the user's message.} | |
{The User is logged in as UserX.} | 709 | 709 | ||
\end{itemize} | 710 | 710 | \item[Trigger]{UserX wants to contact the administrators of our application.} | |
711 | 711 | |||
\item[Postconditions:] | 712 | 712 | \item[Workflow] | |
\begin{itemize} | 713 | 713 | \begin{enumerate} | |
\itemsep1pt\parskip0pt\parsep0pt | 714 | 714 | \itemsep1pt\parskip0pt\parsep0pt | |
\item | 715 | 715 | \item | |
{User only receive notifications at specified times} | 716 | 716 | {The System shall display the admin email address on every page in the | |
\end{itemize} | 717 | 717 | application.} | |
718 | 718 | \end{enumerate} | ||
\item[Trigger]{UserX wants to change their notification settings} | 719 | 719 | ||
720 | 720 | \item[Expected Result:] {The admin's email address can be seen by UserX on every page.} | ||
\item[Workflow] | 721 | 721 | \end{description} | |
\begin{enumerate} | 722 | 722 | \newpage | |
\itemsep1pt\parskip0pt\parsep0pt | 723 | 723 | ||
\item | 724 | 724 | {} | |
{UserX shall select ``Settings'' button from the top header.} | 725 | 725 | ||
\item | 726 | 726 | \subsection{[A10] Configure Account Notifications} | |
{The System shall display a settings screen.} | 727 | 727 | \begin{description} | |
\item | 728 | 728 | \item[Description]{This test case outlines the presentation layering step process of a user configuring notification settings.} | |
{UserX shall change the notification timing to 1 min.} | 729 | 729 | ||
\item | 730 | 730 | \item[Desired Outcome]{The User shall only receive notifications at the | |
{UserX shall click ``Save Settings'' button.} | 731 | 731 | times that were specified.} | |
\item | 732 | 732 | \\ | |
{The System shall display a message confirming the settings are saved.} | 733 | 733 | ||
\item | 734 | 734 | \item[User Goals]{The User shall not be bothered needlessly or at | |
{The System shall save notification settings to the user's attributes.} | 735 | 735 | inconvenient times.} | |
\end{enumerate} | 736 | 736 | ||
737 | 737 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} | ||
\item[Expected Result:]{UserX shall be notified at least as slow as 1 min.} | 738 | 738 | \\ | |
\end{description} | 739 | 739 | ||
\newpage | 740 | 740 | \item[Priority Level]{``Must''} | |
741 | 741 | |||
{} | 742 | 742 | \item[Status]{Deferred} | |
743 | 743 | |||
\section{Flashcards} | 744 | 744 | \item[Preconditions:] | |
\subsection{[F1] Push Flashcard} | 745 | 745 | \begin{itemize} | |
746 | 746 | \itemsep1pt\parskip0pt\parsep0pt | ||
\begin{description} | 747 | 747 | \item | |
\item[Description:]{This test case outlines the presentation layer step | 748 | 748 | {The User is logged in as UserX.} | |
process of a User contributing a flashcard to the live feed and to their deck.} | 749 | 749 | \end{itemize} | |
750 | 750 | |||
\item[Desired Outcome:]{The User shall have the flashcard added to their own deck | 751 | 751 | \item[Postconditions:] | |
and the live feed.} | 752 | 752 | \begin{itemize} | |
\\ | 753 | 753 | \itemsep1pt\parskip0pt\parsep0pt | |
754 | 754 | \item | ||
\item[User Goals:]{The User will see their flashcard in their deck and the | 755 | 755 | {User only receive notifications at specified times} | |
flashcard will be shared with others.} | 756 | 756 | \end{itemize} | |
757 | 757 | |||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class} | 758 | 758 | \item[Trigger]{UserX wants to change their notification settings} | |
\\ | 759 | 759 | ||
760 | 760 | \item[Workflow] | ||
\item[Priority Level:]{``Must''} | 761 | 761 | \begin{enumerate} | |
762 | 762 | \itemsep1pt\parskip0pt\parsep0pt | ||
\item[Status:]{Implemented} | 763 | 763 | \item | |
764 | 764 | {UserX shall select ``Settings'' button from the top header.} | ||
\item[Preconditions:] | 765 | 765 | \item | |
\begin{itemize} | 766 | 766 | {The System shall display a settings screen.} | |
\itemsep1pt\parskip0pt\parsep0pt | 767 | 767 | \item | |
\item | 768 | 768 | {UserX shall change the notification timing to 1 min.} | |
{The User is logged as UserX.} | 769 | 769 | \item | |
\item | 770 | 770 | {UserX shall click ``Save Settings'' button.} | |
{The User is logged in a different browser session as UserY.} | 771 | 771 | \item | |
\item | 772 | 772 | {The System shall display a message confirming the settings are saved.} | |
{UserX and UserY have added the class TEST 101.} | 773 | 773 | \item | |
\item | 774 | 774 | {The System shall save notification settings to the user's attributes.} | |
{UserX and UserY are on the live feed for TEST 101.} | 775 | 775 | \end{enumerate} | |
\end{itemize} | 776 | 776 | ||
777 | 777 | \item[Expected Result:]{UserX shall be notified at least as slow as 1 min.} | ||
\item[Postconditions:] | 778 | 778 | \end{description} | |
\begin{itemize} | 779 | 779 | \newpage | |
\itemsep1pt\parskip0pt\parsep0pt | 780 | 780 | ||
\item | 781 | 781 | {} | |
{UserX has flashcard added to their deck.} | 782 | 782 | ||
\item | 783 | 783 | \section{Flashcards} | |
{The Flashcard is shown in the live feed.} | 784 | 784 | \subsection{[F1] Push Flashcard} | |
\item | 785 | 785 | ||
{UserY and other users can add this flashcard to their decks.} | 786 | 786 | \begin{description} | |
\end{itemize} | 787 | 787 | \item[Description:]{This test case outlines the presentation layer step | |
788 | 788 | process of a User contributing a flashcard to the live feed and to their deck.} | ||
\item[Trigger:]{UserX wants to contribute a flashcard to the class TEST 101.} | 789 | 789 | ||
790 | 790 | \item[Desired Outcome:]{The User shall have the flashcard added to their own deck | ||
\item[Workflow:] | 791 | 791 | and the live feed.} | |
\begin{enumerate} | 792 | 792 | \\ | |
\itemsep1pt\parskip0pt\parsep0pt | 793 | 793 | ||
\item {UserX has clicked the circular plus button (``Compose'' button) in | 794 | 794 | \item[User Goals:]{The User will see their flashcard in their deck and the | |
the lower right corner of the live feed.} | 795 | 795 | flashcard will be shared with others.} | |
\item | 796 | 796 | ||
{The System shall present a modal with a text box.} | 797 | 797 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class} | |
\item | 798 | 798 | \\ | |
{UserX shall select the input field of the modal and type ``The rain in Spain stays mainly in the plain''.} | 799 | 799 | ||
\item | 800 | 800 | \item[Priority Level:]{``Must''} | |
{UserX shall select the ``Contribute'' button in the modal.} | 801 | 801 | ||
\item | 802 | 802 | \item[Status:]{Implemented} | |
{The System shall add the new card containing the text ``The rain in Spain stays mainly in | 803 | 803 | ||
the plain'' to the feed of each user enrolled in ``TEST 101''.} | 804 | 804 | \item[Preconditions:] | |
\item | 805 | 805 | \begin{itemize} | |
{UserY shall see the card appear in their feed within a minute (See Notes).} | 806 | 806 | \itemsep1pt\parskip0pt\parsep0pt | |
\item | 807 | 807 | \item | |
{The System shall hide the modal from UserX.} | 808 | 808 | {The User is logged as UserX.} | |
\item | 809 | 809 | \item | |
{The flashcard shall be included in the UserX's deck.(c.f. Note about simultaneous browser session).} | 810 | 810 | {The User is logged in a different browser session as UserY.} | |
\end{enumerate} | 811 | 811 | \item | |
812 | 812 | {UserX and UserY have added the class TEST 101.} | ||
\item[Expected Result:] {UserX will have the new flashcard in their deck. | 813 | 813 | \item | |
For UserX, the new flashcard will have a checkmark, indicating that the card | 814 | 814 | {UserX and UserY are on the live feed for TEST 101.} | |
is in their deck and a pencil icon on top right to indicate UserX as | 815 | 815 | \end{itemize} | |
the author of the flashcard. The new flashcard will show up on UserY's | 816 | 816 | ||
live feed on class TEST 101 without checkmark and pencil icon.} | 817 | 817 | \item[Postconditions:] | |
818 | 818 | \begin{itemize} | ||
\item[Alternative Workflow:] | 819 | 819 | \itemsep1pt\parskip0pt\parsep0pt | |
\begin{enumerate} | 820 | 820 | \item | |
\setcounter{enumi}{3} | 821 | 821 | {UserX has flashcard added to their deck.} | |
\itemsep1pt\parskip0pt\parsep0pt | 822 | 822 | \item | |
\item | 823 | 823 | {The Flashcard is shown in the live feed.} | |
{UserX shall user their cursor to select the word Spain in the text box, then click the ``Blank Word'' button.} | 824 | 824 | \item | |
\item | 825 | 825 | {UserY and other users can add this flashcard to their decks.} | |
{The System shall bold the word Spain.} | 826 | 826 | \end{itemize} | |
\item | 827 | 827 | ||
{UserX shall use the cursor to select the word ``plain'' in the text box, then click the ``Blank Word'' button.} | 828 | 828 | \item[Trigger:]{UserX wants to contribute a flashcard to the class TEST 101.} | |
\item | 829 | 829 | ||
{The System shall bold the word plain.} | 830 | 830 | \item[Workflow:] | |
\item | 831 | 831 | \begin{enumerate} | |
{UserX shall click the ``Contribute'' button in the modal.} | 832 | 832 | \itemsep1pt\parskip0pt\parsep0pt | |
\item | 833 | 833 | \item {UserX has clicked the circular plus button (``Compose'' button) in | |
{The System shall add the new flashcard containing the text ``The rain in \textbf{Spain} stays mainly in the \textbf{plain}'' to the feed of each user enrolled in TEST.} | 834 | 834 | the lower right corner of the live feed.} | |
\item | 835 | 835 | \item | |
{UserY shall view the live feed and within a minute see the new flashcard appear with ``Spain'' and ``plain'' bolded.} | 836 | 836 | {The System shall present a modal with a text box.} | |
\end{enumerate} | 837 | 837 | \item | |
838 | 838 | {UserX shall select the input field of the modal and type ``The rain in Spain stays mainly in the plain''.} | ||
\item[Expected Result:] { | 839 | 839 | \item | |
UserX will have the new flashcard with the words ``Spain'' and ``plain'' bolded in their deck. | 840 | 840 | {UserX shall select the ``Contribute'' button in the modal.} | |
For UserX, the new flashcard will have a checkmark, | 841 | 841 | \item | |
indicating that the card is in their deck and a pencil icon on | 842 | 842 | {The System shall add the new card containing the text ``The rain in Spain stays mainly in | |
top right to indicate UserX as the author of the flashcard. | 843 | 843 | the plain'' to the feed of each user enrolled in ``TEST 101''.} | |
The new flashcard will show up on UserY's live feed on class TEST 101 | 844 | 844 | \item | |
without checkmark and pencil icon.} | 845 | 845 | {UserY shall see the card appear in their feed within a minute (See Notes).} | |
846 | 846 | \item | ||
\item[Alternative Workflow:] | 847 | 847 | {The System shall hide the modal from UserX.} | |
\begin{enumerate} | 848 | 848 | \item | |
\setcounter{enumi}{2} | 849 | 849 | {The flashcard shall be included in the UserX's deck.(c.f. Note about simultaneous browser session).} | |
\itemsep1pt\parskip0pt\parsep0pt | 850 | 850 | \end{enumerate} | |
\item | 851 | 851 | ||
{UserX shall select the input field of the modal and type five blank spaces.} | 852 | 852 | \item[Expected Result:] {UserX will have the new flashcard in their deck. | |
\item | 853 | 853 | For UserX, the new flashcard will have a checkmark, indicating that the card | |
{UserX shall click the ``Contribute'' button in the dialog.} | 854 | 854 | is in their deck and a pencil icon on top right to indicate UserX as | |
\end{enumerate} | 855 | 855 | the author of the flashcard. The new flashcard will show up on UserY's | |
856 | 856 | live feed on class TEST 101 without checkmark and pencil icon.} | ||
\item[Expected Result:] {Blank flashcard will not be added to UserX's deck or to the live feed of TEST 101.} | 857 | 857 | ||
858 | 858 | \item[Alternative Workflow:] | ||
\item[Alternative Workflow:] | 859 | 859 | \begin{enumerate} | |
\begin{enumerate} | 860 | 860 | \setcounter{enumi}{3} | |
\setcounter{enumi}{2} | 861 | 861 | \itemsep1pt\parskip0pt\parsep0pt | |
\itemsep1pt\parskip0pt\parsep0pt | 862 | 862 | \item | |
\item | 863 | 863 | {UserX shall user their cursor to select the word Spain in the text box, then click the ``Blank Word'' button.} | |
{UserX shall select the input field and type ``Test''.} | 864 | 864 | \item | |
\item | 865 | 865 | {The System shall bold the word Spain.} | |
{UserX shall click the ``Contribute'' button in the dialog.} | 866 | 866 | \item | |
\end{enumerate} | 867 | 867 | {UserX shall use the cursor to select the word ``plain'' in the text box, then click the ``Blank Word'' button.} | |
868 | 868 | \item | ||
\item[Expected Result:] | 869 | 869 | {The System shall bold the word plain.} | |
{ Flashcard with input not meeting the length restriction will not be added to | 870 | 870 | \item | |
UserX's deck or to the live feed of TEST 101.} | 871 | 871 | {UserX shall click the ``Contribute'' button in the modal.} | |
872 | 872 | \item | ||
\end{description} | 873 | 873 | {The System shall add the new flashcard containing the text ``The rain in \textbf{Spain} stays mainly in the \textbf{plain}'' to the feed of each user enrolled in TEST.} | |
\newpage | 874 | 874 | \item | |
875 | 875 | {UserY shall view the live feed and within a minute see the new flashcard appear with ``Spain'' and ``plain'' bolded.} | ||
{} | 876 | 876 | \end{enumerate} | |
877 | 877 | |||
\subsection{[F2] Edit Flashcard} | 878 | 878 | \item[Expected Result:] { | |
879 | 879 | UserX will have the new flashcard with the words ``Spain'' and ``plain'' bolded in their deck. | ||
\begin{description} | 880 | 880 | For UserX, the new flashcard will have a checkmark, | |
\item[Description:]{This test case outlines the presentation layering step process of a user editting a flashcard.} | 881 | 881 | indicating that the card is in their deck and a pencil icon on | |
882 | 882 | top right to indicate UserX as the author of the flashcard. | ||
\item[Desired Outcome:]{Flashcard is edited and saved appropriately} | 883 | 883 | The new flashcard will show up on UserY's live feed on class TEST 101 | |
\\ | 884 | 884 | without checkmark and pencil icon.} | |
885 | 885 | |||
\item[User Goals:]{The User shall be able to change the text and the blanked words on a flashcard.} | 886 | 886 | \item[Alternative Workflow:] | |
887 | 887 | \begin{enumerate} | ||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User | 888 | 888 | \setcounter{enumi}{2} | |
Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull Flashcard} | 889 | 889 | \itemsep1pt\parskip0pt\parsep0pt | |
890 | 890 | \item | ||
\item[Priority Level:]{``Should''} | 891 | 891 | {UserX shall select the input field of the modal and type five blank spaces.} | |
892 | 892 | \item | ||
\item[Status:]{Implemented} | 893 | 893 | {UserX shall click the ``Contribute'' button in the dialog.} | |
894 | 894 | \end{enumerate} | ||
\item[Preconditions:] | 895 | 895 | ||
\begin{itemize} | 896 | 896 | \item[Expected Result:] {Blank flashcard will not be added to UserX's deck or to the live feed of TEST 101.} | |
\itemsep1pt\parskip0pt\parsep0pt | 897 | 897 | ||
\item | 898 | 898 | \item[Alternative Workflow:] | |
{The User is logged in as UserX.} | 899 | 899 | \begin{enumerate} | |
\item | 900 | 900 | \setcounter{enumi}{2} | |
{The User is logged in a different browser session as UserY.} | 901 | 901 | \itemsep1pt\parskip0pt\parsep0pt | |
\item | 902 | 902 | \item | |
{User has added the class TEST 101.} | 903 | 903 | {UserX shall select the input field and type ``Test''.} | |
\item | 904 | 904 | \item | |
{TEST 101 contains the flashcard ``This is made for \textbf{edit}'' | 905 | 905 | {UserX shall click the ``Contribute'' button in the dialog.} | |
, which was made by other user and is not in UserX's deck.} | 906 | 906 | \end{enumerate} | |
\item | 907 | 907 | ||
{UserX has the flashcard ``I have made an error'', which was created by UserX, in their deck.} | 908 | 908 | \item[Expected Result:] | |
\end{itemize} | 909 | 909 | { Flashcard with input not meeting the length restriction will not be added to | |
910 | 910 | UserX's deck or to the live feed of TEST 101.} | ||
\item[Postconditions:] | 911 | 911 | ||
\begin{itemize} | 912 | 912 | \end{description} | |
\itemsep1pt\parskip0pt\parsep0pt | 913 | 913 | \newpage | |
\item | 914 | 914 | ||
{The selected flashcard is edited} | 915 | 915 | {} | |
\end{itemize} | 916 | 916 | ||
917 | 917 | \subsection{[F2] Edit Flashcard} | ||
\item[Trigger:]{The User wants to edit a card.} | 918 | 918 | ||
919 | 919 | \begin{description} | ||
\item[Workflow:] | 920 | 920 | \item[Description:]{This test case outlines the presentation layering step process of a user editting a flashcard.} | |
\begin{enumerate} | 921 | 921 | ||
\itemsep1pt\parskip0pt\parsep0pt | 922 | 922 | \item[Desired Outcome:]{Flashcard is edited and saved appropriately} | |
\item | 923 | 923 | \\ | |
{UserX shall hover the cursor over the flashcard ``this is made for \textbf{edit}''.} | 924 | 924 | ||
\item | 925 | 925 | \item[User Goals:]{The User shall be able to change the text and the blanked words on a flashcard.} | |
{UserX shall click the edit button on bottom left of the hovered flashcard. The blue edit button looks like a pencil slanted writing on a paper.} | 926 | 926 | ||
\item | 927 | 927 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User | |
{The System shall present a modal that contains the text of the selected flashcard.} | 928 | 928 | Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull Flashcard} | |
\item | 929 | 929 | ||
{UserX shall be able to change the text to ``Edit has been made''.} | 930 | 930 | \item[Priority Level:]{``Should''} | |
\item | 931 | 931 | ||
{UserX shall click 'Save'} | 932 | 932 | \item[Status:]{Implemented} | |
\item | 933 | 933 | ||
{The System shall hide the modal from UserX.} | 934 | 934 | \item[Preconditions:] | |
\end{enumerate} | 935 | 935 | \begin{itemize} | |
936 | 936 | \itemsep1pt\parskip0pt\parsep0pt | ||
\item[Expected Results:]{The selected flashcard's text shall be changed to ``Edit has been made''.} | 937 | 937 | \item | |
938 | 938 | {The User is logged in as UserX.} | ||
\item[Alternative Workflow A:] | 939 | 939 | \item | |
940 | 940 | {The User is logged in a different browser session as UserY.} | ||
\begin{enumerate} | 941 | 941 | \item | |
\itemsep1pt\parskip0pt\parsep0pt | 942 | 942 | {User has added the class TEST 101.} | |
\item | 943 | 943 | \item | |
{UserX shall move the cursor over the flash card ``this is made for edit2''.} | 944 | 944 | {TEST 101 contains the flashcard ``This is made for \textbf{edit}'' | |
\item | 945 | 945 | , which was made by other user and is not in UserX's deck.} | |
{UserX shall click the edit button on bottom left of the selected flashcard.} | 946 | 946 | \item | |
\item | 947 | 947 | {UserX has the flashcard ``I have made an error'', which was created by UserX, in their deck.} | |
{The System shall present a modal that contains the text of the selected flashcard.} | 948 | 948 | \end{itemize} | |
\item | 949 | 949 | ||
{UserX shall be able to change the bolded text from ``edit2'' to ``fun'' by highlighting the words and click blank words.} | 950 | 950 | \item[Postconditions:] | |
\item | 951 | 951 | \begin{itemize} | |
{UserX shall click 'Save'} | 952 | 952 | \itemsep1pt\parskip0pt\parsep0pt | |
\item | 953 | 953 | \item | |
{The System shall hide the modal from UserX.} | 954 | 954 | {The selected flashcard is edited} | |
\item | 955 | 955 | \end{itemize} | |
{The selected flashcard's blanked words shall be changed to ``fun''.} | 956 | 956 | ||
\end{enumerate} | 957 | 957 | \item[Trigger:]{The User wants to edit a card.} | |
958 | 958 | |||
\item[Expected Result:]{The selected flashcard's blanked words shall be changed to ``fun''.} | 959 | 959 | \item[Workflow:] | |
960 | 960 | \begin{enumerate} | ||
\item[Alternative Workflow B:] | 961 | 961 | \itemsep1pt\parskip0pt\parsep0pt | |
962 | 962 | \item | ||
\begin{enumerate} | 963 | 963 | {UserX shall hover the cursor over the flashcard ``this is made for \textbf{edit}''.} | |
\itemsep1pt\parskip0pt\parsep0pt | 964 | 964 | \item | |
\item | 965 | 965 | {UserX shall click the edit button on bottom left of the hovered flashcard. The blue edit button looks like a pencil slanted writing on a paper.} | |
{UserX shall move the cursor over the flash card ``this is made for edit3''.} | 966 | 966 | \item | |
\item | 967 | 967 | {The System shall present a modal that contains the text of the selected flashcard.} | |
{UserX shall click the edit button on bottom left of the selected flashcard.} | 968 | 968 | \item | |
\item | 969 | 969 | {UserX shall be able to change the text to ``Edit has been made''.} | |
{The System shall present a modal that contains the text of the selected flashcard.} | 970 | 970 | \item | |
\item | 971 | 971 | {UserX shall click 'Save'} | |
{UserX shall be able the study date to 6/12.} | 972 | 972 | \item | |
\item | 973 | 973 | {The System shall hide the modal from UserX.} | |
{UserX shall click 'Save'} | 974 | 974 | \end{enumerate} | |
\item | 975 | 975 | ||
{The System shall hide the modal from UserX.} | 976 | 976 | \item[Expected Results:]{The selected flashcard's text shall be changed to ``Edit has been made''.} | |
\end{enumerate} | 977 | 977 | ||
978 | 978 | \item[Alternative Workflow A:] | ||
\item[Expected Result:]{The selected flashcard's study date shall be changed to 6/12.} | 979 | 979 | ||
\end{description} | 980 | 980 | \begin{enumerate} | |
\newpage | 981 | 981 | \itemsep1pt\parskip0pt\parsep0pt | |
982 | 982 | \item | ||
{} | 983 | 983 | {UserX shall move the cursor over the flash card ``this is made for edit2''.} | |
984 | 984 | \item | ||
\subsection{[F3] Pull Flashcard} | 985 | 985 | {UserX shall click the edit button on bottom left of the selected flashcard.} | |
\begin{description} | 986 | 986 | \item | |
\item[Description:]{This test case outlines the presentation layering step | 987 | 987 | {The System shall present a modal that contains the text of the selected flashcard.} | |
process of a user pulling a flashcard.} | 988 | 988 | \item | |
989 | 989 | {UserX shall be able to change the bolded text from ``edit2'' to ``fun'' by highlighting the words and click blank words.} | ||
\item[Desired Outcome:]{The User shall have the flashcard added to their deck.} | 990 | 990 | \item | |
\\ | 991 | 991 | {UserX shall click 'Save'} | |
992 | 992 | \item | ||
\item[User Goals:]{The User will be able to review that flashcard.} | 993 | 993 | {The System shall hide the modal from UserX.} | |
994 | 994 | \item | ||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User | 995 | 995 | {The selected flashcard's blanked words shall be changed to ``fun''.} | |
Login, [A3] Add a Class, [F1] Push Flashard} | 996 | 996 | \end{enumerate} | |
997 | 997 | |||
\item[Priority Level:]{``Must'' } | 998 | 998 | \item[Expected Result:]{The selected flashcard's blanked words shall be changed to ``fun''.} | |
999 | 999 | |||
\item[Status:]{Implemented} | 1000 | 1000 | \item[Alternative Workflow B:] | |
1001 | 1001 | |||
\item[Preconditions:] | 1002 | 1002 | \begin{enumerate} | |
\begin{itemize} | 1003 | 1003 | \itemsep1pt\parskip0pt\parsep0pt | |
\itemsep1pt\parskip0pt\parsep0pt | 1004 | 1004 | \item | |
\item | 1005 | 1005 | {UserX shall move the cursor over the flash card ``this is made for edit3''.} | |
{The User is logged in as UserX.} | 1006 | 1006 | \item | |
\item | 1007 | 1007 | {UserX shall click the edit button on bottom left of the selected flashcard.} | |
{User has registered for class TEST 101.} | 1008 | 1008 | \item | |
\item | 1009 | 1009 | {The System shall present a modal that contains the text of the selected flashcard.} | |
{User is at live feed for TEST 101.} | 1010 | 1010 | \item | |
\item | 1011 | 1011 | {UserX shall be able the study date to 6/12.} | |
{That flashcard with the text ``Pull me'' is in the Live Feed of class TEST 101.} | 1012 | 1012 | \item | |
\end{itemize} | 1013 | 1013 | {UserX shall click 'Save'} | |
1014 | 1014 | \item | ||
\item[Postconditions:] | 1015 | 1015 | {The System shall hide the modal from UserX.} | |
\begin{itemize} | 1016 | 1016 | \end{enumerate} | |
\itemsep1pt\parskip0pt\parsep0pt | 1017 | 1017 | ||
\item | 1018 | 1018 | \item[Expected Result:]{The selected flashcard's study date shall be changed to 6/12.} | |
{UserX shall have that flashcard with the text ``Pull me'' added to their deck} | 1019 | 1019 | \end{description} | |
\item | 1020 | 1020 | \newpage | |
{UserX shall be able to review this flashcard later} | 1021 | 1021 | ||
\end{itemize} | 1022 | 1022 | {} | |
1023 | 1023 | |||
\item[Trigger:]{UserX wants to add a flashcard to their deck to study it.} | 1024 | 1024 | \subsection{[F3] Pull Flashcard} | |
1025 | 1025 | \begin{description} | ||
\item[Workflow:] | 1026 | 1026 | \item[Description:]{This test case outlines the presentation layering step | |
1027 | 1027 | process of a user pulling a flashcard.} | ||
\begin{enumerate} | 1028 | 1028 | ||
\itemsep1pt\parskip0pt\parsep0pt | 1029 | 1029 | \item[Desired Outcome:]{The User shall have the flashcard added to their deck.} | |
\item | 1030 | 1030 | \\ | |
{UserX shall choose the flashcard with the text ``Pull me'' from the | 1031 | 1031 | ||
class TEST 101 feed and hover their cursor over it.} | 1032 | 1032 | \item[User Goals:]{The User will be able to review that flashcard.} | |
\item | 1033 | 1033 | ||
{The System shall present buttons on mouseover.} | 1034 | 1034 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User | |
\item | 1035 | 1035 | Login, [A3] Add a Class, [F1] Push Flashard} | |
{UserX shall click on the large plus that appears over the flashcard with the text ``Pull me''.} | 1036 | 1036 | ||
\item | 1037 | 1037 | \item[Priority Level:]{``Must'' } | |
{The System shall add the flashcard into UserX's deck. | 1038 | 1038 | ||
A checkmark shall appear on top right corner of the flashcard.} | 1039 | 1039 | \item[Status:]{Implemented} | |
\item | 1040 | 1040 | ||
{UserX shall click the ``Deck'' icon on the top left to enter their | 1041 | 1041 | \item[Preconditions:] | |
deck.} | 1042 | 1042 | \begin{itemize} | |
\item | 1043 | 1043 | \itemsep1pt\parskip0pt\parsep0pt | |
{UserX shall check that the card with the text ``Pull me'' has been added to their class | 1044 | 1044 | \item | |
TEST 101 deck.} | 1045 | 1045 | {The User is logged in as UserX.} | |
\end{enumerate} | 1046 | 1046 | \item | |
1047 | 1047 | {User has registered for class TEST 101.} | ||
\item[Expected Result:] {The flashcard with the text ``Pull me'' is in the class | 1048 | 1048 | \item | |
TEST 101 deck. If UserX hovers the cursor over the flashcard at the live feed of | 1049 | 1049 | {User is at live feed for TEST 101.} | |
TEST 101, the original placement of the large plus button has been changed to large minus button.} | 1050 | 1050 | \item | |
\end{description} | 1051 | 1051 | {That flashcard with the text ``Pull me'' is in the Live Feed of class TEST 101.} | |
\newpage | 1052 | 1052 | \end{itemize} | |
1053 | 1053 | |||
{} | 1054 | 1054 | \item[Postconditions:] | |
1055 | 1055 | \begin{itemize} | ||
\subsection{[F4] Flag Inappropriate Cards} | 1056 | 1056 | \itemsep1pt\parskip0pt\parsep0pt | |
1057 | 1057 | \item | ||
\begin{description} | 1058 | 1058 | {UserX shall have that flashcard with the text ``Pull me'' added to their deck} | |
\item[Description:]{This test case outlines the presentation layering step | 1059 | 1059 | \item | |
process of a user flagging a card they have deemed inappropriate.} | 1060 | 1060 | {UserX shall be able to review this flashcard later} | |
1061 | 1061 | \end{itemize} | ||
\item[Desired Outcome:]{The flashcard's inappropriateness variable is | 1062 | 1062 | ||
adjusted.} | 1063 | 1063 | \item[Trigger:]{UserX wants to add a flashcard to their deck to study it.} | |
\\ | 1064 | 1064 | ||
1065 | 1065 | \item[Workflow:] | ||
\item[User Goals:]{To note if a card should not belong in the class and | 1066 | 1066 | ||
should not be displayed in the feed.} | 1067 | 1067 | \begin{enumerate} | |
1068 | 1068 | \itemsep1pt\parskip0pt\parsep0pt | ||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User | 1069 | 1069 | \item | |
Login, [A3] Add a Class, [F1] Push Flashcard} | 1070 | 1070 | {UserX shall choose the flashcard with the text ``Pull me'' from the | |
1071 | 1071 | class TEST 101 feed and hover their cursor over it.} | ||
\item[Priority Level:]{``Should''} | 1072 | 1072 | \item | |
1073 | 1073 | {The System shall present buttons on mouseover.} | ||
\item[Status:]{Implemented} | 1074 | 1074 | \item | |
1075 | 1075 | {UserX shall click on the large plus that appears over the flashcard with the text ``Pull me''.} | ||
\item[Preconditions:] | 1076 | 1076 | \item | |
\begin{itemize} | 1077 | 1077 | {The System shall add the flashcard into UserX's deck. | |
\itemsep1pt\parskip0pt\parsep0pt | 1078 | 1078 | A checkmark shall appear on top right corner of the flashcard.} | |
\item | 1079 | 1079 | \item | |
{UserX has registered for a class TEST 101.} | 1080 | 1080 | {UserX shall click the ``Deck'' icon on the top left to enter their | |
\item | 1081 | 1081 | deck.} | |
{UserX is in the live feed for class TEST 101.} | 1082 | 1082 | \item | |
\item | 1083 | 1083 | {UserX shall check that the card with the text ``Pull me'' has been added to their class | |
{Flashcard with text ``TESTY FLASHY'' has been created for TEST 101.} | 1084 | 1084 | TEST 101 deck.} | |
\item | 1085 | 1085 | \end{enumerate} | |
{That flashcard ``TESTY FLASHY'' is in the Live Feed for TEST 101.} | 1086 | 1086 | ||
\end{itemize} | 1087 | 1087 | \item[Expected Result:] {The flashcard with the text ``Pull me'' is in the class | |
1088 | 1088 | TEST 101 deck. If UserX hovers the cursor over the flashcard at the live feed of | ||
\item[Postconditions:] | 1089 | 1089 | TEST 101, the original placement of the large plus button has been changed to large minus button.} | |
\begin{itemize} | 1090 | 1090 | \end{description} | |
\itemsep1pt\parskip0pt\parsep0pt | 1091 | 1091 | \newpage | |
\item | 1092 | 1092 | ||
{User shall have that flashcard added to their deck} | 1093 | 1093 | {} | |
\item | 1094 | 1094 | ||
{User can review this flashcard later} | 1095 | 1095 | \subsection{[F4] Flag Inappropriate Cards} | |
\end{itemize} | 1096 | 1096 | ||
1097 | 1097 | \begin{description} | ||
\item[Trigger:]{UserX wants to mark a card innapropriate.} | 1098 | 1098 | \item[Description:]{This test case outlines the presentation layering step | |
1099 | 1099 | process of a user flagging a card they have deemed inappropriate.} | ||
\item[Workflow:] | 1100 | 1100 | ||
\begin{enumerate} | 1101 | 1101 | \item[Desired Outcome:]{The flashcard's inappropriateness variable is | |
\itemsep1pt\parskip0pt\parsep0pt | 1102 | 1102 | adjusted.} | |
\item | 1103 | 1103 | \\ | |
{UserX shall choose the flashcard with the text ``TESTY FLASHY'' from the | 1104 | 1104 | ||
feed and hover their cursor over it.} | 1105 | 1105 | \item[User Goals:]{To note if a card should not belong in the class and | |
\item | 1106 | 1106 | should not be displayed in the feed.} | |
{The System shall present buttons on mouseover.} | 1107 | 1107 | ||
\item | 1108 | 1108 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User | |
{UserX shall click on the crossed out eye icon (Hide) that appears on the card.} | 1109 | 1109 | Login, [A3] Add a Class, [F1] Push Flashcard} | |
\item | 1110 | 1110 | ||
{The System shall hide the card from UserX and display a toast, ``Card hidden! If the card was spammy or abusive you may also REPORT''.} | 1111 | 1111 | \item[Priority Level:]{``Should''} | |
\item | 1112 | 1112 | ||
{UserX shall click the REPORT.} | 1113 | 1113 | \item[Status:]{Implemented} | |
\end{enumerate} | 1114 | 1114 | ||
1115 | 1115 | \item[Preconditions:] | ||
\item[Expected Result:] {The System shall display a toast, ``Report successful: thanks for letting us know!''} | 1116 | 1116 | \begin{itemize} | |
\end{description} | 1117 | 1117 | \itemsep1pt\parskip0pt\parsep0pt | |
\newpage | 1118 | 1118 | \item | |
1119 | 1119 | {UserX has registered for a class TEST 101.} | ||
{} | 1120 | 1120 | \item | |
1121 | 1121 | {UserX is in the live feed for class TEST 101.} | ||
\subsection{[F5] Filter Flashcards} | 1122 | 1122 | \item | |
1123 | 1123 | {Flashcard with text ``TESTY FLASHY'' has been created for TEST 101.} | ||
\begin{description} | 1124 | 1124 | \item | |
\item[Description:]{This test case outlines the presentation layer process | 1125 | 1125 | {That flashcard ``TESTY FLASHY'' is in the Live Feed for TEST 101.} | |
of a user filtering existing flashcards to view only a specified subset.} | 1126 | 1126 | \end{itemize} | |
1127 | 1127 | |||
\item[Desired Outcome:]{The User shall see flashcards based on the filter | 1128 | 1128 | \item[Postconditions:] | |
options.} | 1129 | 1129 | \begin{itemize} | |
1130 | 1130 | \itemsep1pt\parskip0pt\parsep0pt | ||
\item[User Goals:]{The User can find what they are specifically looking | 1131 | 1131 | \item | |
for} | 1132 | 1132 | {User shall have that flashcard added to their deck} | |
1133 | 1133 | \item | ||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User | 1134 | 1134 | {User can review this flashcard later} | |
Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull | 1135 | 1135 | \end{itemize} | |
Flashcard} | 1136 | 1136 | ||
1137 | 1137 | \item[Trigger:]{UserX wants to mark a card innapropriate.} | ||
\item[Priority Level:]{``Should''} | 1138 | 1138 | ||
1139 | 1139 | \item[Workflow:] | ||
\item[Status:]{Implemented} | 1140 | 1140 | \begin{enumerate} | |
1141 | 1141 | \itemsep1pt\parskip0pt\parsep0pt | ||
\item[Preconditions:] | 1142 | 1142 | \item | |
\begin{itemize} | 1143 | 1143 | {UserX shall choose the flashcard with the text ``TESTY FLASHY'' from the | |
\itemsep1pt\parskip0pt\parsep0pt | 1144 | 1144 | feed and hover their cursor over it.} | |
\item | 1145 | 1145 | \item | |
{User is logged in as UserX.} | 1146 | 1146 | {The System shall present buttons on mouseover.} | |
\item | 1147 | 1147 | \item | |
{UserX has registered for the class TEST 101.} | 1148 | 1148 | {UserX shall click on the crossed out eye icon (Hide) that appears on the card.} | |
\item | 1149 | 1149 | \item | |
{There exist flashcards in TEST 101 with the text ``apple'' and ``banana'' | 1150 | 1150 | {The System shall hide the card from UserX and display a toast, ``Card hidden! If the card was spammy or abusive you may also REPORT''.} | |
for each week in the quarter.} | 1151 | 1151 | \item | |
\item | 1152 | 1152 | {UserX shall click the REPORT.} | |
{There exist flashcards in TEST 101 with the text ``orange'' that are hidden | 1153 | 1153 | \end{enumerate} | |
for each week in the quarter.} | 1154 | 1154 | ||
\item | 1155 | 1155 | \item[Expected Result:] {The System shall display a toast, ``Report successful: thanks for letting us know!''} | |
{UserX is at Card List View for the class.} | 1156 | 1156 | \end{description} | |
\end{itemize} | 1157 | 1157 | \newpage | |
1158 | 1158 | |||
\item[Postconditions:] | 1159 | 1159 | {} | |
\begin{itemize} | 1160 | 1160 | ||
\itemsep1pt\parskip0pt\parsep0pt | 1161 | 1161 | \subsection{[F5] Filter Flashcards} | |
\item | 1162 | 1162 | ||
{User only sees flashcards pertaining to selected dates.} | 1163 | 1163 | \begin{description} | |
\end{itemize} | 1164 | 1164 | \item[Description:]{This test case outlines the presentation layer process | |
1165 | 1165 | of a user filtering existing flashcards to view only a specified subset.} | ||
\item[Trigger:]{User is looking for specific flashcards.} | 1166 | 1166 | ||
1167 | 1167 | \item[Desired Outcome:]{The User shall see flashcards based on the filter | ||
\item[Workflow:] | 1168 | 1168 | options.} | |
\begin{enumerate} | 1169 | 1169 | ||
\itemsep1pt\parskip0pt\parsep0pt | 1170 | 1170 | \item[User Goals:]{The User can find what they are specifically looking | |
\item | 1171 | 1171 | for} | |
{UserX shall deselect ``Week Nine'' from top.} | 1172 | 1172 | ||
\item | 1173 | 1173 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User | |
{The System shall hide all cards from Week 9.} | 1174 | 1174 | Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull | |
\item | 1175 | 1175 | Flashcard} | |
{UserX shall search for ``app'' in the search bar in the top right.} | 1176 | 1176 | ||
\item | 1177 | 1177 | \item[Priority Level:]{``Should''} | |
{The System shall display only cards including text ``app''.} | 1178 | 1178 | ||
\item | 1179 | 1179 | \item[Status:]{Implemented} | |
{UserX shall click ``Show Hidden'' button in the top left and clear | 1180 | 1180 | ||
the text in the search box.} | 1181 | 1181 | \item[Preconditions:] | |
\item | 1182 | 1182 | \begin{itemize} | |
{The System shall display all cards, excluding those from Week 9.} | 1183 | 1183 | \itemsep1pt\parskip0pt\parsep0pt | |
\end{enumerate} | 1184 | 1184 | \item | |
1185 | 1185 | {User is logged in as UserX.} | ||
\item[Expected Result:] {UserX shall see 9 cards with text ``apple'', 9 cards with text ``banana'', and 9 cards with text ``orange'', distributed evenly among weeks.} | 1186 | 1186 | \item | |
\end{description} | 1187 | 1187 | {UserX has registered for the class TEST 101.} | |
\newpage | 1188 | 1188 | \item | |
1189 | 1189 | {There exist flashcards in TEST 101 with the text ``apple'' and ``banana'' | ||
{} | 1190 | 1190 | for each week in the quarter.} | |
1191 | 1191 | \item | ||
\subsection{[F6] Blank Out Words in Flashcard} | 1192 | 1192 | {There exist flashcards in TEST 101 with the text ``orange'' that are hidden | |
1193 | 1193 | for each week in the quarter.} | ||
\begin{description} | 1194 | 1194 | \item | |
\item[Description:]{This test case outlines the presentation layer process | 1195 | 1195 | {UserX is at Card List View for the class.} | |
of the User to create keywords in a card they are pushing.} | 1196 | 1196 | \end{itemize} | |
1197 | 1197 | |||
\item[Desired Outcome:]{The blanked out words (visually bolded) in the | 1198 | 1198 | \item[Postconditions:] | |
flashcard notify the System that they are keywords.} | 1199 | 1199 | \begin{itemize} | |
1200 | 1200 | \itemsep1pt\parskip0pt\parsep0pt | ||
\item[User Goals:]{The User shall mark some words as keywords so the System | 1201 | 1201 | \item | |
may later quiz the User by blanking out one keyword at a time and having the | 1202 | 1202 | {User only sees flashcards pertaining to selected dates.} | |
User enter what they think the keyword is.} | 1203 | 1203 | \end{itemize} | |
1204 | 1204 | |||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User | 1205 | 1205 | \item[Trigger:]{User is looking for specific flashcards.} | |
Login, [A3] Add a Class, [F1] Push Flashcard} | 1206 | 1206 | ||
1207 | 1207 | \item[Workflow:] | ||
\item[Priority Level:]{``Must''} | 1208 | 1208 | \begin{enumerate} | |
1209 | 1209 | \itemsep1pt\parskip0pt\parsep0pt | ||
\item[Status:]{Implemented} | 1210 | 1210 | \item | |
1211 | 1211 | {UserX shall deselect ``Week Nine'' from top.} | ||
\item[Preconditions:] | 1212 | 1212 | \item | |
\begin{itemize} | 1213 | 1213 | {The System shall hide all cards from Week 9.} | |
\itemsep1pt\parskip0pt\parsep0pt | 1214 | 1214 | \item | |
\item | 1215 | 1215 | {UserX shall search for ``app'' in the search bar in the top right.} | |
\item | 1216 | 1216 | \item | |
{The User is logged in as UserX.} | 1217 | 1217 | {The System shall display only cards including text ``app''.} | |
\item | 1218 | 1218 | \item | |
{The User has added the class TEST 101.} | 1219 | 1219 | {UserX shall click ``Show Hidden'' button in the top left and clear | |
\item | 1220 | 1220 | the text in the search box.} | |
{The User is at the Feed View for the class TEST 101.} | 1221 | 1221 | \item | |
\end{itemize} | 1222 | 1222 | {The System shall display all cards, excluding those from Week 9.} | |
1223 | 1223 | \end{enumerate} | ||
\item[Postconditions:] | 1224 | 1224 | ||
\begin{itemize} | 1225 | 1225 | \item[Expected Result:] {UserX shall see 9 cards with text ``apple'', 9 cards with text ``banana'', and 9 cards with text ``orange'', distributed evenly among weeks.} | |
\itemsep1pt\parskip0pt\parsep0pt | 1226 | 1226 | \end{description} | |
\item | 1227 | 1227 | \newpage | |
{The blanked out words (keyword) ``Spain'' in the flashcard are marked with underline.} | 1228 | 1228 | ||
\end{itemize} | 1229 | 1229 | {} | |
1230 | 1230 | |||
\item[Trigger:] {The User wants their newly pushed card to have the keyword ``Spain''.} | 1231 | 1231 | \subsection{[F6] Blank Out Words in Flashcard} | |
1232 | 1232 | |||
\item[Workflow:] | 1233 | 1233 | \begin{description} | |
\begin{enumerate} | 1234 | 1234 | \item[Description:]{This test case outlines the presentation layer process | |
\itemsep1pt\parskip0pt\parsep0pt | 1235 | 1235 | of the User to create keywords in a card they are pushing.} | |
\item | 1236 | 1236 | ||
{UserX shall click the Compose button (+ circle on bottom right) of Feed.} | 1237 | 1237 | \item[Desired Outcome:]{The blanked out words (visually bolded) in the | |
\item | 1238 | 1238 | flashcard notify the System that they are keywords.} | |
{The System shall bring up the composition flashcard modal.} | 1239 | 1239 | ||
\item | 1240 | 1240 | \item[User Goals:]{The User shall mark some words as keywords so the System | |
{UserX shall type text ``The rain in Spain stays mainly in the plain'' | 1241 | 1241 | may later quiz the User by blanking out one keyword at a time and having the | |
into the composition modal, replacing ``Write a flashcard''.} | 1242 | 1242 | User enter what they think the keyword is.} | |
\item | 1243 | 1243 | ||
{UserX shall highlight the word ``Spain''.} | 1244 | 1244 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User | |
\item {UserX shall press Blank Selected Text button.} | 1245 | 1245 | Login, [A3] Add a Class, [F1] Push Flashcard} | |
\item {UserX shall press Contribute button to push the flashcard.} | 1246 | 1246 | ||
\item | 1247 | 1247 | \item[Priority Level:]{``Must''} | |
{The System will save the blanked out word in the Flashcard Mask of the | 1248 | 1248 | ||
newly pushed flashcard.} | 1249 | 1249 | \item[Status:]{Implemented} | |
\item {The Feed shall display the new card with the keyword underlined.} | 1250 | 1250 | ||
\end{enumerate} | 1251 | 1251 | \item[Preconditions:] | |
1252 | 1252 | \begin{itemize} | ||
\item[Expected Result:] {The System shall show ``Spain'' underlined and bolded | 1253 | 1253 | \itemsep1pt\parskip0pt\parsep0pt | |
in the flashcard. The flashcard is visible in the Feed and Deck of class TEST 101.} | 1254 | 1254 | \item | |
\end{description} | 1255 | 1255 | \item | |
\newpage | 1256 | 1256 | {The User is logged in as UserX.} | |
1257 | 1257 | \item | ||
{} | 1258 | 1258 | {The User has added the class TEST 101.} | |
1259 | 1259 | \item | ||
\subsection{[F7] Fix Flashcard} | 1260 | 1260 | {The User is at the Feed View for the class TEST 101.} | |
1261 | 1261 | \end{itemize} | ||
\begin{description} | 1262 | 1262 | ||
\item[Description:]{This Test Case outlines the presentation layer process | 1263 | 1263 | \item[Postconditions:] | |
for the User to alter (``fix'') a flashcard they made originally and not have | 1264 | 1264 | \begin{itemize} | |
to make a new copy of it. It is only a ``fix'' if no other users have the | 1265 | 1265 | \itemsep1pt\parskip0pt\parsep0pt | |
flashcard in their Decks AND the User is the author.} | 1266 | 1266 | \item | |
1267 | 1267 | {The blanked out words (keyword) ``Spain'' in the flashcard are marked with underline.} | ||
\item[Desired Outcome:]{The User shall change one of their flashcard's text | 1268 | 1268 | \end{itemize} | |
and that alteration will be visible to all users in the Feed.} | 1269 | 1269 | ||
1270 | 1270 | \item[Trigger:] {The User wants their newly pushed card to have the keyword ``Spain''.} | ||
\item[User Goals:]{The User shall make their own authored flashcard say | 1271 | 1271 | ||
something different than it did originally.} | 1272 | 1272 | \item[Workflow:] | |
1273 | 1273 | \begin{enumerate} | ||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User | 1274 | 1274 | \itemsep1pt\parskip0pt\parsep0pt | |
Login, [A3] Add a Class, [F1] Push Flashcard} | 1275 | 1275 | \item | |
1276 | 1276 | {UserX shall click the Compose button (+ circle on bottom right) of Feed.} | ||
\item[Priority Level:]{``Must''} | 1277 | 1277 | \item | |
1278 | 1278 | {The System shall bring up the composition flashcard modal.} | ||
\item[Status:]{Implemented} | 1279 | 1279 | \item | |
1280 | 1280 | {UserX shall type text ``The rain in Spain stays mainly in the plain'' | ||
\item[Preconditions:] | 1281 | 1281 | into the composition modal, replacing ``Write a flashcard''.} | |
\begin{itemize} | 1282 | 1282 | \item | |
\itemsep1pt\parskip0pt\parsep0pt | 1283 | 1283 | {UserX shall highlight the word ``Spain''.} | |
\item | 1284 | 1284 | \item {UserX shall press Blank Selected Text button.} | |
{The User is logged in as UserX.} | 1285 | 1285 | \item {UserX shall press Contribute button to push the flashcard.} | |
\item {The User is logged in a separate browser as UserY.} | 1286 | 1286 | \item | |
\item | 1287 | 1287 | {The System will save the blanked out word in the Flashcard Mask of the | |
{UserX and UserY has enrolled in the class TEST 101.} | 1288 | 1288 | newly pushed flashcard.} | |
\item | 1289 | 1289 | \item {The Feed shall display the new card with the keyword underlined.} | |
{UserX is at the Deck View for the class TEST 101.} | 1290 | 1290 | \end{enumerate} | |
\item {UserY is at the Feed View for the class TEST 101.} | 1291 | 1291 | ||
\item | 1292 | 1292 | \item[Expected Result:] {The System shall show ``Spain'' underlined and bolded | |
{The User has contributed and pushed a flashcard to the TEST 101 Feed, which is | 1293 | 1293 | in the flashcard. The flashcard is visible in the Feed and Deck of class TEST 101.} | |
also in their Deck with text | 1294 | 1294 | \end{description} | |
``My card is currently broken''; this flashcard is for fixing.} | 1295 | 1295 | \newpage | |
\end{itemize} | 1296 | 1296 | ||
1297 | 1297 | {} | ||
\item[Postconditions:] | 1298 | 1298 | ||
\begin{itemize} | 1299 | 1299 | \subsection{[F7] Fix Flashcard} | |
\itemsep1pt\parskip0pt\parsep0pt | 1300 | 1300 | ||
\item | 1301 | 1301 | \begin{description} | |
{The authoring User shall see their alteration for that flashcard in their | 1302 | 1302 | \item[Description:]{This Test Case outlines the presentation layer process | |
Feed and Deck for TEST 101.} | 1303 | 1303 | for the User to alter (``fix'') a flashcard they made originally and not have | |
\item {Other users shall see the fixed flashcard in the Feed for TEST 101 if they | 1304 | 1304 | to make a new copy of it. It is only a ``fix'' if no other users have the | |
refresh the app.} | 1305 | 1305 | flashcard in their Decks AND the User is the author.} | |
\end{itemize} | 1306 | 1306 | ||
1307 | 1307 | \item[Desired Outcome:]{The User shall change one of their flashcard's text | ||
\item[Trigger:] {UserX realizes that a card they created previously does | 1308 | 1308 | and that alteration will be visible to all users in the Feed.} | |
not say what they currently desire and wishes to change it.} | 1309 | 1309 | ||
1310 | 1310 | \item[User Goals:]{The User shall make their own authored flashcard say | ||
\item[Workflow:] | 1311 | 1311 | something different than it did originally.} | |
\begin{enumerate} | 1312 | 1312 | ||
\itemsep1pt\parskip0pt\parsep0pt | 1313 | 1313 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User | |
\item | 1314 | 1314 | Login, [A3] Add a Class, [F1] Push Flashcard} | |
{UserX shall hover the Flashcard they created with text ``My card is currently | 1315 | 1315 | ||
broken''.} | 1316 | 1316 | \item[Priority Level:]{``Must''} | |
\item | 1317 | 1317 | ||
{UserX shall select the bottom-left blue Edit Card pencil button on the flashcard.} | 1318 | 1318 | \item[Status:]{Implemented} | |
\item | 1319 | 1319 | ||
{The System shall bring up the flashcard Edit modal.} | 1320 | 1320 | \item[Preconditions:] | |
\item | 1321 | 1321 | \begin{itemize} | |
{UserX shall highlight the text ``broken''.} | 1322 | 1322 | \itemsep1pt\parskip0pt\parsep0pt | |
\item {UserX shall change the highlighted word into ``fixed'' so that the text | 1323 | 1323 | \item | |
reads ``My card is currently fixed''.} | 1324 | 1324 | {The User is logged in as UserX.} | |
\item | 1325 | 1325 | \item {The User is logged in a separate browser as UserY.} | |
{UserX shall press the Save Changes button.} | 1326 | 1326 | \item | |
\item | 1327 | 1327 | {UserX and UserY has enrolled in the class TEST 101.} | |
{The System shall update the flashcard's text content.} | 1328 | 1328 | \item | |
\item | 1329 | 1329 | {UserX is at the Deck View for the class TEST 101.} | |
{The System shall close the edit flashcard modal.} | 1330 | 1330 | \item {UserY is at the Feed View for the class TEST 101.} | |
\item {The Client shall show the flashcard in the UserX's TEST 101 Deck with the | 1331 | 1331 | \item | |
fixed text.} | 1332 | 1332 | {The User has contributed and pushed a flashcard to the TEST 101 Feed, which is | |
1333 | 1333 | also in their Deck with text | ||
\item {UserY refreshes the TEST 101 Feed view and sees the flashcard ``My card is | 1334 | 1334 | ``My card is currently broken''; this flashcard is for fixing.} | |
currently fixed''.} | 1335 | 1335 | \end{itemize} | |
\end{enumerate} | 1336 | 1336 | ||
1337 | 1337 | \item[Postconditions:] | ||
\item[Expected Results:]{The Client shall show the fixed flashcard | 1338 | 1338 | \begin{itemize} | |
in UserX's TEST 101 class Deck with the new text:``My card is currently fixed''. | 1339 | 1339 | \itemsep1pt\parskip0pt\parsep0pt | |
The Client shall show the fixed flashcard in UserY's TEST 101 Feed view as well, | 1340 | 1340 | \item | |
after page refresh.} | 1341 | 1341 | {The authoring User shall see their alteration for that flashcard in their | |
\end{description} | 1342 | 1342 | Feed and Deck for TEST 101.} | |
\newpage | 1343 | 1343 | \item {Other users shall see the fixed flashcard in the Feed for TEST 101 if they | |
1344 | 1344 | refresh the app.} | ||
{} | 1345 | 1345 | \end{itemize} | |
1346 | 1346 | |||
\subsection{[F8] Hide cards from feed} | 1347 | 1347 | \item[Trigger:] {UserX realizes that a card they created previously does | |
1348 | 1348 | not say what they currently desire and wishes to change it.} | ||
\begin{description} | 1349 | 1349 | ||
\item[Description:]{This test case outlines the presentation layer process | 1350 | 1350 | \item[Workflow:] | |
for the User shall be able to hide cards from their own view, on | 1351 | 1351 | \begin{enumerate} | |
the Feed and Deck.} | 1352 | 1352 | \itemsep1pt\parskip0pt\parsep0pt | |
1353 | 1353 | \item | ||
\item[Desired Outcome:]{The System marks the flashcard as hidden from the | 1354 | 1354 | {UserX shall hover the Flashcard they created with text ``My card is currently | |
User so that the User cannot see the flashcard in the Feed or Deck.} | 1355 | 1355 | broken''.} | |
1356 | 1356 | \item | ||
\item[User Goals:]{The flashcard is no longer visible to the User in the Feed or | 1357 | 1357 | {UserX shall select the bottom-left blue Edit Card pencil button on the flashcard.} | |
Deck views.} | 1358 | 1358 | \item | |
1359 | 1359 | {The System shall bring up the flashcard Edit modal.} | ||
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User | 1360 | 1360 | \item | |
Login, [A3] Add a Class, [F1] Push Flashcard} | 1361 | 1361 | {UserX shall highlight the text ``broken''.} | |
1362 | 1362 | \item {UserX shall change the highlighted word into ``fixed'' so that the text | ||
\item[Priority Level:]{``Should''} | 1363 | 1363 | reads ``My card is currently fixed''.} | |
1364 | 1364 | \item | ||
\item[Status:]{Implemented} | 1365 | 1365 | {UserX shall press the Save Changes button.} | |
1366 | 1366 | \item | ||
\item[Preconditions:] | 1367 | 1367 | {The System shall update the flashcard's text content.} | |
\begin{itemize} | 1368 | 1368 | \item | |
\itemsep1pt\parskip0pt\parsep0pt | 1369 | 1369 | {The System shall close the edit flashcard modal.} | |
\item | 1370 | 1370 | \item {The Client shall show the flashcard in the UserX's TEST 101 Deck with the | |
{The User is logged in as UserX.} | 1371 | 1371 | fixed text.} | |
\item | 1372 | 1372 | ||
{The User has enrolled in the class TEST 101.} | 1373 | 1373 | \item {UserY refreshes the TEST 101 Feed view and sees the flashcard ``My card is | |
\item | 1374 | 1374 | currently fixed''.} | |
{The User is at the Feed View or Deck View (alternate workflow) | 1375 | 1375 | \end{enumerate} | |
for the class TEST 101.} | 1376 | 1376 | ||
\item | 1377 | 1377 | \item[Expected Results:]{The Client shall show the fixed flashcard | |
{The User has composed and contributed a flashcard to the Feed with text | 1378 | 1378 | in UserX's TEST 101 class Deck with the new text:``My card is currently fixed''. | |
``The rain in Spain stays mainly in the plain''.} | 1379 | 1379 | The Client shall show the fixed flashcard in UserY's TEST 101 Feed view as well, | |
\end{itemize} | 1380 | 1380 | after page refresh.} | |
1381 | 1381 | \end{description} | ||
\item[Postconditions:] | 1382 | 1382 | \newpage | |
\begin{itemize} | 1383 | 1383 | ||
\itemsep1pt\parskip0pt\parsep0pt | 1384 | 1384 | {} | |
\item{Flashcard is not viewable by user in the Feed or Deck views in TEST 101.} | 1385 | 1385 | ||
\end{itemize} | 1386 | 1386 | \subsection{[F8] Hide cards from feed} | |
1387 | 1387 | |||
\item[Workflow:] | 1388 | 1388 | \begin{description} | |
\begin{enumerate} | 1389 | 1389 | \item[Description:]{This test case outlines the presentation layer process | |
\itemsep1pt\parskip0pt\parsep0pt | 1390 | 1390 | for the User shall be able to hide cards from their own view, on | |
\item {UserX has navigated to the Feed View of TEST 101.} | 1391 | 1391 | the Feed and Deck.} | |
\item | 1392 | 1392 | ||
{UserX hovers the flashcard they added with the text ``The rain in Spain stays | 1393 | 1393 | \item[Desired Outcome:]{The System marks the flashcard as hidden from the | |
mainly in the plain''.} | 1394 | 1394 | User so that the User cannot see the flashcard in the Feed or Deck.} | |
1395 | 1395 | |||
\item {UserX presses Hide button, which is the red crossed-out eye.} | 1396 | 1396 | \item[User Goals:]{The flashcard is no longer visible to the User in the Feed or | |
1397 | 1397 | Deck views.} | ||
\item {The System shall hide the card.} | 1398 | 1398 | ||
\item {The Client shall remove the card from view for UserX.} | 1399 | 1399 | \item[Dependency Use Cases:]{[A1] User Registration, [A2] User | |
\item {A toast is shown on the client that allows the User to report the card.} | 1400 | 1400 | Login, [A3] Add a Class, [F1] Push Flashcard} | |
\item {The card is not shown on the Feed or Deck.} | 1401 | 1401 | ||
\end{enumerate} | 1402 | 1402 | \item[Priority Level:]{``Should''} | |
1403 | 1403 | |||
\item[Expected Result:]{The Client shows the Feed without the flashcard of text | 1404 | 1404 | \item[Status:]{Implemented} | |
``The rain in Spain stays mainly in the plain''. A toast that allows UserX to | 1405 | 1405 | ||
report the card shows up temporarily.} | 1406 | 1406 | \item[Preconditions:] | |
1407 | 1407 | \begin{itemize} | ||
\item[Alternate Workflow:] | 1408 | 1408 | \itemsep1pt\parskip0pt\parsep0pt | |
1409 | 1409 | \item | ||
\begin{enumerate} | 1410 | 1410 | {The User is logged in as UserX.} | |
\itemsep1pt\parskip0pt\parsep0pt | 1411 | 1411 | \item | |
\item {UserX has navigated to the Deck View of TEST 101.} | 1412 | 1412 | {The User has enrolled in the class TEST 101.} | |
\item | 1413 | 1413 | \item | |
{UserX hovers the flashcard they added with the text ``The rain in Spain stays | 1414 | 1414 | {The User is at the Feed View or Deck View (alternate workflow) | |
mainly in the plain''.} | 1415 | 1415 | for the class TEST 101.} | |
1416 | 1416 | \item | ||
\item {UserX presses hide button, which is the red crossed-out eye.} | 1417 | 1417 | {The User has composed and contributed a flashcard to the Feed with text | |
1418 | 1418 | ``The rain in Spain stays mainly in the plain''.} |