Commit 17a3102cde35991964c7d8dbeddadb1cf3a0504a

Authored by mjeng
Exists in master

Fixed merge stuffs

Showing 13 changed files Inline Diff

TestCases.tex View file @ 17a3102
\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. For UserX, the new flashcard will have a checkmark, indicating that the card is in their deck and a pencil picture on top right to indicate UserX as the author of the flashcard. The new flashcard will show up on UserY's live feed on class TEST 101 without checkmark and pencil mark.} 813 813 \item[Expected Result:] {UserX will have the new flashcard in their deck.
814 For UserX, the new flashcard will have a checkmark, indicating that the card
815 is in their deck and a pencil icon on top right to indicate UserX as
816 the author of the flashcard. The new flashcard will show up on UserY's
817 live feed on class TEST 101 without checkmark and pencil icon.}
814 818
\item[Alternative Workflow:] 815 819 \item[Alternative Workflow:]
\begin{enumerate} 816 820 \begin{enumerate}
\setcounter{enumi}{3} 817 821 \setcounter{enumi}{3}
\itemsep1pt\parskip0pt\parsep0pt 818 822 \itemsep1pt\parskip0pt\parsep0pt
\item 819 823 \item
{UserX shall user their cursor to select the word Spain in the text box, then click the ``Blank Word'' button.} 820 824 {UserX shall user their cursor to select the word Spain in the text box, then click the ``Blank Word'' button.}
\item 821 825 \item
{The System shall bold the word Spain.} 822 826 {The System shall bold the word Spain.}
\item 823 827 \item
{UserX shall use the cursor to select the word ``plain'' in the text box, then click the ``Blank Word'' button.} 824 828 {UserX shall use the cursor to select the word ``plain'' in the text box, then click the ``Blank Word'' button.}
\item 825 829 \item
{The System shall bold the word plain.} 826 830 {The System shall bold the word plain.}
\item 827 831 \item
{UserX shall click the ``Contribute'' button in the modal.} 828 832 {UserX shall click the ``Contribute'' button in the modal.}
\item 829 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 1.} 830 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 831 835 \item
{UserY shall view the live feed and within a minute see the new flashcard appear with ``Spain'' and ``plain'' bolded.} 832 836 {UserY shall view the live feed and within a minute see the new flashcard appear with ``Spain'' and ``plain'' bolded.}
\end{enumerate} 833 837 \end{enumerate}
834 838
\item[Expected Result:] { 835 839 \item[Expected Result:] {
UserX will have the new flashcard with the words ``Spain'' and ``plain'' bolded in their deck. 836 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, 837 841 For UserX, the new flashcard will have a checkmark,
indicating that the card is in their deck and a pencil icon on 838 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. 839 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 840 844 The new flashcard will show up on UserY's live feed on class TEST 101
without checkmark and pencil icon. 841 845 without checkmark and pencil icon.}
} 842
843 846
\item[Alternative Workflow:] 844 847 \item[Alternative Workflow:]
\begin{enumerate} 845 848 \begin{enumerate}
\setcounter{enumi}{2} 846 849 \setcounter{enumi}{2}
\itemsep1pt\parskip0pt\parsep0pt 847 850 \itemsep1pt\parskip0pt\parsep0pt
\item 848 851 \item
{UserX shall select the input field of the modal and type five blank spaces.} 849 852 {UserX shall select the input field of the modal and type five blank spaces.}
\item 850 853 \item
{UserX shall click the ``Contribute'' button in the dialog.} 851 854 {UserX shall click the ``Contribute'' button in the dialog.}
\end{enumerate} 852 855 \end{enumerate}
853 856
\item[Expected Result:] 854 857 \item[Expected Result:] {Blank flashcard will not be added to UserX's deck or to the live feed of TEST 101.}
{ Blank flashcard will not be added to UserX's deck or to the live feed of TEST 101.} 855
856 858
\item[Alternative Workflow:] 857 859 \item[Alternative Workflow:]
\begin{enumerate} 858 860 \begin{enumerate}
\setcounter{enumi}{2} 859 861 \setcounter{enumi}{2}
\itemsep1pt\parskip0pt\parsep0pt 860 862 \itemsep1pt\parskip0pt\parsep0pt
\item 861 863 \item
{UserX shall select the input field and type ``Test''.} 862 864 {UserX shall select the input field and type ``Test''.}
\item 863 865 \item
{UserX shall click the ``Contribute'' button in the dialog.} 864 866 {UserX shall click the ``Contribute'' button in the dialog.}
\end{enumerate} 865 867 \end{enumerate}
866 868
\item[Expected Result:] 867 869 \item[Expected Result:]
{ Flashcard with input not meeting the length restriction will not be added to 868 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.} 869 871 UserX's deck or to the live feed of TEST 101.}
870 872
\end{description} 871 873 \end{description}
\newpage 872 874 \newpage
873 875
{} 874 876 {}
875 877
\subsection{[F2] Edit Flashcard} 876 878 \subsection{[F2] Edit Flashcard}
877 879
\begin{description} 878 880 \begin{description}
\item[Description:]{This test case outlines the presentation layering step process of a user editting a flashcard.} 879 881 \item[Description:]{This test case outlines the presentation layering step process of a user editting a flashcard.}
880 882
\item[Desired Outcome:]{Flashcard is edited and saved appropriately} 881 883 \item[Desired Outcome:]{Flashcard is edited and saved appropriately}
\\ 882 884 \\
883 885
\item[User Goals:]{The User shall be able to change the text, the blanked 884 886 \item[User Goals:]{The User shall be able to change the text and the blanked words on a flashcard.}
words, and the study date on a flashcard.} 885
886 887
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 887 888 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull Flashcard} 888 889 Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull Flashcard}
889 890
\item[Priority Level:]{``Should''} 890 891 \item[Priority Level:]{``Should''}
891 892
\item[Status:]{Implemented} 892 893 \item[Status:]{Implemented}
893 894
\item[Preconditions:] 894 895 \item[Preconditions:]
\begin{itemize} 895 896 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 896 897 \itemsep1pt\parskip0pt\parsep0pt
\item 897 898 \item
{UserX is logged in} 898 899 {The User is logged in as UserX.}
\item 899 900 \item
901 {The User is logged in a different browser session as UserY.}
902 \item
{User has added the class TEST 101.} 900 903 {User has added the class TEST 101.}
\item 901 904 \item
{UserX has the flashcard \textbf{Change} me in their flashcard.} 902 905 {TEST 101 contains the flashcard ``This is made for \textbf{edit}''
906 , which was made by other user and is not in UserX's deck.}
907 \item
908 {UserX has the flashcard ``I have made an error'', which was created by UserX, in their deck.}
\end{itemize} 903 909 \end{itemize}
904 910
\item[Postconditions:] 905 911 \item[Postconditions:]
\begin{itemize} 906 912 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 907 913 \itemsep1pt\parskip0pt\parsep0pt
\item 908 914 \item
{Flashcard is edited} 909 915 {The selected flashcard is edited}
\end{itemize} 910 916 \end{itemize}
911 917
\item[Trigger:]{The User wants to edit their card.} 912 918 \item[Trigger:]{The User wants to edit a card.}
913 919
\item[Workflow:] 914 920 \item[Workflow:]
\begin{enumerate} 915 921 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 916 922 \itemsep1pt\parskip0pt\parsep0pt
\item 917 923 \item
{UserX shall move the cursor over the flashcard ``this is made for edit''.} 918 924 {UserX shall hover the cursor over the flashcard ``this is made for \textbf{edit}''.}
\item 919 925 \item
{UserX shall click the edit button on bottom left of the selected flashcard.} 920 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 921 927 \item
{The System shall present a modal that contains the text of the selected flashcard.} 922 928 {The System shall present a modal that contains the text of the selected flashcard.}
\item 923 929 \item
{UserX shall be able to change the text to ``Edit has been made''.} 924 930 {UserX shall be able to change the text to ``Edit has been made''.}
\item 925 931 \item
{UserX shall click 'Save'} 926 932 {UserX shall click 'Save'}
\item 927 933 \item
{The System shall hide the model from UserX.} 928 934 {The System shall hide the modal from UserX.}
\end{enumerate} 929 935 \end{enumerate}
930 936
\item[Expected Results:]{The selected flashcard's text shall be changed to ``Edit has been made''.} 931 937 \item[Expected Results:]{The selected flashcard's text shall be changed to ``Edit has been made''.}
932 938
\item[Alternative Workflow A:] 933 939 \item[Alternative Workflow A:]
934 940
\begin{enumerate} 935 941 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 936 942 \itemsep1pt\parskip0pt\parsep0pt
\item 937 943 \item
{UserX shall move the cursor over the flash card ``this is made for edit2''.} 938 944 {UserX shall move the cursor over the flash card ``this is made for edit2''.}
\item 939 945 \item
{UserX shall click the edit button on bottom left of the selected flashcard.} 940 946 {UserX shall click the edit button on bottom left of the selected flashcard.}
\item 941 947 \item
{The System shall present a modal that contains the text of the selected flashcard.} 942 948 {The System shall present a modal that contains the text of the selected flashcard.}
\item 943 949 \item
{UserX shall be able to change the bolded text from ``edit2'' to ``fun'' by highlighting the words and click blank words.} 944 950 {UserX shall be able to change the bolded text from ``edit2'' to ``fun'' by highlighting the words and click blank words.}
\item 945 951 \item
{UserX shall click 'Save'} 946 952 {UserX shall click 'Save'}
\item 947 953 \item
{The System shall hide the modal from UserX.} 948 954 {The System shall hide the modal from UserX.}
\item 949 955 \item
{The selected flashcard's blanked words shall be changed to ``fun''.} 950 956 {The selected flashcard's blanked words shall be changed to ``fun''.}
\end{enumerate} 951 957 \end{enumerate}
952 958
\item[Expected Result:]{The selected flashcard's blanked words shall be changed to ``fun''.} 953 959 \item[Expected Result:]{The selected flashcard's blanked words shall be changed to ``fun''.}
954 960
\item[Alternative Workflow B:] 955 961 \item[Alternative Workflow B:]
956 962
\begin{enumerate} 957 963 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 958 964 \itemsep1pt\parskip0pt\parsep0pt
\item 959 965 \item
{UserX shall move the cursor over the flash card ``this is made for edit3''.} 960 966 {UserX shall move the cursor over the flash card ``this is made for edit3''.}
\item 961 967 \item
{UserX shall click the edit button on bottom left of the selected flashcard.} 962 968 {UserX shall click the edit button on bottom left of the selected flashcard.}
\item 963 969 \item
{The System shall present a modal that contains the text of the selected flashcard.} 964 970 {The System shall present a modal that contains the text of the selected flashcard.}
\item 965 971 \item
{UserX shall be able the study date to 6/12.} 966 972 {UserX shall be able the study date to 6/12.}
\item 967 973 \item
{UserX shall click 'Save'} 968 974 {UserX shall click 'Save'}
\item 969 975 \item
{The System shall hide the modal from UserX.} 970 976 {The System shall hide the modal from UserX.}
\end{enumerate} 971 977 \end{enumerate}
972 978
\item[Expected Result:]{The selected flashcard's study date shall be changed to 6/12.} 973 979 \item[Expected Result:]{The selected flashcard's study date shall be changed to 6/12.}
\end{description} 974 980 \end{description}
\newpage 975 981 \newpage
976 982
{} 977 983 {}
978 984
\subsection{[F3] Pull Flashcard} 979 985 \subsection{[F3] Pull Flashcard}
\begin{description} 980 986 \begin{description}
\item[Description:]{This test case outlines the presentation layering step 981 987 \item[Description:]{This test case outlines the presentation layering step
process of a user pulling a flashcard.} 982 988 process of a user pulling a flashcard.}
983 989
\item[Desired Outcome:]{The User shall have the flashcard added to their own 984 990 \item[Desired Outcome:]{The User shall have the flashcard added to their deck.}
deck.} 985
\\ 986 991 \\
987 992
\item[User Goals:]{The User will be able to review that flashcard.} 988 993 \item[User Goals:]{The User will be able to review that flashcard.}
989 994
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 990 995 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
Login, [A3] Add a Class, [F1] Push Flashard} 991 996 Login, [A3] Add a Class, [F1] Push Flashard}
992 997
\item[Priority Level:]{``Must'' } 993 998 \item[Priority Level:]{``Must'' }
994 999
\item[Status:]{Implemented} 995 1000 \item[Status:]{Implemented}
996 1001
\item[Preconditions:] 997 1002 \item[Preconditions:]
\begin{itemize} 998 1003 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 999 1004 \itemsep1pt\parskip0pt\parsep0pt
\item 1000 1005 \item
1006 {The User is logged in as UserX.}
1007 \item
{User has registered for class TEST 101.} 1001 1008 {User has registered for class TEST 101.}
\item 1002 1009 \item
{User is at live feed for TEST 101.} 1003 1010 {User is at live feed for TEST 101.}
\item 1004 1011 \item
{Flashcard with text ``TESTY FLASHY'' has been created.} 1005 1012 {That flashcard with the text ``Pull me'' is in the Live Feed of class TEST 101.}
\item 1006
{That flashcard with the text ``TESTY FLASHY'' is in the Live Feed of class TEST 101.} 1007
\end{itemize} 1008 1013 \end{itemize}
1009 1014
\item[Postconditions:] 1010 1015 \item[Postconditions:]
\begin{itemize} 1011 1016 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1012 1017 \itemsep1pt\parskip0pt\parsep0pt
\item 1013 1018 \item
{User shall have that flashcard with the text ``TESTY FLASHY'' added to their deck} 1014 1019 {UserX shall have that flashcard with the text ``Pull me'' added to their deck}
\item 1015 1020 \item
{User can review this flashcard later} 1016 1021 {UserX shall be able to review this flashcard later}
\end{itemize} 1017 1022 \end{itemize}
1018 1023
\item[Trigger:]{UserX wants to add a flashcard to their deck to study it.} 1019 1024 \item[Trigger:]{UserX wants to add a flashcard to their deck to study it.}
1020 1025
\item[Workflow:] 1021 1026 \item[Workflow:]
1022 1027
\begin{enumerate} 1023 1028 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1024 1029 \itemsep1pt\parskip0pt\parsep0pt
\item 1025 1030 \item
{UserX shall choose the flashcard with the text ``TESTY FLASHY'' from the 1026 1031 {UserX shall choose the flashcard with the text ``Pull me'' from the
class TEST 101 feed and hover their cursor over it.} 1027 1032 class TEST 101 feed and hover their cursor over it.}
\item 1028 1033 \item
{The System shall present buttons on mouseover.} 1029 1034 {The System shall present buttons on mouseover.}
\item 1030 1035 \item
{UserX shall click on the large plus that appears over the flashcard with the text ``TESTY FLASHY''.} 1031 1036 {UserX shall click on the large plus that appears over the flashcard with the text ``Pull me''.}
\item 1032 1037 \item
{The System shall hide the flashcard with the text ``TESTY FLASHY'' from the class 1033 1038 {The System shall add the flashcard into UserX's deck.
TEST 101 feed for UserX.} 1034 1039 A checkmark shall appear on top right corner of the flashcard.}
\item 1035 1040 \item
{UserX shall check that card with the text ``TESTY FLASHY'' has been added to 1036 1041 {UserX shall click the ``Deck'' icon on the top left to enter their
their class TEST 101 deck by checking API.} 1037 1042 deck.}
1043 \item
1044 {UserX shall check that the card with the text ``Pull me'' has been added to their class
1045 TEST 101 deck.}
\end{enumerate} 1038 1046 \end{enumerate}
1039 1047
\item[Expected Result:] {The flashcard with the text ``TESTY FLASHY'' is in the class 1040 1048 \item[Expected Result:] {The flashcard with the text ``Pull me'' is in the class
TEST 101 deck.} 1041 1049 TEST 101 deck. If UserX hovers the cursor over the flashcard at the live feed of
1050 TEST 101, the original placement of the large plus button has been changed to large minus button.}
\end{description} 1042 1051 \end{description}
\newpage 1043 1052 \newpage
1044 1053
{} 1045 1054 {}
1046 1055
\subsection{[F4] Flag Inappropriate Cards} 1047 1056 \subsection{[F4] Flag Inappropriate Cards}
1048 1057
\begin{description} 1049 1058 \begin{description}
\item[Description:]{This test case outlines the presentation layering step 1050 1059 \item[Description:]{This test case outlines the presentation layering step
process of a user flagging a card they have deemed inappropriate.} 1051 1060 process of a user flagging a card they have deemed inappropriate.}
1052 1061
\item[Desired Outcome:]{The flashcard's inappropriateness variable is 1053 1062 \item[Desired Outcome:]{The flashcard's inappropriateness variable is
adjusted.} 1054 1063 adjusted.}
\\ 1055 1064 \\
1056 1065
\item[User Goals:]{To note if a card should not belong in the class and 1057 1066 \item[User Goals:]{To note if a card should not belong in the class and
should not be displayed in the feed.} 1058 1067 should not be displayed in the feed.}
1059 1068
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1060 1069 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
Login, [A3] Add a Class, [F1] Push Flashcard} 1061 1070 Login, [A3] Add a Class, [F1] Push Flashcard}
1062 1071
\item[Priority Level:]{``Should''} 1063 1072 \item[Priority Level:]{``Should''}
1064 1073
\item[Status:]{Implemented} 1065 1074 \item[Status:]{Implemented}
1066 1075
\item[Preconditions:] 1067 1076 \item[Preconditions:]
\begin{itemize} 1068 1077 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1069 1078 \itemsep1pt\parskip0pt\parsep0pt
\item 1070 1079 \item
{UserX has registered for a class TEST 101.} 1071 1080 {UserX has registered for a class TEST 101.}
\item 1072 1081 \item
{UserX is in the live feed for class TEST 101.} 1073 1082 {UserX is in the live feed for class TEST 101.}
\item 1074 1083 \item
{Flashcard with text ``TESTY FLASHY'' has been created for TEST 101.} 1075 1084 {Flashcard with text ``TESTY FLASHY'' has been created for TEST 101.}
\item 1076 1085 \item
{That flashcard ``TESTY FLASHY'' is in the Live Feed for TEST 101.} 1077 1086 {That flashcard ``TESTY FLASHY'' is in the Live Feed for TEST 101.}
\end{itemize} 1078 1087 \end{itemize}
1079 1088
\item[Postconditions:] 1080 1089 \item[Postconditions:]
\begin{itemize} 1081 1090 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1082 1091 \itemsep1pt\parskip0pt\parsep0pt
\item 1083 1092 \item
{User shall have that flashcard added to their deck} 1084 1093 {User shall have that flashcard added to their deck}
\item 1085 1094 \item
{User can review this flashcard later} 1086 1095 {User can review this flashcard later}
\end{itemize} 1087 1096 \end{itemize}
1088 1097
\item[Trigger:]{UserX wants to mark a card innapropriate.} 1089 1098 \item[Trigger:]{UserX wants to mark a card innapropriate.}
1090 1099
\item[Workflow:] 1091 1100 \item[Workflow:]
\begin{enumerate} 1092 1101 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1093 1102 \itemsep1pt\parskip0pt\parsep0pt
\item 1094 1103 \item
{UserX shall choose the flashcard with the text ``TESTY FLASHY'' from the 1095 1104 {UserX shall choose the flashcard with the text ``TESTY FLASHY'' from the
feed and hover their cursor over it.} 1096 1105 feed and hover their cursor over it.}
\item 1097 1106 \item
{The System shall present buttons on mouseover.} 1098 1107 {The System shall present buttons on mouseover.}
\item 1099 1108 \item
{UserX shall click on the crossed out eye icon (Hide) that appears on the card.} 1100 1109 {UserX shall click on the crossed out eye icon (Hide) that appears on the card.}
\item 1101 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''.} 1102 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 1103 1112 \item
{UserX shall click the REPORT.} 1104 1113 {UserX shall click the REPORT.}
\end{enumerate} 1105 1114 \end{enumerate}
1106 1115
\item[Expected Result:] {The System shall display a toast, ``Report successful: thanks for letting us know!''} 1107 1116 \item[Expected Result:] {The System shall display a toast, ``Report successful: thanks for letting us know!''}
\end{description} 1108 1117 \end{description}
\newpage 1109 1118 \newpage
1110 1119
{} 1111 1120 {}
1112 1121
\subsection{[F5] Filter Flashcards} 1113 1122 \subsection{[F5] Filter Flashcards}
1114 1123
\begin{description} 1115 1124 \begin{description}
\item[Description:]{This test case outlines the presentation layer process 1116 1125 \item[Description:]{This test case outlines the presentation layer process
of a user filtering existing flashcards to view only a specified subset.} 1117 1126 of a user filtering existing flashcards to view only a specified subset.}
1118 1127
\item[Desired Outcome:]{The User shall see flashcards based on the filter 1119 1128 \item[Desired Outcome:]{The User shall see flashcards based on the filter
options.} 1120 1129 options.}
1121 1130
\item[User Goals:]{The User can find what they are specifically looking 1122 1131 \item[User Goals:]{The User can find what they are specifically looking
for} 1123 1132 for}
1124 1133
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1125 1134 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull 1126 1135 Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull
Flashcard} 1127 1136 Flashcard}
1128 1137
\item[Priority Level:]{``Should''} 1129 1138 \item[Priority Level:]{``Should''}
1130 1139
\item[Status:]{Implemented} 1131 1140 \item[Status:]{Implemented}
1132 1141
\item[Preconditions:] 1133 1142 \item[Preconditions:]
\begin{itemize} 1134 1143 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1135 1144 \itemsep1pt\parskip0pt\parsep0pt
\item 1136 1145 \item
{User is logged in as UserX.} 1137 1146 {User is logged in as UserX.}
\item 1138 1147 \item
{UserX has registered for the class TEST 101.} 1139 1148 {UserX has registered for the class TEST 101.}
\item 1140 1149 \item
{There exist flashcards in TEST 101 with the text ``apple'' and ``banana'' 1141 1150 {There exist flashcards in TEST 101 with the text ``apple'' and ``banana''
for each week in the quarter.} 1142 1151 for each week in the quarter.}
\item 1143 1152 \item
{There exist flashcards in TEST 101 with the text ``orange'' that are hidden 1144 1153 {There exist flashcards in TEST 101 with the text ``orange'' that are hidden
for each week in the quarter.} 1145 1154 for each week in the quarter.}
\item 1146 1155 \item
{UserX is at Card List View for the class.} 1147 1156 {UserX is at Card List View for the class.}
\end{itemize} 1148 1157 \end{itemize}
1149 1158
\item[Postconditions:] 1150 1159 \item[Postconditions:]
\begin{itemize} 1151 1160 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1152 1161 \itemsep1pt\parskip0pt\parsep0pt
\item 1153 1162 \item
{User only sees flashcards pertaining to selected dates.} 1154 1163 {User only sees flashcards pertaining to selected dates.}
\end{itemize} 1155 1164 \end{itemize}
1156 1165
\item[Trigger:]{User is looking for specific flashcards.} 1157 1166 \item[Trigger:]{User is looking for specific flashcards.}
1158 1167
\item[Workflow:] 1159 1168 \item[Workflow:]
\begin{enumerate} 1160 1169 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1161 1170 \itemsep1pt\parskip0pt\parsep0pt
\item 1162 1171 \item
{UserX shall deselect ``Week Nine'' from top.} 1163 1172 {UserX shall deselect ``Week Nine'' from top.}
\item 1164 1173 \item
{The System shall hide all cards from Week 9.} 1165 1174 {The System shall hide all cards from Week 9.}
\item 1166 1175 \item
{UserX shall search for ``app'' in the search bar in the top right.} 1167 1176 {UserX shall search for ``app'' in the search bar in the top right.}
\item 1168 1177 \item
{The System shall display only cards including text ``app''.} 1169 1178 {The System shall display only cards including text ``app''.}
\item 1170 1179 \item
{UserX shall click ``Show Hidden'' button in the top left and clear 1171 1180 {UserX shall click ``Show Hidden'' button in the top left and clear
the text in the search box.} 1172 1181 the text in the search box.}
\item 1173 1182 \item
{The System shall display all cards, excluding those from Week 9.} 1174 1183 {The System shall display all cards, excluding those from Week 9.}
\end{enumerate} 1175 1184 \end{enumerate}
1176 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.} 1177 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} 1178 1187 \end{description}
\newpage 1179 1188 \newpage
1180 1189
{} 1181 1190 {}
1182 1191
\subsection{[F6] Blank Out Words in Flashcard} 1183 1192 \subsection{[F6] Blank Out Words in Flashcard}
1184 1193
\begin{description} 1185 1194 \begin{description}
\item[Description:]{This test case outlines the presentation layer process 1186 1195 \item[Description:]{This test case outlines the presentation layer process
of the User to create keywords in a card they are pushing.} 1187 1196 of the User to create keywords in a card they are pushing.}
1188 1197
\item[Desired Outcome:]{The blanked out words (visually bolded) in the 1189 1198 \item[Desired Outcome:]{The blanked out words (visually bolded) in the
flashcard notify the System that they are keywords.} 1190 1199 flashcard notify the System that they are keywords.}
1191 1200
\item[User Goals:]{The User shall mark some words as keywords so the System 1192 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 1193 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.} 1194 1203 User enter what they think the keyword is.}
1195 1204
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1196 1205 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
Login, [A3] Add a Class, [F1] Push Flashcard} 1197 1206 Login, [A3] Add a Class, [F1] Push Flashcard}
1198 1207
\item[Priority Level:]{``Must''} 1199 1208 \item[Priority Level:]{``Must''}
1200 1209
\item[Status:]{Implemented} 1201 1210 \item[Status:]{Implemented}
1202 1211
\item[Preconditions:] 1203 1212 \item[Preconditions:]
\begin{itemize} 1204 1213 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1205 1214 \itemsep1pt\parskip0pt\parsep0pt
\item 1206 1215 \item
\item 1207 1216 \item
{The User is logged in as UserX.} 1208 1217 {The User is logged in as UserX.}
\item 1209 1218 \item
{The User has added the class TEST 101.} 1210 1219 {The User has added the class TEST 101.}
\item 1211 1220 \item
{The User is at the Feed View for the class TEST 101.} 1212 1221 {The User is at the Feed View for the class TEST 101.}
\end{itemize} 1213 1222 \end{itemize}
1214 1223
\item[Postconditions:] 1215 1224 \item[Postconditions:]
\begin{itemize} 1216 1225 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1217 1226 \itemsep1pt\parskip0pt\parsep0pt
\item 1218 1227 \item
{The blanked out words (keyword) ``Spain'' in the flashcard are marked with underline.} 1219 1228 {The blanked out words (keyword) ``Spain'' in the flashcard are marked with underline.}
\end{itemize} 1220 1229 \end{itemize}
1221 1230
\item[Trigger:] {The User wants their newly pushed card to have the keyword ``Spain''.} 1222 1231 \item[Trigger:] {The User wants their newly pushed card to have the keyword ``Spain''.}
1223 1232
\item[Workflow:] 1224 1233 \item[Workflow:]
\begin{enumerate} 1225 1234 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1226 1235 \itemsep1pt\parskip0pt\parsep0pt
\item 1227 1236 \item
{UserX shall click the Compose button (+ circle on bottom right) of Feed.} 1228 1237 {UserX shall click the Compose button (+ circle on bottom right) of Feed.}
\item 1229 1238 \item
{The System shall bring up the composition flashcard modal.} 1230 1239 {The System shall bring up the composition flashcard modal.}
\item 1231 1240 \item
{UserX shall type text ``The rain in Spain stays mainly in the plain'' 1232 1241 {UserX shall type text ``The rain in Spain stays mainly in the plain''
into the composition modal, replacing ``Write a flashcard''.} 1233 1242 into the composition modal, replacing ``Write a flashcard''.}
\item 1234 1243 \item
{UserX shall highlight the word ``Spain''.} 1235 1244 {UserX shall highlight the word ``Spain''.}
\item {UserX shall press Blank Selected Text button.} 1236 1245 \item {UserX shall press Blank Selected Text button.}
\item {UserX shall press Contribute button to push the flashcard.} 1237 1246 \item {UserX shall press Contribute button to push the flashcard.}
\item 1238 1247 \item
{The System will save the blanked out word in the Flashcard Mask of the 1239 1248 {The System will save the blanked out word in the Flashcard Mask of the
newly pushed flashcard.} 1240 1249 newly pushed flashcard.}
\item {The Feed shall display the new card with the keyword underlined.} 1241 1250 \item {The Feed shall display the new card with the keyword underlined.}
\end{enumerate} 1242 1251 \end{enumerate}
1243 1252
\item[Expected Result:] {The System shall show ``Spain'' underlined and bolded 1244 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.} 1245 1254 in the flashcard. The flashcard is visible in the Feed and Deck of class TEST 101.}
\end{description} 1246 1255 \end{description}
\newpage 1247 1256 \newpage
1248 1257
{} 1249 1258 {}
1250 1259
\subsection{[F7] Fix Flashcard} 1251 1260 \subsection{[F7] Fix Flashcard}
1252 1261
\begin{description} 1253 1262 \begin{description}
\item[Description:]{This Test Case outlines the presentation layer process 1254 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 1255 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 1256 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.} 1257 1266 flashcard in their Decks AND the User is the author.}
1258 1267
\item[Desired Outcome:]{The User shall change one of their flashcard's text 1259 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.} 1260 1269 and that alteration will be visible to all users in the Feed.}
1261 1270
\item[User Goals:]{The User shall make their own authored flashcard say 1262 1271 \item[User Goals:]{The User shall make their own authored flashcard say
something different than it did originally.} 1263 1272 something different than it did originally.}
1264 1273
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1265 1274 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
Login, [A3] Add a Class, [F1] Push Flashcard} 1266 1275 Login, [A3] Add a Class, [F1] Push Flashcard}
1267 1276
\item[Priority Level:]{``Must''} 1268 1277 \item[Priority Level:]{``Must''}
1269 1278
\item[Status:]{Implemented} 1270 1279 \item[Status:]{Implemented}
1271 1280
\item[Preconditions:] 1272 1281 \item[Preconditions:]
\begin{itemize} 1273 1282 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1274 1283 \itemsep1pt\parskip0pt\parsep0pt
\item 1275 1284 \item
{The User is logged in as UserX.} 1276 1285 {The User is logged in as UserX.}
\item {The User is logged in a separate browser as UserY.} 1277 1286 \item {The User is logged in a separate browser as UserY.}
\item 1278 1287 \item
{UserX and UserY has enrolled in the class TEST 101.} 1279 1288 {UserX and UserY has enrolled in the class TEST 101.}
\item 1280 1289 \item
{UserX is at the Deck View for the class TEST 101.} 1281 1290 {UserX is at the Deck View for the class TEST 101.}
\item {UserY is at the Feed View for the class TEST 101.} 1282 1291 \item {UserY is at the Feed View for the class TEST 101.}
\item 1283 1292 \item
{The User has contributed and pushed a flashcard to the TEST 101 Feed, which is 1284 1293 {The User has contributed and pushed a flashcard to the TEST 101 Feed, which is
also in their Deck with text 1285 1294 also in their Deck with text
``My card is currently broken''; this flashcard is for fixing.} 1286 1295 ``My card is currently broken''; this flashcard is for fixing.}
\end{itemize} 1287 1296 \end{itemize}
1288 1297
\item[Postconditions:] 1289 1298 \item[Postconditions:]
\begin{itemize} 1290 1299 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1291 1300 \itemsep1pt\parskip0pt\parsep0pt
\item 1292 1301 \item
{The authoring User shall see their alteration for that flashcard in their 1293 1302 {The authoring User shall see their alteration for that flashcard in their
Feed and Deck for TEST 101.} 1294 1303 Feed and Deck for TEST 101.}
\item {Other users shall see the fixed flashcard in the Feed for TEST 101 if they 1295 1304 \item {Other users shall see the fixed flashcard in the Feed for TEST 101 if they
refresh the app.} 1296 1305 refresh the app.}
\end{itemize} 1297 1306 \end{itemize}
1298 1307
\item[Trigger:] {UserX realizes that a card they created previously does 1299 1308 \item[Trigger:] {UserX realizes that a card they created previously does
not say what they currently desire and wishes to change it.} 1300 1309 not say what they currently desire and wishes to change it.}
1301 1310
\item[Workflow:] 1302 1311 \item[Workflow:]
\begin{enumerate} 1303 1312 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1304 1313 \itemsep1pt\parskip0pt\parsep0pt
\item 1305 1314 \item
{UserX shall hover the Flashcard they created with text ``My card is currently 1306 1315 {UserX shall hover the Flashcard they created with text ``My card is currently
broken''.} 1307 1316 broken''.}
\item 1308 1317 \item
{UserX shall select the bottom-left blue Edit Card pencil button on the flashcard.} 1309 1318 {UserX shall select the bottom-left blue Edit Card pencil button on the flashcard.}
\item 1310 1319 \item
{The System shall bring up the flashcard Edit modal.} 1311 1320 {The System shall bring up the flashcard Edit modal.}
\item 1312 1321 \item
{UserX shall highlight the text ``broken''.} 1313 1322 {UserX shall highlight the text ``broken''.}
\item {UserX shall change the highlighted word into ``fixed'' so that the text 1314 1323 \item {UserX shall change the highlighted word into ``fixed'' so that the text
reads ``My card is currently fixed''.} 1315 1324 reads ``My card is currently fixed''.}
\item 1316 1325 \item
{UserX shall press the Save Changes button.} 1317 1326 {UserX shall press the Save Changes button.}
\item 1318 1327 \item
{The System shall update the flashcard's text content.} 1319 1328 {The System shall update the flashcard's text content.}
\item 1320 1329 \item
{The System shall close the edit flashcard modal.} 1321 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 1322 1331 \item {The Client shall show the flashcard in the UserX's TEST 101 Deck with the
fixed text.} 1323 1332 fixed text.}
1324 1333
\item {UserY refreshes the TEST 101 Feed view and sees the flashcard ``My card is 1325 1334 \item {UserY refreshes the TEST 101 Feed view and sees the flashcard ``My card is
currently fixed''.} 1326 1335 currently fixed''.}
\end{enumerate} 1327 1336 \end{enumerate}
1328 1337
\item[Expected Results:]{The Client shall show the fixed flashcard 1329 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''. 1330 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, 1331 1340 The Client shall show the fixed flashcard in UserY's TEST 101 Feed view as well,
after page refresh.} 1332 1341 after page refresh.}
\end{description} 1333 1342 \end{description}
\newpage 1334 1343 \newpage
1335 1344
{} 1336 1345 {}
1337 1346
\subsection{[F8] Hide cards from feed} 1338 1347 \subsection{[F8] Hide cards from feed}
1339 1348
\begin{description} 1340 1349 \begin{description}
\item[Description:]{This test case outlines the presentation layer process 1341 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 1342 1351 for the User shall be able to hide cards from their own view, on
the Feed and Deck.} 1343 1352 the Feed and Deck.}
1344 1353
\item[Desired Outcome:]{The System marks the flashcard as hidden from the 1345 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.} 1346 1355 User so that the User cannot see the flashcard in the Feed or Deck.}
1347 1356
\item[User Goals:]{The flashcard is no longer visible to the User in the Feed or 1348 1357 \item[User Goals:]{The flashcard is no longer visible to the User in the Feed or
Deck views.} 1349 1358 Deck views.}
1350 1359
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1351 1360 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
Login, [A3] Add a Class, [F1] Push Flashcard} 1352 1361 Login, [A3] Add a Class, [F1] Push Flashcard}
1353 1362
\item[Priority Level:]{``Should''} 1354 1363 \item[Priority Level:]{``Should''}
1355 1364
\item[Status:]{Implemented} 1356 1365 \item[Status:]{Implemented}
1357 1366
\item[Preconditions:] 1358 1367 \item[Preconditions:]
\begin{itemize} 1359 1368 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1360 1369 \itemsep1pt\parskip0pt\parsep0pt
\item 1361 1370 \item
{The User is logged in as UserX.} 1362 1371 {The User is logged in as UserX.}
\item 1363 1372 \item
{The User has enrolled in the class TEST 101.} 1364 1373 {The User has enrolled in the class TEST 101.}
\item 1365 1374 \item
{The User is at the Feed View or Deck View (alternate workflow) 1366 1375 {The User is at the Feed View or Deck View (alternate workflow)
for the class TEST 101.} 1367 1376 for the class TEST 101.}
\item 1368 1377 \item
{The User has composed and contributed a flashcard to the Feed with text 1369 1378 {The User has composed and contributed a flashcard to the Feed with text
``The rain in Spain stays mainly in the plain''.} 1370 1379 ``The rain in Spain stays mainly in the plain''.}
\end{itemize} 1371 1380 \end{itemize}
1372 1381
\item[Postconditions:] 1373 1382 \item[Postconditions:]
\begin{itemize} 1374 1383 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1375 1384 \itemsep1pt\parskip0pt\parsep0pt
\item{Flashcard is not viewable by user in the Feed or Deck views in TEST 101.} 1376 1385 \item{Flashcard is not viewable by user in the Feed or Deck views in TEST 101.}
\end{itemize} 1377 1386 \end{itemize}
1378 1387
\item[Workflow:] 1379 1388 \item[Workflow:]
\begin{enumerate} 1380 1389 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1381 1390 \itemsep1pt\parskip0pt\parsep0pt
\item {UserX has navigated to the Feed View of TEST 101.} 1382 1391 \item {UserX has navigated to the Feed View of TEST 101.}
\item 1383 1392 \item
{UserX hovers the flashcard they added with the text ``The rain in Spain stays 1384 1393 {UserX hovers the flashcard they added with the text ``The rain in Spain stays
mainly in the plain''.} 1385 1394 mainly in the plain''.}
1386 1395
\item {UserX presses Hide button, which is the red crossed-out eye.} 1387 1396 \item {UserX presses Hide button, which is the red crossed-out eye.}
1388 1397
\item {The System shall hide the card.} 1389 1398 \item {The System shall hide the card.}
\item {The Client shall remove the card from view for UserX.} 1390 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.} 1391 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.} 1392 1401 \item {The card is not shown on the Feed or Deck.}
\end{enumerate} 1393 1402 \end{enumerate}
1394 1403
\item[Expected Result:]{The Client shows the Feed without the flashcard of text 1395 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 1396 1405 ``The rain in Spain stays mainly in the plain''. A toast that allows UserX to
report the card shows up temporarily.} 1397 1406 report the card shows up temporarily.}
1398 1407
\item[Alternate Workflow:] 1399 1408 \item[Alternate Workflow:]
1400 1409
\begin{enumerate} 1401 1410 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1402 1411 \itemsep1pt\parskip0pt\parsep0pt
\item {UserX has navigated to the Deck View of TEST 101.} 1403 1412 \item {UserX has navigated to the Deck View of TEST 101.}
\item 1404 1413 \item
{UserX hovers the flashcard they added with the text ``The rain in Spain stays 1405 1414 {UserX hovers the flashcard they added with the text ``The rain in Spain stays
mainly in the plain''.} 1406 1415 mainly in the plain''.}
1407 1416
screen_sequence_diagrams/add_class.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
ratio=0.75; 2 2 ratio=0.75;
//rankdir="LR"; 3 3 //rankdir="LR";
node[shape=box, style="rounded,filled,bold"]; 4 4 node[shape=box, style="rounded,filled,bold"];
splines=ortho; 5 5 splines=ortho;
nodesep=1.4; 6 6 nodesep=1.4;
labelloc="t"; 7 7 labelloc="t";
label = "[A3] Add a Class"; 8 8 label = "[A3] Add a Class";
"Sidebar Menu"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"]; 9 9 "Navigation Menu"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"];
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape=diamond, 10 10 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape=diamond,
fixedsize=true, width=1.4, height=1.4]; 11 11 fixedsize=true, width=1.4, height=1.4];
"POST /api/sections/{pk}/enroll"[shape=none]; 12 12 "POST /api/sections/{pk}/enroll"[shape=none];
labelfloat=true; 13 13 labelfloat=true;
lp=100; 14 14 lp=100;
15 15
"Permission Denied: \n User cannot be enrolled in class"[shape=none] 16 16 "Permission Denied: \n User cannot be enrolled in class"[shape=none]
"Success! \n User is added to class"[shape=none]; 17 17 "Success! \n User is added to class"[shape=none];
"SUCCESS"[shape=none]; 18 18 "SUCCESS"[shape=none];
"FAILURE"[shape=none]; 19 19 "FAILURE"[shape=none];
20 20
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape=diamond, 21 21 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape=diamond,
fixedsize=true, width=1.4, height=1.4]; 22 22 fixedsize=true, width=1.4, height=1.4];
"WhiteListCheck"[center=true, fillcolor="#aaaaff", style=filled, style=filled]; 23 23 "WhiteListCheck"[center=true, fillcolor="#aaaaff", style=filled, style=filled];
"Sidebar Menu" -> "POST /api/sections/{pk}/enroll"[dir=none]; 24 24 "Navigation Menu" -> "POST /api/sections/{pk}/enroll"[dir=none];
"POST /api/sections/{pk}/enroll" -> "Controller"; 25 25 "POST /api/sections/{pk}/enroll" -> "Controller";
"Controller" -> "FAILURE"[dir=none]; 26 26 "Controller" -> "FAILURE";
"FAILURE" -> "Sidebar Menu"; 27 27 "FAILURE" -> "Navigation Menu";
"Controller" -> "SUCCESS"[dir=none]; 28 28 "Controller" -> "SUCCESS";
"SUCCESS"->"WhiteListCheck"; 29 29 "SUCCESS"->"WhiteListCheck";
"WhiteListCheck" -> "Permission Denied: \n User cannot be enrolled in class"[dir=none]; 30 30 "WhiteListCheck" -> "Permission Denied: \n User cannot be enrolled in class";
"WhiteListCheck" -> "Success! \n User is added to class"[dir=none]; 31 31 "WhiteListCheck" -> "Success! \n User is added to class";
"Success! \n User is added to class" -> "Sidebar Menu"; 32 32 "Success! \n User is added to class" -> "Navigation Menu";
"Permission Denied: \n User cannot be enrolled in class" -> "Sidebar Menu"; 33 33 "Permission Denied: \n User cannot be enrolled in class" -> "Navigation Menu";
34 34
} 35 35 }
36 36
screen_sequence_diagrams/blank_out_words.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
ratio=0.75; 2 2 ratio=0.75;
//rankdir="LR"; 3 3 //rankdir="LR";
labelloc="t"; 4 4 labelloc="t";
label="[F6] Blank Out Words in Flashcards"; 5 5 label="[F6] Blank Out Words in Flashcards";
node[shape=box, style="rounded,filled,bold"]; 6 6 node[shape=box, style="rounded,filled,bold"];
splines=ortho; 7 7 splines=ortho;
nodesep=1.0; 8 8 nodesep=1.0;
"View Deck"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"]; 9 9 "View Deck"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"];
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, 10 10 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond,
fixedsize=true, width=1.4, height=1.4]; 11 11 fixedsize=true, width=1.4, height=1.4];
"POST /api/flashcards/{pk}"[shape=none] 12 12 "POST /api/flashcards/{pk}"[shape=none]
13 13
"View Deck" -> "Flashcard"; 14 14 "View Deck" -> "Flashcard";
"Flashcard" -> "Edit Flashcard Page"; 15 15 "Flashcard" -> "Edit Flashcard Page";
"Edit Flashcard Page" -> "POST /api/flashcards/{pk}"[dir=none]; 16 16 "Edit Flashcard Page" -> "POST /api/flashcards/{pk}";
"POST /api/flashcards/{pk}" -> "Controller"; 17 17 "POST /api/flashcards/{pk}" -> "Controller";
18 18
//Only blanks(mask) altered 19 19 //Only blanks(mask) altered
"Only mask altered"[shape=none]; 20 20 "Only mask altered"[shape=none];
"Server Updates FlashcardMask object"[fillcolor="#aaaaff", style=filled,pos="0,0!"]; 21 21 "Server Updates FlashcardMask object"[fillcolor="#aaaaff", style=filled,pos="0,0!"];
"Controller" -> "Only mask altered"[dir=none]; 22 22 "Controller" -> "Only mask altered";
"Only mask altered" -> "Server Updates FlashcardMask object"; 23 23 "Only mask altered" -> "Server Updates FlashcardMask object";
"Server Updates FlashcardMask object" -> "View Deck"; 24 24 "Server Updates FlashcardMask object" -> "View Deck";
25 25
labelfloat=true; 26 26 labelfloat=true;
lp=100; 27 27 lp=100;
screen_sequence_diagrams/change_password.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
ratio=0.75; 2 2 ratio=0.75;
//rankdir="LR"; 3 3 //rankdir="LR";
node[shape=box, style="rounded,filled,bold"]; 4 4 node[shape=box, style="rounded,filled,bold"];
splines=ortho; 5 5 splines=ortho;
nodesep=1.4; 6 6 nodesep=1.4;
labelloc="t"; 7 7 labelloc="t";
label="[A5] Change password & [A6] Reset password"; 8 8 label="[A5] Change password & [A6] Reset password";
"Sidebar Menu"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"]; 9 9 "Navigation Menu/Settings"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"];
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond]; 10 10 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond];
"POST /api/request_password_reset"[shape=none]; 11 11 "POST /api/request_password_reset"[shape=none];
labelfloat=true; 12 12 labelfloat=true;
lp=100; 13 13 lp=100;
14 14
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, 15 15 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond,
fixedsize=true, width=1.4, height=1.4]; 16 16 fixedsize=true, width=1.4, height=1.4];
"Sidebar Menu/Settings" -> "POST /api/request_password_reset"[dir=none]; 17 17 "Navigation Menu/Settings" -> "POST /api/request_password_reset"[dir=none];
"POST /api/request_password_reset" -> "Controller"; 18 18 "POST /api/request_password_reset" -> "Controller";
"Controller" -> "Email"; 19 19 "Controller" -> "Email";
"Failure: User did not\nchange password"[shape=none]; 20 20 "Failure: User did not\nchange password"[shape=none];
"Email" -> "Failure: User did not\nchange password"[dir=none]; 21 21 "Email" -> "Failure: User did not\nchange password";
"Failure: User did not\nchange password" -> "Sidebar Menu"; 22 22 "Failure: User did not\nchange password" -> "Navigation Menu";
"Success: User \nchanged password"[shape=none]; 23 23 "Success: User \nchanged password"[shape=none];
"Email" -> "Success: User \nchanged password"[dir=none]; 24 24 "Email" -> "Success: User \nchanged password";
"Success: User \nchanged password" -> "Sidebar Menu"; 25 25 "Success: User \nchanged password" -> "Navigation Menu";
} 26 26 }
27 27
screen_sequence_diagrams/configure_account_notifications.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
ratio=0.75; 2 2 ratio=0.75;
//rankdir="LR"; 3 3 //rankdir="LR";
labelloc="t"; 4 4 labelloc="t";
label="[R3] Configure Account Notifications" 5 5 label="[R3] Configure Account Notifications"
node[shape=box, style="rounded,filled,bold"]; 6 6 node[shape=box, style="rounded,filled,bold"];
splines=ortho; 7 7 splines=ortho;
nodesep=2.5; 8 8 nodesep=2.5;
ranksep=0.45; 9 9 ranksep=0.45;
"Account Settings"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"]; 10 10 "Account Settings"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"];
"Account Settings" -> "PATCH /api/me/settings"[dir=none]; 11 11 "Account Settings" -> "PATCH /api/me/settings";
12 12
"views.update_settings" -> "New settings valid?"; 13 13 "views.update_settings" -> "New settings valid?";
"New settings valid?" -> "Yes\nSUCCESS"[dir=none]; 14 14 "New settings valid?" -> "Yes\nSUCCESS";
"New settings valid?" -> "No\nFAILURE"[dir=none]; 15 15 "New settings valid?" -> "No\nFAILURE";
"PATCH /api/me/settings" -> "views.update_settings"; 16 16 "PATCH /api/me/settings" -> "views.update_settings";
"No\nFAILURE" -> "Account Settings"; 17 17 "No\nFAILURE" -> "Account Settings";
"Yes\nSUCCESS" -> "Save settings"; 18 18 "Yes\nSUCCESS" -> "Save settings";
"Save settings" -> "Account Settings"; 19 19 "Save settings" -> "Account Settings";
"Yes\nSUCCESS"[shape=none]; 20 20 "Yes\nSUCCESS"[shape=none];
"No\nFAILURE"[shape=none]; 21 21 "No\nFAILURE"[shape=none];
"PATCH /api/me/settings"[shape=none]; 22 22 "PATCH /api/me/settings"[shape=none];
labelfloat=true; 23 23 labelfloat=true;
lp=100; 24 24 lp=100;
"views.update_settings"[center=true, fillcolor="#aaaaff", style=filled, shape=diamond, fixedsize=true, width=2.0, height=2.0]; 25 25 "views.update_settings"[center=true, fillcolor="#aaaaff", style=filled, shape=diamond, fixedsize=true, width=2.0, height=2.0];
} 26 26 }
27 27
screen_sequence_diagrams/contact_admin.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
// Title 2 2 // Title
labelloc="t"; 3 3 labelloc="t";
label="[A9] Contact Admin"; 4 4 label="[A9] Contact Admin";
5 5
// Other 6 6 // Other
ratio=0.75; 7 7 ratio=0.75;
node[shape=box, style="rounded,filled,bold"]; 8 8 node[shape=box, style="rounded,filled,bold"];
splines=ortho; 9 9 splines=ortho;
nodesep=1.4; 10 10 nodesep=1.4;
"Instructor's Email Client"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"]; 11 11 "Instructor's Email Client"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"];
"Admin's Message Box"[center=true, fillcolor="#aaaaff", style=filled]; 12 12 "Admin's Message Box"[center=true, fillcolor="#aaaaff", style=filled];
"EMAIL"[shape=none]; 13 13 "EMAIL"[shape=none];
"MESSAGE"[shape=none]; 14 14 "MESSAGE"[shape=none];
labelfloat=true; 15 15 labelfloat=true;
lp=100; 16 16 lp=100;
17 17
// Graph 18 18 // Graph
"Instructor's Email Client" -> "EMAIL"[dir=none]; 19 19 "Instructor's Email Client" -> "EMAIL";
"EMAIL" -> "Admin's Message Box"; 20 20 "EMAIL" -> "Admin's Message Box";
"Admin's Message Box" -> "MESSAGE"[dir=none]; 21 21 "Admin's Message Box" -> "MESSAGE";
"MESSAGE" -> "Instructor's Email Client"; 22 22 "MESSAGE" -> "Instructor's Email Client";
} 23 23 }
screen_sequence_diagrams/drop_class.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
ratio=0.75; 2 2 ratio=0.75;
// rankdir="LR"; 3 3 // rankdir="LR";
node[shape=box, style="rounded,filled,bold"]; 4 4 node[shape=box, style="rounded,filled,bold"];
splines=ortho; 5 5 splines=ortho;
nodesep=1.4; 6 6 nodesep=1.4;
labelloc="t"; 7 7 labelloc="t";
label="[A4] Drop a class"; 8 8 label="[A4] Drop a class";
"Sidebar Menu"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"]; 9 9 "Navigation Menu/Settings"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"];
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape=diamond, 10 10 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape=diamond,
fixedsize=true, width=1.4, height=1.4]; 11 11 fixedsize=true, width=1.4, height=1.4];
"User Check"[center=true, fillcolor="#aaaaff", style=filled]; 12 12 "User Check"[center=true, fillcolor="#aaaaff", style=filled];
//labelfloat=true; 13 13 //labelfloat=true;
//lp=100; 14 14 //lp=100;
15 15
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape=diamond, 16 16 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape=diamond,
fixedsize=true, width=1.4, height=1.4]; 17 17 fixedsize=true, width=1.4, height=1.4];
"POST /api/sections/{pk}/drop"[shape=none]; 18 18 "POST /api/sections/{pk}/drop"[shape=none];
"Sidebar Menu" -> "POST /api/sections/{pk}/drop"[dir=none]; 19 19 "Navigation Menu/Settings" -> "POST /api/sections/{pk}/drop";
"POST /api/sections/{pk}/drop" -> "Controller"; 20 20 "POST /api/sections/{pk}/drop" -> "Controller";
"Controller" -> "User Check"; 21 21 "Controller" -> "User Check";
"User did not\ndrop class"[shape=none]; 22 22 "User did not\ndrop class"[shape=none];
"User Check" -> "User did not\ndrop class"[dir=none]; 23 23 "User Check" -> "User did not\ndrop class";
"User did not\ndrop class" -> "Sidebar Menu"; 24 24 "User did not\ndrop class" -> "Navigation Menu/Settings";
"User successfully\ndropped class"[shape=none]; 25 25 "User successfully\ndropped class"[shape=none];
"User Check" -> "User successfully\ndropped class"[dir=none]; 26 26 "User Check" -> "User successfully\ndropped class";
"User successfully\ndropped class" -> "Sidebar Menu"; 27 27 "User successfully\ndropped class" -> "Navigation Menu/Settings";
} 28 28 }
29 29
screen_sequence_diagrams/edit_flashcard.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
ratio=0.75; 2 2 ratio=0.75;
//rankdir="LR"; 3 3 //rankdir="LR";
labelloc="t"; 4 4 labelloc="t";
label="[F2] Edit Flashcard"; 5 5 label="[F2] Edit Flashcard";
node[shape=box, style="rounded,filled,bold"]; 6 6 node[shape=box, style="rounded,filled,bold"];
splines=ortho; 7 7 splines=ortho;
nodesep=1.0; 8 8 nodesep=1.0;
"View Deck"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"]; 9 9 "View Deck"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"];
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, 10 10 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond,
fixedsize=true, width=1.4, height=1.4]; 11 11 fixedsize=true, width=1.4, height=1.4];
"POST /api/flashcards/{pk}"[shape=none]; 12 12 "POST /api/flashcards/{pk}"[shape=none];
13 13
"View Deck" -> "Edit Flashcard Button"; 14 14 "View Deck" -> "Edit Flashcard Button";
"Edit Flashcard Button" -> "Flashcard Changes"; 15 15 "Edit Flashcard Button" -> "Flashcard Changes";
"Flashcard Changes" -> "POST /api/flashcards/{pk}"[dir=none]; 16 16 "Flashcard Changes" -> "POST /api/flashcards/{pk}";
"POST /api/flashcards/{pk}" -> "Controller"; 17 17 "POST /api/flashcards/{pk}" -> "Controller";
18 18
//Only blanks(mask) altered 19 19 //Only blanks(mask) altered
"Only mask altered"[shape=none]; 20 20 "Only mask altered"[shape=none];
"Server creates New FlashcardMask object"[fillcolor="#aaaaff", style=filled,pos="0,0!"]; 21 21 "Server creates New FlashcardMask object"[fillcolor="#aaaaff", style=filled,pos="0,0!"];
"Controller" -> "Only mask altered"[dir=none]; 22 22 "Controller" -> "Only mask altered";
"Only mask altered" -> "Server creates New FlashcardMask object"; 23 23 "Only mask altered" -> "Server creates New FlashcardMask object";
"Server creates New FlashcardMask object" -> "View Deck"; 24 24 "Server creates New FlashcardMask object" -> "View Deck";
25 25
//Text changed 26 26 //Text changed
"Text or material date altered"[shape=none]; 27 27 "Text or material date altered"[shape=none];
"Controller" -> "Text or material date altered"[dir=none]; 28 28 "Controller" -> "Text or material date altered";
"Text or material date altered" -> "Create New Flashcard"; 29 29 "Text or material date altered" -> "Create New Flashcard";
"Create New Flashcard" -> "Push to Feed"; 30 30 "Create New Flashcard" -> "Push to Feed";
"Push to Feed"-> "Add to User Deck"; 31 31 "Push to Feed"-> "Add to User Deck";
"Add to User Deck" -> "View Deck"; 32 32 "Add to User Deck" -> "View Deck";
labelfloat=true; 33 33 labelfloat=true;
lp=100; 34 34 lp=100;
} 35 35 }
screen_sequence_diagrams/filter_cards.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
ratio=0.75; 2 2 ratio=0.75;
//rankdir="LR"; 3 3 //rankdir="LR";
node[shape=box, style="rounded,filled,bold"]; 4 4 node[shape=box, style="rounded,filled,bold"];
splines=ortho; 5 5 splines=ortho;
nodesep=1.4; 6 6 nodesep=1.4;
labelloc="t"; 7 7 labelloc="t";
label="[F5] Filter cards"; 8 8 label="[F5] Filter cards";
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond]; 9 9 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond];
labelfloat=true; 10 10 labelfloat=true;
lp=100; 11 11 lp=100;
12 12
13 13
"Filter"[shape=none]; 14 14 "Filter"[shape=none];
"Filtered cards"[shape=none]; 15 15 "Filtered cards"[shape=none];
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, 16 16 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond,
fixedsize=true, width=1.4, height=1.4]; 17 17 fixedsize=true, width=1.4, height=1.4];
18 18
"Feed" -> "Filter"[dir=none]; 19 19 "Feed" -> "Filter";
"Filter" -> "Controller"; 20 20 "Filter" -> "Controller";
"Controller" -> "Filtered cards"[dir=none]; 21 21 "Controller" -> "Filtered cards";
"Filtered cards" -> "Feed"; 22 22 "Filtered cards" -> "Feed";
screen_sequence_diagrams/fix_flashcard.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
ratio=0.75; 2 2 ratio=0.75;
//rankdir="LR"; 3 3 //rankdir="LR";
labelloc="t"; 4 4 labelloc="t";
label="[F7] Fix Flashcard"; 5 5 label="[F7] Fix Flashcard";
node[shape=box, style="rounded,filled,bold"]; 6 6 node[shape=box, style="rounded,filled,bold"];
splines=ortho; 7 7 splines=ortho;
nodesep=0.4; 8 8 nodesep=0.4;
ranksep=0.1; 9 9 ranksep=0.1;
"View Deck"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"]; 10 10 "View Deck"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"];
"View Deck" -> "Edit Flashcard"; 11 11 "View Deck" -> "Edit Flashcard";
"Edit Flashcard" -> "POST /api/flashcard/{pk}/edit"[dir=none]; 12 12 "Edit Flashcard" -> "POST /api/flashcard/{pk}/edit";
"POST /api/flashcard/{pk}/edit" -> "FlashcardViewSet.edit"; 13 13 "POST /api/flashcard/{pk}/edit" -> "FlashcardViewSet.edit";
"FlashcardViewSet.edit" -> "Text or material date altered"[dir=none]; 14 14 "FlashcardViewSet.edit" -> "Text or material date altered";
"FlashcardViewSet.edit" -> "Only mask altered"[dir=none]; 15 15 "FlashcardViewSet.edit" -> "Only mask altered";
"Only mask altered" -> "Update UserFlashcard object"; 16 16 "Only mask altered" -> "Update UserFlashcard object";
"Text or material date altered" -> "Create new Flashcard with prev pointer\nNotify all users who've pulled the card"; 17 17 "Text or material date altered" -> "Create new Flashcard with prev pointer\nNotify all users who've pulled the card";
"Only mask altered"[shape=none]; 18 18 "Only mask altered"[shape=none];
"Text or material date altered"[shape=none]; 19 19 "Text or material date altered"[shape=none];
"Update UserFlashcard object" -> "View Deck"; 20 20 "Update UserFlashcard object" -> "View Deck";
"Create new Flashcard with prev pointer\nNotify all users who've pulled the card" -> "View Deck"; 21 21 "Create new Flashcard with prev pointer\nNotify all users who've pulled the card" -> "View Deck";
"POST /api/flashcard/{pk}/edit"[shape=none]; 22 22 "POST /api/flashcard/{pk}/edit"[shape=none];
labelfloat=true; 23 23 labelfloat=true;
lp=100; 24 24 lp=100;
"FlashcardViewSet.edit"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, fixedsize=true, width=2.2, height=2.2]; 25 25 "FlashcardViewSet.edit"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, fixedsize=true, width=2.2, height=2.2];
"Sidebar Menu"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"]; 26 26 "Navigation Menu"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"];
"WhiteListCheck"[center=true, fillcolor="#aaaaff", style=filled, style=filled]; 27 27 "WhiteListCheck"[center=true, fillcolor="#aaaaff", style=filled, style=filled];
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, fixedsize=true, width=1.1, height=1.1]; 28 28 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, fixedsize=true, width=1.1, height=1.1];
"POST"[shape=none]; 29 29 "POST"[shape=none];
"FAILURE"[shape=none]; 30 30 "FAILURE"[shape=none];
"SUCCESS"[shape=none]; 31 31 "SUCCESS"[shape=none];
"Sidebar Menu" -> "POST"[dir=none]; 32 32 "Navigation Menu" -> "POST";
"POST" -> "Controller"; 33 33 "POST" -> "Controller";
"Controller" -> "FAILURE"[dir=none]; 34 34 "Controller" -> "FAILURE";
"FAILURE" -> "Sidebar Menu"; 35 35 "FAILURE" -> "Navigation Menu";
"Controller" -> "SUCCESS"[dir=none]; 36 36 "Controller" -> "SUCCESS";
"SUCCESS"->"WhiteListCheck"; 37 37 "SUCCESS"->"WhiteListCheck";
"WhiteListCheck" -> "Permission Denied: \n User cannot be enrolled in class"; 38 38 "WhiteListCheck" -> "Permission Denied: \n User cannot be enrolled in class";
"WhiteListCheck" -> "Success! \n User is added to class"; 39 39 "WhiteListCheck" -> "Success! \n User is added to class";
"Success! \n User is added to class" -> "Sidebar Menu"; 40 40 "Success! \n User is added to class" -> "Navigation Menu";
"Permission Denied: \n User cannot be enrolled in class" -> "Sidebar Menu"; 41 41 "Permission Denied: \n User cannot be enrolled in class" -> "Navigation Menu";
} 42 42 }
43 43
screen_sequence_diagrams/flag_inappropriate_cards.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
ratio=0.75; 2 2 ratio=0.75;
//rankdir="LR"; 3 3 //rankdir="LR";
labelloc="t"; 4 4 labelloc="t";
label="[F4] Flag Inappropriate Cards"; 5 5 label="[F4] Flag Inappropriate Cards";
node[shape=box, style="rounded,filled,bold"]; 6 6 node[shape=box, style="rounded,filled,bold"];
splines=ortho; 7 7 splines=ortho;
nodesep=2.0; 8 8 nodesep=2.0;
ranksep=0.4; 9 9 ranksep=0.4;
"Live Feed"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"]; 10 10 "Live Feed"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"];
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, 11 11 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond,
fixedsize=true, width=1.4, height=1.4]; 12 12 fixedsize=true, width=1.4, height=1.4];
"Server"[fillcolor="#aaaaff", style=filled,pos="0,0!"]; 13 13 "Server"[fillcolor="#aaaaff", style=filled,pos="0,0!"];
"Flashcard Hidden from Feed"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"]; 14 14 "Flashcard Hidden from Feed"[center=true, fillcolor="#aaaaff", style=filled,pos="0,0!"];
"POST /api/flashcards/{pk]/report"[shape=none]; 15 15 "POST /api/flashcards/{pk]/report"[shape=none];
labelfloat=true; 16 16 labelfloat=true;
lp=100; 17 17 lp=100;
18 18
"SUCCESS"[shape=none]; 19 19 "SUCCESS"[shape=none];
"FAILURE"[shape=none]; 20 20 "FAILURE"[shape=none];
21 21
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, 22 22 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond,
fixedsize=true, width=1.4, height=1.4]; 23 23 fixedsize=true, width=1.4, height=1.4];
"Flashcard Hidden from Feed"[center=true, fillcolor="#aaaaff", style=filled]; 24 24 "Flashcard Hidden from Feed"[center=true, fillcolor="#aaaaff", style=filled];
"POST /api/flashcards/{pk]/report"[shape=none]; 25 25 "POST /api/flashcards/{pk]/report"[shape=none];
"Live Feed" -> "Flag as Inappropriate"; 26 26 "Live Feed" -> "Flag as Inappropriate";
"Flag as Inappropriate" -> "POST /api/flashcards/{pk]/report"[dir=none]; 27 27 "Flag as Inappropriate" -> "POST /api/flashcards/{pk]/report";
"POST /api/flashcards/{pk]/report" -> "Controller"; 28 28 "POST /api/flashcards/{pk]/report" -> "Controller";
"Controller" -> "FAILURE"[dir=none]; 29 29 "Controller" -> "FAILURE";
"FAILURE" -> "Live Feed"; 30 30 "FAILURE" -> "Live Feed";
"Controller" -> "POST /api/flashcards/{pk]/report"[dir=none]; 31 31 "Controller" -> "POST /api/flashcards/{pk]/report";
"POST /api/flashcards/{pk]/report" -> "Server"; 32 32 "POST /api/flashcards/{pk]/report" -> "Server";
"Server"-> "SUCCESS"[dir=none]; 33 33 "Server"-> "SUCCESS";
"SUCCESS" -> "Flashcard Hidden from Feed"; 34 34 "SUCCESS" -> "Flashcard Hidden from Feed";
"Flashcard Hidden from Feed" -> "Server creates a FlashcardReport object"; 35 35 "Flashcard Hidden from Feed" -> "Server creates a FlashcardReport object";
"Server creates a FlashcardReport object" -> "Live Feed"; 36 36 "Server creates a FlashcardReport object" -> "Live Feed";
37 37
} 38 38 }
39 39
screen_sequence_diagrams/hide_card.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
ratio=0.75; 2 2 ratio=0.75;
//rankdir="LR"; 3 3 //rankdir="LR";
node[shape=box, style="rounded,filled,bold"]; 4 4 node[shape=box, style="rounded,filled,bold"];
splines=ortho; 5 5 splines=ortho;
nodesep=1.4; 6 6 nodesep=1.4;
labelloc="t"; 7 7 labelloc="t";
label="[F8] Hide Card from Feed"; 8 8 label="[F8] Hide Card from Feed";
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, 9 9 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond,
fixedsize=true, width=1.4, height=1.4]; 10 10 fixedsize=true, width=1.4, height=1.4];
labelfloat=true; 11 11 labelfloat=true;
lp=100; 12 12 lp=100;
13 13
"POST"[shape=none]; 14 14 "POST"[shape=none];
"FAILURE: card no longer\nexists in database"[shape=none]; 15 15 "FAILURE: card no longer\nexists in database"[shape=none];
"SUCCESS: card\nsuccessfully hidden"[shape=none]; 16 16 "SUCCESS: card\nsuccessfully hidden"[shape=none];
17 17
"Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond, 18 18 "Controller"[center=true, fillcolor="#aaaaff", style=filled, shape = diamond,
fixedsize=true, width=1.4, height=1.4]; 19 19 fixedsize=true, width=1.4, height=1.4];
"Feed" -> "POST"[dir=none]; 20 20 "Feed" -> "POST";
"POST" -> "Controller"; 21 21 "POST" -> "Controller";
"Controller" -> "FAILURE: card no longer\nexists in database"[dir=none]; 22 22 "Controller" -> "FAILURE: card no longer\nexists in database";
"Controller" -> "SUCCESS: card\nsuccessfully hidden"[dir=none]; 23 23 "Controller" -> "SUCCESS: card\nsuccessfully hidden";
"FAILURE: card no longer\nexists in database" -> "Feed"; 24 24 "FAILURE: card no longer\nexists in database" -> "Feed";
"SUCCESS: card\nsuccessfully hidden" -> "Feed"; 25 25 "SUCCESS: card\nsuccessfully hidden" -> "Feed";
} 26 26 }
27 27
use_cases_diagram.dot View file @ 17a3102
digraph G{ 1 1 digraph G{
ratio=0.75; 2 2 ratio=0.7;
rankdir="LR"; 3 3 rankdir="LR";
node[shape=box]; 4 4 node[shape=box];
5 nodesep=1.1;
// Styling: 5 6 // Styling:
// Accounts 6 7 // Accounts
"[A1] User Registration"[fillcolor="#9ce3ff", style=filled]; 7 8 "[A1] User Registration"[fillcolor="#9ce3ff", style=filled];
"[A2] User Login"[fillcolor="#9ce3ff", style=filled]; 8 9 "[A2] User Login"[fillcolor="#9ce3ff", style=filled];
"[A3] Add a Class"[fillcolor="#9ce3ff", style=filled]; 9 10 "[A3] Add a Class"[fillcolor="#9ce3ff", style=filled];
"[A4] Drop a Class"[fillcolor="#9ce3ff", style=filled]; 10 11 "[A4] Drop a Class"[fillcolor="#9ce3ff", style=filled];
"[A5] Password Change"[fillcolor="#9ce3ff", style=filled]; 11 12 "[A5] Password Change"[fillcolor="#9ce3ff", style=filled];
"[A6] Password Reset"[fillcolor="#9ce3ff", style=filled]; 12 13 "[A6] Password Reset"[fillcolor="#9ce3ff", style=filled];
"[A8] User Logout"[fillcolor="#9ce3ff", style=filled]; 13 14 "[A8] User Logout"[fillcolor="#9ce3ff", style=filled];
"[A9] Contact Admin"[fillcolor="#9ce3ff", style=filled]; 14 15 "[A9] Contact Admin"[fillcolor="#9ce3ff", style=filled];
"[A10] Configure Account Notifications"[fillcolor="#9ce3ff", style=filled]; 15 16 "[A10] Configure Account Notifications"[fillcolor="#9ce3ff", style=filled];
16 17
// Flashcards 17 18 // Flashcards
"[F1] Push Flashcard"[fillcolor="#ff5050", style=filled]; 18 19 "[F1] Push Flashcard"[fillcolor="#ff5050", style=filled];
"[F2] Edit Card"[fillcolor="#ff5050", style=filled]; 19 20 "[F2] Edit Card"[fillcolor="#ff5050", style=filled];
"[F3] Pull Flashcard"[fillcolor="#ff5050", style=filled]; 20 21 "[F3] Pull Flashcard"[fillcolor="#ff5050", style=filled];
"[F4] Flag Inappropriate Cards"[fillcolor="#ff5050", style=filled]; 21 22 "[F4] Flag Inappropriate Cards"[fillcolor="#ff5050", style=filled];
"[F5] Filter Flashcards"[fillcolor="#ff5050", style=filled]; 22 23 "[F5] Filter Flashcards"[fillcolor="#ff5050", style=filled];
"[F6] Blank Out Words"[fillcolor="#ff5050", style=filled]; 23 24 "[F6] Blank Out Words"[fillcolor="#ff5050", style=filled];
"[F7] Fix Flashcard"[fillcolor="#ff5050", style=filled]; 24 25 "[F7] Fix Flashcard"[fillcolor="#ff5050", style=filled];
"[F8] Hide Cards"[fillcolor="#ff5050", style=filled]; 25 26 "[F8] Hide Cards"[fillcolor="#ff5050", style=filled];
"[F9] View Class Feed"[fillcolor="#ff5050", style=filled]; 26 27 "[F9] View Class Feed"[fillcolor="#ff5050", style=filled];
27 28
// Decks 28 29 // Decks
"[D1] Remove Card from Deck"[fillcolor="#ccff99", style=filled]; 29 30 "[D1] Remove Card from Deck"[fillcolor="#ccff99", style=filled];
"[D2] View Deck"[fillcolor="#ccff99", style=filled]; 30 31 "[D2] View Deck"[fillcolor="#ccff99", style=filled];
31 32
// Study 32 33 // Study
"[R1] Study Deck"[fillcolor="#ffeeaa", style=filled]; 33 34 "[R1] Study Deck"[fillcolor="#ffeeaa", style=filled];
34 35
// User 35 36 // User
"User" [shape=none, shapefile="stick.png" style=none]; 36 37 [shape=none, shapefile="stick.png"];
37 38
//Graph 38 39 //Graph
"User"->"[A1] User Registration"; 39 40 "User"->"[A1] User Registration";
40 41
"[A1] User Registration"->"[A2] User Login"; 41 42 "[A1] User Registration"->"[A2] User Login";
"[A2] User Login"->"[A6] Password Reset"; 42 43 "[A2] User Login"->"[A6] Password Reset";
"[A2] User Login"->"[A5] Password Change"; 43 44 "[A2] User Login"->"[A5] Password Change";
"[A2] User Login"->"[A3] Add a Class"; 44 45 "[A2] User Login"->"[A3] Add a Class";
"[A2] User Login"->"[A8] User Logout"; 45 46 "[A2] User Login"->"[A8] User Logout";
"[A3] Add a Class"->"[F9] View Class Feed"; 46 47 "[A3] Add a Class"->"[F9] View Class Feed";
"[A3] Add a Class"->"[A4] Drop a Class" 47 48 "[A3] Add a Class"->"[A4] Drop a Class"
"[A8] User Logout"->"[A2] User Login"; 48 49 "[A8] User Logout"->"[A2] User Login";
"[A9] Contact Admin" 49 50 "[A9] Contact Admin";
50 51
"[F1] Push Flashcard"->"[F6] Blank Out Words" 51 52 "[F1] Push Flashcard"->"[F6] Blank Out Words";
"[F6] Blank Out Words"->"[F9] View Class Feed"; 52
"[F8] Hide Cards"->"[F4] Flag Inappropriate Cards"; 53 53 "[F8] Hide Cards"->"[F4] Flag Inappropriate Cards";
"[F9] View Class Feed"->"[F1] Push Flashcard"; 54
"[F9] View Class Feed"->"[F3] Pull Flashcard"; 55
"[F9] View Class Feed" ->"[R1] Study Deck"; 56 54 "[F9] View Class Feed" ->"[R1] Study Deck";
"[F9] View Class Feed"->"[D2] View Deck"; 57 55 "[F9] View Class Feed"->"[D2] View Deck";
"[F9] View Class Feed"->"[F8] Hide Cards"; 58 56 "[F9] View Class Feed"->"[F1] Push Flashcard";
"[F9] View Class Feed"->"[F7] Fix Flashcard"; 59 57 "[F9] View Class Feed"->"[F2] Edit Card";
58 "[F9] View Class Feed"->"[F3] Pull Flashcard";
"[F9] View Class Feed"->"[F5] Filter Flashcards"; 60 59 "[F9] View Class Feed"->"[F5] Filter Flashcards";
60 "[F9] View Class Feed"->"[F7] Fix Flashcard";
61 "[F9] View Class Feed"->"[F8] Hide Cards";
61 62
"[D2] View Deck"->"[D1] Remove Card from Deck"; 62 63 "[D2] View Deck"->"[D1] Remove Card from Deck";