Commit 44fca697dd9af0bec92cb8dca4823408ce65fc2d

Authored by Rohan Rangray
Exists in master

Merge branch 'master' of git.ucsd.edu:110swag/docs

mergin

Showing 2 changed files Inline Diff

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