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