Compare View

switch
from
...
to
 
Commits (2)

Diff

Showing 1 changed file Inline Diff

TestCases.tex View file @ f09e8ef
\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 names>} in the root of the backend directory. If multiple fixtures are specified, they should be separated by spaces on the command line. 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 names>} in the root of the backend directory. If multiple fixtures are specified, they should be separated by spaces on the command line. Once a fixture has been applied, reload the page, log back in (if required by the test case) and continue running the test case.
59 59
Each test case specifies either ``No fixture'' or the name of the fixture to apply before running the test. 60 60 Each test case specifies either ``No fixture'' or the name of the fixture to apply before running the test.
61 61
\subsection{Testing Backend Locally} 62 62 \subsection{Testing Backend Locally}
63 63
See the README.md of the backend repository for instructions on setting up the server for these tests. 64 64 See the README.md of the backend repository for instructions on setting up the server for these tests.
65 65
\subsection{Testing Multiple Users} 66 66 \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. 67 67 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} 68 68 \subsection{Supported Browser}
Flashy officially supports Chrome version 42 on Windows and Linux. Frontend functionality may be degraded on other browsers. 69 69 Flashy officially supports Chrome version 42 on Windows and Linux. Frontend functionality may be degraded on other browsers.
70 70
\subsection{Sent Emails in Development} 71 71 \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: 72 72 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:
73 73
\includegraphics[width=4in]{../doc_screenshots/console_backend.png} 74 74 \includegraphics[width=4in]{../doc_screenshots/console_backend.png}
75 75
\newpage 76 76 \newpage
77 77
78 78
\section{Accounts} 79 79 \section{Accounts}
80 80
\subsection{[A1] User Registration} 81 81 \subsection{[A1] User Registration}
\begin{description}[style=multiline,leftmargin=3cm] 82 82 \begin{description}[style=multiline,leftmargin=3cm]
83 83
\item[Description:]{This test case outlines the presentation layering step 84 84 \item[Description:]{This test case outlines the presentation layering step
process of a user registering for an account with our application.} 85 85 process of a user registering for an account with our application.}
86 86
\item[Desired Outcome:]{An account will be created for the User from the 87 87 \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 88 88 specified username, password, email. The User will be able to log into
the aforementioned account.} 89 89 the aforementioned account.}
90 90
\item[User Goals:]{The User shall have an account to participate in the 91 91 \item[User Goals:]{The User shall have an account to participate in the
website's activities.} 92 92 website's activities.}
93 93
\item[Dependency Use Cases:]{None} 94 94 \item[Dependency Use Cases:]{None}
\\ 95 95 \\
96 96
\item[Priority Level:]{``Must''} 97 97 \item[Priority Level:]{``Must''}
98 98
\item[Status:]{Implemented} 99 99 \item[Status:]{Implemented}
100 100
\item[Fixture:] a1 101 101 \item[Fixture:] a1
102 102
\item[Preconditions:] 103 103 \item[Preconditions:]
\begin{itemize} 104 104 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 105 105 \itemsep1pt\parskip0pt\parsep0pt
\item 106 106 \item
{None} 107 107 {None}
\end{itemize} 108 108 \end{itemize}
109 109
\item[Postconditions:] 110 110 \item[Postconditions:]
\begin{itemize} 111 111 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 112 112 \itemsep1pt\parskip0pt\parsep0pt
\item 113 113 \item
{The User has an account registered with the system.} 114 114 {The User has an account registered with the system.}
\end{itemize} 115 115 \end{itemize}
116 116
\item[Trigger:]{UserX wants to start creating flashcards for a class.} 117 117 \item[Trigger:]{UserX wants to start creating flashcards for a class.}
118 118
\item[Workflow:] 119 119 \item[Workflow:]
\begin{enumerate} 120 120 \begin{enumerate}
\item 121 121 \item
{UserX shall click the ``Sign Up'' button.} 122 122 {UserX shall click the ``Sign Up'' button.}
\item 123 123 \item
{The System shall display a registration form.} 124 124 {The System shall display a registration form.}
\item 125 125 \item
{UserX shall fill in the form with email \mbox{UserX@flashy.cards} and password 126 126 {UserX shall fill in the form with email \mbox{UserX@flashy.cards} and password
\mbox{``mynameisuserx''}.} 127 127 \mbox{``mynameisuserx''}.}
\item 128 128 \item
{The System shall successfully receive the correct credentials and send an 129 129 {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 130 130 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.} 131 131 and displays the Add Class page to the User.}
\item 132 132 \item
{The System shall display a toast ``Please verify your email address! RESEND 133 133 {The System shall display a toast ``Please verify your email address! RESEND
VERIFICATION EMAIL''.} 134 134 VERIFICATION EMAIL''.}
\item 135 135 \item
{UserX receives an email with a link to verify their email. The 136 136 {UserX receives an email with a link to verify their email. The
User clicks the link (see Testing Notes).} 137 137 User clicks the link (see Testing Notes).}
\item 138 138 \item
{The System shall mark UserX's email as valid.} 139 139 {The System shall mark UserX's email as valid.}
\item 140 140 \item
{UserX shall click ``Logout'' (power button) in the top left corner.} 141 141 {UserX shall click ``Logout'' (power button) in the top left corner.}
\item 142 142 \item
{The System shall present UserX Login screen.} 143 143 {The System shall present UserX Login screen.}
\item 144 144 \item
{UserX shall once again login with \mbox{``UserX@flashy.cards''} and \mbox{``mynameisuserx''}.} 145 145 {UserX shall once again login with \mbox{``UserX@flashy.cards''} and \mbox{``mynameisuserx''}.}
\end{enumerate} 146 146 \end{enumerate}
147 147
\item [Expected Result:]{UserX shall see Add Class page without a toast asking 148 148 \item [Expected Result:]{UserX shall see Add Class page without a toast asking
UserX to verify their email.} 149 149 UserX to verify their email.}
150 150
\end{description} 151 151 \end{description}
\newpage 152 152 \newpage
153 153
{} 154 154 {}
155 155
\subsection{[A2] User Login} 156 156 \subsection{[A2] User Login}
157 157
\begin{description} 158 158 \begin{description}
\item[Description:]{This test case outlines the presentation layering step 159 159 \item[Description:]{This test case outlines the presentation layering step
process of a user logging into the application.} 160 160 process of a user logging into the application.}
161 161
\item[Desired Outcome:]{The User shall be able to provide their email address and 162 162 \item[Desired Outcome:]{The User shall be able to provide their email address and
password to access their courses and flashcards. The User shall gain 163 163 password to access their courses and flashcards. The User shall gain
access to the list of the courses they have added, and be able to review 164 164 access to the list of the courses they have added, and be able to review
the flashcards they have added to their decks.} 165 165 the flashcards they have added to their decks.}
166 166
\item[User Goals:]{The User wants to resume use of the site on another 167 167 \item[User Goals:]{The User wants to resume use of the site on another
device, or use the site after logging out.} 168 168 device, or use the site after logging out.}
169 169
\item[Dependency Use Cases:]{[A1] User Registration} 170 170 \item[Dependency Use Cases:]{[A1] User Registration}
\\ 171 171 \\
172 172
\item[Priority Level:]{``Must''} 173 173 \item[Priority Level:]{``Must''}
174 174
\item[Status:]{Implemented} 175 175 \item[Status:]{Implemented}
176 176
\item[Fixture:] a2 177 177 \item[Fixture:] a2
178 178
\item[Preconditions:] 179 179 \item[Preconditions:]
\begin{itemize} 180 180 \begin{itemize}
\item 181 181 \item
{The User has created an account before with email \mbox{``UserX@flashy.cards''} with 182 182 {The User has created an account before with email \mbox{``UserX@flashy.cards''} with
password \mbox{``mynameisuserx''}.} 183 183 password \mbox{``mynameisuserx''}.}
\end{itemize} 184 184 \end{itemize}
185 185
\item[Postconditions:] 186 186 \item[Postconditions:]
\begin{itemize} 187 187 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 188 188 \itemsep1pt\parskip0pt\parsep0pt
\item 189 189 \item
{The user can navigate the site and see their data.} 190 190 {The user can navigate the site and see their data.}
\end{itemize} 191 191 \end{itemize}
192 192
\item[Trigger:]{UserX wants to view, add, or create cards for a class or classes.} 193 193 \item[Trigger:]{UserX wants to view, add, or create cards for a class or classes.}
194 194
\item[Workflow:] 195 195 \item[Workflow:]
\begin{enumerate} 196 196 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 197 197 \itemsep1pt\parskip0pt\parsep0pt
\item 198 198 \item
{UserX shall enter their email \mbox{``UserX@flashy.cards''} and password 199 199 {UserX shall enter their email \mbox{``UserX@flashy.cards''} and password
\mbox{``mynameisuserx''}.} 200 200 \mbox{``mynameisuserx''}.}
\item 201 201 \item
{The System shall authenticate UserX's email and password and checks if UserX is active.} 202 202 {The System shall authenticate UserX's email and password and checks if UserX is active.}
\item 203 203 \item
{The System shall receive the credentials and display the ``Add Class'' page to the User.} 204 204 {The System shall receive the credentials and display the ``Add Class'' page to the User.}
\end{enumerate} 205 205 \end{enumerate}
\item [Expected Result:] 206 206 \item [Expected Result:]
{The User is brought to the page ``Add Class''.}\\ 207 207 {The User is brought to the page ``Add Class''.}\\
208 208
\item [Alternate Workflow A:] 209 209 \item [Alternate Workflow A:]
\begin{enumerate} 210 210 \begin{enumerate}
\item 211 211 \item
{UserX accidentally puts in the credentials \mbox{``UserX@flashy.cards''}, 212 212 {UserX accidentally puts in the credentials \mbox{``UserX@flashy.cards''},
\mbox{``hahahaha''} and clicks the ``Login'' button.} 213 213 \mbox{``hahahaha''} and clicks the ``Login'' button.}
\item 214 214 \item
{The System shows UserX the site login page with a message reading 215 215 {The System shows UserX the site login page with a message reading
``Invalid username or password!!''.} 216 216 ``Invalid username or password!!''.}
\end {enumerate} 217 217 \end {enumerate}
218 218
\item [Expected Result:] 219 219 \item [Expected Result:]
{The User is not logged in.} \\ 220 220 {The User is not logged in.} \\
221 221
\item [Alternate Workflow B:] 222 222 \item [Alternate Workflow B:]
\begin{enumerate} 223 223 \begin{enumerate}
\item 224 224 \item
{UserX accidentally puts in the credentials \mbox{``NotUserX@flashy.cards''}, 225 225 {UserX accidentally puts in the credentials \mbox{``NotUserX@flashy.cards''},
\mbox{``mynameisuserx''} and clicks the ``Login'' button.} 226 226 \mbox{``mynameisuserx''} and clicks the ``Login'' button.}
\item 227 227 \item
{The System shows UserX the site login page with a message reading 228 228 {The System shows UserX the site login page with a message reading
``Invalid username or password!!''.} 229 229 ``Invalid username or password!!''.}
\end {enumerate} 230 230 \end {enumerate}
231 231
\item [Expected Result:] 232 232 \item [Expected Result:]
{The User is not logged in.} \\ 233 233 {The User is not logged in.} \\
234 234
\item [Alternate Workflow C:] 235 235 \item [Alternate Workflow C:]
\begin{enumerate} 236 236 \begin{enumerate}
\item 237 237 \item
{UserX accidentally puts in the credentials \mbox{``theflash@flashy.cards''}, 238 238 {UserX accidentally puts in the credentials \mbox{``theflash@flashy.cards''},
\mbox{``MyNameIsUserX''} and clicks the ``Login'' button.} 239 239 \mbox{``MyNameIsUserX''} and clicks the ``Login'' button.}
\item 240 240 \item
{The System shows UserX the site login page with a message reading 241 241 {The System shows UserX the site login page with a message reading
``Invalid username or password!!''.} 242 242 ``Invalid username or password!!''.}
\end {enumerate} 243 243 \end {enumerate}
244 244
\item [Expected Result:] 245 245 \item [Expected Result:]
{The User is not logged in.} \\ 246 246 {The User is not logged in.} \\
247 247
\end{description} 248 248 \end{description}
\newpage 249 249 \newpage
250 250
{} 251 251 {}
252 252
\subsection{[A3] Add a Class} 253 253 \subsection{[A3] Add a Class}
\begin{description} 254 254 \begin{description}
\item[Description:]{This test case outlines the presentation layering step 255 255 \item[Description:]{This test case outlines the presentation layering step
process of a user adding a class.} 256 256 process of a user adding a class.}
257 257
\item[Desired Outcome:]{The class shall be linked with the student's account 258 258 \item[Desired Outcome:]{The class shall be linked with the student's account
and the student shall have the ability to read and publish flashcards 259 259 and the student shall have the ability to read and publish flashcards
for this class.} 260 260 for this class.}
261 261
\item[User Goals:]{The User wants to publish flashcards for this class and 262 262 \item[User Goals:]{The User wants to publish flashcards for this class and
read the flashcards for this class that are published by other users.} 263 263 read the flashcards for this class that are published by other users.}
264 264
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} 265 265 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login}
\\ 266 266 \\
267 267
\item[Priority Level:]{``Must''} 268 268 \item[Priority Level:]{``Must''}
269 269
\item[Status:]{Implemented} 270 270 \item[Status:]{Implemented}
271 271
\item[Fixture:] a3 272 272 \item[Fixture:] a3
273 273
\item[Preconditions:] 274 274 \item[Preconditions:]
\begin{itemize} 275 275 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 276 276 \itemsep1pt\parskip0pt\parsep0pt
\item 277 277 \item
{The User is logged in as UserX.} 278 278 {The User is logged in as UserX.}
\item 279 279 \item
{The User is whitelisted for class TEST 101.} 280 280 {The User is whitelisted for class TEST 101.}
\item 281 281 \item
{The User is not whitelisted for class TEST 102.} 282 282 {The User is not whitelisted for class TEST 102.}
\item 283 283 \item
{The class TEST 103 has no whitelist.} 284 284 {The class TEST 103 has no whitelist.}
\end{itemize} 285 285 \end{itemize}
286 286
\item[Postconditions:] 287 287 \item[Postconditions:]
\begin{itemize} 288 288 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 289 289 \itemsep1pt\parskip0pt\parsep0pt
\item 290 290 \item
{The User can read the flashcards being published for the class and 291 291 {The User can read the flashcards being published for the class and
add them to their deck.} 292 292 add them to their deck.}
\item 293 293 \item
{The User can publish flashcards to be viewed and added by other users 294 294 {The User can publish flashcards to be viewed and added by other users
in the same class.} 295 295 in the same class.}
\end{itemize} 296 296 \end{itemize}
297 297
\item[Trigger:]{UserX wants to view the Live Feed and have a flashcard deck for a class.} 298 298 \item[Trigger:]{UserX wants to view the Live Feed and have a flashcard deck for a class.}
299 299
\item[Workflow:] 300 300 \item[Workflow:]
\begin{enumerate} 301 301 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 302 302 \itemsep1pt\parskip0pt\parsep0pt
\item 303 303 \item
{UserX shall click ``Add Class'' on the classes dropdown from the navigation bar.} 304 304 {UserX shall click ``Add Class'' on the classes dropdown from the navigation bar.}
\item 305 305 \item
{The System shall show the user ``Add Class'' page.} 306 306 {The System shall show the user ``Add Class'' page.}
\item 307 307 \item
{UserX shall begin to type ``TEST 101''.} 308 308 {UserX shall begin to type ``TEST 101''.}
\item 309 309 \item
{The System shall show suggestions as a user types. (This may take some time on the local server)} 310 310 {The System shall show suggestions as a user types. (This may take some time on the local server)}
\item 311 311 \item
{The System shall check if there is a whitelist for each class in the suggestions.} 312 312 {The System shall check if there is a whitelist for each class in the suggestions.}
\item 313 313 \item
{The System shall ensure that UserX is on the whitelist for each section.} 314 314 {The System shall ensure that UserX is on the whitelist for each section.}
\item 315 315 \item
{UserX shall click on ``TEST 101'', which should not have a lock icon.} 316 316 {UserX shall click on ``TEST 101'', which should not have a lock icon.}
\item 317 317 \item
{UserX shall click on the ``Add'' button.} 318 318 {UserX shall click on the ``Add'' button.}
\item 319 319 \item
{The System shall add UserX to the specified class TEST 101.} 320 320 {The System shall add UserX to the specified class TEST 101.}
\end{enumerate} 321 321 \end{enumerate}
322 322
\item[Expected Result:] {UserX has added the section and sees the Live Feed 323 323 \item[Expected Result:] {UserX has added the section and sees the Live Feed
for TEST 101.} 324 324 for TEST 101.}
325 325
\item[Alternate Workflow A:] 326 326 \item[Alternate Workflow A:]
\begin{enumerate} 327 327 \begin{enumerate}
\item[1-3.] {See Workflow} 328 328 \item[1-3.] {See Workflow}
\setcounter{enumi}{3} 329 329 \setcounter{enumi}{3}
\itemsep1pt\parskip0pt\parsep0pt 330 330 \itemsep1pt\parskip0pt\parsep0pt
\item 331 331 \item
{UserX shall begin to type ``TEST 102''.} 332 332 {UserX shall begin to type ``TEST 102''.}
\item 333 333 \item
{The System shall show suggestions as a user types.} 334 334 {The System shall show suggestions as a user types.}
\item 335 335 \item
{The System shall check if there is a whitelist for each class in the suggestions.} 336 336 {The System shall check if there is a whitelist for each class in the suggestions.}
\item 337 337 \item
{The System shall see that UserX is not on the whitelist.} 338 338 {The System shall see that UserX is not on the whitelist.}
\item 339 339 \item
{UserX shall see a lock icon in the suggestions for TEST 102.} 340 340 {UserX shall see a lock icon in the suggestions for TEST 102.}
\item 341 341 \item
{UserX shall click on ``TEST 102'', which has a lock icon.} 342 342 {UserX shall click on ``TEST 102'', which has a lock icon.}
\item 343 343 \item
{The System shall disable the ``Add'' button.} 344 344 {The System shall disable the ``Add'' button.}
\end{enumerate} 345 345 \end{enumerate}
346 346
\item[Expected Result:] {UserX cannot add the specified TEST 102 and cannot 347 347 \item[Expected Result:] {UserX cannot add the specified TEST 102 and cannot
view contents related to this class.} 348 348 view contents related to this class.}
349 349
\item[Alternate Workflow B:] 350 350 \item[Alternate Workflow B:]
\begin{enumerate} 351 351 \begin{enumerate}
\item[1-3.] {See Workflow} 352 352 \item[1-3.] {See Workflow}
\setcounter{enumi}{3} 353 353 \setcounter{enumi}{3}
\itemsep1pt\parskip0pt\parsep0pt 354 354 \itemsep1pt\parskip0pt\parsep0pt
\item 355 355 \item
{UserX shall begin to type ``TEST 103''.} 356 356 {UserX shall begin to type ``TEST 103''.}
\item 357 357 \item
{The System shall show suggestions as UserX types.} 358 358 {The System shall show suggestions as UserX types.}
\item 359 359 \item
{The System shall check if there is a whitelist for each class in the suggestions.} 360 360 {The System shall check if there is a whitelist for each class in the suggestions.}
\item 361 361 \item
{The System shall see there is no whitelist for TEST 103.} 362 362 {The System shall see there is no whitelist for TEST 103.}
\item 363 363 \item
{UserX shall click on ``TEST 103'', which should not have a lock icon.} 364 364 {UserX shall click on ``TEST 103'', which should not have a lock icon.}
\item 365 365 \item
{UserX shall click on the ``Add'' button.} 366 366 {UserX shall click on the ``Add'' button.}
\item 367 367 \item
{The System shall add UserX to TEST 103.} 368 368 {The System shall add UserX to TEST 103.}
\end{enumerate} 369 369 \end{enumerate}
370 370
\item[Expected Result:] {UserX has added the section and sees the Live Feed 371 371 \item[Expected Result:] {UserX has added the section and sees the Live Feed
for TEST 103.} 372 372 for TEST 103.}
\end{description} 373 373 \end{description}
\newpage 374 374 \newpage
375 375
{} 376 376 {}
377 377
\subsection{[A4] Drop a Class} 378 378 \subsection{[A4] Drop a Class}
379 379
\begin{description} 380 380 \begin{description}
\item[Description:]{This test case outlines the presentation layering step process of a user dropping a class.} 381 381 \item[Description:]{This test case outlines the presentation layering step process of a user dropping a class.}
382 382
\item[Desired Outcome:]{The User has dropped the class and no longer needs 383 383 \item[Desired Outcome:]{The User has dropped the class and no longer needs
access to the flashcards for the dropped class. They can no longer 384 384 access to the flashcards for the dropped class. They can no longer
see the flashcards associated to the class that they dropped.} 385 385 see the flashcards associated to the class that they dropped.}
386 386
\item[User Goals:]{The User shall not have access to a class and the 387 387 \item[User Goals:]{The User shall not have access to a class and the
flashcards associated with that class. They will no longer see the class 388 388 flashcards associated with that class. They will no longer see the class
listed in their list of ``Enrolled Classes''.} 389 389 listed in their list of ``Enrolled Classes''.}
390 390
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class} 391 391 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class}
\\ 392 392 \\
393 393
\item[Priority Level:]{``Should''} 394 394 \item[Priority Level:]{``Should''}
395 395
\item[Status:]{Implemented} 396 396 \item[Status:]{Implemented}
397 397
\item[Fixture:] a4 398 398 \item[Fixture:] a4
399 399
\item[Preconditions:] 400 400 \item[Preconditions:]
\begin{itemize} 401 401 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 402 402 \itemsep1pt\parskip0pt\parsep0pt
\item 403 403 \item
{The User is logged in as UserX.} 404 404 {The User is logged in as UserX.}
\item 405 405 \item
{The User has enrolled in TEST 101.} 406 406 {The User has enrolled in TEST 101.}
\end{itemize} 407 407 \end{itemize}
408 408
\item[Postconditions:] 409 409 \item[Postconditions:]
\begin{itemize} 410 410 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 411 411 \itemsep1pt\parskip0pt\parsep0pt
\item 412 412 \item
{The User shall no longer have access to TEST 101, or associated flashcards.} 413 413 {The User shall no longer have access to TEST 101, or associated flashcards.}
\end{itemize} 414 414 \end{itemize}
415 415
\item[Trigger:]{UserX wants to stop seeing the class's Live Feed and remove 416 416 \item[Trigger:]{UserX wants to stop seeing the class's Live Feed and remove
all of their flashcards.} 417 417 all of their flashcards.}
418 418
\item[Workflow:] 419 419 \item[Workflow:]
\begin{enumerate} 420 420 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 421 421 \itemsep1pt\parskip0pt\parsep0pt
\item 422 422 \item
{UserX shall go to the Settings page by clicking on the gear icon at the right side of the navbar.} 423 423 {UserX shall go to the Settings page by clicking on the gear icon at the right side of the navbar.}
\item 424 424 \item
{UserX shall click ``X'' icon next to TEST 101 in ``Enrolled Classes'' table.} 425 425 {UserX shall click ``X'' icon next to TEST 101 in ``Enrolled Classes'' table.}
\item 426 426 \item
{The System shall remove UserX from TEST 101.} 427 427 {The System shall remove UserX from TEST 101.}
\item 428 428 \item
{The System shall display a toast indicating that a class has been dropped.} 429 429 {The System shall display a toast indicating that a class has been dropped.}
\end{enumerate} 430 430 \end{enumerate}
431 431
\item[Expected Result:] {UserX no longer has access to any content related to TEST 101.} 432 432 \item[Expected Result:] {UserX no longer has access to any content related to TEST 101.}
\end{description} 433 433 \end{description}
\newpage 434 434 \newpage
435 435
{} 436 436 {}
437 437
\subsection{[A5] Password Change} 438 438 \subsection{[A5] Password Change}
439 439
\begin{description} 440 440 \begin{description}
\item[Description:]{This test case outlines the presentation layering step process 441 441 \item[Description:]{This test case outlines the presentation layering step process
of a user changing their password.} 442 442 of a user changing their password.}
443 443
\item[Desired Outcome:]{The User's password shall be changed and the user 444 444 \item[Desired Outcome:]{The User's password shall be changed and the user
shall be able to log in with the new password in the future.} 445 445 shall be able to log in with the new password in the future.}
446 446
\item[User Goals:]{The User wants to use a different password in the future.} 447 447 \item[User Goals:]{The User wants to use a different password in the future.}
448 448
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} 449 449 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login}
\\ 450 450 \\
451 451
\item[Priority Level:]{``Must''} 452 452 \item[Priority Level:]{``Must''}
453 453
\item[Status:]{Implemented} 454 454 \item[Status:]{Implemented}
455 455
\item[Fixture:] a5 456 456 \item[Fixture:] a5
457 457
\item[Preconditions:] 458 458 \item[Preconditions:]
\begin{itemize} 459 459 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 460 460 \itemsep1pt\parskip0pt\parsep0pt
\item 461 461 \item
{The User is logged in as UserX.} 462 462 {The User is logged in as UserX.}
\item 463 463 \item
{The User knows the current password \mbox{``mynameisuserx''}.} 464 464 {The User knows the current password \mbox{``mynameisuserx''}.}
\item 465 465 \item
{The User is at the Settings page.} 466 466 {The User is at the Settings page.}
\end{itemize} 467 467 \end{itemize}
468 468
\item[Postconditions:] 469 469 \item[Postconditions:]
\begin{itemize} 470 470 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 471 471 \itemsep1pt\parskip0pt\parsep0pt
\item 472 472 \item
{The User's password is changed} 473 473 {The User's password is changed}
\item 474 474 \item
{The User can log in with the new password} 475 475 {The User can log in with the new password}
\end{itemize} 476 476 \end{itemize}
477 477
\item[Trigger:]{UserX is dissatisfied with their current password and wishes 478 478 \item[Trigger:]{UserX is dissatisfied with their current password and wishes
to change it.} 479 479 to change it.}
480 480
\item[Workflow:] 481 481 \item[Workflow:]
\begin{enumerate} 482 482 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 483 483 \itemsep1pt\parskip0pt\parsep0pt
\item 484 484 \item
{UserX shall enter their current password \mbox{``mynameisuserx''} and the desired 485 485 {UserX shall enter their current password \mbox{``mynameisuserx''} and the desired
new password \mbox{``newPassword''} (twice) in the ``Change Password'' form.} 486 486 new password \mbox{``newPassword''} (twice) in the ``Change Password'' form.}
\item 487 487 \item
{UserX shall click the ``Submit'' button.} 488 488 {UserX shall click the ``Submit'' button.}
\item 489 489 \item
{The System shall check UserX's current password.} 490 490 {The System shall check UserX's current password.}
\item 491 491 \item
{The System shall update the UserX's current password \mbox{``mynameisuserx''} 492 492 {The System shall update the UserX's current password \mbox{``mynameisuserx''}
to the new password \mbox{``newPassword''}.} 493 493 to the new password \mbox{``newPassword''}.}
\item 494 494 \item
{UserX shall logout by clicking on the power icon on the right side of the navbar.} 495 495 {UserX shall logout by clicking on the power icon on the right side of the navbar.}
\item 496 496 \item
{UserX shall log back in with the new password.} 497 497 {UserX shall log back in with the new password.}
\end{enumerate} 498 498 \end{enumerate}
499 499
\item[Expected Result:] {User's password is changed from \mbox{``mynameisuserx''} 500 500 \item[Expected Result:] {User's password is changed from \mbox{``mynameisuserx''}
to \mbox{``newPassword''} and he/she is able to log back in to his account with the new password.} 501 501 to \mbox{``newPassword''} and he/she is able to log back in to his account with the new password.}
\\ 502 502 \\
503 503
\item[Alternate Workflow A:] 504 504 \item[Alternate Workflow A:]
\begin{enumerate} 505 505 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 506 506 \itemsep1pt\parskip0pt\parsep0pt
\item 507 507 \item
{UserX shall enter an incorrect current password \mbox{``MyNameIsUserX''} and the desired 508 508 {UserX shall enter an incorrect current password \mbox{``MyNameIsUserX''} and the desired
new password \mbox{``newPassword''} (twice) in the ``Change Password'' form.} 509 509 new password \mbox{``newPassword''} (twice) in the ``Change Password'' form.}
\item 510 510 \item
{UserX shall click the ``Submit'' button.} 511 511 {UserX shall click the ``Submit'' button.}
\item 512 512 \item
{The System shall ensure validity of new password.} 513 513 {The System shall ensure validity of new password.}
\item 514 514 \item
{The System shall check UserX's current password.} 515 515 {The System shall check UserX's current password.}
\item 516 516 \item
{UserX shall logout of his account.} 517 517 {UserX shall logout of his account.}
\item 518 518 \item
{UserX shall try to log back in with the new password and then with their old password.} 519 519 {UserX shall try to log back in with the new password and then with their old password.}
\end{enumerate} 520 520 \end{enumerate}
521 521
\item[Expected Result:] {The System shall display a toast ``Your old password is not correct'' 522 522 \item[Expected Result:] {The System shall display a toast ``Your old password is not correct''
and leave the User's password unchanged (the User can't log back in with the new password but 523 523 and leave the User's password unchanged (the User can't log back in with the new password but
they can log back in with their old password)} 524 524 they can log back in with their old password)}
\\ 525 525 \\
526 526
\item[Alternate Workflow B:] 527 527 \item[Alternate Workflow B:]
\begin{enumerate} 528 528 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 529 529 \itemsep1pt\parskip0pt\parsep0pt
\item 530 530 \item
{UserX shall enter their current password \mbox{``mynameisuserx''} and the desired 531 531 {UserX shall enter their current password \mbox{``mynameisuserx''} and the desired
new password \mbox{``newPass''} (twice) in the ``Change Password'' form.} 532 532 new password \mbox{``newPass''} (twice) in the ``Change Password'' form.}
\item 533 533 \item
{UserX shall click the ``Submit'' button.} 534 534 {UserX shall click the ``Submit'' button.}
\item 535 535 \item
{The System shall ensure validity of new password.} 536 536 {The System shall ensure validity of new password.}
\item 537 537 \item
{UserX shall logout of his account.} 538 538 {UserX shall logout of his account.}
\item 539 539 \item
{UserX shall try to log back in with the new password and then with their old password.} 540 540 {UserX shall try to log back in with the new password and then with their old password.}
\end{enumerate} 541 541 \end{enumerate}
542 542
\item[Expected Result:] {The System shall display error text ``New password 543 543 \item[Expected Result:] {The System shall display error text ``New password
must be at least 8 characters and leave the User's password unchanged 544 544 must be at least 8 characters and leave the User's password unchanged
(the User can't log back in with the new password but they can log back in with their old password)} 545 545 (the User can't log back in with the new password but they can log back in with their old password)}
546 546
\end{description} 547 547 \end{description}
\newpage 548 548 \newpage
549 549
{} 550 550 {}
551 551
\subsection{[A6] Password Reset} 552 552 \subsection{[A6] Password Reset}
553 553
\begin{description} 554 554 \begin{description}
\item[Description:]{This test case outlines the presentation layering step process of 555 555 \item[Description:]{This test case outlines the presentation layering step process of
a user requesting a password reset without logging in.} 556 556 a user requesting a password reset without logging in.}
557 557
\item[Desired Outcome:]{The User's password shall be changed to one that 558 558 \item[Desired Outcome:]{The User's password shall be changed to one that
they remember.} 559 559 they remember.}
\\ 560 560 \\
561 561
\item[User Goals:]{The User does not know their current password but wants 562 562 \item[User Goals:]{The User does not know their current password but wants
to log into the site.} 563 563 to log into the site.}
564 564
\item[Dependency Use Cases:]{[A1] User Registration} 565 565 \item[Dependency Use Cases:]{[A1] User Registration}
\\ 566 566 \\
567 567
\item[Priority Level:]{``Must''} 568 568 \item[Priority Level:]{``Must''}
569 569
\item[Status]{Implemented} 570 570 \item[Status]{Implemented}
571 571
\item[Fixtures] a6 572 572 \item[Fixtures] a6
573 573
\item[Preconditions:] 574 574 \item[Preconditions:]
\begin{itemize} 575 575 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 576 576 \itemsep1pt\parskip0pt\parsep0pt
\item 577 577 \item
{Account for UserX has been created.} 578 578 {Account for UserX has been created.}
\end{itemize} 579 579 \end{itemize}
580 580
\item[Postconditions:] 581 581 \item[Postconditions:]
\begin{itemize} 582 582 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 583 583 \itemsep1pt\parskip0pt\parsep0pt
\item 584 584 \item
{UserX's password is changed.} 585 585 {UserX's password is changed.}
\item 586 586 \item
{UserX can log in with the new password.} 587 587 {UserX can log in with the new password.}
\end{itemize} 588 588 \end{itemize}
589 589
\item[Trigger:]{UserX forgot their password and wants to access the site.} 590 590 \item[Trigger:]{UserX forgot their password and wants to access the site.}
591 591
\item[Workflow:] 592 592 \item[Workflow:]
\begin{enumerate} 593 593 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 594 594 \itemsep1pt\parskip0pt\parsep0pt
\item 595 595 \item
{UserX shall click the ``Forgot Password'' hyperlink.} 596 596 {UserX shall click the ``Forgot Password'' hyperlink.}
\item 597 597 \item
{The System shall prompt the user for their current email.} 598 598 {The System shall prompt the user for their current email.}
\item 599 599 \item
{UserX shall submit their email \mbox{``UserX@flashy.cards''}.} 600 600 {UserX shall submit their email \mbox{``UserX@flashy.cards''}.}
\item 601 601 \item
{The System shall check if an account exists with the email entered by UserX.} 602 602 {The System shall check if an account exists with the email entered by UserX.}
\item 603 603 \item
{The System shall create a new password reset token for UserX.} 604 604 {The System shall create a new password reset token for UserX.}
\item 605 605 \item
{The System shall send an email to UserX with a link containing the token and the 606 606 {The System shall send an email to UserX with a link containing the token and the
user's ID.} 607 607 user's ID.}
\item 608 608 \item
{UserX shall click the link in the email to visit /app/password\_reset.} 609 609 {UserX shall click the link in the email to visit /app/password\_reset.}
\item 610 610 \item
{The System shall render a form that will prompt the user for a new password.} 611 611 {The System shall render a form that will prompt the user for a new password.}
\item 612 612 \item
{UserX shall provide a new password, \mbox{``newPassword''}, in the form.} 613 613 {UserX shall provide a new password, \mbox{``newPassword''}, in the form.}
\item 614 614 \item
{The System shall change the password associated with the user's email.} 615 615 {The System shall change the password associated with the user's email.}
\item 616 616 \item
{UserX shall navigate back to the login page and enter \mbox{``UserX@flashy.cards''} 617 617 {UserX shall navigate back to the login page and enter \mbox{``UserX@flashy.cards''}
with the old password \mbox{``mynameisuserx''}.} 618 618 with the old password \mbox{``mynameisuserx''}.}
\item 619 619 \item
{The System shall display ``Invalid username or password!''} 620 620 {The System shall display ``Invalid username or password!''}
\item 621 621 \item
{UserX shall login as \mbox{``UserX@flashy.cards''} with the password \mbox{``newPassword''}.} 622 622 {UserX shall login as \mbox{``UserX@flashy.cards''} with the password \mbox{``newPassword''}.}
\end{enumerate} 623 623 \end{enumerate}
624 624
\item[Expected Result:] {UserX shall be logged in.} 625 625 \item[Expected Result:] {UserX shall be logged in.}
\\ 626 626 \\
627 627
\item[Alternate Workflow:] 628 628 \item[Alternate Workflow:]
\begin{enumerate} 629 629 \begin{enumerate}
\item[1-2.] {See Workflow} 630 630 \item[1-2.] {See Workflow}
\setcounter{enumi}{2} 631 631 \setcounter{enumi}{2}
\itemsep1pt\parskip0pt\parsep0pt 632 632 \itemsep1pt\parskip0pt\parsep0pt
\item 633 633 \item
{UserX shall submit an invalid email \mbox{``NotUserX@flashy.cards''}.} 634 634 {UserX shall submit an invalid email \mbox{``NotUserX@flashy.cards''}.}
\item 635 635 \item
{The System shall display an error message ``Enter a valid email!'' to UserX.} 636 636 {The System shall display an error message ``Enter a valid email!'' to UserX.}
\end{enumerate} 637 637 \end{enumerate}
638 638
\item[Expected Result:] {UserX's password will not be reset.} 639 639 \item[Expected Result:] {UserX's password will not be reset.}
\end{description} 640 640 \end{description}
\newpage 641 641 \newpage
642 642
{} 643 643 {}
644 644
\subsection{[A7] Student Prevented From Accessing A Restricted Course} 645 645 \subsection{[A7] Student Prevented From Accessing A Restricted Course}
646 646
\begin{description} 647 647 \begin{description}
\item[Description:]{This test case outlines the presentation layering step process of 648 648 \item[Description:]{This test case outlines the presentation layering step process of
an instructor limiting access to a class.} 649 649 an instructor limiting access to a class.}
650 650
\item[Desired Outcome:]{The class will have limited access and only those 651 651 \item[Desired Outcome:]{The class will have limited access and only those
users who are whitelisted may enroll in the class.} 652 652 users who are whitelisted may enroll in the class.}
653 653
\item[User Goals:]{The instructor wants to limit access to his class so only 654 654 \item[User Goals:]{The instructor wants to limit access to his class so only
the students who are actually in his class participate, and nobody 655 655 the students who are actually in his class participate, and nobody
else.} 656 656 else.}
657 657
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} 658 658 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login}
\\ 659 659 \\
660 660
\item[Priority Level:]{``Should''} 661 661 \item[Priority Level:]{``Should''}
662 662
\item[Status:]{Deferred (see Add a Class)} 663 663 \item[Status:]{Deferred (see Add a Class)}
664 664
\item[Preconditions:] 665 665 \item[Preconditions:]
\begin{itemize} 666 666 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 667 667 \itemsep1pt\parskip0pt\parsep0pt
\item 668 668 \item
{UserX has valid instructor's account} 669 669 {UserX has valid instructor's account}
\end{itemize} 670 670 \end{itemize}
671 671
\item[Postconditions:] 672 672 \item[Postconditions:]
\begin{itemize} 673 673 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 674 674 \itemsep1pt\parskip0pt\parsep0pt
\item 675 675 \item
{Only those users who were whitelisted may add the class.} 676 676 {Only those users who were whitelisted may add the class.}
\end{itemize} 677 677 \end{itemize}
678 678
\item[Trigger:]{The instructor emails the administrator and requests to 679 679 \item[Trigger:]{The instructor emails the administrator and requests to
limit access to his class.} 680 680 limit access to his class.}
681 681
\item[Workflow:] 682 682 \item[Workflow:]
\begin{enumerate} 683 683 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 684 684 \itemsep1pt\parskip0pt\parsep0pt
\item 685 685 \item
{The instructor, ``INSTR1'', shall email the administrators from his UCSD email address 686 686 {The instructor, ``INSTR1'', shall email the administrators from his UCSD email address
and requests to limit access to his course.} 687 687 and requests to limit access to his course.}
\item 688 688 \item
{ INSTR1 shall provide a list of 689 689 { INSTR1 shall provide a list of
emails of the students that are to be whitelisted.} 690 690 emails of the students that are to be whitelisted.}
\item 691 691 \item
{The administrators shall visit a custom admin page, select the course, and 692 692 {The administrators shall visit a custom admin page, select the course, and
paste the list of emails.} 693 693 paste the list of emails.}
\item 694 694 \item
{The administrators shall submit the page directly to the System.} 695 695 {The administrators shall submit the page directly to the System.}
\item 696 696 \item
{The System shall create a WhitelistedAddress for each provided email, 697 697 {The System shall create a WhitelistedAddress for each provided email,
attaching it to the section taught by INST1.} 698 698 attaching it to the section taught by INST1.}
\item 699 699 \item
{The System shall add any existing users whose email addresses appear 700 700 {The System shall add any existing users whose email addresses appear
in the whitelist to the class. } 701 701 in the whitelist to the class. }
\end{enumerate} 702 702 \end{enumerate}
703 703
\item[Expected Result:] {A whitelist is added to a section.} 704 704 \item[Expected Result:] {A whitelist is added to a section.}
\end{description} 705 705 \end{description}
\newpage 706 706 \newpage
707 707
{} 708 708 {}
709 709
\subsection{[A8] User Logout} 710 710 \subsection{[A8] User Logout}
711 711
\begin{description} 712 712 \begin{description}
\item[Description:]{This test case outlines the presentation layering step process 713 713 \item[Description:]{This test case outlines the presentation layering step process
of a user logging out from their account.} 714 714 of a user logging out from their account.}
715 715
\item[Desired Outcome:]{The User's information and data will no longer be 716 716 \item[Desired Outcome:]{The User's information and data will no longer be
accessible after logging out. } 717 717 accessible after logging out. }
718 718
\item[User Goals:]{The User is done with their session of using the 719 719 \item[User Goals:]{The User is done with their session of using the
website, and wants to make sure others cannot access the data in their 720 720 website, and wants to make sure others cannot access the data in their
account.} 721 721 account.}
722 722
\item[Dependency Use Cases:] {[A1] User Registration, [A2] User Login} 723 723 \item[Dependency Use Cases:] {[A1] User Registration, [A2] User Login}
\\ 724 724 \\
725 725
\item[Priority Level:]{``Must''} 726 726 \item[Priority Level:]{``Must''}
727 727
\item[Status:]{Implemented} 728 728 \item[Status:]{Implemented}
729 729
\item[Fixture] a8 730 730 \item[Fixture] a8
731 731
\item[Preconditions:] 732 732 \item[Preconditions:]
\begin{itemize} 733 733 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 734 734 \itemsep1pt\parskip0pt\parsep0pt
\item 735 735 \item
{The user is logged in as UserX.} 736 736 {The user is logged in as UserX.}
\end{itemize} 737 737 \end{itemize}
738 738
\item[Postconditions:] 739 739 \item[Postconditions:]
\begin{itemize} 740 740 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 741 741 \itemsep1pt\parskip0pt\parsep0pt
\item 742 742 \item
{The user's data can no longer be accessed.} 743 743 {The user's data can no longer be accessed.}
\end{itemize} 744 744 \end{itemize}
745 745
\item[Trigger:] {UserX does not currently want access to the site and does 746 746 \item[Trigger:] {UserX does not currently want access to the site and does
not want others tampering with their account.} 747 747 not want others tampering with their account.}
748 748
\item[Workflow:] 749 749 \item[Workflow:]
\begin{enumerate} 750 750 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 751 751 \itemsep1pt\parskip0pt\parsep0pt
\item 752 752 \item
{UserX shall click ``Logout'' (power button) in the top right.} 753 753 {UserX shall click ``Logout'' (power button) in the top right.}
\item 754 754 \item
{The System shall log out UserX.} 755 755 {The System shall log out UserX.}
\item 756 756 \item
{The System shall redirect UserX to the login page.} 757 757 {The System shall redirect UserX to the login page.}
\end{enumerate} 758 758 \end{enumerate}
759 759
\item[Expected Result:] {UserX is logged out and on the login page.} 760 760 \item[Expected Result:] {UserX is logged out and on the login page.}
\end{description} 761 761 \end{description}
\newpage 762 762 \newpage
763 763
{} 764 764 {}
765 765
\subsection{[A9] Contact Admin} 766 766 \subsection{[A9] Contact Admin}
767 767
\begin{description} 768 768 \begin{description}
\item[Description]{This test case outlines the presentation layering step 769 769 \item[Description]{This test case outlines the presentation layering step
process of a user contacting site admins.} 770 770 process of a user contacting site admins.}
771 771
\item[Desired Outcome]{The User shall send a message to the admin; the 772 772 \item[Desired Outcome]{The User shall send a message to the admin; the
admin shall receive the message.} 773 773 admin shall receive the message.}
774 774
\item[User Goals:]{The User sends a message to the admin.} 775 775 \item[User Goals:]{The User sends a message to the admin.}
776 776
\item[Dependency Use Cases]{None} 777 777 \item[Dependency Use Cases]{None}
\\ 778 778 \\
779 779
\item[Priority Level]{``Must''} 780 780 \item[Priority Level]{``Must''}
781 781
\item[Status]{Not Implemented and Deferred} 782 782 \item[Status]{Not Implemented and Deferred}
783 783
\item[Pre-conditions]{None.} 784 784 \item[Pre-conditions]{None.}
785 785
\item[Post-conditions]{The admin receives the user's message.} 786 786 \item[Post-conditions]{The admin receives the user's message.}
787 787
\item[Trigger]{UserX wants to contact the administrators of our application.} 788 788 \item[Trigger]{UserX wants to contact the administrators of our application.}
789 789
\item[Workflow] 790 790 \item[Workflow]
\begin{enumerate} 791 791 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 792 792 \itemsep1pt\parskip0pt\parsep0pt
\item 793 793 \item
{The System shall display the admin email address on every page in the 794 794 {The User shall click on the '?' icon at the right side of the navbar.}
application.} 795 795 \item
\end{enumerate} 796 796 {The System shall display the the Help page.}
797 797 \item
\item[Expected Result:] {The admin's email address can be seen by UserX on every page.} 798 798 {The User shall scroll to the bottom and click on 'Send us an email!' to send an email to the admins.}
\end{description} 799 799 \end{enumerate}
\newpage 800 800
801 801 \item[Expected Result:] {UserX is able to contact the admins.}
{} 802 802 \end{description}
803 803 \newpage
\subsection{[A10] Configure Account Notifications} 804 804
\begin{description} 805 805 {}
\item[Description]{This test case outlines the presentation layering step process of a user configuring notification settings.} 806 806
807 807 \subsection{[A10] Configure Account Notifications}
\item[Desired Outcome]{The User shall only receive notifications at the 808 808 \begin{description}
times that were specified.} 809 809 \item[Description]{This test case outlines the presentation layering step process of a user configuring notification settings.}
\\ 810 810
811 811 \item[Desired Outcome]{The User shall only receive notifications at the
\item[User Goals]{The User shall not be bothered needlessly or at 812 812 times that were specified.}
inconvenient times.} 813 813 \\
814 814
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} 815 815 \item[User Goals]{The User shall not be bothered needlessly or at
\\ 816 816 inconvenient times.}
817 817
\item[Priority Level]{``Must''} 818 818 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login}
819 819 \\
\item[Status]{Deferred} 820 820
821 821 \item[Priority Level]{``Must''}
\item[Preconditions:] 822 822
\begin{itemize} 823 823 \item[Status]{Deferred}
\itemsep1pt\parskip0pt\parsep0pt 824 824
\item 825 825 \item[Preconditions:]
{The User is logged in as UserX.} 826 826 \begin{itemize}
\end{itemize} 827 827 \itemsep1pt\parskip0pt\parsep0pt
828 828 \item
\item[Postconditions:] 829 829 {The User is logged in as UserX.}
\begin{itemize} 830 830 \end{itemize}
\itemsep1pt\parskip0pt\parsep0pt 831 831
\item 832 832 \item[Postconditions:]
{User only receive notifications at specified times} 833 833 \begin{itemize}
\end{itemize} 834 834 \itemsep1pt\parskip0pt\parsep0pt
835 835 \item
\item[Trigger]{UserX wants to change their notification settings} 836 836 {User only receive notifications at specified times}
837 837 \end{itemize}
\item[Workflow] 838 838
\begin{enumerate} 839 839 \item[Trigger]{UserX wants to change their notification settings}
\itemsep1pt\parskip0pt\parsep0pt 840 840
\item 841 841 \item[Workflow]
{UserX shall select ``Settings'' (gear) from the top right.} 842 842 \begin{enumerate}
\item 843 843 \itemsep1pt\parskip0pt\parsep0pt
{The System shall display a settings screen.} 844 844 \item
\item 845 845 {UserX shall select ``Settings'' (gear) from the top right.}
{UserX shall change the notification timing to 1 min.} 846 846 \item
\item 847 847 {The System shall display a settings screen.}
{UserX shall click ``Save Settings'' button.} 848 848 \item
\item 849 849 {UserX shall change the notification timing to 1 min.}
{The System shall display a message confirming the settings are saved.} 850 850 \item
\item 851 851 {UserX shall click ``Save Settings'' button.}
{The System shall save notification settings to the user's attributes.} 852 852 \item
\end{enumerate} 853 853 {The System shall display a message confirming the settings are saved.}
854 854 \item
\item[Expected Result:]{UserX shall be notified at least as slow as 1 min.} 855 855 {The System shall save notification settings to the user's attributes.}
\end{description} 856 856 \end{enumerate}
\newpage 857 857
858 858 \item[Expected Result:]{UserX shall be notified at least as slow as 1 min.}
{} 859 859 \end{description}
860 860 \newpage
\section{Flashcards} 861 861
\subsection{[F1] Push Flashcard} 862 862 {}
863 863
\begin{description} 864 864 \section{Flashcards}
\item[Description:]{This test case outlines the presentation layering step 865 865 \subsection{[F1] Push Flashcard}
process of a User contributing a flashcard to the live feed and to their deck.} 866 866
867 867 \begin{description}
\item[Desired Outcome:]{The User shall have the flashcard added to their own deck 868 868 \item[Description:]{This test case outlines the presentation layering step
and the live feed.} 869 869 process of a User contributing a flashcard to the live feed and to their deck.}
\\ 870 870
871 871 \item[Desired Outcome:]{The User shall have the flashcard added to their own deck
\item[User Goals:]{The User will see their flashcard in their deck and the 872 872 and the live feed.}
flashcard will be shared with others.} 873 873 \\
874 874
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class} 875 875 \item[User Goals:]{The User will see their flashcard in their deck and the
\\ 876 876 flashcard will be shared with others.}
877 877
\item[Priority Level:]{``Must''} 878 878 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class}
879 879 \\
\item[Status:]{Implemented} 880 880
881 881 \item[Priority Level:]{``Must''}
\item[Fixture] f1 882 882
883 883 \item[Status:]{Implemented}
\item[Preconditions:] 884 884
\begin{itemize} 885 885 \item[Fixture] f1
\itemsep1pt\parskip0pt\parsep0pt 886 886
\item 887 887 \item[Preconditions:]
{One browser session is logged in as UserX.} 888 888 \begin{itemize}
\item 889 889 \itemsep1pt\parskip0pt\parsep0pt
{Another browser session is logged in as UserY (see Testing Notes).} 890 890 \item
\item 891 891 {One browser session is logged in as UserX.}
{UserX and UserY have added the class TEST 101.} 892 892 \item
\item 893 893 {Another browser session is logged in as UserY (see Testing Notes).}
{UserX and UserY are on the live feed for TEST 101.} 894 894 \item
\end{itemize} 895 895 {UserX and UserY have added the class TEST 101.}
896 896 \item
\item[Postconditions:] 897 897 {UserX and UserY are on the live feed for TEST 101.}
\begin{itemize} 898 898 \end{itemize}
\itemsep1pt\parskip0pt\parsep0pt 899 899
\item 900 900 \item[Postconditions:]
{UserX has flashcard added to their deck.} 901 901 \begin{itemize}
\item 902 902 \itemsep1pt\parskip0pt\parsep0pt
{The flashcard is shown on the live feed for TEST 101.} 903 903 \item
\item 904 904 {UserX has flashcard added to their deck.}
{UserY and other users shall be able to add the 905 905 \item
flashcard to their decks.} 906 906 {The flashcard is shown on the live feed for TEST 101.}
\end{itemize} 907 907 \item
908 908 {UserY and other users shall be able to add the
\item[Trigger:]{UserX wants to contribute a flashcard 909 909 flashcard to their decks.}
to the class TEST 101.} 910 910 \end{itemize}
911 911
\item[Workflow:] 912 912 \item[Trigger:]{UserX wants to contribute a flashcard
\begin{enumerate} 913 913 to the class TEST 101.}
\itemsep1pt\parskip0pt\parsep0pt 914 914
\item {UserX has clicked the circular plus button (``Compose'' button) in 915 915 \item[Workflow:]
the lower right corner of the screen.} 916 916 \begin{enumerate}
\item 917 917 \itemsep1pt\parskip0pt\parsep0pt
{The System shall present a modal with a text box.} 918 918 \item {UserX has clicked the circular plus button (``Compose'' button) in
\item 919 919 the lower right corner of the screen.}
{UserX shall select the input field of the modal and type ``The rain in Spain stays mainly in the plain''.} 920 920 \item
\item 921 921 {The System shall present a modal with a text box.}
{UserX shall select the ``Contribute'' button in the modal.} 922 922 \item
\item 923 923 {UserX shall select the input field of the modal and type ``The rain in Spain stays mainly in the plain''.}
{The System shall add the new card containing the text 924 924 \item
``The rain in Spain stays mainly in 925 925 {UserX shall select the ``Contribute'' button in the modal.}
the plain'' to the feed of each user enrolled in ``TEST 101''.} 926 926 \item
\item 927 927 {The System shall add the new card containing the text
{UserY shall see the card appear in their feed within a minute (See Notes).} 928 928 ``The rain in Spain stays mainly in
\item 929 929 the plain'' to the feed of each user enrolled in ``TEST 101''.}
{The System shall hide the modal from UserX.} 930 930 \item
\item 931 931 {UserY shall see the card appear in their feed within a minute (See Notes).}
{The flashcard shall be included in the UserX's deck.(c.f. Note about simultaneous browser session).} 932 932 \item
\end{enumerate} 933 933 {The System shall hide the modal from UserX.}
934 934 \item
\item[Expected Result:] 935 935 {The flashcard shall be included in the UserX's deck.(c.f. Note about simultaneous browser session).}
{UserX will have the new flashcard in their deck. 936 936 \end{enumerate}
For UserX, the new flashcard will have a checkmark, 937 937
indicating that the card is in their deck and a pencil icon 938 938 \item[Expected Result:]
on top right to indicate UserX as the author of the flashcard. 939 939 {UserX will have the new flashcard in their deck.
The new flashcard will show up on UserY's 940 940 For UserX, the new flashcard will have a checkmark,
live feed on class TEST 101 without checkmark and pencil icon.} 941 941 indicating that the card is in their deck and a pencil icon
942 942 on top right to indicate UserX as the author of the flashcard.
\item[Alternate Workflow A:] 943 943 The new flashcard will show up on UserY's
\begin{enumerate} 944 944 live feed on class TEST 101 without checkmark and pencil icon.}
\item[1-3.] {See Workflow} 945 945
\setcounter{enumi}{3} 946 946 \item[Alternate Workflow A:]
\itemsep1pt\parskip0pt\parsep0pt 947 947 \begin{enumerate}
\item 948 948 \item[1-3.] {See Workflow}
{UserX shall user their cursor to select the word 949 949 \setcounter{enumi}{3}
``Spain'' in the text box, then click the ``Blank Word'' button.} 950 950 \itemsep1pt\parskip0pt\parsep0pt
\item 951 951 \item
{The System shall bold the word ``Spain''.} 952 952 {UserX shall user their cursor to select the word
\item 953 953 ``Spain'' in the text box, then click the ``Blank Word'' button.}
{UserX shall use the cursor to select the word 954 954 \item
``plain'' in the text box, then click the ``Blank Word'' button.} 955 955 {The System shall bold the word ``Spain''.}
\item 956 956 \item
{The System shall bold the word plain.} 957 957 {UserX shall use the cursor to select the word
\item 958 958 ``plain'' in the text box, then click the ``Blank Word'' button.}
{UserX shall click the ``Contribute'' button in the modal.} 959 959 \item
\item 960 960 {The System shall bold the word plain.}
{The System shall add the new flashcard containing 961 961 \item
the text ``The rain in \textbf{Spain} stays mainly in the \textbf{plain}'' to the feed of each user enrolled in TEST.} 962 962 {UserX shall click the ``Contribute'' button in the modal.}
\item 963 963 \item
{UserY shall view the live feed and within a minute 964 964 {The System shall add the new flashcard containing
see the new flashcard appear with ``Spain'' and ``plain'' bolded.} 965 965 the text ``The rain in \textbf{Spain} stays mainly in the \textbf{plain}'' to the feed of each user enrolled in TEST.}
\end{enumerate} 966 966 \item
967 967 {UserY shall view the live feed and within a minute
\item[Expected Result:] { 968 968 see the new flashcard appear with ``Spain'' and ``plain'' bolded.}
UserX will have the new flashcard with the words 969 969 \end{enumerate}
``Spain'' and ``plain'' bolded in their deck. 970 970
For UserX, the new flashcard will have a checkmark, 971 971 \item[Expected Result:] {
indicating that the card is in their deck and a pencil icon on 972 972 UserX will have the new flashcard with the words
top right to indicate UserX as the author of the flashcard. 973 973 ``Spain'' and ``plain'' bolded in their deck.
The new flashcard will show up on UserY's live feed on class TEST 101 974 974 For UserX, the new flashcard will have a checkmark,
without checkmark and pencil icon.} 975 975 indicating that the card is in their deck and a pencil icon on
976 976 top right to indicate UserX as the author of the flashcard.
\item[Alternate Workflow B:] 977 977 The new flashcard will show up on UserY's live feed on class TEST 101
\begin{enumerate} 978 978 without checkmark and pencil icon.}
\item[1-2.] {See Workflow} 979 979
\setcounter{enumi}{2} 980 980 \item[Alternate Workflow B:]
\itemsep1pt\parskip0pt\parsep0pt 981 981 \begin{enumerate}
\item 982 982 \item[1-2.] {See Workflow}
{UserX shall select the input field of the modal and type five blank spaces.} 983 983 \setcounter{enumi}{2}
\item 984 984 \itemsep1pt\parskip0pt\parsep0pt
{UserX shall click the ``Contribute'' button in the dialog.} 985 985 \item
\end{enumerate} 986 986 {UserX shall select the input field of the modal and type five blank spaces.}
987 987 \item
\item[Expected Result:] {Blank flashcard will not be added to UserX's deck or 988 988 {UserX shall click the ``Contribute'' button in the dialog.}
to the live feed of TEST 101.} 989 989 \end{enumerate}
990 990
\item[Alternate Workflow C:] 991 991 \item[Expected Result:] {Blank flashcard will not be added to UserX's deck or
\begin{enumerate} 992 992 to the live feed of TEST 101.}
\item[1-2.] {See Workflow} 993 993
\setcounter{enumi}{2} 994 994 \item[Alternate Workflow C:]
\itemsep1pt\parskip0pt\parsep0pt 995 995 \begin{enumerate}
\item 996 996 \item[1-2.] {See Workflow}
{UserX shall select the input field and type ``Test''.} 997 997 \setcounter{enumi}{2}
\item 998 998 \itemsep1pt\parskip0pt\parsep0pt
{UserX shall click the ``Contribute'' button in the dialog.} 999 999 \item
\end{enumerate} 1000 1000 {UserX shall select the input field and type ``Test''.}
1001 1001 \item
\item[Expected Result:] 1002 1002 {UserX shall click the ``Contribute'' button in the dialog.}
{ Flashcard with input size that does not meeting the 1003 1003 \end{enumerate}
length restriction will not be added to 1004 1004
UserX's deck or to the live feed of TEST 101.} 1005 1005 \item[Expected Result:]
1006 1006 { Flashcard with input size that does not meeting the
\end{description} 1007 1007 length restriction will not be added to
\newpage 1008 1008 UserX's deck or to the live feed of TEST 101.}
1009 1009
{} 1010 1010 \end{description}
1011 1011 \newpage
\subsection{[F2] Edit Flashcard} 1012 1012
1013 1013 {}
\begin{description} 1014 1014
\item[Description:]{ 1015 1015 \subsection{[F2] Edit Flashcard}
This test case outlines the presentation layering step 1016 1016
process of a user editting a flashcard.} 1017 1017 \begin{description}
1018 1018 \item[Description:]{
\item[Desired Outcome:]{Flashcard is edited and saved appropriately} 1019 1019 This test case outlines the presentation layering step
\\ 1020 1020 process of a user editting a flashcard.}
1021 1021
\item[User Goals:]{The User shall be able to change the text and 1022 1022 \item[Desired Outcome:]{Flashcard is edited and saved appropriately}
the blanked words on a flashcard.} 1023 1023 \\
1024 1024
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1025 1025 \item[User Goals:]{The User shall be able to change the text and
Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull Flashcard} 1026 1026 the blanked words on a flashcard.}
1027 1027
\item[Priority Level:]{``Should''} 1028 1028 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
1029 1029 Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull Flashcard}
\item[Status:]{Implemented} 1030 1030
1031 1031 \item[Priority Level:]{``Should''}
\item[Fixture] f2 1032 1032
1033 1033 \item[Status:]{Implemented}
\item[Preconditions:] 1034 1034
\begin{itemize} 1035 1035 \item[Fixture] f2
\itemsep1pt\parskip0pt\parsep0pt 1036 1036
\item 1037 1037 \item[Preconditions:]
{One browser session is logged in as UserX.} 1038 1038 \begin{itemize}
\item 1039 1039 \itemsep1pt\parskip0pt\parsep0pt
{Another browser session is logged in as UserY.} 1040 1040 \item
\item 1041 1041 {One browser session is logged in as UserX.}
{UserX and UserY have added the class TEST 101.} 1042 1042 \item
\item 1043 1043 {Another browser session is logged in as UserY.}
{TEST 101 contains the flashcard ``This is made for edit'' 1044 1044 \item
, which was made by UserY and is not in UserX's deck.} 1045 1045 {UserX and UserY have added the class TEST 101.}
\item 1046 1046 \item
{UserX has the flashcard ``I have made an \textbf{error}'', 1047 1047 {TEST 101 contains the flashcard ``This is made for edit''
which was created by UserX, and was pulled by UserY.} 1048 1048 , which was made by UserY and is not in UserX's deck.}
\item 1049 1049 \item
{UserX is at the live feed of TEST 101.} 1050 1050 {UserX has the flashcard ``I have made an \textbf{error}'',
\end{itemize} 1051 1051 which was created by UserX, and was pulled by UserY.}
1052 1052 \item
\item[Postconditions:] 1053 1053 {UserX is at the live feed of TEST 101.}
\begin{itemize} 1054 1054 \end{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1055 1055
\item 1056 1056 \item[Postconditions:]
{The selected flashcards are edited.} 1057 1057 \begin{itemize}
\end{itemize} 1058 1058 \itemsep1pt\parskip0pt\parsep0pt
1059 1059 \item
\item[Trigger:]{The User wants to edit existing flashcards.} 1060 1060 {The selected flashcards are edited.}
1061 1061 \end{itemize}
\item[Workflow:] 1062 1062
\begin{enumerate} 1063 1063 \item[Trigger:]{The User wants to edit existing flashcards.}
\itemsep1pt\parskip0pt\parsep0pt 1064 1064
\item 1065 1065 \item[Workflow:]
{UserX shall hover the cursor over the flashcard 1066 1066 \begin{enumerate}
``this is made for edit''.} 1067 1067 \itemsep1pt\parskip0pt\parsep0pt
\item 1068 1068 \item
{UserX shall click the blue pencil edit icon on 1069 1069 {UserX shall hover the cursor over the flashcard
the bottom left of the hovered flashcard.} 1070 1070 ``this is made for edit''.}
\item 1071 1071 \item
{The System shall present a modal that contains the 1072 1072 {UserX shall click the blue pencil edit icon on
``this is made for edit'' of the selected flashcard.} 1073 1073 the bottom left of the hovered flashcard.}
\item 1074 1074 \item
{UserX shall select the entire text.} 1075 1075 {The System shall present a modal that contains the
\item 1076 1076 ``this is made for edit'' of the selected flashcard.}
{UserX shall change the text to ``Edit has been made''.} 1077 1077 \item
\item 1078 1078 {UserX shall select the entire text.}
{UserX shall click 'SAVE CHANGES'} 1079 1079 \item
\item 1080 1080 {UserX shall change the text to ``Edit has been made''.}
{The System shall hide the modal from UserX.} 1081 1081 \item
\item 1082 1082 {UserX shall click 'SAVE CHANGES'}
{The System shall create a new flashcard with the given 1083 1083 \item
text.} 1084 1084 {The System shall hide the modal from UserX.}
1085 1085 \item
\end{enumerate} 1086 1086 {The System shall create a new flashcard with the given
1087 1087 text.}
\item[Expected Result:] 1088 1088
{For UserX:\\ 1089 1089 \end{enumerate}
The flashcard with the text ``this is made for edit'' will be 1090 1090
hidden from UserX. The new flashcard with the text 1091 1091 \item[Expected Result:]
``Edit has been made'' will be added to UserX's deck and 1092 1092 {For UserX:\\
have the checkmark and pencil mark on the top right.\\ 1093 1093 The flashcard with the text ``this is made for edit'' will be
For UserY:\\ 1094 1094 hidden from UserX. The new flashcard with the text
The flashcard with the text ``this is made for edit'' will 1095 1095 ``Edit has been made'' will be added to UserX's deck and
remain on the live feed with a checkmark. The new flashcard 1096 1096 have the checkmark and pencil mark on the top right.\\
with the text ``Edit has been made'' will be added to 1097 1097 For UserY:\\
the top of the live feed. This new flashcard has not 1098 1098 The flashcard with the text ``this is made for edit'' will
been pulled by UserY and is not made by UserY, therefore 1099 1099 remain on the live feed with a checkmark. The new flashcard
will not have a checkmark and pencil mark.} 1100 1100 with the text ``Edit has been made'' will be added to
1101 1101 the top of the live feed. This new flashcard has not
\item[Alternate Workflow A:] 1102 1102 been pulled by UserY and is not made by UserY, therefore
\begin{enumerate} 1103 1103 will not have a checkmark and pencil mark.}
\itemsep1pt\parskip0pt\parsep0pt 1104 1104
\item 1105 1105 \item[Alternate Workflow A:]
{UserX shall move the cursor over the flash card 1106 1106 \begin{enumerate}
``I have made an \textbf{error}''.} 1107 1107 \itemsep1pt\parskip0pt\parsep0pt
\item 1108 1108 \item
{UserX shall click the blue pencil edit icon on 1109 1109 {UserX shall move the cursor over the flash card
the bottom left of the hovered flashcard.} 1110 1110 ``I have made an \textbf{error}''.}
\item 1111 1111 \item
{The System shall present a modal that contains the text 1112 1112 {UserX shall click the blue pencil edit icon on
``I have made an \textbf{error}'' of the selected flashcard.} 1113 1113 the bottom left of the hovered flashcard.}
\item 1114 1114 \item
{UserX shall select the bolded text ``\textbf{error}''} 1115 1115 {The System shall present a modal that contains the text
\item 1116 1116 ``I have made an \textbf{error}'' of the selected flashcard.}
{UserX shall click 'BLANKED SELECTED TEXT' to 1117 1117 \item
unblank the bold text.} 1118 1118 {UserX shall select the bolded text ``\textbf{error}''}
\item 1119 1119 \item
{UserX shall select the text ``made''.} 1120 1120 {UserX shall click 'BLANKED SELECTED TEXT' to
\item 1121 1121 unblank the bold text.}
{UserX shall click 'BLANKED SELECTED TEXT' to 1122 1122 \item
blank ``made'' to ``\textbf{made}''.} 1123 1123 {UserX shall select the text ``made''.}
\item 1124 1124 \item
{UserX shall click ``Save Changes''.} 1125 1125 {UserX shall click 'BLANKED SELECTED TEXT' to
\item 1126 1126 blank ``made'' to ``\textbf{made}''.}
{The System shall hide the modal from UserX.} 1127 1127 \item
\end{enumerate} 1128 1128 {UserX shall click ``Save Changes''.}
1129 1129 \item
\item[Expected Result:] 1130 1130 {The System shall hide the modal from UserX.}
{For UserX:\\ 1131 1131 \end{enumerate}
The flashcard with the text ``I have made an \textbf{error}'' 1132 1132
will change to ``I have ``\textbf{made}'' an error'' with 1133 1133 \item[Expected Result:]
bolding at different places. 1134 1134 {For UserX:\\
This flashcard with the text ``I have ``\textbf{made}'' an error'' 1135 1135 The flashcard with the text ``I have made an \textbf{error}''
is not a new flashcard. It will be added 1136 1136 will change to ``I have ``\textbf{made}'' an error'' with
to UserX's deck with the UserX's choice of blanking. 1137 1137 bolding at different places.
The card will have only a checkmark and no pencil mark.\\ 1138 1138 This flashcard with the text ``I have ``\textbf{made}'' an error''
1139 1139 is not a new flashcard. It will be added
For UserY:\\ 1140 1140 to UserX's deck with the UserX's choice of blanking.
The flashcard with the text ``I have made an \textbf{error}'' 1141 1141 The card will have only a checkmark and no pencil mark.\\
will remain on the live feed with a checkmark. 1142 1142
Since no new flashcard has been added, UserY's 1143 1143 For UserY:\\
will see no change in the live feed.} 1144 1144 The flashcard with the text ``I have made an \textbf{error}''
\\ 1145 1145 will remain on the live feed with a checkmark.
1146 1146 Since no new flashcard has been added, UserY's
\item[Alternate Workflow B:] 1147 1147 will see no change in the live feed.}
\begin{enumerate} 1148 1148 \\
\itemsep1pt\parskip0pt\parsep0pt 1149 1149
\item 1150 1150 \item[Alternate Workflow B:]
{UserX shall move the cursor over the flash card 1151 1151 \begin{enumerate}
``I have \textbf{made} an error''.} 1152 1152 \itemsep1pt\parskip0pt\parsep0pt
\item 1153 1153 \item
{UserX shall click the blue pencil edit icon on 1154 1154 {UserX shall move the cursor over the flash card
the bottom left of the hovered flashcard.} 1155 1155 ``I have \textbf{made} an error''.}
\item 1156 1156 \item
{The System shall present a modal that contains the 1157 1157 {UserX shall click the blue pencil edit icon on
``I have \textbf{made} an error'' of the selected flashcard.} 1158 1158 the bottom left of the hovered flashcard.}
\item 1159 1159 \item
{UserX shall select the text ``I'' and change it 1160 1160 {The System shall present a modal that contains the
to ``UserX''.} 1161 1161 ``I have \textbf{made} an error'' of the selected flashcard.}
\item 1162 1162 \item
{UserX shall select the text ``UserX''.} 1163 1163 {UserX shall select the text ``I'' and change it
\item 1164 1164 to ``UserX''.}
{UserX shall click 'BLANKED SELECTED TEXT' to 1165 1165 \item
blank ``UserX'' to ``\textbf{UserX}''.} 1166 1166 {UserX shall select the text ``UserX''.}
\item 1167 1167 \item
{UserX shall click ``Save Changes''.} 1168 1168 {UserX shall click 'BLANKED SELECTED TEXT' to
\item 1169 1169 blank ``UserX'' to ``\textbf{UserX}''.}
{The System shall hide the modal from UserX.} 1170 1170 \item
\item 1171 1171 {UserX shall click ``Save Changes''.}
{The System shall create a new flashcard with the given 1172 1172 \item
text.} 1173 1173 {The System shall hide the modal from UserX.}
\end{enumerate} 1174 1174 \item
1175 1175 {The System shall create a new flashcard with the given
\item[Expected Result:] 1176 1176 text.}
{For UserX:\\ 1177 1177 \end{enumerate}
The flashcard with the text ``I have \textbf{made} an error'' 1178 1178
will be hidden from UserX. The new flashcard with the text 1179 1179 \item[Expected Result:]
``\textbf{UserX} have \textbf{made} an error'' 1180 1180 {For UserX:\\
will be added to UserX's deck and 1181 1181 The flashcard with the text ``I have \textbf{made} an error''
have the checkmark and pencil mark on the top right.\\ 1182 1182 will be hidden from UserX. The new flashcard with the text
1183 1183 ``\textbf{UserX} have \textbf{made} an error''
For UserY:\\ 1184 1184 will be added to UserX's deck and
The flashcard with the text ``I have \textbf{made} an error'' 1185 1185 have the checkmark and pencil mark on the top right.\\
will remain on the live feed with a checkmark. 1186 1186
The new flashcard with the text 1187 1187 For UserY:\\
``\textbf{UserX} have \textbf{made} an error'' will be added to 1188 1188 The flashcard with the text ``I have \textbf{made} an error''
the top of the live feed. This new flashcard has not 1189 1189 will remain on the live feed with a checkmark.
been pulled by UserY and is not made by UserY, therefore 1190 1190 The new flashcard with the text
will not have a checkmark and pencil mark.} 1191 1191 ``\textbf{UserX} have \textbf{made} an error'' will be added to
1192 1192 the top of the live feed. This new flashcard has not
\item[Alternate Workflow C:] 1193 1193 been pulled by UserY and is not made by UserY, therefore
\begin{enumerate} 1194 1194 will not have a checkmark and pencil mark.}
\itemsep1pt\parskip0pt\parsep0pt 1195 1195
1196 \item[Alternate Workflow C:]
1197 \begin{enumerate}
1198 \itemsep1pt\parskip0pt\parsep0pt
1199 \item
1200 {UserX shall move the cursor over the flash card
1201 ``\textbf{UserX} have \textbf{made} an error''.}
1202 \item
1203 {UserX shall click the blue pencil edit icon on
1204 the bottom left of the hovered flashcard.}
1205 \item
1206 {The System shall present a modal that contains the
1207 ``\textbf{UserX} have \textbf{made} an error''
1208 of the selected flashcard.}
1209 \item
1210 {UserX shall select the entire text and
1211 change it to five blanks (5 spacebars).}
1212 \item
1213 {UserX shall click ``Save Changes''.}
1214 \item
1215 {The System shall hide the modal from UserX.}
1216 \end{enumerate}
1217
1218 \item[Expected Result:]
1219 {Since blank flashcard cannot be made, the flashcard with the text
1220 ``\textbf{UserX} have \textbf{made} an error''
1221 will be remain with UserX. No new flashcard will be made.
1222 Both UserX and UserY's live feed will not change.
1223 }
1224
\item 1196 1225 \end{description}
{UserX shall move the cursor over the flash card 1197 1226 \newpage
``\textbf{UserX} have \textbf{made} an error''.} 1198 1227
\item 1199 1228 {}
{UserX shall click the blue pencil edit icon on 1200 1229
the bottom left of the hovered flashcard.} 1201 1230 \subsection{[F3] Pull Flashcard}
\item 1202 1231 \begin{description}
{The System shall present a modal that contains the 1203 1232 \item[Description:]{This test case outlines the presentation layering step
``\textbf{UserX} have \textbf{made} an error'' 1204 1233 process of a user pulling a flashcard.}
of the selected flashcard.} 1205 1234
\item 1206 1235 \item[Desired Outcome:]{The User shall have the flashcard added to their deck.}
{UserX shall select the entire text and 1207 1236 \\
change it to five blanks (5 spacebars).} 1208 1237
\item 1209 1238 \item[User Goals:]{The User will be able to review that flashcard.}
{UserX shall click ``Save Changes''.} 1210 1239
\item 1211 1240 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
{The System shall hide the modal from UserX.} 1212 1241 Login, [A3] Add a Class, [F1] Push Flashard}
\end{enumerate} 1213 1242
1214 1243 \item[Priority Level:]{``Must'' }
\item[Expected Result:] 1215 1244
{Since blank flashcard cannot be made, the flashcard with the text 1216 1245 \item[Status:]{Implemented}
``\textbf{UserX} have \textbf{made} an error'' 1217 1246
will be remain with UserX. No new flashcard will be made. 1218 1247 \item[Fixture] f3
Both UserX and UserY's live feed will not change. 1219 1248
} 1220 1249 \item[Preconditions:]
1221 1250 \begin{itemize}
\end{description} 1222 1251 \itemsep1pt\parskip0pt\parsep0pt
\newpage 1223 1252 \item
1224 1253 {The User is logged in as UserX.}
{} 1225 1254 \item
1226 1255 {User has registered for class TEST 101.}
\subsection{[F3] Pull Flashcard} 1227 1256 \item
\begin{description} 1228 1257 {User is at live feed for TEST 101.}
\item[Description:]{This test case outlines the presentation layering step 1229 1258 \item
process of a user pulling a flashcard.} 1230 1259 {That flashcard with the text ``Pull me'' is in the Live Feed of class TEST 101.}
1231 1260 \end{itemize}
\item[Desired Outcome:]{The User shall have the flashcard added to their deck.} 1232 1261
\\ 1233 1262 \item[Postconditions:]
1234 1263 \begin{itemize}
\item[User Goals:]{The User will be able to review that flashcard.} 1235 1264 \itemsep1pt\parskip0pt\parsep0pt
1236 1265 \item
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1237 1266 {UserX shall have that flashcard with the text ``Pull me'' added to their deck}
Login, [A3] Add a Class, [F1] Push Flashard} 1238 1267 \item
1239 1268 {UserX shall be able to review this flashcard later}
\item[Priority Level:]{``Must'' } 1240 1269 \end{itemize}
1241 1270
\item[Status:]{Implemented} 1242 1271 \item[Trigger:]{UserX wants to add a flashcard to their deck to study it.}
1243 1272
\item[Fixture] f3 1244 1273 \item[Workflow:]
1245 1274
\item[Preconditions:] 1246 1275 \begin{enumerate}
\begin{itemize} 1247 1276 \itemsep1pt\parskip0pt\parsep0pt
\itemsep1pt\parskip0pt\parsep0pt 1248 1277 \item
\item 1249 1278 {UserX shall choose the flashcard with the text ``Pull me'' from the
{The User is logged in as UserX.} 1250 1279 class TEST 101 feed and hover their cursor over it.}
\item 1251 1280 \item
{User has registered for class TEST 101.} 1252 1281 {The System shall present buttons on mouseover.}
\item 1253 1282 \item
{User is at live feed for TEST 101.} 1254 1283 {UserX shall click on the large plus that appears over the flashcard with the text ``Pull me''.}
\item 1255 1284 \item
{That flashcard with the text ``Pull me'' is in the Live Feed of class TEST 101.} 1256 1285 {The System shall add the flashcard into UserX's deck.
\end{itemize} 1257 1286 A checkmark shall appear on top right corner of the flashcard.}
1258 1287 \item
\item[Postconditions:] 1259 1288 {UserX shall click the ``Deck'' icon on the top left to enter their
\begin{itemize} 1260 1289 deck.}
\itemsep1pt\parskip0pt\parsep0pt 1261 1290 \item
\item 1262 1291 {UserX shall check that the card with the text ``Pull me'' has been added to their class
{UserX shall have that flashcard with the text ``Pull me'' added to their deck} 1263 1292 TEST 101 deck.}
\item 1264 1293 \end{enumerate}
{UserX shall be able to review this flashcard later} 1265 1294
\end{itemize} 1266 1295 \item[Expected Result:] {The flashcard with the text ``Pull me'' is in the class
1267 1296 TEST 101 deck. If UserX hovers the cursor over the flashcard at the live feed of
\item[Trigger:]{UserX wants to add a flashcard to their deck to study it.} 1268 1297 TEST 101, the original placement of the large plus button has been changed to large minus button.}
1269 1298 \end{description}
\item[Workflow:] 1270 1299 \newpage
1271 1300
\begin{enumerate} 1272 1301 {}
\itemsep1pt\parskip0pt\parsep0pt 1273 1302
\item 1274 1303 \subsection{[F4] Flag Inappropriate Cards}
{UserX shall choose the flashcard with the text ``Pull me'' from the 1275 1304
class TEST 101 feed and hover their cursor over it.} 1276 1305 \begin{description}
\item 1277 1306 \item[Description:]{This test case outlines the presentation layering step
{The System shall present buttons on mouseover.} 1278 1307 process of a user flagging a card they have deemed inappropriate.}
\item 1279 1308
{UserX shall click on the large plus that appears over the flashcard with the text ``Pull me''.} 1280 1309 \item[Desired Outcome:]{The flashcard's inappropriateness variable is
\item 1281 1310 adjusted.}
{The System shall add the flashcard into UserX's deck. 1282 1311 \\
A checkmark shall appear on top right corner of the flashcard.} 1283 1312
\item 1284 1313 \item[User Goals:]{To note if a card should not belong in the class and
{UserX shall click the ``Deck'' icon on the top left to enter their 1285 1314 should not be displayed in the feed.}
deck.} 1286 1315
\item 1287 1316 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
{UserX shall check that the card with the text ``Pull me'' has been added to their class 1288 1317 Login, [A3] Add a Class, [F1] Push Flashcard}
TEST 101 deck.} 1289 1318
\end{enumerate} 1290 1319 \item[Priority Level:]{``Should''}
1291 1320
\item[Expected Result:] {The flashcard with the text ``Pull me'' is in the class 1292 1321 \item[Status:]{Implemented}
TEST 101 deck. If UserX hovers the cursor over the flashcard at the live feed of 1293 1322
TEST 101, the original placement of the large plus button has been changed to large minus button.} 1294 1323 \item[Fixture] f4
\end{description} 1295 1324
\newpage 1296 1325 \item[Preconditions:]
1297 1326 \begin{itemize}
{} 1298 1327 \itemsep1pt\parskip0pt\parsep0pt
1299 1328 \item
\subsection{[F4] Flag Inappropriate Cards} 1300 1329 {UserX has registered for a class TEST 101.}
1301 1330 \item
\begin{description} 1302 1331 {UserX is in the live feed for class TEST 101.}
\item[Description:]{This test case outlines the presentation layering step 1303 1332 \item
process of a user flagging a card they have deemed inappropriate.} 1304 1333 {Flashcard with text ``TESTY FLASHY'' has been created for TEST 101.}
1305 1334 \item
\item[Desired Outcome:]{The flashcard's inappropriateness variable is 1306 1335 {That flashcard ``TESTY FLASHY'' is in the Live Feed for TEST 101.}
adjusted.} 1307 1336 \end{itemize}
\\ 1308 1337
1309 1338 \item[Postconditions:]
\item[User Goals:]{To note if a card should not belong in the class and 1310 1339 \begin{itemize}
should not be displayed in the feed.} 1311 1340 \itemsep1pt\parskip0pt\parsep0pt
1312 1341 \item
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1313 1342 {User shall have that flashcard added to their deck}
Login, [A3] Add a Class, [F1] Push Flashcard} 1314 1343 \item
1315 1344 {User can review this flashcard later}
\item[Priority Level:]{``Should''} 1316 1345 \end{itemize}
1317 1346
\item[Status:]{Implemented} 1318 1347 \item[Trigger:]{UserX wants to mark a card innapropriate.}
1319 1348
\item[Fixture] f4 1320 1349 \item[Workflow:]
1321 1350 \begin{enumerate}
\item[Preconditions:] 1322 1351 \itemsep1pt\parskip0pt\parsep0pt
\begin{itemize} 1323 1352 \item
\itemsep1pt\parskip0pt\parsep0pt 1324 1353 {UserX shall choose the flashcard with the text ``TESTY FLASHY'' from the
\item 1325 1354 feed and hover their cursor over it.}
{UserX has registered for a class TEST 101.} 1326 1355 \item
\item 1327 1356 {The System shall present buttons on mouseover.}
{UserX is in the live feed for class TEST 101.} 1328 1357 \item
\item 1329 1358 {UserX shall click on the crossed out eye icon (Hide) that appears on the card.}
{Flashcard with text ``TESTY FLASHY'' has been created for TEST 101.} 1330 1359 \item
\item 1331 1360 {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''.}
{That flashcard ``TESTY FLASHY'' is in the Live Feed for TEST 101.} 1332 1361 \item
\end{itemize} 1333 1362 {UserX shall click the REPORT.}
1334 1363 \end{enumerate}
\item[Postconditions:] 1335 1364
\begin{itemize} 1336 1365 \item[Expected Result:] {The System shall display a toast, ``Report successful: thanks for letting us know!''}
\itemsep1pt\parskip0pt\parsep0pt 1337 1366 \end{description}
\item 1338 1367 \newpage
{User shall have that flashcard added to their deck} 1339 1368
\item 1340 1369 {}
{User can review this flashcard later} 1341 1370
\end{itemize} 1342 1371 \subsection{[F5] Filter Flashcards}
1343 1372
\item[Trigger:]{UserX wants to mark a card innapropriate.} 1344 1373 \begin{description}
1345 1374 \item[Description:]{This test case outlines the presentation layering process
\item[Workflow:] 1346 1375 of a user filtering existing flashcards to view only a specified subset.}
\begin{enumerate} 1347 1376
\itemsep1pt\parskip0pt\parsep0pt 1348 1377 \item[Desired Outcome:]{The User shall see flashcards based on the filter
\item 1349 1378 options.}
{UserX shall choose the flashcard with the text ``TESTY FLASHY'' from the 1350 1379
feed and hover their cursor over it.} 1351 1380 \item[User Goals:]{The User can find what they are specifically looking
\item 1352 1381 for}
{The System shall present buttons on mouseover.} 1353 1382
\item 1354 1383 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
{UserX shall click on the crossed out eye icon (Hide) that appears on the card.} 1355 1384 Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull
\item 1356 1385 Flashcard}
{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''.} 1357 1386
\item 1358 1387 \item[Priority Level:]{``Should''}
{UserX shall click the REPORT.} 1359 1388
\end{enumerate} 1360 1389 \item[Status:]{Implemented}
1361 1390
\item[Expected Result:] {The System shall display a toast, ``Report successful: thanks for letting us know!''} 1362 1391 \item[Fixture] f5
\end{description} 1363 1392
\newpage 1364 1393 \item[Preconditions:]
1365 1394 \begin{itemize}
{} 1366 1395 \itemsep1pt\parskip0pt\parsep0pt
1367 1396 \item
\subsection{[F5] Filter Flashcards} 1368 1397 {User is logged in as UserX.}
1369 1398 \item
\begin{description} 1370 1399 {UserX has registered for the class TEST 101.}
\item[Description:]{This test case outlines the presentation layering process 1371 1400 \item
of a user filtering existing flashcards to view only a specified subset.} 1372 1401 {There exist flashcards in TEST 101 with the text ``apple'' and ``banana''
1373 1402 for each week in the quarter.}
\item[Desired Outcome:]{The User shall see flashcards based on the filter 1374 1403 \item
options.} 1375 1404 {There exist flashcards in TEST 101 with the text ``orange'' that are hidden
1376 1405 for each week in the quarter.}
\item[User Goals:]{The User can find what they are specifically looking 1377 1406 \item
for} 1378 1407 {UserX is at Card List View for the class.}
1379 1408 \end{itemize}
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1380 1409
Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull 1381 1410 \item[Postconditions:]
Flashcard} 1382 1411 \begin{itemize}
1383 1412 \itemsep1pt\parskip0pt\parsep0pt
\item[Priority Level:]{``Should''} 1384 1413 \item
1385 1414 {User only sees flashcards pertaining to selected dates.}
\item[Status:]{Implemented} 1386 1415 \end{itemize}
1387 1416
\item[Fixture] f5 1388 1417 \item[Trigger:]{User is looking for specific flashcards.}
1389 1418
\item[Preconditions:] 1390 1419 \item[Workflow:]
\begin{itemize} 1391 1420 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1392 1421 \itemsep1pt\parskip0pt\parsep0pt
\item 1393 1422 \item
{User is logged in as UserX.} 1394 1423 {UserX shall deselect ``Week Nine'' from top.}
\item 1395 1424 \item
{UserX has registered for the class TEST 101.} 1396 1425 {The System shall hide all cards from Week 9.}
\item 1397 1426 \item
{There exist flashcards in TEST 101 with the text ``apple'' and ``banana'' 1398 1427 {UserX shall search for ``app'' in the search bar in the top right.}
for each week in the quarter.} 1399 1428 \item
\item 1400 1429 {The System shall display only cards including text ``app''.}
{There exist flashcards in TEST 101 with the text ``orange'' that are hidden 1401 1430 \item
for each week in the quarter.} 1402 1431 {UserX shall click ``Show Hidden'' button in the top left and clear
\item 1403 1432 the text in the search box.}
{UserX is at Card List View for the class.} 1404 1433 \item
\end{itemize} 1405 1434 {The System shall display all cards, excluding those from Week 9.}
1406 1435 \end{enumerate}
\item[Postconditions:] 1407 1436
\begin{itemize} 1408 1437 \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 1409 1438 \end{description}
\item 1410 1439 \newpage
{User only sees flashcards pertaining to selected dates.} 1411 1440
\end{itemize} 1412 1441 {}
1413 1442
\item[Trigger:]{User is looking for specific flashcards.} 1414 1443 \subsection{[F6] Blank Out Words in Flashcard}
1415 1444
\item[Workflow:] 1416 1445 \begin{description}
\begin{enumerate} 1417 1446 \item[Description:]{This test case outlines the presentation layering process
\itemsep1pt\parskip0pt\parsep0pt 1418 1447 of the User to create keywords in a card they are pushing.}
\item 1419 1448
{UserX shall deselect ``Week Nine'' from top.} 1420 1449 \item[Desired Outcome:]{The blanked out words (visually bolded) in the
\item 1421 1450 flashcard notify the System that they are keywords.}
{The System shall hide all cards from Week 9.} 1422 1451
\item 1423 1452 \item[User Goals:]{The User shall mark some words as keywords so the System
{UserX shall search for ``app'' in the search bar in the top right.} 1424 1453 may later quiz the User by blanking out one keyword at a time and having the
\item 1425 1454 User enter what they think the keyword is.}
{The System shall display only cards including text ``app''.} 1426 1455
\item 1427 1456 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
{UserX shall click ``Show Hidden'' button in the top left and clear 1428 1457 Login, [A3] Add a Class, [F1] Push Flashcard}
the text in the search box.} 1429 1458
\item 1430 1459 \item[Priority Level:]{``Must''}
{The System shall display all cards, excluding those from Week 9.} 1431 1460
\end{enumerate} 1432 1461 \item[Status:]{Implemented}
1433 1462
\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.} 1434 1463 \item[Preconditions:]
\end{description} 1435 1464 \begin{itemize}
\newpage 1436 1465 \itemsep1pt\parskip0pt\parsep0pt
1437 1466 \item
{} 1438 1467 \item
1439 1468 {The User is logged in as UserX.}
\subsection{[F6] Blank Out Words in Flashcard} 1440 1469 \item
1441 1470 {The User has added the class TEST 101.}
\begin{description} 1442 1471 \item
\item[Description:]{This test case outlines the presentation layering process 1443 1472 {The User is at the Feed View for the class TEST 101.}
of the User to create keywords in a card they are pushing.} 1444 1473 \end{itemize}
1445 1474
\item[Desired Outcome:]{The blanked out words (visually bolded) in the 1446 1475 \item[Postconditions:]
flashcard notify the System that they are keywords.} 1447 1476 \begin{itemize}
1448 1477 \itemsep1pt\parskip0pt\parsep0pt
\item[User Goals:]{The User shall mark some words as keywords so the System 1449 1478 \item
may later quiz the User by blanking out one keyword at a time and having the 1450 1479 {The blanked out words (keyword) ``Spain'' in the flashcard are marked with underline.}
User enter what they think the keyword is.} 1451 1480 \end{itemize}
1452 1481
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1453 1482 \item[Trigger:] {The User wants their newly pushed card to have the keyword ``Spain''.}
Login, [A3] Add a Class, [F1] Push Flashcard} 1454 1483
1455 1484 \item[Workflow:]
\item[Priority Level:]{``Must''} 1456 1485 \begin{enumerate}
1457 1486 \itemsep1pt\parskip0pt\parsep0pt
\item[Status:]{Implemented} 1458 1487 \item
1459 1488 {UserX shall click the Compose button (+ circle on bottom right) of Feed.}
\item[Preconditions:] 1460 1489 \item
\begin{itemize} 1461 1490 {The System shall bring up the composition flashcard modal.}
\itemsep1pt\parskip0pt\parsep0pt 1462 1491 \item
\item 1463 1492 {UserX shall type text ``The rain in Spain stays mainly in the plain''
\item 1464 1493 into the composition modal, replacing ``Write a flashcard''.}
{The User is logged in as UserX.} 1465 1494 \item
\item 1466 1495 {UserX shall highlight the word ``Spain''.}
{The User has added the class TEST 101.} 1467 1496 \item {UserX shall press Blank Selected Text button.}
\item 1468 1497 \item {UserX shall press Contribute button to push the flashcard.}
{The User is at the Feed View for the class TEST 101.} 1469 1498 \item
\end{itemize} 1470 1499 {The System will save the blanked out word in the Flashcard Mask of the
1471 1500 newly pushed flashcard.}
\item[Postconditions:] 1472 1501 \item {The Feed shall display the new card with the keyword underlined.}
\begin{itemize} 1473 1502 \end{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1474 1503
\item 1475 1504 \item[Expected Result:] {The System shall show ``Spain'' underlined and bolded
{The blanked out words (keyword) ``Spain'' in the flashcard are marked with underline.} 1476 1505 in the flashcard. The flashcard is visible in the Feed and Deck of class TEST 101.}
\end{itemize} 1477 1506 \end{description}
1478 1507 \newpage
\item[Trigger:] {The User wants their newly pushed card to have the keyword ``Spain''.} 1479 1508
1480 1509 {}
\item[Workflow:] 1481 1510
\begin{enumerate} 1482 1511 \subsection{[F7] Fix Flashcard}
\itemsep1pt\parskip0pt\parsep0pt 1483 1512
\item 1484 1513 \begin{description}
{UserX shall click the Compose button (+ circle on bottom right) of Feed.} 1485 1514 \item[Description:]{This Test Case outlines the presentation layering process
\item 1486 1515 for the User to alter (``fix'') a flashcard they made originally and not have
{The System shall bring up the composition flashcard modal.} 1487 1516 to make a new copy of it. It is only a ``fix'' if no other users have the
\item 1488 1517 flashcard in their Decks AND the User is the author.}
{UserX shall type text ``The rain in Spain stays mainly in the plain'' 1489 1518
into the composition modal, replacing ``Write a flashcard''.} 1490 1519 \item[Desired Outcome:]{The User shall change one of their flashcards' text
\item 1491 1520 and that alteration will be visible to all users in the Feed.}
{UserX shall highlight the word ``Spain''.} 1492 1521
\item {UserX shall press Blank Selected Text button.} 1493 1522 \item[User Goals:]{The User shall make their own authored flashcard say
\item {UserX shall press Contribute button to push the flashcard.} 1494 1523 something different than it did originally.}
\item 1495 1524
{The System will save the blanked out word in the Flashcard Mask of the 1496 1525 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
newly pushed flashcard.} 1497 1526 Login, [A3] Add a Class, [F1] Push Flashcard}
\item {The Feed shall display the new card with the keyword underlined.} 1498 1527
\end{enumerate} 1499 1528 \item[Priority Level:]{``Must''}
1500 1529
\item[Expected Result:] {The System shall show ``Spain'' underlined and bolded 1501 1530 \item[Status:]{Implemented}
in the flashcard. The flashcard is visible in the Feed and Deck of class TEST 101.} 1502 1531
\end{description} 1503 1532 \item[Preconditions:]
\newpage 1504 1533 \begin{itemize}
1505 1534 \itemsep1pt\parskip0pt\parsep0pt
{} 1506 1535 \item
1507 1536 {The User is logged in as UserX.}
\subsection{[F7] Fix Flashcard} 1508 1537 \item
1509 1538 {UserX has enrolled in the class TEST 101.}
\begin{description} 1510 1539 \item
\item[Description:]{This Test Case outlines the presentation layering process 1511 1540 {UserX is at the Deck View for the class TEST 101.}
for the User to alter (``fix'') a flashcard they made originally and not have 1512 1541 \item
to make a new copy of it. It is only a ``fix'' if no other users have the 1513 1542 {UserX has contributed and pushed a flashcard to the TEST 101 Feed, which is
flashcard in their Decks AND the User is the author.} 1514 1543 also in their Deck with text
1515 1544 ``My card is currently broken''; this flashcard is for fixing.}
\item[Desired Outcome:]{The User shall change one of their flashcard's text 1516 1545 \item
and that alteration will be visible to all users in the Feed.} 1517 1546 {No other users have pulled said card.}
1518 1547 \end{itemize}
\item[User Goals:]{The User shall make their own authored flashcard say 1519 1548
something different than it did originally.} 1520 1549 \item[Postconditions:]
1521 1550 \begin{itemize}
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1522 1551 \itemsep1pt\parskip0pt\parsep0pt
Login, [A3] Add a Class, [F1] Push Flashcard} 1523 1552 \item
1524 1553 {UserX shall see their alteration for that flashcard in their
\item[Priority Level:]{``Must''} 1525 1554 Feed and Deck for TEST 101.}
1526 1555 \end{itemize}
\item[Status:]{Implemented} 1527 1556
1528 1557 \item[Trigger:] {UserX realizes that a card they created previously does
\item[Preconditions:] 1529 1558 not say what they currently desire and wishes to change it.}
\begin{itemize} 1530 1559
\itemsep1pt\parskip0pt\parsep0pt 1531 1560 \item[Workflow:]
\item 1532 1561 \begin{enumerate}
{The User is logged in as UserX.} 1533 1562 \itemsep1pt\parskip0pt\parsep0pt
\item {The User is logged in a separate browser as UserY.} 1534 1563 \item
\item 1535 1564 {UserX shall hover the Flashcard they created with text ``My card is currently
{UserX and UserY has enrolled in the class TEST 101.} 1536 1565 broken''.}
\item 1537 1566 \item
{UserX is at the Deck View for the class TEST 101.} 1538 1567 {UserX shall select the bottom-left blue Edit Card pencil button on the flashcard.}
\item {UserY is at the Feed View for the class TEST 101.} 1539 1568 \item
\item 1540 1569 {The System shall bring up the flashcard Edit modal.}
{The User has contributed and pushed a flashcard to the TEST 101 Feed, which is 1541 1570 \item
also in their Deck with text 1542 1571 {UserX shall highlight the text ``broken''.}
``My card is currently broken''; this flashcard is for fixing.} 1543 1572 \item {UserX shall change the highlighted word into ``fixed'' so that the text
\end{itemize} 1544 1573 reads ``My card is currently \textbf{fixed}''.}
1545 1574 \item
\item[Postconditions:] 1546 1575 {UserX shall press the Save Changes button.}
\begin{itemize} 1547 1576 \item
\itemsep1pt\parskip0pt\parsep0pt 1548 1577 {The System shall update the flashcard's text content.}
\item 1549 1578 \item
{The authoring User shall see their alteration for that flashcard in their 1550 1579 {The System shall close the edit flashcard modal.}
Feed and Deck for TEST 101.} 1551 1580 \end{enumerate}
\item {Other users shall see the fixed flashcard in the Feed for TEST 101 if they 1552 1581
refresh the app.} 1553 1582 \item[Expected Results:]{UserX shall see the fixed flashcard
\end{itemize} 1554 1583 in the TEST 101 feed as well as in their TEST 101 Deck with the new
1555 1584 text: ``My card is currently \textbf{fixed}''.}
\item[Trigger:] {UserX realizes that a card they created previously does 1556 1585 \end{description}
not say what they currently desire and wishes to change it.} 1557 1586 \newpage
1558 1587
\item[Workflow:] 1559 1588 {}
\begin{enumerate} 1560 1589
\itemsep1pt\parskip0pt\parsep0pt 1561 1590 \subsection{[F8] Hide cards from feed}
\item 1562 1591
{UserX shall hover the Flashcard they created with text ``My card is currently 1563 1592 \begin{description}
broken''.} 1564 1593 \item[Description:]{This test case outlines the presentation layering process
\item 1565 1594 for the User shall be able to hide cards from their own view, on
{UserX shall select the bottom-left blue Edit Card pencil button on the flashcard.} 1566 1595 the Feed and Deck.}
\item 1567 1596
{The System shall bring up the flashcard Edit modal.} 1568 1597 \item[Desired Outcome:]{The System marks the flashcard as hidden from the
\item 1569 1598 User so that the User cannot see the flashcard in the Feed or Deck.}
{UserX shall highlight the text ``broken''.} 1570 1599
\item {UserX shall change the highlighted word into ``fixed'' so that the text 1571 1600 \item[User Goals:]{The flashcard is no longer visible to the User in the Feed or
reads ``My card is currently fixed''.} 1572 1601 Deck views.}
\item 1573 1602
{UserX shall press the Save Changes button.} 1574 1603 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
\item 1575 1604 Login, [A3] Add a Class, [F1] Push Flashcard}
{The System shall update the flashcard's text content.} 1576 1605
\item 1577 1606 \item[Priority Level:]{``Should''}
{The System shall close the edit flashcard modal.} 1578 1607
\item {The Client shall show the flashcard in the UserX's TEST 101 Deck with the 1579 1608 \item[Status:]{Implemented}
fixed text.} 1580 1609
1581 1610 \item[Preconditions:]
\item {UserY refreshes the TEST 101 Feed view and sees the flashcard ``My card is 1582 1611 \begin{itemize}
currently fixed''.} 1583 1612 \itemsep1pt\parskip0pt\parsep0pt
\end{enumerate} 1584 1613 \item
1585 1614 {The User is logged in as UserX.}
\item[Expected Results:]{The Client shall show the fixed flashcard 1586 1615 \item
in UserX's TEST 101 class Deck with the new text:``My card is currently fixed''. 1587 1616 {The User has enrolled in the class TEST 101.}
The Client shall show the fixed flashcard in UserY's TEST 101 Feed view as well, 1588 1617 \item
after page refresh.} 1589 1618 {The User is at the Feed View or Deck View (alternate workflow)
\end{description} 1590 1619 for the class TEST 101.}
\newpage 1591 1620 \item
1592 1621 {The User has composed and contributed a flashcard to the Feed with text
{} 1593 1622 ``The rain in Spain stays mainly in the plain''.}
1594 1623 \end{itemize}
\subsection{[F8] Hide cards from feed} 1595 1624
1596 1625 \item[Postconditions:]
\begin{description} 1597 1626 \begin{itemize}
\item[Description:]{This test case outlines the presentation layering process 1598 1627 \itemsep1pt\parskip0pt\parsep0pt
for the User shall be able to hide cards from their own view, on 1599 1628 \item{Flashcard is not viewable by user in the Feed or Deck views in TEST 101.}
the Feed and Deck.} 1600 1629 \end{itemize}
1601 1630
\item[Desired Outcome:]{The System marks the flashcard as hidden from the 1602 1631 \item[Workflow:]
User so that the User cannot see the flashcard in the Feed or Deck.} 1603 1632 \begin{enumerate}
1604 1633 \itemsep1pt\parskip0pt\parsep0pt
\item[User Goals:]{The flashcard is no longer visible to the User in the Feed or 1605 1634 \item {UserX has navigated to the Feed View of TEST 101.}
Deck views.} 1606 1635 \item
1607 1636 {UserX hovers over the flashcard they added with the text ``The rain in Spain stays
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1608 1637 mainly in the plain''.}
Login, [A3] Add a Class, [F1] Push Flashcard} 1609 1638 \item {UserX presses Hide button, which is the red crossed-out eye.}
1610 1639 \item {The System shall hide the card.}
\item[Priority Level:]{``Should''} 1611 1640 \end{enumerate}
1612 1641
\item[Status:]{Implemented} 1613 1642 \item[Expected Result:] {The System shall display a toast ``Card Hidden! If
1614 1643 the card was spammy or abusive you may also REPORT''.}
\item[Preconditions:] 1615 1644
\begin{itemize} 1616 1645 \item[Alternate Workflow:]
\itemsep1pt\parskip0pt\parsep0pt 1617 1646 \begin{enumerate}
\item 1618 1647 \itemsep1pt\parskip0pt\parsep0pt
{The User is logged in as UserX.} 1619 1648 \item {UserX has navigated to the Deck View of TEST 101.}
\item 1620 1649 \item
{The User has enrolled in the class TEST 101.} 1621 1650 {UserX hovers the flashcard they added with the text ``The rain in Spain stays
\item 1622 1651 mainly in the plain''.}
{The User is at the Feed View or Deck View (alternate workflow) 1623 1652
for the class TEST 101.} 1624 1653 \item {UserX presses hide button, which is the red crossed-out eye.}
\item 1625 1654
{The User has composed and contributed a flashcard to the Feed with text 1626 1655 \item {The System shall hide the card.}
``The rain in Spain stays mainly in the plain''.} 1627 1656 \item {A toast is shown on the client that allows the User to report the card.}
\end{itemize} 1628 1657 \item {The card is not shown on the Feed or Deck.}
1629 1658 \end{enumerate}
\item[Postconditions:] 1630 1659
\begin{itemize} 1631 1660