Commit d83d230cf684b5da49cb065c552e2cfa3f1312b7
Exists in
master
Merge branch 'master' of git.ucsd.edu:110swag/docs
Showing 6 changed files Side-by-side Diff
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 |
Makefile
View file @
d83d230
... | ... | @@ -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
texput.log
View file @
d83d230
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! |