Commit 6c8360177c7a9c89c779c430dfb8ead44775d565

Authored by Kevin Mach
Exists in master

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

Showing 2 changed files Inline Diff

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