Commit d83d230cf684b5da49cb065c552e2cfa3f1312b7

Authored by Nam Tran
Exists in master

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

Showing 6 changed files Side-by-side Diff

1 1 *~
2   -*.png
  2 +
3 3 *.pdf
4 4 built/*
5 5 *.swp
DesignUseCases.tex View file @ d83d230
... ... @@ -43,6 +43,7 @@
43 43 \newpage
44 44 \tableofcontents
45 45 \newpage
  46 +
46 47 \section{Accounts}
47 48 \subsection{[A1] User Registration}
48 49 \begin{description}[style=multiline,leftmargin=3cm]
... ... @@ -54,7 +55,7 @@
54 55 the aforementioned account.}
55 56 \\
56 57 \item[User Goals]{The user shall have an account to participate in the
57   -website's activities.}
  58 +application's activities.}
58 59  
59 60 \item[Primary Actor]{User (student)}
60 61  
61 62  
... ... @@ -62,9 +63,9 @@
62 63 \\
63 64 \item[Priority Level]{``Must''}
64 65  
65   -\item[Status]{Not Implemented}
  66 +\item[Status]{Implemented}
66 67  
67   -\item[Pre-conditions]
  68 +\item[Pre-conditions]: None.
68 69  
69 70 \item[Post-conditions]
70 71  
71 72  
72 73  
73 74  
74 75  
75 76  
76 77  
77 78  
78 79  
79 80  
80 81  
81 82  
... ... @@ -81,36 +82,38 @@
81 82 \begin{enumerate}
82 83 \itemsep1pt\parskip0pt\parsep0pt
83 84 \item
84   - {The user shall click the sign up button.}
  85 + {The frontend renders the login form described in login.html.}
85 86 \item
86   - {The client renders a registration form and displays it to the user}
  87 + {The User shall click the sign up toggle.}
87 88 \item
88   - {The user fills the form}
  89 + {The frontend shall render a registration form and display it to the User.}
89 90 \item
90   - {The client checks that the provided email is not invalid, and that
  91 + {The User shal fill in the form.}
  92 +\item
  93 + {The frontend checks that the provided email is not invalid, and that
91 94 the password is not valid. If anything is not valid, it displays an
92 95 error and returns this to the user. }
93 96 \item
94   - {If the form is valid, the client POSTs the form in JSON format to the
95   - server API at /api/me.}
  97 + {If the form is valid, the frontent POSTs the form in JSON format to the
  98 + server API at /api/verify\_email/.}
96 99 \item
97   - {The server deserializes and validates the data. If it's not valid, it
98   - returns an error to the client.}
  100 + {The backend deserializes and validates the data in /api/register. If it's not valid, it
  101 + returns an error to the frontend.}
99 102 \item
100   - {The server creates a new User object from the provided data, filling
101   - in the appropriate fields}
  103 + {The backend creates a new User object from the provided data, filling
  104 + in the email and password fields in models.py in model method create\_user.}
102 105 \item
103   - {The server saves the user object}
  106 + {The backend saves the User object in models.py.}
104 107 \item
105   - {The server marks the user's email as unverified}
  108 + {The backend marks the User's email as unverified.}
106 109 \item
107   - {The server sends an email to the user's address with a link to
108   - validate the user's email address.}
  110 + {The backend sends an email to the User's address with a link to
  111 + validate the user's email address from models.py in function send\_confirmation\_email.}
109 112 \item
110   - {The server responds with success and logs the user in on a new
111   - session for the user. }
  113 + {The backend responds with success and logs the User in on a new
  114 + session for the User. }
112 115 \item
113   - {The client reports success to the user and stores the sessionid for
  116 + {The frontend reports success to the User and stores the sessionid for
114 117 future requests.}
115 118 \end{enumerate}
116 119  
117 120  
118 121  
119 122  
120 123  
... ... @@ -119,18 +122,18 @@
119 122 \begin{enumerate}
120 123 \itemsep1pt\parskip0pt\parsep0pt
121 124 \item
122   - {The user receives an email with a link to verify their email. The
123   - user clicks the link}
  125 + {The User receives an email with a link to verify their email. The
  126 + User clicks the link}
124 127 \item
125   - {The client submits the verification code to the server}
  128 + {The frontend in VerifyEmailController submits a POST request to the backend.}
126 129 \item
127   - {The server validates the code. If the code is not valid, it returns
128   - an error to the client.}
  130 + {The backend validates the code in views.py in function veryify\_email. If the code is not valid, it returns
  131 + an error to the frontend.}
129 132 \item
130   - {The server marks the user's email as valid and saves the User object
131   - again. The user's account is now active}
  133 + {The backend marks the user's email as confirmed and saves the User object
  134 + again in models.py in function confirm\_email. The user's account is now active.}
132 135 \item
133   - {The client reports success. }
  136 + {The frontend's VerifyEmailController.js reports success and logs the User in to the application. }
134 137 \end{enumerate}
135 138  
136 139 \end{description}
137 140  
... ... @@ -155,14 +158,15 @@
155 158 \\
156 159 \item[Priority Level]{``Must''}
157 160  
158   -\item[Status]{Not Implemented}
  161 +\item[Status]{Implemented}
159 162  
160 163 \item[Pre-conditions]
161 164  
162 165 \begin{itemize}
163 166 \itemsep1pt\parskip0pt\parsep0pt
164 167 \item
165   - {The user has created an account before.}
  168 + {The User has registered an account.}
  169 + {The User knows their email and password.}
166 170 \end{itemize}
167 171  
168 172 \item[Post-conditions]
169 173  
170 174  
171 175  
172 176  
173 177  
174 178  
175 179  
176 180  
... ... @@ -170,41 +174,42 @@
170 174 \begin{itemize}
171 175 \itemsep1pt\parskip0pt\parsep0pt
172 176 \item
173   - {The user can navigate the site and see their data.}
  177 + {The User can navigate the site and see their data.}
174 178 \end{itemize}
175 179  
176   -\item[Trigger]{The User shall enter their email and password into the Login
177   -form. The user then submits this information by clicking the ``Login''
178   -button or pressing the return key.}
  180 +\item[Trigger]{The User wants to use the application and its core features.}
179 181  
180 182 \item[Workflow]
181 183  
182 184 \begin{enumerate}
183 185 \itemsep1pt\parskip0pt\parsep0pt
184 186 \item
185   - {The server verifies that the User has submitted an email and password}
  187 +{The frontend shall render the login form described in login.html and implemented in LoginController.js}
186 188 \item
187   - {The server authenticates the User's email and password and checks if the
188   - User is active}
  189 +{The User shall type in their email and password.}
189 190 \item
190   - {The server logs the User in using the Django login feature}
  191 + {The backend shall verify that the User has submitted their email and password in views.py in function login.}
191 192 \item
192   - {Front-end displays the home page for the User}
  193 + {The backend shall check that the User is active in views.py in function login.}
  194 +\item
  195 + {The backend shall log the User in using the Django login feature.}
  196 +\item
  197 + {The frontend shall displays the home page for the User.}
193 198 \end{enumerate}
194 199 \end{description}
195 200 \newpage
196 201  
197 202 \subsection{[A3] Add a Class}
198 203 \begin{description}
199   -\item[Description]{The user shall be able to add a class and access the
  204 +\item[Description]{The User shall be able to add a class and access the
200 205 flashcards associated with that class.}
201 206  
202   -\item[Desired Outcome]{The class shall be linked with the student's account
203   -and the student shall have the ability to read and publish flashcards
  207 +\item[Desired Outcome]{The class shall be connected to the student's account
  208 +and the User shall have the ability to read and publish flashcards
204 209 for this class.}
205 210 \\
206   -\item[User Goals]{The user wants to publish flashcards for this class, and
207   -reads the flashcards for this class that are published by other users.}
  211 +\item[User Goals]{The User wants to publish flashcards for this class, and
  212 +read the flashcards for this class that are published by other users.}
208 213  
209 214 \item[Primary Actor]{User (student)}
210 215  
211 216  
212 217  
... ... @@ -213,16 +218,16 @@
213 218 \\
214 219 \item[Priority Level]{``Must''}
215 220  
216   -\item[Status]{Not implemented}
  221 +\item[Status]{Implemented}
217 222  
218 223 \item[Pre-conditions]
219 224  
220 225 \begin{itemize}
221 226 \itemsep1pt\parskip0pt\parsep0pt
222 227 \item
223   - {The user has created an account.}
  228 + {The User has registered an account.}
224 229 \item
225   - {The user is logged in to their account and is at root view}
  230 + {The User has successfully logged in to the application.}
226 231 \end{itemize}
227 232  
228 233 \item[Post-conditions]
229 234  
230 235  
231 236  
232 237  
233 238  
234 239  
235 240  
236 241  
237 242  
238 243  
239 244  
240 245  
241 246  
242 247  
243 248  
244 249  
245 250  
246 251  
... ... @@ -230,72 +235,83 @@
230 235 \begin{itemize}
231 236 \itemsep1pt\parskip0pt\parsep0pt
232 237 \item
233   - {The user can read the flashcards being published for the class and
234   - add them to his/her deck.}
  238 + {The User can view the flashcards being published for the class and
  239 + add them to their deck.}
235 240 \item
236   - {The user can publish flashcards to be viewed and added by other users
  241 + {The User can publish flashcards to be viewed and added by other users
237 242 in the same class.}
238 243 \end{itemize}
239 244  
240   -\item[Trigger]{The user wants to add a class.}
  245 +\item[Trigger]{The User wants to make flashcards and view flashcards for a class.}
241 246  
242 247 \item[Workflow]
243 248  
244 249 \begin{enumerate}
245 250 \itemsep1pt\parskip0pt\parsep0pt
246 251 \item
247   - {The user shall click add a class on the sidebar.}
  252 + {The User shall click "Add a Class" from the drop down menu in the upper left hand corner.}
248 253 \item
249   - {The client shall bring the user to a AddClassView.}
  254 + {The frontend shall navigate to the new page described by addclass.html.}
250 255 \item
251   - {The user begins to type their class name or number.}
  256 + {The User shall begin to type the class department code, course title, course number, or instructor in the text box.}
252 257 \item
253   - {The ShowSuggestion shall show suggestions as a user types.}
254   -\end{enumerate}
255   -
256   -\begin{itemize}
257   -\itemsep1pt\parskip0pt\parsep0pt
  258 + {The frontend in ClassAddController.js shall send a get request to the backend at api/sections/search/.}
258 259 \item
259   - {Implementation unspecified at present; need to do further research
260   - (django-autocomplete-lite?)}
261   -\end{itemize}
  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.}
  261 +\item
  262 + {The frontend shall show the classes that the backend has found.}
  263 +\item
  264 + {The User shall select from the classes the one that they want to add.}
  265 +\item
  266 + {The frontend shall enable the 'Add Class' button.}
  267 +\item
  268 + {The User shall click 'Add Class' button to the right of the text box.}
  269 +\item
  270 + {The frontend shall send a post request to api/sections/.}
  271 +\item
  272 + {The backend shall in views.py in function enroll shall call the method enroll in models.py.}
  273 +\item
  274 + {The backend in models.py in function enroll shall add the class to the User's sections.}
  275 +\item
  276 + {The frontend shall redirect the User to the class's Live Feed using the ClassAddController.js.}
  277 +\item
  278 + {The frontend shall present the live feed for the class by using feed.html and FeedController.js.}
262 279  
  280 +\end{enumerate}
  281 +
  282 +\item[Alternate Workflow: User is whitelisted.\\]
263 283 \begin{enumerate}
264 284 \setcounter{enumi}{3}
265 285 \itemsep1pt\parskip0pt\parsep0pt
  286 +\item []{ Precondition: The class has a whitelist, a whitelist is a list of email addresses that can add themselves to the class.\\}
266 287 \item
267   - {The user shall select a class by clicking on ``Add Class''.}
  288 + {The User shall select their desired class, which has a whitelist, by clicking on ``Add Class''.}
268 289 \item
269   - {The client shall submit a POST request to /api/me/sections with
270   - the course ID that the User added. }
  290 + {The frontend shall submit a POST request to /api/me/sections with
  291 + the course ID that the User typed. }
271 292 \item
272   - {The server shall check if there is a whitelist for the class that the
273   - user is trying to add.}
  293 + {The backend shall check if there is a whitelist for the class that the
  294 + User has selected in models.py at function is\_whitelisted.}
274 295 \item
275   - {The server shall ensure that the user is whitelisted.}
  296 + {The backend shall check if the user is on the whitelist in models.py
  297 + in function is\_user\_on\_whitelist.}
276 298 \item
277   - {The server shall link the user to the section.}
  299 + {The backend shall add the User to the class following steps above.}
  300 +\item
  301 + {The frontend shall redirect the User to the class's live feed followed the last step in the Workflow above.}
278 302 \end{enumerate}
279 303  
280 304 \item[Alternate Workflow: User is not whitelisted.]
281 305 \begin{enumerate}
282 306 \setcounter{enumi}{7}
283 307 \itemsep1pt\parskip0pt\parsep0pt
  308 +\item []{ Precondition: The class has a whitelist, a whitelist is a list of email addresses that can add themselves to the class.\\}
284 309 \item
285   - {The server shall deny user access to class.}
  310 + {The backend shall will check that the user is in the whitelist in models.py.}
286 311 \item
287   - {The client shall display failure message to user.}
  312 + {The frontend shall display that the class is whitelisted and the Add Class button will not be enabled.}
288 313 \end{enumerate}
289 314  
290   -\item[Alternate Workflow: There is no whitelist.]
291   -\begin{enumerate}
292   -\setcounter{enumi}{6}
293   -\itemsep1pt\parskip0pt\parsep0pt
294   -\item
295   - {The server shall link the user to the section.}
296   -\item
297   - {The client shall display success message to user.}
298   -\end{enumerate}
299 315 \end{description}
300 316 {}
301 317  
302 318  
303 319  
304 320  
... ... @@ -306,16 +322,16 @@
306 322 \subsection{[A4] Drop a Class}
307 323  
308 324 \begin{description}
309   -\item[Description]{The user can remove themselves from a course he/she is
  325 +\item[Description]{The User can remove themselves from a course he/she is
310 326 registered to}
311 327  
312   -\item[Desired Outcome]{The user has dropped the class and no longer need
  328 +\item[Desired Outcome]{The User has dropped the class and no longer need
313 329 access to the flashcards for said class. This means they can no longer
314 330 see the flashcards associated to the class that they dropped }
315 331 \\
316   -\item[User Goals]{The user shall not have access to a class and the
  332 +\item[User Goals]{The User shall not have access to a class and the
317 333 flashcards associated with that class. They will no longer see the class
318   -listed in their list of ``Enrolled Classes''}
  334 +listed in their drop down menu.}
319 335  
320 336 \item[Primary Actor]{User (student)}
321 337  
322 338  
323 339  
324 340  
... ... @@ -324,18 +340,20 @@
324 340 \\
325 341 \item[Priority Level]{ ``Should''}
326 342  
327   -\item[Status]{Not Implemented }
  343 +\item[Status]{Implemented }
328 344  
329 345 \item[Pre-conditions]
330 346  
331 347 \begin{itemize}
332 348 \itemsep1pt\parskip0pt\parsep0pt
333 349 \item
334   - {User has a valid account.}
  350 + {The User has a valid account.}
335 351 \item
336   - {User is logged in.}
  352 + {The User is logged in.}
337 353 \item
338   - {User has enrolled in classes.}
  354 + {The User has enrolled in at least one class.}
  355 +\item
  356 + {The User has navigated to the Settings page.}
339 357 \end{itemize}
340 358  
341 359 \item[Post-conditions]{}
342 360  
343 361  
344 362  
345 363  
346 364  
... ... @@ -347,32 +365,23 @@
347 365 flashcards}
348 366 \end{itemize}
349 367  
350   -\item[Trigger]{User clicked button to drop class.}
  368 +\item[Trigger]{User no longer wants to see flashcards from that class.}
351 369  
352 370 \item[Workflow]
353 371  
354 372 \begin{enumerate}
355 373 \itemsep1pt\parskip0pt\parsep0pt
356 374 \item
357   - {The user shall click ``Drop'' (or equivalent) button.}
  375 + {The User shall click `Drop' button to the right of the class they wish to drop.}
358 376 \item
359   - {The client shall display a dialogue box which will say ``Are you
360   - sure you want to drop this class?''}
361   -\item
362   - {The user shall click ``Yes'' to confirm that they want to drop the
363   - class}
364   -\item
365   - {The client shall submit a DELETE request to
  377 + {The frontend shall submit a DELETE request to
366 378 /api/me/sections/\textless{}section ID number\textgreater{}.}
367 379 \item
368   - {If the user is not already enrolled in the section, the server will
369   - return a 404 Not Found error, which the client shall handle. (The
370   - client should not show an error to the user)}
  380 + {The backend shall check that the User is enrolled in the section in models.py in function drop.}
371 381 \item
372   - {The server shall remove the selected class from a user's list of
373   - classes. }
  382 + {The server shall remove the selected class from a user's list of section in models.py in function drop. }
374 383 \item
375   - {The server shall return success to the client}
  384 + {The frontend shall remove the class from the list in setting and show toast reading 'Dropped'.}
376 385 \end{enumerate}
377 386 \end{description}
378 387 \newpage
379 388  
380 389  
381 390  
382 391  
383 392  
384 393  
385 394  
... ... @@ -382,38 +391,39 @@
382 391 \subsection{[A5] Password change}
383 392  
384 393 \begin{description}
385   -\item[Description]{The user shall be able to change the password for their
386   -account in the account settings. This requires that they are logged in.
387   -}
  394 +\item[Description]{The User shall be able to change the password for their
  395 +account in the account settings. }
388 396  
389   -\item[Desired Outcome]{The user's password shall be changed and the user
  397 +\item[Desired Outcome]{The User's password shall be changed and the User
390 398 shall be able to log in with the new password in the future}
391 399 \\\\
392   -\item[User Goals]{The user wants to use a different password in the future}
  400 +\item[User Goals]{The User wants to use a different password in the future}
393 401  
394 402 \item[Primary Actor]{User (student)}
395 403  
396 404 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
397 405 Login}
398 406 \\
399   -\item[Details]{The user provides their current password and a new password
  407 +\item[Details]{The User provides their current password and a new password
400 408 in a form. If the current password is correct, the system updates their
401 409 password to the requested new password.}
402 410  
403 411 \item[Priority Level]{``Must''}
404 412  
405   -\item[Status]{Not }{implemented}
  413 +\item[Status]{Implemented}
406 414  
407 415 \item[Pre-conditions]
408 416  
409 417 \begin{itemize}
410 418 \itemsep1pt\parskip0pt\parsep0pt
411 419 \item
412   - {The user has created an account}
  420 + {The User has registered an account.}
413 421 \item
414   - {The user has logged in }
  422 + {The User has logged in.}
415 423 \item
416   - {The user knows their current password}
  424 + {The User knows their current password.}
  425 +\item
  426 + {The User has navigated to the Settings page.}
417 427 \end{itemize}
418 428  
419 429 \item[Post-conditions]
420 430  
421 431  
... ... @@ -421,12 +431,12 @@
421 431 \begin{itemize}
422 432 \itemsep1pt\parskip0pt\parsep0pt
423 433 \item
424   - {The user's password is changed}
  434 + {The User's password is changed}
425 435 \item
426   - {The user can log in with the new password}
  436 + {The User can log in with the new password}
427 437 \end{itemize}
428 438  
429   -\item[Trigger]{User clicks ``Change Password'' button in Accounts page}
  439 +\item[Trigger]{The User wants to change their password.}
430 440  
431 441 \item[Error Handling]
432 442 \begin{description}
433 443  
434 444  
435 445  
436 446  
437 447  
... ... @@ -446,23 +456,21 @@
446 456 \begin{enumerate}
447 457 \itemsep1pt\parskip0pt\parsep0pt
448 458 \item
449   - {The user shall press the ``Change Password'' button}
  459 + {The frontend shall render a form that requires the user to enter their
  460 + old password and new password from settings.html}
450 461 \item
451   - {The client shall render a form that requires the user to enter their
452   - old password and new password}
  462 + {The User shall type in their current password, the desired new
  463 + password, and retype the desired new password to confirm.}
453 464 \item
454   - {The user shall enter their current password and the desired new
455   - password}
456   -\item
457   - {The client shall submit the data to the server by sending a PATCH
  465 + {The frontend shall submit the data to the server by sending a PATCH
458 466 request to /api/me containing ``old\_password'' and
459   - ``new\_password'' values.}
  467 + ``new\_password'' values in SettingsController.js.}
460 468 \item (The )
461 469 \item
462   - {The server shall check the user's current password}
463   -\item The server shall update the user's current password
  470 + {The backend shall check the user's current password in views.py in function patch under UserDetail.}
  471 +\item The backend shall update the user's current password in views.py in function patch under UserDetail.
464 472 \item
465   - {The client shall report success to the user}
  473 + {The frontend shall present a toast reading "Password successfully changed" and redirect the User to the Add a Class page.}
466 474 \end{enumerate}
467 475 \end{description}
468 476 {}
469 477  
470 478  
... ... @@ -474,14 +482,13 @@
474 482 \subsection{[A6] Password reset}
475 483  
476 484 \begin{description}
477   -\item[Description]{The user shall be able to reset their password without
478   -being logged in }
  485 +\item[Description]{The User shall be able to reset their password without
  486 +being logged in.}
479 487  
480   -\item[Desired Outcome]{The user's password shall be changed to one that
481   -they remember}
  488 +\item[Desired Outcome]{The User's password shall be changed to one that
  489 +they remember.}
482 490 \\
483   -\item[User Goals]{The user does not know their current password but wants
484   -to log into the site}
  491 +\item[User Goals]{The User will be able to log into the site with a new password.}
485 492  
486 493 \item[Primary Actor]{User (student)}
487 494  
488 495  
489 496  
... ... @@ -498,16 +505,18 @@
498 505  
499 506 \item[Priority Level]{``Must''}
500 507  
501   -\item[Status]{Not i}{mplemented}
  508 +\item[Status]{Implemented}
502 509  
503 510 \item[Pre-conditions]
504 511  
505 512 \begin{itemize}
506 513 \itemsep1pt\parskip0pt\parsep0pt
507 514 \item
508   - {The user has created an account before}
  515 + {The User has created an account before.}
509 516 \item
510   - {The user knows the email address attached to their account}
  517 + {The User knows the email address attached to their account for our application.}
  518 +\item
  519 + {The User can log into their email account.}
511 520 \end{itemize}
512 521  
513 522 \item[Post-conditions]
514 523  
515 524  
516 525  
517 526  
518 527  
519 528  
520 529  
521 530  
522 531  
523 532  
524 533  
525 534  
526 535  
527 536  
528 537  
... ... @@ -515,73 +524,47 @@
515 524 \begin{itemize}
516 525 \itemsep1pt\parskip0pt\parsep0pt
517 526 \item
518   - {The user's password is changed}
  527 + {The User's password is changed.}
519 528 \item
520   - {The user can log in with the new password}
  529 + {The User can log in with the new password.}
521 530 \end{itemize}
522 531  
523   -\item[Trigger]{User clicks ``Forgot Password'' button on the login page}
  532 +\item[Trigger]{The User wants to log into the site but does not know their password.}
  533 +\item[Workflow]
524 534  
525   -\item[Workflow, requesting password reset]
526   -
527 535 \begin{enumerate}
528 536 \itemsep1pt\parskip0pt\parsep0pt
529 537 \item
530   - {The user shall click ``Forgot Password'' (or equivalent) button}
  538 +{The User clicks ``Forgot Password'' text on the login page}
531 539 \item
532   - {The client shall prompt the user for their current email}
  540 + {The frontend shall render the password reset page from the template requestpasswordreset.html.}
533 541 \item
534   - {The user shall submit their email address}
  542 + {The User shall type in their email address for their account and click the "Reset" button.}
535 543 \item
536   - {The client shall validate that the email address is formatted
537   - correctly}
  544 + {The frontend shall send a POST request to /api/request\_password\_reset/ from RequestResetController.js.}
538 545 \item
539   - {The client shall submit the email address to the server in a POST
540   - request to /api/reset\_password with an ``email'' value}
  546 + {The backend shall check if an account exists with the email entered by
  547 + the User in views.py in function request\_password\_reset.}
541 548 \item
542   - {The server shall check if an account exists with the email entered by
543   - the user}
  549 + {The backend shal send an email to the User with a link to the password reset page in models.py in function
  550 + request\_password\_reset.}
544 551 \item
545   - {If no such account exists, the server shall return an error to the
546   - frontend, which will display it to the user}
  552 + {The User will navigate to their email account, open the email, and click the link.}
547 553 \item
548   - {If the account does exist, the server will:}
549   -\end{enumerate}
550   -
551   -\begin{enumerate}
552   -\itemsep1pt\parskip0pt\parsep0pt
  554 + {The frontend shall render the password reset page from the template resetpassword.html.}
  555 +\item
  556 + {The User shall type in their new password and re-type it to confirm it.}
  557 +\item
  558 + {The frontend shall check if the new password is long enough and if the confirmed password is the same as
  559 + the new password in ResetPasswordController.js.}
553 560 \item
554   - {Create a new password reset token for the user}
  561 + {The frontend shall send a POST request to /api/reset\_password from ResetPasswordController.js.}
555 562 \item
556   - {Send an email to the user with a link containing the token and the
557   - user's ID}
558   -\end{enumerate}
559   -
560   -\item[Workflow, resetting password]
561   -
562   -\begin{enumerate}
563   -\setcounter{enumi}{8}
564   -\itemsep1pt\parskip0pt\parsep0pt
  563 + {The backend shall change the user's password in views.py in function reset\_password.}
565 564 \item
566   - {The user shall click the link in the email and visit
567   - /app/password\_reset}
  565 + {The frontend shall redirect the User to the login page. }
568 566 \item
569   - {The client shall render a form that will prompt the user for a new
570   - password}
571   -\item
572   - {The user shall provide a new password in the form}
573   -\item
574   - {The client shall submit the password to the server}
575   -\item
576   - {If the user tries to submit without a password in the text field, the
577   - client shall display a message saying ``Password cannot be blank.''}
578   -\item
579   - {The server first verifies that the token is valid for the user}
580   -\item
581   - {The server then verifies that the user's new password is non-blank}
582   -\item
583   - {If neither of the above verifications fail, the server shall change
584   - the password associated with the user's email. }
  567 + {The User shall use their new password to login to the application.}
585 568 \end{enumerate}
586 569 \end{description}
587 570 \newpage
... ... @@ -609,7 +592,7 @@
609 592 \\
610 593 \item[Priority Level]{``Should''}
611 594  
612   -\item[Status]{Not Implemented}
  595 +\item[Status]{Implemented}
613 596  
614 597 \item[Pre-conditions]
615 598  
... ... @@ -627,8 +610,8 @@
627 610 {Only those users who were whitelisted may add the class.}
628 611 \end{itemize}
629 612  
630   -\item[Trigger]{The instructor emails the administrator and requests to
631   -limit access to his class.}
  613 +\item[Trigger]{The course instructor wants to limit the students who
  614 +can add his class on our application.}
632 615  
633 616 \item[Workflow]
634 617  
635 618  
... ... @@ -643,10 +626,10 @@
643 626 paste the list of emails. They submit the page directly (no separate
644 627 frontend here) to the server.}
645 628 \item
646   - {The server shall create a WhitelistedAddress for each provided email,
  629 + {The backend shall create a WhitelistedAddress for each provided email,
647 630 attaching it to the section taught by the instructor.}
648 631 \item
649   - {The server shall add any existing users whose email addresses appear
  632 + {The backend shall add any existing users whose email addresses appear
650 633 in the whitelist to the class. }
651 634 \end{enumerate}
652 635 \end{description}
653 636  
654 637  
... ... @@ -655,13 +638,13 @@
655 638 \subsection{[A8] User Logout}
656 639  
657 640 \begin{description}
658   -\item[Description]{The user shall be able to log out of his/her account on
  641 +\item[Description]{The User shall be able to log out of his/her account on
659 642 the site.}
660 643  
661   -\item[Desired Outcome]{The user's information and data will no longer be
  644 +\item[Desired Outcome]{The User's information and data will no longer be
662 645 accessible after logging out. }
663 646 \\
664   -\item[User Goals]{The user is done with his/her session of using the
  647 +\item[User Goals]{The User is done with his/her session of using the
665 648 website, and wants to make sure others cannot access the data in his/her
666 649 account.}
667 650  
668 651  
669 652  
... ... @@ -677,16 +660,18 @@
677 660  
678 661 \item[Post-conditions]{}{The user's data can no longer be accessed.}
679 662  
680   -\item[Trigger]{User clicks ``Logout'' button}
  663 +\item[Trigger]{The User no longer wants to be logged into the application.}
681 664  
682 665 \item[Workflow]
683 666  
684 667 \begin{enumerate}
685 668 \itemsep1pt\parskip0pt\parsep0pt
686 669 \item
687   - {The server logs the User out using the Django logout feature}
  670 + {The User clicks the 'Logout' button in the upper right hand corner.}
688 671 \item
689   - {Front-end displays application login page}
  672 + {The backend shall log the User out using the Django logout feature.}
  673 +\item
  674 + {The frontend renders the application login page using login.html.}
690 675 \end{enumerate}
691 676  
692 677 \end{description}
693 678  
694 679  
... ... @@ -698,12 +683,12 @@
698 683 \subsection{[A9] Contact Admin}
699 684  
700 685 \begin{description}
701   -\item[Description]{The user shall be able to contact the admin.}
  686 +\item[Description]{The User shall be able to contact the admin.}
702 687  
703   -\item[Desired Outcome]{The user shall send a message to the admin; the
  688 +\item[Desired Outcome]{The User shall send a message to the admin; the
704 689 admin shall receive the message.}
705 690  
706   -{User Goals:}{The user sends a message to the admin.}
  691 +{User Goals:}{The User sends a message to the admin.}
707 692  
708 693 \item[Primary Actor]{User}
709 694  
710 695  
711 696  
712 697  
... ... @@ -711,21 +696,31 @@
711 696 \\
712 697 \item[Priority Level]{``Must''}
713 698  
714   -\item[Status]{Not implemented}
  699 +\item[Status]{Implemented}
715 700  
716   -\item[Pre-conditions]{None.}
  701 +\item[Pre-conditions]{The User has an account registered and is logged in.}
717 702  
718 703 \item[Post-conditions]{The admin receives the user's message.}
719 704  
720   -\item[Trigger]{User has navigated to our website. }
  705 +\item[Trigger]{The User wants to contact the adiminstators of the site with
  706 +bug reports, questions, or praise. }
721 707  
722 708 \item[Workflow]
723 709  
724 710 \begin{enumerate}
725 711 \itemsep1pt\parskip0pt\parsep0pt
726 712 \item
727   - {The frontend displays the admin email address on every page in the
728   - application.}
  713 + {The User shall click the '?' button that presents a toast reading "Help" when the User hovers over it.}
  714 +\item
  715 + {The frontend shall render the page using the help.html template.}
  716 +\item
  717 + {The User shall scroll to the bottom of the page.}
  718 +\item
  719 + {The User shall click the text reading "Send Us an Email!"}
  720 +\item
  721 + {The frontend shall open Microsoft Outlook or a similar application using the HelpController.js.}
  722 +\item
  723 + {The User shall see our email address in the recipients text box.}
729 724 \end{enumerate}
730 725 \end{description}
731 726 \newpage
... ... @@ -4,7 +4,7 @@
4 4 SCREEN_SEQUENCE_DOTS = $(wildcard screen_sequence_diagrams/*.dot)
5 5 SCREEN_SEQUENCE_PNGS = $(patsubst screen_sequence_diagrams/%,built/%,$(patsubst %.dot,%.png,$(SCREEN_SEQUENCE_DOTS)))
6 6  
7   -all: built/ $(PNGS) $(PDFS) built/screenshots/
  7 +all: built/ $(PNGS) $(PDFS) #built/screenshots/
8 8  
9 9 built/:
10 10 mkdir -p built
TestCases.tex View file @ d83d230
Diff suppressed. Click to show
... ... @@ -43,10 +43,20 @@
43 43 \newpage
44 44 \tableofcontents
45 45 \newpage
  46 +
46 47 \section{Testing Notes}
  48 +\subsection{Fixtures}
  49 +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.
47 50 \subsection{Testing Multiple Users}
48 51 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.
49   -
  52 +\subsection{Supported Browser}
  53 +Flashy officially supports Chrome version 42 on Windows and Linux. Frontend functionality may be degraded on other browsers.
  54 +
  55 +\subsection{Sent Emails in Development}
  56 +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:
  57 +
  58 +\includegraphics[width=4in]{../doc_screenshots/console_backend.png}
  59 +
50 60 \newpage
51 61  
52 62  
53 63  
54 64  
55 65  
56 66  
... ... @@ -55,20 +65,22 @@
55 65 \subsection{[A1] User Registration}
56 66 \begin{description}[style=multiline,leftmargin=3cm]
57 67  
58   -\item[Description:]{This Test Case outlines the presentation layer step process of a user registering for an account with our application.}
  68 +\item[Description:]{This test case outlines the presentation layer step
  69 +process of a user registering for an account with our application.}
59 70  
60   -\item[Desired Outcome:]{An account will be created for the user from the
61   -specified username, password, email. The user will be able to log into
  71 +\item[Desired Outcome:]{An account will be created for the User from the
  72 +specified username, password, email. The User will be able to log into
62 73 the aforementioned account.}
63 74  
64   -\item[User Goals:]{The user shall have an account to participate in the
  75 +\item[User Goals:]{The User shall have an account to participate in the
65 76 website's activities.}
66 77  
67 78 \item[Dependency Use Cases:]{None}
68 79 \\
  80 +
69 81 \item[Priority Level:]{``Must''}
70 82  
71   -\item[Status:]{Not Implemented}
  83 +\item[Status:]{Implemented}
72 84  
73 85 \item[Preconditions:]
74 86 \begin{itemize}
... ... @@ -81,7 +93,7 @@
81 93 \begin{itemize}
82 94 \itemsep1pt\parskip0pt\parsep0pt
83 95 \item
84   - {The user has an account registered with the system.}
  96 + {The User has an account registered with the system.}
85 97 \end{itemize}
86 98  
87 99 \item[Trigger:]{UserX wants to start creating flashcards for a class.}
... ... @@ -105,7 +117,7 @@
105 117 again.}
106 118 \end{enumerate}
107 119  
108   -\item [Expected Results:]{UserX's account is now active (registered with the system)}
  120 +\item [Expected Results:]{UserX's account is now active (registered with the system).}
109 121  
110 122 \end{description}
111 123 \newpage
112 124  
113 125  
114 126  
115 127  
116 128  
117 129  
118 130  
119 131  
120 132  
121 133  
122 134  
... ... @@ -115,52 +127,51 @@
115 127 \subsection{[A2] User Login}
116 128  
117 129 \begin{description}
118   -\item[Description:]{This Test Case outlines the presentation layering step process of a user logging into the application}
  130 +\item[Description:]{This test case outlines the presentation layering step
  131 +process of a user logging into the application.}
119 132  
120   -\item[Desired Outcome:]{The user shall be able to provide their email address and
121   -password to access their courses and flash cards. The user shall gain
  133 +\item[Desired Outcome:]{The User shall be able to provide their email address and
  134 +password to access their courses and flash cards. The User shall gain
122 135 access to the list of the courses they have added, and be able to review
123 136 the flash cards they have added to their decks.}
124 137  
125   -\item[User Goals:]{The user wants to resume use of the site on another
  138 +\item[User Goals:]{The User wants to resume use of the site on another
126 139 device, or use the site after logging out.}
127 140  
128 141 \item[Dependency Use Cases:]{[A1] User Registration}
129 142 \\
  143 +
130 144 \item[Priority Level:]{``Must''}
131 145  
132   -\item[Status:]{Not Implemented}
  146 +\item[Status:]{Implemented}
133 147  
134 148 \item[Preconditions:]
135   -
136 149 \begin{itemize}
137 150 \item
138 151 {The User has created an account before with email ``testuser@flashy.cards'' with password ``test''.}
139 152 \end{itemize}
140 153  
141 154 \item[Postconditions:]
142   -
143 155 \begin{itemize}
144 156 \itemsep1pt\parskip0pt\parsep0pt
145 157 \item
146 158 {The user can navigate the site and see their data.}
147 159 \end{itemize}
148 160  
149   -\item[Trigger:]{ UserX wants to view, add, or create cards for a class or classes.}
  161 +\item[Trigger:]{UserX wants to view, add, or create cards for a class or classes.}
150 162  
151 163 \item[Workflow:]
152   -
153 164 \begin{enumerate}
154 165 \itemsep1pt\parskip0pt\parsep0pt
155 166 \item
156   - {UserX shall enter his or her email ``testuser@flashy.cards'' and password ``test''. }
  167 + {UserX shall enter their email ``testuser@flashy.cards'' and password ``test''.}
157 168 \item
158 169 {The System shall authenticate UserX's email and password and checks if UserX is active.}
159 170 \item
160   - {The System shall receive the credentials and display the ``Add Class'' page to the User. }
  171 + {The System shall receive the credentials and display the ``Add Class'' page to the User.}
161 172 \end{enumerate}
162   -\item [Expected Results:]
163   - {The User is brought to the page ``Add Class''.} \\
  173 +\item [Expected Result:]
  174 + {The User is brought to the page ``Add Class''.}\\
164 175  
165 176 \item [Alternate Workflow:]
166 177 \begin{enumerate}
... ... @@ -170,7 +181,7 @@
170 181 {The System shows UserX the site login page with a text message reading ``Invalid username or password!!'' displayed in the log in text box.}
171 182 \end {enumerate}
172 183  
173   -\item [Expected Results:]
  184 +\item [Expected Result:]
174 185 {The User is not able to login.} \\
175 186  
176 187 \end{description}
177 188  
... ... @@ -180,13 +191,14 @@
180 191  
181 192 \subsection{[A3] Add a Class}
182 193 \begin{description}
183   -\item[Description:]{This Test Case outlines the presentation layer step process of a User adding a class.}
  194 +\item[Description:]{This test case outlines the presentation layer step
  195 +process of a user adding a class.}
184 196  
185 197 \item[Desired Outcome:]{The class shall be linked with the student's account
186 198 and the student shall have the ability to read and publish flashcards
187 199 for this class.}
188 200  
189   -\item[User Goals:]{The user wants to publish flashcards for this class and
  201 +\item[User Goals:]{The User wants to publish flashcards for this class and
190 202 read the flashcards for this class that are published by other users.}
191 203  
192 204 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login}
193 205  
194 206  
195 207  
196 208  
197 209  
198 210  
199 211  
200 212  
201 213  
202 214  
203 215  
204 216  
205 217  
206 218  
207 219  
208 220  
209 221  
210 222  
211 223  
212 224  
213 225  
214 226  
215 227  
216 228  
217 229  
218 230  
219 231  
... ... @@ -194,84 +206,107 @@
194 206  
195 207 \item[Priority Level:]{``Must''}
196 208  
197   -\item[Status:]{Not implemented}
  209 +\item[Status:]{Implemented}
198 210  
199 211 \item[Preconditions:]
200 212 \begin{itemize}
201 213 \itemsep1pt\parskip0pt\parsep0pt
202 214 \item
203   - {The user has created an account.}
  215 + {The User is logged in as UserX.}
204 216 \item
205   - {The user is logged in to their account and is at root view.}
  217 + {The User is at root view.}
  218 +\item
  219 + {The User is whitelisted for class TEST1.}
  220 +\item
  221 + {The User is not whitelisted for class TEST2.}
  222 +\item
  223 + {The class TEST3 has no whitelist.}
206 224 \end{itemize}
207 225  
208 226 \item[Postconditions:]
209 227 \begin{itemize}
210 228 \itemsep1pt\parskip0pt\parsep0pt
211 229 \item
212   - {The user can read the flashcards being published for the class and
213   - add them to his/her deck.}
  230 + {The User can read the flashcards being published for the class and
  231 + add them to their deck.}
214 232 \item
215   - {The user can publish flashcards to be viewed and added by other users
  233 + {The User can publish flashcards to be viewed and added by other users
216 234 in the same class.}
217 235 \end{itemize}
218 236  
219 237 \item[Trigger:]{UserX wants to view the Live Feed and have a flashcard deck for a class.}
220 238  
221 239 \item[Workflow:]
222   -
223 240 \begin{enumerate}
224 241 \itemsep1pt\parskip0pt\parsep0pt
225 242 \item
226   - {UserX shall click ``Add Class'' on the menu.}
  243 + {UserX shall click ``Add Class'' on the classes dropdown from the navigation bar.}
227 244 \item
228 245 {The System shall show the user ``Add Class'' page.}
229 246 \item
230   - {UserX shall begin to type ``CSE 110''.}
  247 + {UserX shall begin to type ``TEST1''.}
231 248 \item
232 249 {The System shall show suggestions as a user types.}
233 250 \item
234   - {UserX shall click on ``CSE 110: Software Engineering (Gillespie, Gary N)''.}
  251 + {The System shall check if there is a whitelist for each class in the suggestions.}
235 252 \item
236   - {UserX shall click on the ``Add'' button.}
  253 + {The System shall ensure that UserX is on the whitelist for each section.}
237 254 \item
238   - {The System shall check if there is a whitelist for the CSE 110 section that
239   - UserX is trying to add.}
  255 + {UserX shall click on ``TEST1'', which should not have a lock icon.}
240 256 \item
241   - {The System shall ensure that UserX is on the whitelist for the specified CSE 110 section.}
  257 + {UserX shall click on the ``Add'' button.}
242 258 \item
243   - {The System shall add UserX to the specified CSE 110 section.}
  259 + {The System shall add UserX to the specified class TEST1.}
244 260 \end{enumerate}
245 261  
246   -\item[Expected Result:] {UserX has added the section and sees the Live Feed for the specified CSE 110 section.}
  262 +\item[Expected Result:] {UserX has added the section and sees the Live Feed
  263 +for TEST1.}
247 264  
248   -\item[Alternate Workflow - Planned:]
  265 +\item[Alternate Workflow A:]
249 266 \begin{enumerate}
250   -\setcounter{enumi}{6}
  267 +\setcounter{enumi}{3}
251 268 \itemsep1pt\parskip0pt\parsep0pt
  269 +\item
  270 + {UserX shall begin to type ``TEST2''.}
  271 +\item
  272 + {The System shall show suggestions as a user types.}
  273 +\item
  274 + {The System shall check if there is a whitelist for each class in the suggestions.}
252 275 \item
253   - {The System shall see that UserX is not on the whitelist. }
  276 + {The System shall see that UserX is not on the whitelist.}
254 277 \item
255   - {The System shall deny UserX access to the specified CSE 110 section.}
  278 + {UserX shall see a lock icon in the suggestions for TEST2.}
256 279 \item
257   - {The System shall display failure message to UserX.} \\
  280 + {UserX shall click on ``TEST2'', which has a lock icon.}
  281 +\item
  282 + {The System shall disable the ``Add'' button.}
258 283 \end{enumerate}
259 284  
260   -\item[Expected Result:] {UserX cannot add the specified CSE 110 section and cannot view contents related to this class.}
  285 +\item[Expected Result:] {UserX cannot add the specified TEST2 and cannot
  286 +view contents related to this class.}
261 287  
262   -\item[Alternate Workflow - Planned:]
  288 +\item[Alternate Workflow:]
263 289 \begin{enumerate}
264   -\setcounter{enumi}{6}
  290 +\setcounter{enumi}{3}
265 291 \itemsep1pt\parskip0pt\parsep0pt
  292 +\item
  293 + {UserX shall begin to type ``TEST3''.}
  294 +\item
  295 + {The System shall show suggestions as a user types.}
  296 +\item
  297 + {The System shall check if there is a whitelist for each class in the suggestions.}
266 298 \item
267   - {The System shall see there is not whitelist for the specified CSE 110 section.}
  299 + {The System shall see there is no whitelist for TEST3.}
268 300 \item
269   - {The System shall link UserX to the specified CSE 110 section.}
  301 + {UserX shall click on ``TEST3'', which should not have a lock icon.}
270 302 \item
271   - {UserX shall see the Live Feed for the specified CSE 110 section.}
  303 + {UserX shall click on the ``Add'' button.}
  304 +\item
  305 + {The System shall add UserX to TEST3.}
272 306 \end{enumerate}
273 307  
274   -\item[Expected Workflow:] {User has added the section and sees the Live Feed for the specified CSE 110 section.}
  308 +\item[Expected Result:] {UserX has added the section and sees the Live Feed
  309 +for TEST3.}
275 310 \end{description}
276 311 \newpage
277 312  
278 313  
279 314  
280 315  
281 316  
282 317  
283 318  
284 319  
285 320  
286 321  
287 322  
288 323  
289 324  
290 325  
... ... @@ -280,62 +315,56 @@
280 315 \subsection{[A4] Drop a Class}
281 316  
282 317 \begin{description}
283   -\item[Description:]{This Test Case outlines the presentation layer step process of a user dropping a class.}
  318 +\item[Description:]{This test case outlines the presentation layer step process of a user dropping a class.}
284 319  
285   -\item[Desired Outcome:]{The user has dropped the class and no longer needs
  320 +\item[Desired Outcome:]{The User has dropped the class and no longer needs
286 321 access to the flashcards for the dropped class. They can no longer
287 322 see the flashcards associated to the class that they dropped.}
288 323  
289   -\item[User Goals:]{The user shall not have access to a class and the
  324 +\item[User Goals:]{The User shall not have access to a class and the
290 325 flashcards associated with that class. They will no longer see the class
291   -listed in their list of ``Enrolled Classes''}
  326 +listed in their list of ``Enrolled Classes''.}
292 327  
293 328 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class}
294 329 \\
295 330  
296 331 \item[Priority Level:]{``Should''}
297 332  
298   -\item[Status:]{Not Implemented}
  333 +\item[Status:]{Implemented}
299 334  
300 335 \item[Preconditions:]
301 336 \begin{itemize}
302 337 \itemsep1pt\parskip0pt\parsep0pt
303 338 \item
304   - {User has a valid account.}
  339 + {User is logged in as UserX.}
305 340 \item
306   - {User is logged in.}
  341 + {User has enrolled in TEST1.}
307 342 \item
308   - {User has enrolled in classes.}
  343 + {User is at Settings page.}
309 344 \end{itemize}
310 345  
311 346 \item[Postconditions:]
312 347 \begin{itemize}
313 348 \itemsep1pt\parskip0pt\parsep0pt
314 349 \item
315   - {User shall no longer have access to dropped class, or associated
316   - flashcards}
  350 + {User shall no longer have access to TEST1, or associated flashcards.}
317 351 \end{itemize}
318 352  
319   -\item[Trigger:]{UserX wants to stop seeing the class's Live Feed and remove all of their flashcards.}
  353 +\item[Trigger:]{UserX wants to stop seeing the class's Live Feed and remove
  354 +all of their flashcards.}
320 355  
321 356 \item[Workflow:]
322 357 \begin{enumerate}
323 358 \itemsep1pt\parskip0pt\parsep0pt
324 359 \item
325   - {UserX shall click ``Drop'' (or equivalent) button for CSE 110: Software Engineering (Gillespie, Gary N).}
  360 + {UserX shall click ``X'' icon next to TEST1 in ``Enrolled Classes'' table.}
326 361 \item
327   - {The System shall display a dialogue box which will say ``Are you
328   - sure you want to drop this class?''.}
329   -\item
330   - {UserX shall click ``Yes'' to confirm that they want to drop the specified CSE 110 section.}
331   -\item
332   - {The System shall remove UserX from the specified CSE 110 section's roster.}
  362 + {The System shall remove UserX from TEST1.}
333 363 \item
334   - {The System shall remove the specified CSE 110 section from the User's list of classes.}
335   -\item {UserX shall have one less class to select on the menu.}
  364 + {The System shall display a toast indicating that a class has been dropped.}
336 365 \end{enumerate}
337 366  
338   -\item[Expected Result:] {UserX no longer has access to any content related to to the class that has been dropped.}
  367 +\item[Expected Result:] {UserX no longer has access to any content related to TEST1.}
339 368 \end{description}
340 369 \newpage
341 370  
342 371  
343 372  
344 373  
... ... @@ -344,16 +373,14 @@
344 373 \subsection{[A5] Password Change}
345 374  
346 375 \begin{description}
347   -\item[Description:]{The user shall be able to change the password for their
  376 +\item[Description:]{The User shall be able to change the password for their
348 377 account in the account settings. This requires that they are logged in.}
349 378  
350   -\item[Desired Outcome:]{The user's password shall be changed and the user
351   -shall be able to log in with the new password in the future}
  379 +\item[Desired Outcome:]{The User's password shall be changed and the user
  380 +shall be able to log in with the new password in the future.}
352 381  
353   -\item[User Goals:]{The user wants to use a different password in the future}
  382 +\item[User Goals:]{The User wants to use a different password in the future.}
354 383  
355   -\item[Primary Actor:]{User (student)}
356   -
357 384 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login}
358 385 \\
359 386  
360 387  
361 388  
362 389  
363 390  
364 391  
365 392  
... ... @@ -363,29 +390,30 @@
363 390  
364 391 \item[Priority Level:]{``Must''}
365 392  
366   -\item[Status:]{Not Implemented}
  393 +\item[Status:]{Implemented}
367 394  
368 395 \item[Preconditions:]
369 396 \begin{itemize}
370 397 \itemsep1pt\parskip0pt\parsep0pt
371 398 \item
372   - {The user has created an account}
  399 + {The User is logged in as UserX.}
373 400 \item
374   - {The user has logged in }
  401 + {The User knows the current password (``oldPassword'').}
375 402 \item
376   - {The user knows their current password}
  403 + {The User is at the Settings page.}
377 404 \end{itemize}
378 405  
379 406 \item[Postconditions:]
380 407 \begin{itemize}
381 408 \itemsep1pt\parskip0pt\parsep0pt
382 409 \item
383   - {The user's password is changed}
  410 + {The User's password is changed}
384 411 \item
385   - {The user can log in with the new password}
  412 + {The User can log in with the new password}
386 413 \end{itemize}
387 414  
388   -\item[Trigger:]{UserX wants to change their password.}
  415 +\item[Trigger:]{UserX is dissatisfied with their current password and wishes
  416 +to change it.}
389 417  
390 418 \item[Error Handling:]
391 419 \begin{description}
392 420  
393 421  
394 422  
... ... @@ -405,17 +433,14 @@
405 433 \begin{enumerate}
406 434 \itemsep1pt\parskip0pt\parsep0pt
407 435 \item
408   - {UserX shall press the ``Change Password'' button.}
  436 + {UserX shall enter their current password ``oldPassword'' and the desired
  437 +new password ``newPassword'' (twice) in the ``Change Password'' form.}
409 438 \item
410   - {The System shall render a form that requires the user to enter their old password and new password.}
  439 + {UserX shall click the ``Submit'' button.}
411 440 \item
412   - {UserX shall enter their current password ``oldPassword'' and the desired new password ``newPassword''.}
413   -\item
414 441 {The System shall check UserX's current password.}
415 442 \item
416 443 {The System shall update the UserX's current password ``oldPassword'' to the new password ``newPassword''.}
417   -\item
418   - {The System shall display a modal displaying ``Success! You've changed your password!''}
419 444 \end{enumerate}
420 445  
421 446 \item[Expected Result:] {User's password is changed from ``oldPasswrd'' to ``newPassword''.}
422 447  
423 448  
424 449  
... ... @@ -427,20 +452,20 @@
427 452 \subsection{[A6] Password Reset}
428 453  
429 454 \begin{description}
430   -\item[Description:]{The user shall be able to reset their password without
  455 +\item[Description:]{The User shall be able to reset their password without
431 456 being logged in }
432 457  
433   -\item[Desired Outcome:]{The user's password shall be changed to one that
  458 +\item[Desired Outcome:]{The User's password shall be changed to one that
434 459 they remember}
435 460 \\
436 461  
437   -\item[User Goals:]{The user does not know their current password but wants
  462 +\item[User Goals:]{The User does not know their current password but wants
438 463 to log into the site}
439 464  
440 465 \item[Dependency Use Cases:]{[A1] User Registration}
441 466 \\
442 467  
443   -\item[Details:]{The user provides their email in a password reset form. If
  468 +\item[Details:]{The User provides their email in a password reset form. If
444 469 the address is valid, the site sends a password reset link with a random
445 470 token to that address. If the address is invalid, the site does not send
446 471 a link. For security reasons, we do not reveal to the user whether the
447 472  
448 473  
449 474  
450 475  
451 476  
452 477  
453 478  
454 479  
455 480  
456 481  
457 482  
458 483  
459 484  
460 485  
461 486  
... ... @@ -451,65 +476,54 @@
451 476  
452 477 \item[Priority Level:]{``Must''}
453 478  
454   -\item[Status:]{Not Implemented}
455   -
456 479 \item[Preconditions:]
457 480 \begin{itemize}
458 481 \itemsep1pt\parskip0pt\parsep0pt
459 482 \item
460   - {The user has created an account before}
461   -\item
462   - {The user knows the email address attached to their account}
  483 + {UserX has created an account with testuserx@flashy.cards.}
463 484 \end{itemize}
464 485  
465 486 \item[Postconditions:]
466 487 \begin{itemize}
467 488 \itemsep1pt\parskip0pt\parsep0pt
468 489 \item
469   - {The user's password is changed}
  490 + {UserX's password is changed.}
470 491 \item
471   - {The user can log in with the new password}
  492 + {UserX can log in with the new password.}
472 493 \end{itemize}
473 494  
474 495 \item[Trigger]{UserX forgot their password and wants to access the site.}
475 496  
476   -\item[Workflow:][Requesting password reset]
  497 +\item[Workflow:]
477 498  
478 499 \begin{enumerate}
479 500 \itemsep1pt\parskip0pt\parsep0pt
480 501 \item
481   - {UserX shall click the ``Forgot Password'' button.}
  502 + {UserX shall click the ``Forgot Password'' hyperlink.}
482 503 \item
483   - {The System shall prompt the user for their current email}
  504 + {The System shall prompt the user for their current email.}
484 505 \item
485   - {UserX shall submit their email ``testuser@flahy.cards''.}
  506 + {UserX shall submit their email ``testuserx@flashy.cards''.}
486 507 \item
487   - {The System shall check if an account exists with the email entered by
488   - UserX.}
489   -\end{enumerate}
490   -
491   -\item[Workflow:]
492   -\begin{enumerate}
493   -\setcounter{enumi}{4}
494   -\itemsep1pt\parskip0pt\parsep0pt
  508 + {The System shall check if an account exists with the email entered by UserX.}
495 509 \item
496   - {The System shall create a new password reset token for the user}
  510 + {The System shall create a new password reset token for UserX.}
497 511 \item
498   - {The System shall send an email to the user with a link containing the token and the
499   - user's ID}
  512 + {The System shall send an email to UserX with a link containing the token and the
  513 + user's ID.}
500 514 \item
501   - {UserX shall click the link in the email and visit
502   - /app/password\_reset}
  515 + {UserX shall click the link in the email to visit /app/password\_reset.}
503 516 \item
504   - {The System shall render a form that will prompt the user for a new
505   - password}
  517 + {The System shall render a form that will prompt the user for a new password.}
506 518 \item
507   - {UserX shall provide a new password ``newPassword'' in the form}
  519 + {UserX shall provide a new password in the form.}
508 520 \item
509   - {The System shall change the password associated with the user's email. }
  521 + {The System shall change the password associated with the user's email.}
510 522 \end{enumerate}
511 523  
512 524 \item[Expected Result:] {UserX's password will change to ``newPasword''.}
  525 +
  526 +\item[Alternate Workflow:]
513 527 \begin{enumerate}
514 528 \setcounter{enumi}{4}
515 529 \itemsep1pt\parskip0pt\parsep0pt
516 530  
... ... @@ -523,12 +537,10 @@
523 537  
524 538 {}
525 539  
526   -\subsection{[A7] Limit Student Access to Courses - Planned}
  540 +\subsection{[A7] Student Prevented From Accessing A Restricted Course}
527 541  
528 542 \begin{description}
529   -\item[Description:]{The instructor shall be able to limit access to the
530   -courses that he is in charge of by whitelisting only those students that
531   -are actually in the class.}
  543 +\item[Description:]{The User shall not be able to access a restricted course.}
532 544  
533 545 \item[Desired Outcome:]{The class will have limited access and only those
534 546 users who are whitelisted may enroll in the class.}
535 547  
... ... @@ -542,13 +554,13 @@
542 554  
543 555 \item[Priority Level:]{``Should''}
544 556  
545   -\item[Status:]{Not Implemented}
  557 +\item[Status:]{Implemented}
546 558  
547 559 \item[Preconditions:]
548 560 \begin{itemize}
549 561 \itemsep1pt\parskip0pt\parsep0pt
550 562 \item
551   - {User has valid instructor's account}
  563 + {UserX has valid instructor's account}
552 564 \end{itemize}
553 565  
554 566 \item[Postconditions:]
555 567  
556 568  
557 569  
558 570  
... ... @@ -592,24 +604,24 @@
592 604 \subsection{[A8] User Logout}
593 605  
594 606 \begin{description}
595   -\item[Description:]{The user shall be able to log out of his/her account on
  607 +\item[Description:]{The User shall be able to log out of his/her account on
596 608 the site.}
597 609  
598   -\item[Desired Outcome:]{The user's information and data will no longer be
  610 +\item[Desired Outcome:]{The User's information and data will no longer be
599 611 accessible after logging out. }
600 612  
601   -\item[User Goals:]{The user is done with his/her session of using the
  613 +\item[User Goals:]{The User is done with his/her session of using the
602 614 website, and wants to make sure others cannot access the data in his/her
603 615 account.}
604 616  
605   -\item[Dependency Use Cases:] None
  617 +\item[Dependency Use Cases:] {[A1] User Registration, [A2] User Login}
606 618 \\
607 619  
608 620 \item[Priority Level:]{``Must''}
609 621  
610 622 \item[Status:]{Implemented}
611 623  
612   -\item[Preconditions:]{The user is logged into their account}
  624 +\item[Preconditions:]{The user is logged into their account.}
613 625  
614 626 \item[Postconditions:]{The user's data can no longer be accessed.}
615 627  
616 628  
617 629  
618 630  
... ... @@ -636,19 +648,19 @@
636 648 \subsection{[A9] Contact Admin}
637 649  
638 650 \begin{description}
639   -\item[Description]{The user shall be able to contact the admin.}
  651 +\item[Description]{The User shall be able to contact the admin.}
640 652  
641   -\item[Desired Outcome]{The user shall send a message to the admin; the
  653 +\item[Desired Outcome]{The User shall send a message to the admin; the
642 654 admin shall receive the message.}
643 655  
644   -\item[User Goals:]{The user sends a message to the admin.}
  656 +\item[User Goals:]{The User sends a message to the admin.}
645 657  
646 658 \item[Dependency Use Cases]{None}
647 659 \\
648 660  
649 661 \item[Priority Level]{``Must''}
650 662  
651   -\item[Status]{Not Implemented}
  663 +\item[Status]{Not Implemented and Deferred}
652 664  
653 665 \item[Pre-conditions]{None.}
654 666  
655 667  
656 668  
657 669  
658 670  
... ... @@ -675,26 +687,24 @@
675 687 \item[Description]{This test case outlines the presentation layering step process of a user configuring notification settings.}
676 688  
677 689 \item[Desired Outcome]{The User shall only receive notifications at the
678   -times that were specified}
  690 +times that were specified.}
679 691 \\
680 692  
681 693 \item[User Goals]{The User shall not be bothered needlessly or at
682   -inconvenient times}
  694 +inconvenient times.}
683 695  
684   -\item[Primary Actor]{User (student)}
685   -
686 696 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login}
687 697 \\
688 698  
689 699 \item[Priority Level]{``Must''}
690 700  
691   -\item[Status]{In progress}
  701 +\item[Status]{Implemented}
692 702  
693 703 \item[Preconditions:]
694 704 \begin{itemize}
695 705 \itemsep1pt\parskip0pt\parsep0pt
696 706 \item
697   - {The User has registered with the email testuser@flashy.cards. }
  707 + {The User has registered with the email testuser@flashy.cards.}
698 708 \item
699 709 {The user has verified their email address.}
700 710 \item {The User is logged in with the above email.}
701 711  
702 712  
... ... @@ -736,11 +746,15 @@
736 746 \subsection{[F1] Push Flashcard}
737 747  
738 748 \begin{description}
739   -\item[Description:]{ This Test Case outlines the presentation layer step process of a User contributing a flashcard to the Live Feed and to their deck. }
  749 +\item[Description:]{This test case outlines the presentation layer step
  750 +process of a User contributing a flashcard to the live feed and to their deck.}
740 751  
741   -\item[Desired Outcome:]{The user shall have the flashcard added to their own deck and the Live Feed.}
  752 +\item[Desired Outcome:]{The User shall have the flashcard added to their own deck
  753 +and the live feed.}
  754 +\\
742 755  
743   -\item[User Goals:]{The user will see their flashcard in their deck and the flashcard will be shared with others.}
  756 +\item[User Goals:]{The User will see their flashcard in their deck and the
  757 +flashcard will be shared with others.}
744 758  
745 759 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class}
746 760 \\
747 761  
748 762  
749 763  
... ... @@ -753,16 +767,13 @@
753 767 \begin{itemize}
754 768 \itemsep1pt\parskip0pt\parsep0pt
755 769 \item
756   - {UserX has registered with the email testuser@flashy.cards and password ``test''. }
  770 + {The User is logged as UserX.}
757 771 \item
758   -{UserY has registered with the email TEST1@flashy.cards and password ``test''. }
  772 +{The User is logged in a different browser session as UserY.}
759 773 \item
760   - {UserX and UserY have verified their email addresses.}
761   -\item {UserX and UserY are logged in with their respective emails.}
762   -\item
763 774 {UserX and UserY have added the class TEST 1.}
764 775 \item
765   - {UserX and UserY are on the Live Feed for TEST 1.}
  776 + {UserX and UserY are on the live feed for TEST 1.}
766 777 \end{itemize}
767 778  
768 779 \item[Postconditions:]
769 780  
... ... @@ -776,12 +787,13 @@
776 787 {UserY and other users can add this flashcard to their decks.}
777 788 \end{itemize}
778 789  
779   -\item[Trigger:]{UserX wants to make a flashcard.}
  790 +\item[Trigger:]{UserX wants to contribute a flashcard to the TEST 1.}
780 791  
781 792 \item[Workflow:]
782 793 \begin{enumerate}
783 794 \itemsep1pt\parskip0pt\parsep0pt
784   -\item {UserX has clicked the circular plus button (``Create Card'' button) in the lower right corner of the Live Feed.}
  795 +\item {UserX has clicked the circular plus button (``Compose'' button) in
  796 +the lower right corner of the live feed.}
785 797 \item
786 798 {The System shall present a modal with a text box.}
787 799 \item
788 800  
789 801  
790 802  
... ... @@ -795,19 +807,16 @@
795 807 \item
796 808 {The System shall hide the modal from UserX.}
797 809 \item
798   - {The flashcard shall be included in the UserX's deck.(c.f. Note 2 for procedure.}
  810 + {The flashcard shall be included in the UserX's deck.(c.f. Note about simultaneous browser session).}
799 811 \end{enumerate}
800 812  
801   -\item[Expected Result:] {UserX will have the new flashcard in their deck, and the new flashcard will show up on the live feed of class TEST 1.}
  813 +\item[Expected Result:] {UserX will have the new flashcard in their deck. For UserX, the new flashcard will have a checkmark, indicating that the card is in their deck and a pencil picture on top right to indicate UserX as the author of the flashcard. The new flashcard will show up on UserY's live feed on class TEST 1 without checkmark and pencil mark.}
802 814  
803 815 \item[Alternative Workflow:]
804 816 \begin{enumerate}
  817 +\setcounter{enumi}{3}
805 818 \itemsep1pt\parskip0pt\parsep0pt
806 819 \item
807   - {The System shall present a modal with a text box.}
808   -\item
809   - {UserX shall select the input field of the modal and type ``The rain in Spain stays mainly in the plain''.}
810   -\item
811 820 {UserX shall user their cursor to select the word Spain in the text box, then click the ``Blank Word'' button.}
812 821 \item
813 822 {The System shall bold the word Spain.}
814 823  
815 824  
816 825  
... ... @@ -816,15 +825,48 @@
816 825 \item
817 826 {The System shall bold the word plain.}
818 827 \item
819   - {UserX shall click the ``Contribute'' button in the dialog.}
  828 + {UserX shall click the ``Contribute'' button in the modal.}
820 829 \item
821 830 {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 1.}
822 831 \item
823   - {UserY shall view the Live Feed and within a minute see the new flashcard appear with ``Spain'' and ``plain'' bolded.}
  832 + {UserY shall view the live feed and within a minute see the new flashcard appear with ``Spain'' and ``plain'' bolded.}
824 833 \end{enumerate}
825 834  
826   -\item[Expected Result:] {UserX will have the new flashcard with the words ``Spain'' and ``plain'' bolded and the new flashcard will appear visible to UserX and UserY on the Live Feed of the class TEST 1.}
  835 +\item[Expected Result:] {
  836 +UserX will have the new flashcard with the words ``Spain'' and ``plain'' bolded in their deck.
  837 +For UserX, the new flashcard will have a checkmark,
  838 +indicating that the card is in their deck and a pencil picture on
  839 +top right to indicate UserX as the author of the flashcard.
  840 +The new flashcard will show up on UserY's live feed on class TEST 1
  841 +without checkmark and pencil mark.
  842 +}
827 843  
  844 +\item[Alternative Workflow:]
  845 +\begin{enumerate}
  846 +\setcounter{enumi}{2}
  847 +\itemsep1pt\parskip0pt\parsep0pt
  848 +\item
  849 + {UserX shall select the input field of the modal and type five blank spaces.}
  850 +\item
  851 + {UserX shall click the ``Contribute'' button in the dialog.}
  852 +\end{enumerate}
  853 +
  854 +\item[Expected Result:]
  855 +{ Blank flashcard will not be added to UserX's deck or to the live feed of TEST 1. }
  856 +
  857 +\item[Alternative Workflow:]
  858 +\begin{enumerate}
  859 +\setcounter{enumi}{2}
  860 +\itemsep1pt\parskip0pt\parsep0pt
  861 +\item
  862 + {UserX shall select the input field and type ``Test''.}
  863 +\item
  864 + {UserX shall click the ``Contribute'' button in the dialog.}
  865 +\end{enumerate}
  866 +
  867 +\item[Expected Result:]
  868 +{ Flashcard with input not meeting the length restriction will not be added to UserX's deck or to the live feed of TEST 1. }
  869 +
828 870 \end{description}
829 871 \newpage
830 872  
... ... @@ -838,7 +880,8 @@
838 880 \item[Desired Outcome:]{Flashcard is edited and saved appropriately}
839 881 \\
840 882  
841   -\item[User Goals:]{To be able to change the text, the blanked words, and the study date on a flashcard.}
  883 +\item[User Goals:]{The User shall be able to change the text, the blanked
  884 +words, and the study date on a flashcard.}
842 885  
843 886 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
844 887 Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull Flashcard}
845 888  
846 889  
847 890  
... ... @@ -848,18 +891,14 @@
848 891 \item[Status:]{Implemented}
849 892  
850 893 \item[Preconditions:]
851   -
852 894 \begin{itemize}
853 895 \itemsep1pt\parskip0pt\parsep0pt
854 896 \item
855   - {The User has registered with the email testuser@flashy.cards. }
  897 + {UserX is logged in}
856 898 \item
857   - {The user has verified their email address.}
858   -\item {The User is logged in with the above email.}
  899 + {User has added the class TEST EDIT.}
859 900 \item
860   - {The User has added the class TEST EDIT}
861   -\item
862   - {The User is their deck for TEST EDIT.}
  901 + {UserX has the flashcard \textbf{Change} me in their flashcard.}
863 902 \end{itemize}
864 903  
865 904 \item[Postconditions:]
866 905  
867 906  
... ... @@ -942,17 +981,17 @@
942 981 process of a user pulling a flashcard.}
943 982  
944 983 \item[Desired Outcome:]{The User shall have the flashcard added to their own
945   -deck }
  984 +deck.}
946 985 \\
947 986  
948   -\item[User Goals:]{The user will be able to review that flashcard. }
  987 +\item[User Goals:]{The User will be able to review that flashcard.}
949 988  
950 989 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
951 990 Login, [A3] Add a Class, [F1] Push Flashard}
952 991  
953 992 \item[Priority Level:]{``Must'' }
954 993  
955   -\item[Status:]{Not Implemented}
  994 +\item[Status:]{Implemented}
956 995  
957 996 \item[Preconditions:]
958 997 \begin{itemize}
959 998  
960 999  
961 1000  
... ... @@ -1008,17 +1047,18 @@
1008 1047 process of a user flagging a card they have deemed inappropriate.}
1009 1048  
1010 1049 \item[Desired Outcome:]{The flashcard's inappropriateness variable is
1011   -adjusted}
  1050 +adjusted.}
1012 1051 \\
  1052 +
1013 1053 \item[User Goals:]{To note if a card should not belong in the class and
1014   -should not be displayed in the feed}
  1054 +should not be displayed in the feed.}
1015 1055  
1016 1056 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
1017 1057 Login, [A3] Add a Class, [F1] Push Flashcard}
1018 1058  
1019 1059 \item[Priority Level:]{``Should''}
1020 1060  
1021   -\item[Status:]{Not Implemented}
  1061 +\item[Status:]{Implemented}
1022 1062  
1023 1063 \item[Preconditions:]
1024 1064 \begin{itemize}
... ... @@ -1048,8 +1088,8 @@
1048 1088 \begin{enumerate}
1049 1089 \itemsep1pt\parskip0pt\parsep0pt
1050 1090 \item
1051   - {UserX shall choose the flashcard with the text ``TESTY FLASHY'' from the feed and hover their cursor
1052   -over it.}
  1091 + {UserX shall choose the flashcard with the text ``TESTY FLASHY'' from the
  1092 +feed and hover their cursor over it.}
1053 1093 \item
1054 1094 {The System shall present buttons on mouseover.}
1055 1095 \item
... ... @@ -1059,7 +1099,7 @@
1059 1099 feed for the User.}
1060 1100 \end{enumerate}
1061 1101  
1062   -\item[Expected Result:] {The flashycard with the text ``TESTY FLASHY'' will be flagged for inappropriateness.}
  1102 +\item[Expected Result:] {The flashcard with the text ``TESTY FLASHY'' will be flagged for inappropriateness.}
1063 1103 \end{description}
1064 1104 \newpage
1065 1105  
1066 1106  
1067 1107  
... ... @@ -1068,13 +1108,13 @@
1068 1108 \subsection{[F5] Filter Flashcards}
1069 1109  
1070 1110 \begin{description}
1071   -\item[Description:]{This test case outlines the presentation layering step
1072   -process of a user filtering existing flashcards to view only a specified subset.}
  1111 +\item[Description:]{This Test Case outlines the presentation layer process
  1112 +of a user filtering existing flashcards to view only a specified subset.}
1073 1113  
1074   -\item[Desired Outcome:]{The user shall see flashcards based on the filter
1075   -options}
  1114 +\item[Desired Outcome:]{The User shall see flashcards based on the filter
  1115 +options.}
1076 1116  
1077   -\item[User Goals:]{The user can find what he/she is specifically looking
  1117 +\item[User Goals:]{The User can find what he/she is specifically looking
1078 1118 for}
1079 1119  
1080 1120 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
... ... @@ -1083,7 +1123,7 @@
1083 1123  
1084 1124 \item[Priority Level:]{``Should''}
1085 1125  
1086   -\item[Status:]{Not Implemented}
  1126 +\item[Status:]{Not Implemented and Deferred}
1087 1127  
1088 1128 \item[Preconditions:]
1089 1129 \begin{itemize}
1090 1130  
1091 1131  
1092 1132  
1093 1133  
1094 1134  
1095 1135  
1096 1136  
1097 1137  
1098 1138  
1099 1139  
1100 1140  
1101 1141  
1102 1142  
1103 1143  
1104 1144  
1105 1145  
1106 1146  
1107 1147  
... ... @@ -1125,82 +1165,76 @@
1125 1165 \subsection{[F6] Blank Out Words in Flashcard}
1126 1166  
1127 1167 \begin{description}
1128   -\item[Description:]{The User shall be able to blank out keywords in any
1129   -flashcard in his deck.}
  1168 +\item[Description:]{This Test Case outlines the presentation layer process
  1169 +of the User to create keywords in a card they are pushing.}
1130 1170  
1131   -\item[Desired Outcome:]{The blanked out words in the flashcard notify the
1132   -System that they are keywords.}
  1171 +\item[Desired Outcome:]{The blanked out words (visually bolded) in the
  1172 +flashcard notify the System that they are keywords.}
  1173 +\\
1133 1174  
1134 1175 \item[User Goals:]{The User shall mark some words as keywords so the System
1135   -may later quiz theirself by blanking out the keywords and having the
1136   -User guess what they are.}
  1176 +may later quiz the User by blanking out one keyword at a time and having the
  1177 +User enter what they think the keyword is.}
1137 1178  
1138 1179 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
1139 1180 Login, [A3] Add a Class, [F1] Push Flashcard}
1140 1181  
  1182 +\item[Priority Level:]{``Must''}
  1183 +
  1184 +\item[Status:]{Implemented}
  1185 +
1141 1186 \item[Preconditions:]
1142 1187 \begin{itemize}
1143 1188 \itemsep1pt\parskip0pt\parsep0pt
1144 1189 \item
1145   - {The User has registered with the email testuser@flashy.cards.}
1146 1190 \item
1147   - {The User has verified their email address.}
  1191 + {The User is logged in as UserX.}
1148 1192 \item
1149   - {The User is logged in with the above email.}
  1193 + {The User has added the class ``TEST 1''.}
1150 1194 \item
1151   - {The User has enrolled in the class TEST 1.}
1152   -\item
1153   - {The User is at the Deck View for the class ``TEST 1''.}
1154   -\item
1155   - {The User has created and added a flashcard to their deck with text
1156   - ``The rain in Spain stays mainly in the plain''.}
  1195 + {The User is at the Feed View for the class ``TEST 1''.}
1157 1196 \end{itemize}
1158 1197  
1159 1198 \item[Postconditions:]
1160 1199 \begin{itemize}
1161 1200 \itemsep1pt\parskip0pt\parsep0pt
1162 1201 \item
1163   - {The blanked out words in the flashcard are marked}
  1202 + {The blanked out words (keyword) ``Spain'' in the flashcard are marked with underline}
1164 1203 \end{itemize}
1165 1204  
1166   -\item[Workflow:]
1167   -\begin{enumerate}
  1205 +
  1206 +\item[Trigger:]
  1207 +
  1208 +\begin{itemize}
1168 1209 \itemsep1pt\parskip0pt\parsep0pt
1169 1210 \item
1170   - {UserX shall click on the edit button on the flashcard in their deck.}
1171   -\item
1172   - {The System shall bring up the edit flashcard modal.}
1173   -\item
1174   - {UserX shall select the input field bold ``Spain'' highlighting it and
1175   - pressing the blank out button.}
1176   -\item
1177   - {UserX shall click on `Save' or the equivalent button to save the
1178   - changes.}
1179   -\item
1180   - {The System will save the blanked out word in the Flashcard Mask.}
1181   -\end{enumerate}
  1211 + {The User wants their newly pushed card to have the keyword ``Spain''.}
  1212 +\end{itemize}
1182 1213  
1183   -\item[Expected Result:] {The System shall show ``Spain'' marked in the flashcard.}
1184 1214  
1185   -\item[Alternative Workflow:]
  1215 +\item[Workflow:]
  1216 +
1186 1217 \begin{enumerate}
1187 1218 \itemsep1pt\parskip0pt\parsep0pt
1188 1219 \item
1189   - {UserX shall click on the Feed View button.}
  1220 + {UserX shall click the Compose button (+ circle on bottom right) of Feed.}
1190 1221 \item
1191   - {The System shall switch the view to Feed.}
  1222 + {The System shall bring up the composition flashcard modal.}
1192 1223 \item
1193   - {UserX shall click the plus button to add a card.}
  1224 + {UserX shall type text ``The rain in Spain stays mainly in the plain''
  1225 + into the composition modal, replacing ``Write a flashcard''.}
1194 1226 \item
1195   - {The System shall bring up the flashcard modal.}
  1227 + {UserX shall highlight the word ``Spain''.}
  1228 +\item {UserX shall press Blank Selected Text button.}
  1229 +\item {UserX shall press Contribute button to push the flashcard.}
1196 1230 \item
1197   - {UserX shall select the input field bold ``Spain'' highlighting it and
1198   - pressing the blank out button.}
1199   -\item
1200   - {The System will save the blanked out word in the Flashcard Mask.}
  1231 + {The System will save the blanked out word in the Flashcard Mask of the
  1232 + newly pushed flashcard.}
  1233 +\item {The Feed shall display the new card with the keyword underlined.}
1201 1234 \end{enumerate}
1202 1235  
1203   -\item[Expected Result:]{The System shall show ``Spain'' marked in the flashcard.}
  1236 +\item[Expected Result:] {The System shall show ``Spain'' underlined and bolded
  1237 +in the flashcard. The flashcard is visible in the Feed and Deck of class TEST 1.}
1204 1238 \end{description}
1205 1239 \newpage
1206 1240  
1207 1241  
1208 1242  
1209 1243  
1210 1244  
1211 1245  
1212 1246  
1213 1247  
1214 1248  
1215 1249  
1216 1250  
1217 1251  
1218 1252  
1219 1253  
1220 1254  
1221 1255  
1222 1256  
1223 1257  
... ... @@ -1209,70 +1243,84 @@
1209 1243 \subsection{[F7] Fix Flashcard}
1210 1244  
1211 1245 \begin{description}
1212   -\item[Description:]{The User shall be able to alter a flashcard he/she made
1213   -originally and not have to make a new copy of it.}
  1246 +\item[Description:]{This Test Case outlines the presentation layer process
  1247 +for the User to alter (``fix'') a flashcard they made originally and not have
  1248 +to make a new copy of it. It is only a ``fix'' if no other users have the
  1249 +flashcard in their Decks AND the User is the author.}
1214 1250  
1215   -\item[Desired Outcome:]{The User shall alter one flashcard and that
1216   -alteration will be shown to all users of that flashcard}
  1251 +\item[Desired Outcome:]{The User shall change one of their flashcard's text
  1252 +and that alteration will be visible to all users in the Feed.}
1217 1253  
1218   -\item[User Goals:]{The user shall make the flashcard say something different
1219   -than it did originally.}
  1254 +\item[User Goals:]{The User shall make their own authored flashcard say
  1255 +something different than it did originally.}
1220 1256  
1221 1257 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
1222 1258 Login, [A3] Add a Class, [F1] Push Flashcard}
1223 1259  
  1260 +\item[Priority Level:]{``Must''}
  1261 +
  1262 +\item[Status:]{Implemented}
  1263 +
1224 1264 \item[Preconditions:]
1225 1265 \begin{itemize}
1226 1266 \itemsep1pt\parskip0pt\parsep0pt
1227 1267 \item
1228   - {The User has registered with the email testuser@flashy.cards.}
  1268 + {The User is logged in as UserX.}
  1269 +\item {The User is logged in a separate browser as UserY.}
1229 1270 \item
1230   - {The User has verified their email address.}
  1271 + {UserX and UserY has enrolled in the class ``TEST 1''.}
1231 1272 \item
1232   - {The User is logged in with the above email.}
  1273 + {UserX is at the Deck View for the class ``TEST 1''.}
  1274 +\item {UserY is at the Feed View for the class ``TEST 1''.}
1233 1275 \item
1234   - {The User has enrolled in the class TEST 1.}
1235   -\item
1236   - {The User is at the Deck View for the class ``TEST 1''.}
1237   -\item
1238   - {The User has created and added a flashcard to their deck with text
1239   - ``The rain in Spain stays mainly in the plain''.}
  1276 + {The User has contributed and pushed a flashcard to the TEST 1 Feed, which is
  1277 + also in their Deck with text
  1278 + ``My card is currently broken''; this flashcard is for fixing.}
1240 1279 \end{itemize}
1241 1280  
1242 1281 \item[Postconditions:]
1243 1282 \begin{itemize}
1244 1283 \itemsep1pt\parskip0pt\parsep0pt
1245 1284 \item
1246   - {The user shall see their alteration for that flashcard.}
1247   -\item
1248   - {Other users will be notified of the alteration.}
  1285 + {The authoring User shall see their alteration for that flashcard in their
  1286 + Feed and Deck for TEST 1.}
  1287 +\item {Other users shall see the fixed flashcard in the Feed for TEST 1 if they
  1288 +refresh the app.}
1249 1289 \end{itemize}
1250 1290  
  1291 +\item[Trigger:]
  1292 +
1251 1293 \item[Workflow:]
1252 1294 \begin{enumerate}
1253 1295 \itemsep1pt\parskip0pt\parsep0pt
1254 1296 \item
1255   - {UserX shall select the Flashcard they created.}
  1297 + {UserX shall hover the Flashcard they created with text ``My card is currently
  1298 + broken''.}
1256 1299 \item
1257   - {UserX shall select ``Info'' button on the flashcard.}
  1300 + {UserX shall select the bottom-left blue Edit Card pencil button on the flashcard.}
1258 1301 \item
1259   - {The System shall bring up the flashcard information modal.}
  1302 + {The System shall bring up the flashcard Edit modal.}
1260 1303 \item
1261   - {UserX shall select the ``Fix'' button.}
  1304 + {UserX shall highlight the text ``broken''.}
  1305 +\item {UserX shall change the highlighted word into ``fixed'' so that the text
  1306 +reads ``My card is currently fixed''.}
1262 1307 \item
1263   - {The System shall bring up the edit flashcard modal.}
  1308 + {UserX shall press the Save Changes button.}
1264 1309 \item
1265   - {UserX shall change the text to ``The rain in Spain stays mainly in Germany''.}
  1310 + {The System shall update the flashcard's text content.}
1266 1311 \item
1267   - {UserX shall select the ``Done'' button.}
1268   -\item
1269   - {The System shall update the flashcard's content.}
1270   -\item
1271   - {The System shall close the edit flashcard modal and the close the
1272   - flashcard information modal.}
  1312 + {The System shall close the edit flashcard modal.}
  1313 +\item {The Client shall show the flashcard in the UserX's TEXT 1 Deck with the
  1314 +fixed text.}
  1315 +
  1316 +\item {UserY refreshes the TEST 1 Feed view and sees the flashcard ``My card is
  1317 +currently fixed''.}
1273 1318 \end{enumerate}
1274 1319  
1275   -\item[Expected Results:]{The Client shall show the flashcard with new text:``The rain in Spain stays mainly in Germany''.}
  1320 +\item[Expected Results:]{The Client shall show the fixed flashcard
  1321 +in UserX's TEST 1 class Deck with the new text:``My card is currently fixed''.
  1322 +The Client shall show the fixed flashcard in UserY's TEST 1 Feed view as well,
  1323 +after page refresh.}
1276 1324 \end{description}
1277 1325 \newpage
1278 1326  
1279 1327  
1280 1328  
1281 1329  
1282 1330  
1283 1331  
1284 1332  
1285 1333  
1286 1334  
1287 1335  
1288 1336  
1289 1337  
... ... @@ -1281,49 +1329,85 @@
1281 1329 \subsection{[F8] Hide cards from feed}
1282 1330  
1283 1331 \begin{description}
1284   -\item[Description:]{The User shall be able to hide cards from feed}
  1332 +\item[Description:]{This Test Case outlines the presentation layer process
  1333 +for the User shall be able to hide cards from their own view, on
  1334 + the Feed and Deck.}
1285 1335  
1286   -\item[Desired Outcome:]{The card is no longer visible to the User}
  1336 +\item[Desired Outcome:]{The System marks the flashcard as hidden from the
  1337 + User so that the User cannot see the flashcard in the Feed or Deck.}
1287 1338 \\
1288 1339  
1289   -\item[User Goals:]{The card has been looked at and should be hidden to
1290   -reduce screen clutter}
  1340 +\item[User Goals:]{The flashcard is no longer visible to the User in the Feed or
  1341 + Deck views.}
1291 1342  
1292 1343 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
1293 1344 Login, [A3] Add a Class, [F1] Push Flashcard}
1294 1345  
  1346 +\item[Priority Level:]{``Should''}
  1347 +
  1348 +\item[Status:]{Implemented}
  1349 +
1295 1350 \item[Preconditions:]
1296 1351 \begin{itemize}
1297 1352 \itemsep1pt\parskip0pt\parsep0pt
1298 1353 \item
1299   - {The User has registered with the email testuser@flashy.cards.}
  1354 + {The User is logged in as UserX.}
1300 1355 \item
1301   - {The User has verified their email address.}
  1356 + {The User has enrolled in the class ``TEST 1''.}
1302 1357 \item
1303   - {The User is logged in with the above email.}
  1358 + {The User is at the Feed View or Deck View (alternate workflow)
  1359 + for the class ``TEST 1''.}
1304 1360 \item
1305   - {The User has enrolled in the class TEST 1.}
1306   -\item
1307   - {The User is at the Feed View for the class ``TEST 1''.}
1308   -\item
1309   - {The User has created and added a flashcard to their deck with text
  1361 + {The User has composed and contributed a flashcard to the Feed with text
1310 1362 ``The rain in Spain stays mainly in the plain''.}
1311 1363 \end{itemize}
1312 1364  
1313 1365 \item[Postconditions:]
1314 1366 \begin{itemize}
1315 1367 \itemsep1pt\parskip0pt\parsep0pt
1316   -\item{Flashcard is not viewable by user.}
  1368 +\item{Flashcard is not viewable by user in the Feed or Deck views in TEST 1.}
1317 1369 \end{itemize}
1318 1370  
1319 1371 \item[Workflow:]
1320 1372 \begin{enumerate}
1321 1373 \itemsep1pt\parskip0pt\parsep0pt
  1374 +\item {UserX has navigated to the Feed View of TEST 1.}
1322 1375 \item
1323   - {UserX selects the hide flashcard button on the flashcard they added.}
  1376 + {UserX hovers the flashcard they added with the text ``The rain in Spain stays
  1377 + mainly in the plain''.}
  1378 +
  1379 +\item {UserX presses Hide button, which is the red crossed-out eye.}
  1380 +
  1381 +\item {The System shall hide the card.}
  1382 +\item {The Client shall remove the card from view for UserX.}
  1383 +\item {A toast is shown on the client that allows the User to report the card.}
  1384 +\item {The card is not shown on the Feed or Deck.}
1324 1385 \end{enumerate}
1325 1386  
1326   -\item[Expected Result:]{The Client show the Feed without the flashcard.}
  1387 +\item[Expected Result:]{The Client shows the Feed without the flashcard of text
  1388 + ``The rain in Spain stays mainly in the plain''. A toast that allows UserX to
  1389 + report the card shows up temporarily.}
  1390 +
  1391 +\item[Alternate Workflow:]
  1392 +
  1393 +\begin{enumerate}
  1394 +\itemsep1pt\parskip0pt\parsep0pt
  1395 +\item {UserX has navigated to the Deck View of TEST 1.}
  1396 +\item
  1397 + {UserX hovers the flashcard they added with the text ``The rain in Spain stays
  1398 + mainly in the plain''.}
  1399 +
  1400 +\item {UserX presses hide button, which is the red crossed-out eye.}
  1401 +
  1402 +\item {The System shall hide the card.}
  1403 +\item {A toast is shown on the client that allows the User to report the card.}
  1404 +\item {The card is not shown on the Feed or Deck.}
  1405 +\end{enumerate}
  1406 +
  1407 +
  1408 +\item[Expected Result:]{The Client shows the Deck without the flashcard of text
  1409 + ``The rain in Spain stays mainly in the plain''. A toast that allows UserX to
  1410 + report the card shows up temporarily.}
1327 1411 \end{description}
1328 1412 \newpage
1329 1413  
1330 1414  
1331 1415  
1332 1416  
... ... @@ -1332,15 +1416,17 @@
1332 1416 \subsection{[F9] View a Feed}
1333 1417  
1334 1418 \begin{description}
1335   -\item[Description:]{This test case outlines the presentation layering step process of a user viewing a class feed.}
  1419 +\item[Description:]{This Test Case outlines the presentation layer process
  1420 + process of a user viewing a class feed of flashcards.}
1336 1421  
1337   -\item[Desired Outcome:]{The System shall show the user Live Feeds for
1338   -specific classes.}
  1422 +\item[Desired Outcome:]{The System shall show the user the Feed for their
  1423 + class.}
1339 1424 \\
1340 1425  
1341   -\item[User Goals:]{The User will see Live Feeds for the class User selected.}
  1426 +\item[User Goals:]{The User will see the Feed for the class User selected.}
1342 1427  
1343   -\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class}
  1428 +\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login,
  1429 + [A3] Add a Class}
1344 1430 \\
1345 1431  
1346 1432 \item[Priority Level:]{``Must''}
1347 1433  
1348 1434  
1349 1435  
1350 1436  
1351 1437  
1352 1438  
1353 1439  
... ... @@ -1350,34 +1436,31 @@
1350 1436 \item[Preconditions:]
1351 1437 \begin{itemize}
1352 1438 \itemsep1pt\parskip0pt\parsep0pt
1353   - {The User has registered with the email testuser@flashy.cards.}
  1439 + {The User is logged in as UserX.}
1354 1440 \item
1355   - {The user has verified their email address.}
1356   -\item {The User is logged in with the above email.}
1357   -\item
1358   - {The User has added the class TEST 1}
  1441 + {The User has added the class TEST 1.}
1359 1442 \end{itemize}
1360 1443  
1361   -\item[Postconditions:]
1362   -\begin{itemize}
  1444 +\item[Postconditions:]\begin{itemize}
1363 1445 \itemsep1pt\parskip0pt\parsep0pt
1364   -\item{User shall see the Live Feed for that class}
  1446 +\item {User shall see the Feed for the class TEST 1.}
1365 1447 \end{itemize}
1366 1448  
1367   -\item[Trigger:]{User wants to view Live Feed.}
  1449 +\item[Trigger:]{The User wants to view Feed of their class.}
1368 1450  
1369 1451 \item[Workflow:]
1370 1452 \begin{enumerate}
1371 1453 \itemsep1pt\parskip0pt\parsep0pt
1372 1454 \item
1373   - {UserX is at their dashboard.}
  1455 + {UserX is at any view on the application.}
  1456 +\item {UserX shall press the menu on the far left of the navigation bar.}
  1457 +\item {UserX shall select the class TEST 1 from the menu.}
1374 1458 \item
1375   - {UserX shall click on the downward arrow key located on the right of ``Flashy'' to select the class TEST 1.}
1376   -\item
1377   - {The System shall display the feed view to UserX.}
  1459 + {The System shall display the Feed view of TEST 1 to UserX.}
1378 1460 \end{enumerate}
1379 1461  
1380   -\item[Expected Result:]{UserX should be able to see the Live Feed for the selected class.}
  1462 +\item[Expected Result:]{UserX should be able to see the Feed view for the
  1463 + selected class TEST 1.}
1381 1464 \end{description}
1382 1465 \newpage
1383 1466  
... ... @@ -1448,7 +1531,6 @@
1448 1531 \item[Expected Result:] {The flashcard is removed from UserX's deck.}
1449 1532  
1450 1533 \item[Alternate Workflow:]
1451   -
1452 1534 \begin{enumerate}
1453 1535 \itemsep1pt\parskip0pt\parsep0pt
1454 1536 \item
... ... @@ -1491,7 +1573,6 @@
1491 1573 \item[Status:]{Implemented}
1492 1574  
1493 1575 \item[Preconditions:]
1494   -
1495 1576 \begin{itemize}
1496 1577 \itemsep1pt\parskip0pt\parsep0pt
1497 1578 \item
... ... @@ -1555,7 +1636,7 @@
1555 1636 \subsection{[R1] Study Deck}
1556 1637  
1557 1638 \begin{description}
1558   -\item[Description]{This Test Case outlines the presentation layering step process of a user studying a flashcard.}
  1639 +\item[Description]{This test case outlines the presentation layering step process of a user studying a flashcard.}
1559 1640  
1560 1641 \item[Desired Outcome]{The User shall be presented with individual
1561 1642 flashcards in an optimized order. Blanks will be empty and the user will
... ... @@ -1598,8 +1679,6 @@
1598 1679 {The User can choose whether their response is correct or not.}
1599 1680 \end{itemize}
1600 1681  
1601   -\item
1602   -
1603 1682 \item[Trigger:]{UserX wishes to study flashcards compiled for a specific class.}
1604 1683  
1605 1684 \item[Workflow:]
... ... @@ -1618,8 +1697,7 @@
1618 1697 \item
1619 1698 {UserX shall click ``Yes'' button. (Either YES or NO leads to the same behavior for the User)}
1620 1699 \item
1621   - {The Server saves the response and updates statistics about the
1622   - flashcard.}
  1700 + {The Server saves the response and updates statistics about the flashcard.}
1623 1701 \item
1624 1702 {Loop back to 2.}
1625 1703 \end{enumerate}
doc_screenshots/console_backend.png View file @ d83d230

10.4 KB

1   -This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014/Arch Linux) (preloaded format=pdflatex 2015.4.28) 25 MAY 2015 23:42
  1 +This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) (format=pdflatex 2015.5.6) 4 JUN 2015 01:18
2 2 entering extended mode
3 3 restricted \write18 enabled.
4 4 %&-line parsing enabled.
5 5  
... ... @@ -11,12 +11,12 @@
11 11  
12 12  
13 13 Here is how much of TeX's memory you used:
14   - 4 strings out of 493109
15   - 118 string characters out of 6140856
16   - 52967 words of memory out of 5000000
17   - 3570 multiletter control sequences out of 15000+600000
  14 + 4 strings out of 495028
  15 + 113 string characters out of 6181498
  16 + 45944 words of memory out of 5000000
  17 + 3315 multiletter control sequences out of 15000+600000
18 18 3640 words of font info for 14 fonts, out of 8000000 for 9000
19   - 1141 hyphenation exceptions out of 8191
  19 + 14 hyphenation exceptions out of 8191
20 20 0i,0n,0p,1b,6s stack positions out of 5000i,500n,10000p,200000b,80000s
21 21 ! ==> Fatal error occurred, no output PDF file produced!