Commit 2d7d97a9598be7b26d1b01f77d155f7b822dfa44

Authored by Rohan Rangray
Exists in master

Merged conflicts

Showing 17 changed files Inline Diff

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