Compare View

switch
from
...
to
 
Commits (2)

Diff

Showing 1 changed file Inline Diff

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