Compare View

switch
from
...
to
 
Commits (2)

Diff

Showing 1 changed file Inline Diff

TestCases.tex View file @ bd1f4d1
\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}
\begin{enumerate} 112 112 \item
\item 113 113 {UserX shall click the ``Sign Up'' button.}
{UserX shall click the ``Sign Up'' button.} 114 114 \item
\item 115 115 {The System shall display a registration form.}
{The System shall display a registration form.} 116 116 \item
\item 117 117 {UserX shall fill in the form with email UserX@flashy.cards and password ``mynameisuserx''.}
{UserX shall fill in the form with email testuser@flashy.cards and password ``test''.} 118 118 \item
\item 119 119 {The System shall successfully receive the correct credentials and send an
{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 email to the User's address with a link to validate the User's email address
\item 121 121 and displays the Add Class page to the User.}
{UserX receives an email with a link to verify their email. The 122 122 \item
User clicks the link.} 123 123 {The System shall display a toast ``Please verify your email address! RESEND
\item 124 124 VERIFICATION EMAIL''.}
{The Server marks the user's email as valid and saves the User object 125 125 \item
again.} 126 126 {UserX receives an email with a link to verify their email. The
\end{enumerate} 127 127 User clicks the link (see Testing Notes).}
128 128 \item
\item [Expected Results:]{UserX's account is now active (registered with the system).} 129 129 {The System shall mark UserX's email as valid.}
130 130 \item
\end{description} 131 131 {UserX shall click ``Logout'' (power button) in the top left corner.}
\newpage 132 132 \item
133 133 {The System shall present UserX Login screen.}
{} 134 134 \item
135 135 {UserX shall once again login with ``UserX@flashy.cards'' and ``mynameisuserx''.}
\subsection{[A2] User Login} 136 136 \end{enumerate}
137 137
\begin{description} 138 138 \item [Expected Result:]{UserX shall see Add Class page without a toast asking
\item[Description:]{This test case outlines the presentation layering step 139 139 UserX to verify their email.}
process of a user logging into the application.} 140 140
141 141 \end{description}
\item[Desired Outcome:]{The User shall be able to provide their email address and 142 142 \newpage
password to access their courses and flash cards. The User shall gain 143 143
access to the list of the courses they have added, and be able to review 144 144 {}
the flash cards they have added to their decks.} 145 145
146 146 \subsection{[A2] User Login}
\item[User Goals:]{The User wants to resume use of the site on another 147 147
device, or use the site after logging out.} 148 148 \begin{description}
149 149 \item[Description:]{This test case outlines the presentation layering step
\item[Dependency Use Cases:]{[A1] User Registration} 150 150 process of a user logging into the application.}
\\ 151 151
152 152 \item[Desired Outcome:]{The User shall be able to provide their email address and
\item[Priority Level:]{``Must''} 153 153 password to access their courses and flash cards. The User shall gain
154 154 access to the list of the courses they have added, and be able to review
\item[Status:]{Implemented} 155 155 the flashcards they have added to their decks.}
156 156
\item[Preconditions:] 157 157 \item[User Goals:]{The User wants to resume use of the site on another
\begin{itemize} 158 158 device, or use the site after logging out.}
\item 159 159
{The User has created an account before with email ``testuser@flashy.cards'' with password ``test''.} 160 160 \item[Dependency Use Cases:]{[A1] User Registration}
\end{itemize} 161 161 \\
162 162
\item[Postconditions:] 163 163 \item[Priority Level:]{``Must''}
\begin{itemize} 164 164
\itemsep1pt\parskip0pt\parsep0pt 165 165 \item[Status:]{Implemented}
\item 166 166
{The user can navigate the site and see their data.} 167 167 \item[Preconditions:]
\end{itemize} 168 168 \begin{itemize}
169 169 \item
\item[Trigger:]{UserX wants to view, add, or create cards for a class or classes.} 170 170 {The User has created an account before with email ``UserX@flashy.cards'' with
171 171 password ``mynameisuserx''.}
\item[Workflow:] 172 172 \end{itemize}
\begin{enumerate} 173 173
\itemsep1pt\parskip0pt\parsep0pt 174 174 \item[Postconditions:]
\item 175 175 \begin{itemize}
{UserX shall enter their email ``testuser@flashy.cards'' and password ``test''.} 176 176 \itemsep1pt\parskip0pt\parsep0pt
\item 177 177 \item
{The System shall authenticate UserX's email and password and checks if UserX is active.} 178 178 {The user can navigate the site and see their data.}
\item 179 179 \end{itemize}
{The System shall receive the credentials and display the ``Add Class'' page to the User.} 180 180
\end{enumerate} 181 181 \item[Trigger:]{UserX wants to view, add, or create cards for a class or classes.}
\item [Expected Result:] 182 182
{The User is brought to the page ``Add Class''.}\\ 183 183 \item[Workflow:]
184 184 \begin{enumerate}
\item [Alternate Workflow:] 185 185 \itemsep1pt\parskip0pt\parsep0pt
\begin{enumerate} 186 186 \item
\item 187 187 {UserX shall enter their email ``UserX@flashy.cards'' and password ``mynameisuserx''.}
{UserX accidentally puts in the wrong credentials and clicks the ``Login'' button.} 188 188 \item
\item 189 189 {The System shall authenticate UserX's email and password and checks if UserX is active.}
{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 \item
\end {enumerate} 191 191 {The System shall receive the credentials and display the ``Add Class'' page to the User.}
192 192 \end{enumerate}
\item [Expected Result:] 193 193 \item [Expected Result:]
{The User is not able to login.} \\ 194 194 {The User is brought to the page ``Add Class''.}\\
195 195
\end{description} 196 196 \item [Alternate Workflow A:]
\newpage 197 197 \begin{enumerate}
198 198 \item
{} 199 199 {UserX accidentally puts in the credentials ``UserX@flashy.cards'',
200 200 ``hahahaha'' and clicks the ``Login'' button.}
\subsection{[A3] Add a Class} 201 201 \item
\begin{description} 202 202 {The System shows UserX the site login page with a message reading
\item[Description:]{This test case outlines the presentation layer step 203 203 ``Invalid username or password!!''.}
process of a user adding a class.} 204 204 \end {enumerate}
205 205
\item[Desired Outcome:]{The class shall be linked with the student's account 206 206 \item [Expected Result:]
and the student shall have the ability to read and publish flashcards 207 207 {The User is not able to login.} \\
for this class.} 208 208
209 209 \item [Alternate Workflow B:]
\item[User Goals:]{The User wants to publish flashcards for this class and 210 210 \begin{enumerate}
read the flashcards for this class that are published by other users.} 211 211 \item
212 212 {UserX accidentally puts in the credentials ``NotUserX@flashy.cards'',
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} 213 213 ``mynameisuserx'' and clicks the ``Login'' button.}
\\ 214 214 \item
215 215 {The System shows UserX the site login page with a message reading
\item[Priority Level:]{``Must''} 216 216 ``Invalid username or password!!''.}
217 217 \end {enumerate}
\item[Status:]{Implemented} 218 218
219 219 \item [Expected Result:]
\item[Preconditions:] 220 220 {The User is not able to login.} \\
\begin{itemize} 221 221
\itemsep1pt\parskip0pt\parsep0pt 222 222 \item [Alternate Workflow C:]
\item 223 223 \begin{enumerate}
{The User is logged in as UserX.} 224 224 \item
\item 225 225 {UserX accidentally puts in the credentials ``theflash@flashy.cards'',
{The User is whitelisted for class TEST 101.} 226 226 ``MyNameIsUserX'' and clicks the ``Login'' button.}
\item 227 227 \item
{The User is not whitelisted for class TEST 102.} 228 228 {The System shows UserX the site login page with a message reading
\item 229 229 ``Invalid username or password!!''.}
{The class TEST 103 has no whitelist.} 230 230 \end {enumerate}
\end{itemize} 231 231
232 232 \item [Expected Result:]
\item[Postconditions:] 233 233 {The User is not able to login.} \\
\begin{itemize} 234 234
\itemsep1pt\parskip0pt\parsep0pt 235 235 \end{description}
\item 236 236 \newpage
{The User can read the flashcards being published for the class and 237 237
add them to their deck.} 238 238 {}
\item 239 239
{The User can publish flashcards to be viewed and added by other users 240 240 \subsection{[A3] Add a Class}
in the same class.} 241 241 \begin{description}
\end{itemize} 242 242 \item[Description:]{This test case outlines the presentation layer step
243 243 process of a user adding a class.}
\item[Trigger:]{UserX wants to view the Live Feed and have a flashcard deck for a class.} 244 244
245 245 \item[Desired Outcome:]{The class shall be linked with the student's account
\item[Workflow:] 246 246 and the student shall have the ability to read and publish flashcards
\begin{enumerate} 247 247 for this class.}
\itemsep1pt\parskip0pt\parsep0pt 248 248
\item 249 249 \item[User Goals:]{The User wants to publish flashcards for this class and
{UserX shall click ``Add Class'' on the classes dropdown from the navigation bar.} 250 250 read the flashcards for this class that are published by other users.}
\item 251 251
{The System shall show the user ``Add Class'' page.} 252 252 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login}
\item 253 253 \\
{UserX shall begin to type ``TEST 101''.} 254 254
\item 255 255 \item[Priority Level:]{``Must''}
{The System shall show suggestions as a user types.} 256 256
\item 257 257 \item[Status:]{Implemented}
{The System shall check if there is a whitelist for each class in the suggestions.} 258 258
\item 259 259 \item[Preconditions:]
{The System shall ensure that UserX is on the whitelist for each section.} 260 260 \begin{itemize}
\item 261 261 \itemsep1pt\parskip0pt\parsep0pt
{UserX shall click on ``TEST 101'', which should not have a lock icon.} 262 262 \item
\item 263 263 {The User is logged in as UserX.}
{UserX shall click on the ``Add'' button.} 264 264 \item
\item 265 265 {The User is whitelisted for class TEST 101.}
{The System shall add UserX to the specified class TEST 101.} 266 266 \item
\end{enumerate} 267 267 {The User is not whitelisted for class TEST 102.}
268 268 \item
\item[Expected Result:] {UserX has added the section and sees the Live Feed 269 269 {The class TEST 103 has no whitelist.}
for TEST 101.} 270 270 \end{itemize}
271 271
\item[Alternate Workflow A:] 272 272 \item[Postconditions:]
\begin{enumerate} 273 273 \begin{itemize}
\setcounter{enumi}{3} 274 274 \itemsep1pt\parskip0pt\parsep0pt
\itemsep1pt\parskip0pt\parsep0pt 275 275 \item
\item 276 276 {The User can read the flashcards being published for the class and
{UserX shall begin to type ``TEST 102''.} 277 277 add them to their deck.}
\item 278 278 \item
{The System shall show suggestions as a user types.} 279 279 {The User can publish flashcards to be viewed and added by other users
\item 280 280 in the same class.}
{The System shall check if there is a whitelist for each class in the suggestions.} 281 281 \end{itemize}
\item 282 282
{The System shall see that UserX is not on the whitelist.} 283 283 \item[Trigger:]{UserX wants to view the Live Feed and have a flashcard deck for a class.}
\item 284 284
{UserX shall see a lock icon in the suggestions for TEST 102.} 285 285 \item[Workflow:]
\item 286 286 \begin{enumerate}
{UserX shall click on ``TEST 102'', which has a lock icon.} 287 287 \itemsep1pt\parskip0pt\parsep0pt
\item 288 288 \item
{The System shall disable the ``Add'' button.} 289 289 {UserX shall click ``Add Class'' on the classes dropdown from the navigation bar.}
\end{enumerate} 290 290 \item
291 291 {The System shall show the user ``Add Class'' page.}
\item[Expected Result:] {UserX cannot add the specified TEST 102 and cannot 292 292 \item
view contents related to this class.} 293 293 {UserX shall begin to type ``TEST 101''.}
294 294 \item
\item[Alternate Workflow B:] 295 295 {The System shall show suggestions as a user types.}
\begin{enumerate} 296 296 \item
\setcounter{enumi}{3} 297 297 {The System shall check if there is a whitelist for each class in the suggestions.}
\itemsep1pt\parskip0pt\parsep0pt 298 298 \item
\item 299 299 {The System shall ensure that UserX is on the whitelist for each section.}
{UserX shall begin to type ``TEST 103''.} 300 300 \item
\item 301 301 {UserX shall click on ``TEST 101'', which should not have a lock icon.}
{The System shall show suggestions as UserX types.} 302 302 \item
\item 303 303 {UserX shall click on the ``Add'' button.}
{The System shall check if there is a whitelist for each class in the suggestions.} 304 304 \item
\item 305 305 {The System shall add UserX to the specified class TEST 101.}
{The System shall see there is no whitelist for TEST 103.} 306 306 \end{enumerate}
\item 307 307
{UserX shall click on ``TEST 103'', which should not have a lock icon.} 308 308 \item[Expected Result:] {UserX has added the section and sees the Live Feed
\item 309 309 for TEST 101.}
{UserX shall click on the ``Add'' button.} 310 310
\item 311 311 \item[Alternate Workflow A:]
{The System shall add UserX to TEST 103.} 312 312 \begin{enumerate}
\end{enumerate} 313 313 \setcounter{enumi}{3}
314 314 \itemsep1pt\parskip0pt\parsep0pt
\item[Expected Result:] {UserX has added the section and sees the Live Feed 315 315 \item
for TEST 103.} 316 316 {UserX shall begin to type ``TEST 102''.}
\end{description} 317 317 \item
\newpage 318 318 {The System shall show suggestions as a user types.}
319 319 \item
{} 320 320 {The System shall check if there is a whitelist for each class in the suggestions.}
321 321 \item
\subsection{[A4] Drop a Class} 322 322 {The System shall see that UserX is not on the whitelist.}
323 323 \item
\begin{description} 324 324 {UserX shall see a lock icon in the suggestions for TEST 102.}
\item[Description:]{This test case outlines the presentation layer step process of a user dropping a class.} 325 325 \item
326 326 {UserX shall click on ``TEST 102'', which has a lock icon.}
\item[Desired Outcome:]{The User has dropped the class and no longer needs 327 327 \item
access to the flashcards for the dropped class. They can no longer 328 328 {The System shall disable the ``Add'' button.}
see the flashcards associated to the class that they dropped.} 329 329 \end{enumerate}
330 330
\item[User Goals:]{The User shall not have access to a class and the 331 331 \item[Expected Result:] {UserX cannot add the specified TEST 102 and cannot
flashcards associated with that class. They will no longer see the class 332 332 view contents related to this class.}
listed in their list of ``Enrolled Classes''.} 333 333
334 334 \item[Alternate Workflow B:]
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class} 335 335 \begin{enumerate}
\\ 336 336 \setcounter{enumi}{3}
337 337 \itemsep1pt\parskip0pt\parsep0pt
\item[Priority Level:]{``Should''} 338 338 \item
339 339 {UserX shall begin to type ``TEST 103''.}
\item[Status:]{Implemented} 340 340 \item
341 341 {The System shall show suggestions as UserX types.}
\item[Preconditions:] 342 342 \item
\begin{itemize} 343 343 {The System shall check if there is a whitelist for each class in the suggestions.}
\itemsep1pt\parskip0pt\parsep0pt 344 344 \item
\item 345 345 {The System shall see there is no whitelist for TEST 103.}
{The User is logged in as UserX.} 346 346 \item
\item 347 347 {UserX shall click on ``TEST 103'', which should not have a lock icon.}
{The User has enrolled in TEST 101.} 348 348 \item
\item 349 349 {UserX shall click on the ``Add'' button.}
{The User is at Settings page.} 350 350 \item
\end{itemize} 351 351 {The System shall add UserX to TEST 103.}
352 352 \end{enumerate}
\item[Postconditions:] 353 353
\begin{itemize} 354 354 \item[Expected Result:] {UserX has added the section and sees the Live Feed
\itemsep1pt\parskip0pt\parsep0pt 355 355 for TEST 103.}
\item 356 356 \end{description}
{The User shall no longer have access to TEST 101, or associated flashcards.} 357 357 \newpage
\end{itemize} 358 358
359 359 {}
\item[Trigger:]{UserX wants to stop seeing the class's Live Feed and remove 360 360
all of their flashcards.} 361 361 \subsection{[A4] Drop a Class}
362 362
\item[Workflow:] 363 363 \begin{description}
\begin{enumerate} 364 364 \item[Description:]{This test case outlines the presentation layer step process of a user dropping a class.}
\itemsep1pt\parskip0pt\parsep0pt 365 365
\item 366 366 \item[Desired Outcome:]{The User has dropped the class and no longer needs
{UserX shall click ``X'' icon next to TEST 101 in ``Enrolled Classes'' table.} 367 367 access to the flashcards for the dropped class. They can no longer
\item 368 368 see the flashcards associated to the class that they dropped.}
{The System shall remove UserX from TEST 101.} 369 369
\item 370 370 \item[User Goals:]{The User shall not have access to a class and the
{The System shall display a toast indicating that a class has been dropped.} 371 371 flashcards associated with that class. They will no longer see the class
\end{enumerate} 372 372 listed in their list of ``Enrolled Classes''.}
373 373
\item[Expected Result:] {UserX no longer has access to any content related to TEST 101.} 374 374 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class}
\end{description} 375 375 \\
\newpage 376 376
377 377 \item[Priority Level:]{``Should''}
{} 378 378
379 379 \item[Status:]{Implemented}
\subsection{[A5] Password Change} 380 380
381 381 \item[Preconditions:]
\begin{description} 382 382 \begin{itemize}
\item[Description:]{The User shall be able to change the password for their 383 383 \itemsep1pt\parskip0pt\parsep0pt
account in the account settings. This requires that they are logged in.} 384 384 \item
385 385 {The User is logged in as UserX.}
\item[Desired Outcome:]{The User's password shall be changed and the user 386 386 \item
shall be able to log in with the new password in the future.} 387 387 {The User has enrolled in TEST 101.}
388 388 \item
\item[User Goals:]{The User wants to use a different password in the future.} 389 389 {The User is at Settings page.}
390 390 \end{itemize}
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} 391 391
\\ 392 392 \item[Postconditions:]
393 393 \begin{itemize}
\item[Details:]{The user provides their current password and a new password 394 394 \itemsep1pt\parskip0pt\parsep0pt
in a form. If the current password is correct, the system updates their 395 395 \item
password to the requested new password.} 396 396 {The User shall no longer have access to TEST 101, or associated flashcards.}
397 397 \end{itemize}
\item[Priority Level:]{``Must''} 398 398
399 399 \item[Trigger:]{UserX wants to stop seeing the class's Live Feed and remove
\item[Status:]{Implemented} 400 400 all of their flashcards.}
401 401
\item[Preconditions:] 402 402 \item[Workflow:]
\begin{itemize} 403 403 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 404 404 \itemsep1pt\parskip0pt\parsep0pt
\item 405 405 \item
{The User is logged in as UserX.} 406 406 {UserX shall click ``X'' icon next to TEST 101 in ``Enrolled Classes'' table.}
\item 407 407 \item
{The User knows the current password (``oldPassword'').} 408 408 {The System shall remove UserX from TEST 101.}
\item 409 409 \item
{The User is at the Settings page.} 410 410 {The System shall display a toast indicating that a class has been dropped.}
\end{itemize} 411 411 \end{enumerate}
412 412
\item[Postconditions:] 413 413 \item[Expected Result:] {UserX no longer has access to any content related to TEST 101.}
\begin{itemize} 414 414 \end{description}
\itemsep1pt\parskip0pt\parsep0pt 415 415 \newpage
\item 416 416
{The User's password is changed} 417 417 {}
\item 418 418
{The User can log in with the new password} 419 419 \subsection{[A5] Password Change}
\end{itemize} 420 420
421 421 \begin{description}
\item[Trigger:]{UserX is dissatisfied with their current password and wishes 422 422 \item[Description:]{The User shall be able to change the password for their
to change it.} 423 423 account in the account settings. This requires that they are logged in.}
424 424
\item[Workflow:] 425 425 \item[Desired Outcome:]{The User's password shall be changed and the user
\begin{enumerate} 426 426 shall be able to log in with the new password in the future.}
\itemsep1pt\parskip0pt\parsep0pt 427 427
\item 428 428 \item[User Goals:]{The User wants to use a different password in the future.}
{UserX shall enter their current password ``oldPassword'' and the desired 429 429
new password ``newPassword'' (twice) in the ``Change Password'' form.} 430 430 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login}
\item 431 431 \\
{UserX shall click the ``Submit'' button.} 432 432
\item 433 433 \item[Details:]{The user provides their current password and a new password
{The System shall check UserX's current password.} 434 434 in a form. If the current password is correct, the system updates their
\item 435 435 password to the requested new password.}
{The System shall update the UserX's current password ``oldPassword'' to the new password ``newPassword''.} 436 436
\end{enumerate} 437 437 \item[Priority Level:]{``Must''}
438 438
\item[Expected Result:] {User's password is changed from ``oldPasswrd'' to ``newPassword''.} 439 439 \item[Status:]{Implemented}
\end{description} 440 440
\newpage 441 441 \item[Preconditions:]
442 442 \begin{itemize}
{} 443 443 \itemsep1pt\parskip0pt\parsep0pt
444 444 \item
\subsection{[A6] Password Reset} 445 445 {The User is logged in as UserX.}
446 446 \item
\begin{description} 447 447 {The User knows the current password (``oldPassword'').}
\item[Description:]{The User shall be able to reset their password without 448 448 \item
being logged in } 449 449 {The User is at the Settings page.}
450 450 \end{itemize}
\item[Desired Outcome:]{The User's password shall be changed to one that 451 451
they remember} 452 452 \item[Postconditions:]
\\ 453 453 \begin{itemize}
454 454 \itemsep1pt\parskip0pt\parsep0pt
\item[User Goals:]{The User does not know their current password but wants 455 455 \item
to log into the site} 456 456 {The User's password is changed}
457 457 \item
\item[Dependency Use Cases:]{[A1] User Registration} 458 458 {The User can log in with the new password}
\\ 459 459 \end{itemize}
460 460
\item[Details:]{The User provides their email in a password reset form. If 461 461 \item[Trigger:]{UserX is dissatisfied with their current password and wishes
the address is valid, the site sends a password reset link with a random 462 462 to change it.}
token to that address. If the address is invalid, the site does not send 463 463
a link. For security reasons, we do not reveal to the user whether the 464 464 \item[Workflow:]
email address was valid, and we expire the link after 24 hours. When a 465 465 \begin{enumerate}
user visits the link emailed to them, they are able to specify a new 466 466 \itemsep1pt\parskip0pt\parsep0pt
password in a form. When they submit the form, their password is updated 467 467 \item
if the token is correct. } 468 468 {UserX shall enter their current password ``oldPassword'' and the desired
469 469 new password ``newPassword'' (twice) in the ``Change Password'' form.}
\item[Priority Level:]{``Must''} 470 470 \item
471 471 {UserX shall click the ``Submit'' button.}
\item[Status]{Implemented} 472 472 \item
473 473 {The System shall check UserX's current password.}
\item[Preconditions:] 474 474 \item
\begin{itemize} 475 475 {The System shall update the UserX's current password ``oldPassword'' to the new password ``newPassword''.}
\itemsep1pt\parskip0pt\parsep0pt 476 476 \end{enumerate}
\item 477 477
{Account for UserX has been created.} 478 478 \item[Expected Result:] {User's password is changed from ``oldPasswrd'' to ``newPassword''.}
\end{itemize} 479 479 \end{description}
480 480 \newpage
\item[Postconditions:] 481 481
\begin{itemize} 482 482 {}
\itemsep1pt\parskip0pt\parsep0pt 483 483
\item 484 484 \subsection{[A6] Password Reset}
{UserX's password is changed.} 485 485
\item 486 486 \begin{description}
{UserX can log in with the new password.} 487 487 \item[Description:]{The User shall be able to reset their password without
\end{itemize} 488 488 being logged in }
489 489
\item[Trigger]{UserX forgot their password and wants to access the site.} 490 490 \item[Desired Outcome:]{The User's password shall be changed to one that
491 491 they remember}
\item[Workflow:] 492 492 \\
493 493
\begin{enumerate} 494 494 \item[User Goals:]{The User does not know their current password but wants
\itemsep1pt\parskip0pt\parsep0pt 495 495 to log into the site}
\item 496 496
{UserX shall click the ``Forgot Password'' hyperlink.} 497 497 \item[Dependency Use Cases:]{[A1] User Registration}
\item 498 498 \\
{The System shall prompt the user for their current email.} 499 499
\item 500 500 \item[Details:]{The User provides their email in a password reset form. If
{UserX shall submit their email ``UserX@flashy.cards''.} 501 501 the address is valid, the site sends a password reset link with a random
\item 502 502 token to that address. If the address is invalid, the site does not send
{The System shall check if an account exists with the email entered by UserX.} 503 503 a link. For security reasons, we do not reveal to the user whether the
\item 504 504 email address was valid, and we expire the link after 24 hours. When a
{The System shall create a new password reset token for UserX.} 505 505 user visits the link emailed to them, they are able to specify a new
\item 506 506 password in a form. When they submit the form, their password is updated
{The System shall send an email to UserX with a link containing the token and the 507 507 if the token is correct. }
user's ID.} 508 508
\item 509 509 \item[Priority Level:]{``Must''}
{UserX shall click the link in the email to visit /app/password\_reset.} 510 510
\item 511 511 \item[Status]{Implemented}
{The System shall render a form that will prompt the user for a new password.} 512 512
\item 513 513 \item[Preconditions:]
{UserX shall provide a new password, ``newPassword'', in the form.} 514 514 \begin{itemize}
\item 515 515 \itemsep1pt\parskip0pt\parsep0pt
{The System shall change the password associated with the user's email.} 516 516 \item
\item 517 517 {Account for UserX has been created.}
{UserX shall navigate back to the login page and enter ``UserX@flashy.cards'' 518 518 \end{itemize}
with the old password ``mynameisuserx''.} 519 519
\item 520 520 \item[Postconditions:]
{The System shall display ``Invalid username or password!''} 521 521 \begin{itemize}
\item 522 522 \itemsep1pt\parskip0pt\parsep0pt
{UserX shall login as ``UserX@flashy.cards'' with the password ``newPassword''.} 523 523 \item
\end{enumerate} 524 524 {UserX's password is changed.}
525 525 \item
\item[Expected Result:] {The login shall succeed.} 526 526 {UserX can log in with the new password.}
527 527 \end{itemize}
\item[Alternate Workflow:] 528 528
\begin{enumerate} 529 529 \item[Trigger]{UserX forgot their password and wants to access the site.}
\setcounter{enumi}{4} 530 530
\itemsep1pt\parskip0pt\parsep0pt 531 531 \item[Workflow:]
\item 532 532
{If no such account exists, the System shall display a modal display ``Cannot find account.'' to UserX.} 533 533 \begin{enumerate}
\end{enumerate} 534 534 \itemsep1pt\parskip0pt\parsep0pt
535 535 \item
\item[Expected Result:] {UserX's password will not be reset.} 536 536 {UserX shall click the ``Forgot Password'' hyperlink.}
\end{description} 537 537 \item
\newpage 538 538 {The System shall prompt the user for their current email.}
539 539 \item
{} 540 540 {UserX shall submit their email ``UserX@flashy.cards''.}
541 541 \item
\subsection{[A7] Student Prevented From Accessing A Restricted Course} 542 542 {The System shall check if an account exists with the email entered by UserX.}
543 543 \item
\begin{description} 544 544 {The System shall create a new password reset token for UserX.}
\item[Description:]{The User shall not be able to access a restricted course.} 545 545 \item
546 546 {The System shall send an email to UserX with a link containing the token and the
\item[Desired Outcome:]{The class will have limited access and only those 547 547 user's ID.}
users who are whitelisted may enroll in the class.} 548 548 \item
549 549 {UserX shall click the link in the email to visit /app/password\_reset.}
\item[User Goals:]{The instructor wants to limit access to his class so only 550 550 \item
the students who are actually in his class participate, and nobody 551 551 {The System shall render a form that will prompt the user for a new password.}
else.} 552 552 \item
553 553 {UserX shall provide a new password, ``newPassword'', in the form.}
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} 554 554 \item
\\ 555 555 {The System shall change the password associated with the user's email.}
556 556 \item
\item[Priority Level:]{``Should''} 557 557 {UserX shall navigate back to the login page and enter ``UserX@flashy.cards''
558 558 with the old password ``mynameisuserx''.}
\item[Status:]{Implemented} 559 559 \item
560 560 {The System shall display ``Invalid username or password!''}
\item[Preconditions:] 561 561 \item
\begin{itemize} 562 562 {UserX shall login as ``UserX@flashy.cards'' with the password ``newPassword''.}
\itemsep1pt\parskip0pt\parsep0pt 563 563 \end{enumerate}
\item 564 564
{UserX has valid instructor's account} 565 565 \item[Expected Result:] {The login shall succeed.}
\end{itemize} 566 566
567 567 \item[Alternate Workflow:]
\item[Postconditions:] 568 568 \begin{enumerate}
\begin{itemize} 569 569 \setcounter{enumi}{4}
\itemsep1pt\parskip0pt\parsep0pt 570 570 \itemsep1pt\parskip0pt\parsep0pt
\item 571 571 \item
{Only those users who were whitelisted may add the class.} 572 572 {If no such account exists, the System shall display a modal display ``Cannot find account.'' to UserX.}
\end{itemize} 573 573 \end{enumerate}
574 574
\item[Trigger:]{The instructor emails the administrator and requests to 575 575 \item[Expected Result:] {UserX's password will not be reset.}
limit access to his class.} 576 576 \end{description}
577 577 \newpage
\item[Workflow:] 578 578
\begin{enumerate} 579 579 {}
\itemsep1pt\parskip0pt\parsep0pt 580 580
\item 581 581 \subsection{[A7] Student Prevented From Accessing A Restricted Course}
{The instructor, ``INSTR1'', shall email the administrators from his UCSD email address 582 582
and requests to limit access to his course.} 583 583 \begin{description}
\item 584 584 \item[Description:]{The User shall not be able to access a restricted course.}
{ INSTR1 shall provide a list of 585 585
emails of the students that are to be whitelisted.} 586 586 \item[Desired Outcome:]{The class will have limited access and only those
\item 587 587 users who are whitelisted may enroll in the class.}
{The administrators shall visit a custom admin page, select the course, and 588 588
paste the list of emails.} 589 589 \item[User Goals:]{The instructor wants to limit access to his class so only
\item 590 590 the students who are actually in his class participate, and nobody
{The administrators shall submit the page directly to the System.} 591 591 else.}
\item 592 592
{The System shall create a WhitelistedAddress for each provided email, 593 593 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login}
attaching it to the section taught by INST1.} 594 594 \\
\item 595 595
{The System shall add any existing users whose email addresses appear 596 596 \item[Priority Level:]{``Should''}
in the whitelist to the class. } 597 597
\end{enumerate} 598 598 \item[Status:]{Implemented}
599 599
\item[Expected Result:] {A whitelist is added to a section.} 600 600 \item[Preconditions:]
\end{description} 601 601 \begin{itemize}
\newpage 602 602 \itemsep1pt\parskip0pt\parsep0pt
603 603 \item
{} 604 604 {UserX has valid instructor's account}
605 605 \end{itemize}
\subsection{[A8] User Logout} 606 606
607 607 \item[Postconditions:]
\begin{description} 608 608 \begin{itemize}
\item[Description:]{The User shall be able to log out of his/her account on 609 609 \itemsep1pt\parskip0pt\parsep0pt
the site.} 610 610 \item
611 611 {Only those users who were whitelisted may add the class.}
\item[Desired Outcome:]{The User's information and data will no longer be 612 612 \end{itemize}
accessible after logging out. } 613 613
614 614 \item[Trigger:]{The instructor emails the administrator and requests to
\item[User Goals:]{The User is done with his/her session of using the 615 615 limit access to his class.}
website, and wants to make sure others cannot access the data in his/her 616 616
account.} 617 617 \item[Workflow:]
618 618 \begin{enumerate}
\item[Dependency Use Cases:] {[A1] User Registration, [A2] User Login} 619 619 \itemsep1pt\parskip0pt\parsep0pt
\\ 620 620 \item
621 621 {The instructor, ``INSTR1'', shall email the administrators from his UCSD email address
\item[Priority Level:]{``Must''} 622 622 and requests to limit access to his course.}
623 623 \item
\item[Status:]{Implemented} 624 624 { INSTR1 shall provide a list of
625 625 emails of the students that are to be whitelisted.}
\item[Preconditions:]{The user is logged into their account.} 626 626 \item
627 627 {The administrators shall visit a custom admin page, select the course, and
\item[Postconditions:]{The user's data can no longer be accessed.} 628 628 paste the list of emails.}
629 629 \item
\item[Trigger:] 630 630 {The administrators shall submit the page directly to the System.}
631 631 \item
\item[Workflow:] 632 632 {The System shall create a WhitelistedAddress for each provided email,
633 633 attaching it to the section taught by INST1.}
\begin{enumerate} 634 634 \item
\itemsep1pt\parskip0pt\parsep0pt 635 635 {The System shall add any existing users whose email addresses appear
\item 636 636 in the whitelist to the class. }
{UserX shall click the ``Logout'' button.} 637 637 \end{enumerate}
\item 638 638
{The System shall logs out UserX.} 639 639 \item[Expected Result:] {A whitelist is added to a section.}
\item 640 640 \end{description}
{The System shall redirect UserX to the login page.} 641 641 \newpage
\end{enumerate} 642 642
643 643 {}
\item[Expected Result:] {User is logged out and is redirected to the login page.} 644 644
\end{description} 645 645 \subsection{[A8] User Logout}
\newpage 646 646
647 647 \begin{description}
{} 648 648 \item[Description:]{The User shall be able to log out of his/her account on
649 649 the site.}
\subsection{[A9] Contact Admin} 650 650
651 651 \item[Desired Outcome:]{The User's information and data will no longer be
\begin{description} 652 652 accessible after logging out. }
\item[Description]{The User shall be able to contact the admin.} 653 653
654 654 \item[User Goals:]{The User is done with his/her session of using the
\item[Desired Outcome]{The User shall send a message to the admin; the 655 655 website, and wants to make sure others cannot access the data in his/her
admin shall receive the message.} 656 656 account.}
657 657
\item[User Goals:]{The User sends a message to the admin.} 658 658 \item[Dependency Use Cases:] {[A1] User Registration, [A2] User Login}
659 659 \\
\item[Dependency Use Cases]{None} 660 660
\\ 661 661 \item[Priority Level:]{``Must''}
662 662
\item[Priority Level]{``Must''} 663 663 \item[Status:]{Implemented}
664 664
\item[Status]{Not Implemented and Deferred} 665 665 \item[Preconditions:]{The user is logged into their account.}
666 666
\item[Pre-conditions]{None.} 667 667 \item[Postconditions:]{The user's data can no longer be accessed.}
668 668
\item[Post-conditions]{The admin receives the user's message.} 669 669 \item[Trigger:]
670 670
\item[Trigger]{UserX wants to contact the administrators of our application.} 671 671 \item[Workflow:]
672 672
\item[Workflow] 673 673 \begin{enumerate}
\begin{enumerate} 674 674 \itemsep1pt\parskip0pt\parsep0pt
\itemsep1pt\parskip0pt\parsep0pt 675 675 \item
\item 676 676 {UserX shall click the ``Logout'' button.}
{The System shall display the admin email address on every page in the 677 677 \item
application.} 678 678 {The System shall logs out UserX.}
\end{enumerate} 679 679 \item
680 680 {The System shall redirect UserX to the login page.}
\item[Expected Result:] {The admin's email address can be seen by UserX on every page.} 681 681 \end{enumerate}
\end{description} 682 682
\newpage 683 683 \item[Expected Result:] {User is logged out and is redirected to the login page.}
684 684 \end{description}
{} 685 685 \newpage
686 686
\subsection{[A10] Configure Account Notifications} 687 687 {}
\begin{description} 688 688
\item[Description]{This test case outlines the presentation layering step process of a user configuring notification settings.} 689 689 \subsection{[A9] Contact Admin}
690 690
\item[Desired Outcome]{The User shall only receive notifications at the 691 691 \begin{description}
times that were specified.} 692 692 \item[Description]{The User shall be able to contact the admin.}
\\ 693 693
694 694 \item[Desired Outcome]{The User shall send a message to the admin; the
\item[User Goals]{The User shall not be bothered needlessly or at 695 695 admin shall receive the message.}
inconvenient times.} 696 696
697 697 \item[User Goals:]{The User sends a message to the admin.}
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login} 698 698
\\ 699 699 \item[Dependency Use Cases]{None}
700 700 \\
\item[Priority Level]{``Must''} 701 701
702 702 \item[Priority Level]{``Must''}
\item[Status]{Deferred} 703 703
704 704 \item[Status]{Not Implemented and Deferred}
\item[Preconditions:] 705 705
\begin{itemize} 706 706 \item[Pre-conditions]{None.}
\itemsep1pt\parskip0pt\parsep0pt 707 707
\item 708 708 \item[Post-conditions]{The admin receives the user's message.}
{The User is logged in as UserX.} 709 709
\end{itemize} 710 710 \item[Trigger]{UserX wants to contact the administrators of our application.}
711 711
\item[Postconditions:] 712 712 \item[Workflow]
\begin{itemize} 713 713 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 714 714 \itemsep1pt\parskip0pt\parsep0pt
\item 715 715 \item
{User only receive notifications at specified times} 716 716 {The System shall display the admin email address on every page in the
\end{itemize} 717 717 application.}
718 718 \end{enumerate}
\item[Trigger]{UserX wants to change their notification settings} 719 719
720 720 \item[Expected Result:] {The admin's email address can be seen by UserX on every page.}
\item[Workflow] 721 721 \end{description}
\begin{enumerate} 722 722 \newpage
\itemsep1pt\parskip0pt\parsep0pt 723 723
\item 724 724 {}
{UserX shall select ``Settings'' button from the top header.} 725 725
\item 726 726 \subsection{[A10] Configure Account Notifications}
{The System shall display a settings screen.} 727 727 \begin{description}
\item 728 728 \item[Description]{This test case outlines the presentation layering step process of a user configuring notification settings.}
{UserX shall change the notification timing to 1 min.} 729 729
\item 730 730 \item[Desired Outcome]{The User shall only receive notifications at the
{UserX shall click ``Save Settings'' button.} 731 731 times that were specified.}
\item 732 732 \\
{The System shall display a message confirming the settings are saved.} 733 733
\item 734 734 \item[User Goals]{The User shall not be bothered needlessly or at
{The System shall save notification settings to the user's attributes.} 735 735 inconvenient times.}
\end{enumerate} 736 736
737 737 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login}
\item[Expected Result:]{UserX shall be notified at least as slow as 1 min.} 738 738 \\
\end{description} 739 739
\newpage 740 740 \item[Priority Level]{``Must''}
741 741
{} 742 742 \item[Status]{Deferred}
743 743
\section{Flashcards} 744 744 \item[Preconditions:]
\subsection{[F1] Push Flashcard} 745 745 \begin{itemize}
746 746 \itemsep1pt\parskip0pt\parsep0pt
\begin{description} 747 747 \item
\item[Description:]{This test case outlines the presentation layer step 748 748 {The User is logged in as UserX.}
process of a User contributing a flashcard to the live feed and to their deck.} 749 749 \end{itemize}
750 750
\item[Desired Outcome:]{The User shall have the flashcard added to their own deck 751 751 \item[Postconditions:]
and the live feed.} 752 752 \begin{itemize}
\\ 753 753 \itemsep1pt\parskip0pt\parsep0pt
754 754 \item
\item[User Goals:]{The User will see their flashcard in their deck and the 755 755 {User only receive notifications at specified times}
flashcard will be shared with others.} 756 756 \end{itemize}
757 757
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class} 758 758 \item[Trigger]{UserX wants to change their notification settings}
\\ 759 759
760 760 \item[Workflow]
\item[Priority Level:]{``Must''} 761 761 \begin{enumerate}
762 762 \itemsep1pt\parskip0pt\parsep0pt
\item[Status:]{Implemented} 763 763 \item
764 764 {UserX shall select ``Settings'' button from the top header.}
\item[Preconditions:] 765 765 \item
\begin{itemize} 766 766 {The System shall display a settings screen.}
\itemsep1pt\parskip0pt\parsep0pt 767 767 \item
\item 768 768 {UserX shall change the notification timing to 1 min.}
{The User is logged as UserX.} 769 769 \item
\item 770 770 {UserX shall click ``Save Settings'' button.}
{The User is logged in a different browser session as UserY.} 771 771 \item
\item 772 772 {The System shall display a message confirming the settings are saved.}
{UserX and UserY have added the class TEST 101.} 773 773 \item
\item 774 774 {The System shall save notification settings to the user's attributes.}
{UserX and UserY are on the live feed for TEST 101.} 775 775 \end{enumerate}
\end{itemize} 776 776
777 777 \item[Expected Result:]{UserX shall be notified at least as slow as 1 min.}
\item[Postconditions:] 778 778 \end{description}
\begin{itemize} 779 779 \newpage
\itemsep1pt\parskip0pt\parsep0pt 780 780
\item 781 781 {}
{UserX has flashcard added to their deck.} 782 782
\item 783 783 \section{Flashcards}
{The Flashcard is shown in the live feed.} 784 784 \subsection{[F1] Push Flashcard}
\item 785 785
{UserY and other users can add this flashcard to their decks.} 786 786 \begin{description}
\end{itemize} 787 787 \item[Description:]{This test case outlines the presentation layer step
788 788 process of a User contributing a flashcard to the live feed and to their deck.}
\item[Trigger:]{UserX wants to contribute a flashcard to the class TEST 101.} 789 789
790 790 \item[Desired Outcome:]{The User shall have the flashcard added to their own deck
\item[Workflow:] 791 791 and the live feed.}
\begin{enumerate} 792 792 \\
\itemsep1pt\parskip0pt\parsep0pt 793 793
\item {UserX has clicked the circular plus button (``Compose'' button) in 794 794 \item[User Goals:]{The User will see their flashcard in their deck and the
the lower right corner of the live feed.} 795 795 flashcard will be shared with others.}
\item 796 796
{The System shall present a modal with a text box.} 797 797 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User Login, [A3] Add a Class}
\item 798 798 \\
{UserX shall select the input field of the modal and type ``The rain in Spain stays mainly in the plain''.} 799 799
\item 800 800 \item[Priority Level:]{``Must''}
{UserX shall select the ``Contribute'' button in the modal.} 801 801
\item 802 802 \item[Status:]{Implemented}
{The System shall add the new card containing the text ``The rain in Spain stays mainly in 803 803
the plain'' to the feed of each user enrolled in ``TEST 101''.} 804 804 \item[Preconditions:]
\item 805 805 \begin{itemize}
{UserY shall see the card appear in their feed within a minute (See Notes).} 806 806 \itemsep1pt\parskip0pt\parsep0pt
\item 807 807 \item
{The System shall hide the modal from UserX.} 808 808 {The User is logged as 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 User is logged in a different browser session as UserY.}
\end{enumerate} 811 811 \item
812 812 {UserX and UserY have added the class TEST 101.}
\item[Expected Result:] {UserX will have the new flashcard in their deck. 813 813 \item
For UserX, the new flashcard will have a checkmark, indicating that the card 814 814 {UserX and UserY are on the live feed for TEST 101.}
is in their deck and a pencil icon on top right to indicate UserX as 815 815 \end{itemize}
the author of the flashcard. The new flashcard will show up on UserY's 816 816
live feed on class TEST 101 without checkmark and pencil icon.} 817 817 \item[Postconditions:]
818 818 \begin{itemize}
\item[Alternative Workflow:] 819 819 \itemsep1pt\parskip0pt\parsep0pt
\begin{enumerate} 820 820 \item
\setcounter{enumi}{3} 821 821 {UserX has flashcard added to their deck.}
\itemsep1pt\parskip0pt\parsep0pt 822 822 \item
\item 823 823 {The Flashcard is shown in the live feed.}
{UserX shall user their cursor to select the word Spain in the text box, then click the ``Blank Word'' button.} 824 824 \item
\item 825 825 {UserY and other users can add this flashcard to their decks.}
{The System shall bold the word Spain.} 826 826 \end{itemize}
\item 827 827
{UserX shall use the cursor to select the word ``plain'' in the text box, then click the ``Blank Word'' button.} 828 828 \item[Trigger:]{UserX wants to contribute a flashcard to the class TEST 101.}
\item 829 829
{The System shall bold the word plain.} 830 830 \item[Workflow:]
\item 831 831 \begin{enumerate}
{UserX shall click the ``Contribute'' button in the modal.} 832 832 \itemsep1pt\parskip0pt\parsep0pt
\item 833 833 \item {UserX has clicked the circular plus button (``Compose'' button) in
{The System shall add the new flashcard containing the text ``The rain in \textbf{Spain} stays mainly in the \textbf{plain}'' to the feed of each user enrolled in TEST.} 834 834 the lower right corner of the live feed.}
\item 835 835 \item
{UserY shall view the live feed and within a minute see the new flashcard appear with ``Spain'' and ``plain'' bolded.} 836 836 {The System shall present a modal with a text box.}
\end{enumerate} 837 837 \item
838 838 {UserX shall select the input field of the modal and type ``The rain in Spain stays mainly in the plain''.}
\item[Expected Result:] { 839 839 \item
UserX will have the new flashcard with the words ``Spain'' and ``plain'' bolded in their deck. 840 840 {UserX shall select the ``Contribute'' button in the modal.}
For UserX, the new flashcard will have a checkmark, 841 841 \item
indicating that the card is in their deck and a pencil icon on 842 842 {The System shall add the new card containing the text ``The rain in Spain stays mainly in
top right to indicate UserX as the author of the flashcard. 843 843 the plain'' to the feed of each user enrolled in ``TEST 101''.}
The new flashcard will show up on UserY's live feed on class TEST 101 844 844 \item
without checkmark and pencil icon.} 845 845 {UserY shall see the card appear in their feed within a minute (See Notes).}
846 846 \item
\item[Alternative Workflow:] 847 847 {The System shall hide the modal from UserX.}
\begin{enumerate} 848 848 \item
\setcounter{enumi}{2} 849 849 {The flashcard shall be included in the UserX's deck.(c.f. Note about simultaneous browser session).}
\itemsep1pt\parskip0pt\parsep0pt 850 850 \end{enumerate}
\item 851 851
{UserX shall select the input field of the modal and type five blank spaces.} 852 852 \item[Expected Result:] {UserX will have the new flashcard in their deck.
\item 853 853 For UserX, the new flashcard will have a checkmark, indicating that the card
{UserX shall click the ``Contribute'' button in the dialog.} 854 854 is in their deck and a pencil icon on top right to indicate UserX as
\end{enumerate} 855 855 the author of the flashcard. The new flashcard will show up on UserY's
856 856 live feed on class TEST 101 without checkmark and pencil icon.}
\item[Expected Result:] {Blank flashcard will not be added to UserX's deck or to the live feed of TEST 101.} 857 857
858 858 \item[Alternative Workflow:]
\item[Alternative Workflow:] 859 859 \begin{enumerate}
\begin{enumerate} 860 860 \setcounter{enumi}{3}
\setcounter{enumi}{2} 861 861 \itemsep1pt\parskip0pt\parsep0pt
\itemsep1pt\parskip0pt\parsep0pt 862 862 \item
\item 863 863 {UserX shall user their cursor to select the word Spain in the text box, then click the ``Blank Word'' button.}
{UserX shall select the input field and type ``Test''.} 864 864 \item
\item 865 865 {The System shall bold the word Spain.}
{UserX shall click the ``Contribute'' button in the dialog.} 866 866 \item
\end{enumerate} 867 867 {UserX shall use the cursor to select the word ``plain'' in the text box, then click the ``Blank Word'' button.}
868 868 \item
\item[Expected Result:] 869 869 {The System shall bold the word plain.}
{ Flashcard with input not meeting the length restriction will not be added to 870 870 \item
UserX's deck or to the live feed of TEST 101.} 871 871 {UserX shall click the ``Contribute'' button in the modal.}
872 872 \item
\end{description} 873 873 {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.}
\newpage 874 874 \item
875 875 {UserY shall view the live feed and within a minute see the new flashcard appear with ``Spain'' and ``plain'' bolded.}
{} 876 876 \end{enumerate}
877 877
\subsection{[F2] Edit Flashcard} 878 878 \item[Expected Result:] {
879 879 UserX will have the new flashcard with the words ``Spain'' and ``plain'' bolded in their deck.
\begin{description} 880 880 For UserX, the new flashcard will have a checkmark,
\item[Description:]{This test case outlines the presentation layering step process of a user editting a flashcard.} 881 881 indicating that the card is in their deck and a pencil icon on
882 882 top right to indicate UserX as the author of the flashcard.
\item[Desired Outcome:]{Flashcard is edited and saved appropriately} 883 883 The new flashcard will show up on UserY's live feed on class TEST 101
\\ 884 884 without checkmark and pencil icon.}
885 885
\item[User Goals:]{The User shall be able to change the text and the blanked words on a flashcard.} 886 886 \item[Alternative Workflow:]
887 887 \begin{enumerate}
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 888 888 \setcounter{enumi}{2}
Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull Flashcard} 889 889 \itemsep1pt\parskip0pt\parsep0pt
890 890 \item
\item[Priority Level:]{``Should''} 891 891 {UserX shall select the input field of the modal and type five blank spaces.}
892 892 \item
\item[Status:]{Implemented} 893 893 {UserX shall click the ``Contribute'' button in the dialog.}
894 894 \end{enumerate}
\item[Preconditions:] 895 895
\begin{itemize} 896 896 \item[Expected Result:] {Blank flashcard will not be added to UserX's deck or to the live feed of TEST 101.}
\itemsep1pt\parskip0pt\parsep0pt 897 897
\item 898 898 \item[Alternative Workflow:]
{The User is logged in as UserX.} 899 899 \begin{enumerate}
\item 900 900 \setcounter{enumi}{2}
{The User is logged in a different browser session as UserY.} 901 901 \itemsep1pt\parskip0pt\parsep0pt
\item 902 902 \item
{User has added the class TEST 101.} 903 903 {UserX shall select the input field and type ``Test''.}
\item 904 904 \item
{TEST 101 contains the flashcard ``This is made for \textbf{edit}'' 905 905 {UserX shall click the ``Contribute'' button in the dialog.}
, which was made by other user and is not in UserX's deck.} 906 906 \end{enumerate}
\item 907 907
{UserX has the flashcard ``I have made an error'', which was created by UserX, in their deck.} 908 908 \item[Expected Result:]
\end{itemize} 909 909 { Flashcard with input not meeting the length restriction will not be added to
910 910 UserX's deck or to the live feed of TEST 101.}
\item[Postconditions:] 911 911
\begin{itemize} 912 912 \end{description}
\itemsep1pt\parskip0pt\parsep0pt 913 913 \newpage
\item 914 914
{The selected flashcard is edited} 915 915 {}
\end{itemize} 916 916
917 917 \subsection{[F2] Edit Flashcard}
\item[Trigger:]{The User wants to edit a card.} 918 918
919 919 \begin{description}
\item[Workflow:] 920 920 \item[Description:]{This test case outlines the presentation layering step process of a user editting a flashcard.}
\begin{enumerate} 921 921
\itemsep1pt\parskip0pt\parsep0pt 922 922 \item[Desired Outcome:]{Flashcard is edited and saved appropriately}
\item 923 923 \\
{UserX shall hover the cursor over the flashcard ``this is made for \textbf{edit}''.} 924 924
\item 925 925 \item[User Goals:]{The User shall be able to change the text and the blanked words on a flashcard.}
{UserX shall click the edit button on bottom left of the hovered flashcard. The blue edit button looks like a pencil slanted writing on a paper.} 926 926
\item 927 927 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
{The System shall present a modal that contains the text of the selected flashcard.} 928 928 Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull Flashcard}
\item 929 929
{UserX shall be able to change the text to ``Edit has been made''.} 930 930 \item[Priority Level:]{``Should''}
\item 931 931
{UserX shall click 'Save'} 932 932 \item[Status:]{Implemented}
\item 933 933
{The System shall hide the modal from UserX.} 934 934 \item[Preconditions:]
\end{enumerate} 935 935 \begin{itemize}
936 936 \itemsep1pt\parskip0pt\parsep0pt
\item[Expected Results:]{The selected flashcard's text shall be changed to ``Edit has been made''.} 937 937 \item
938 938 {The User is logged in as UserX.}
\item[Alternative Workflow A:] 939 939 \item
940 940 {The User is logged in a different browser session as UserY.}
\begin{enumerate} 941 941 \item
\itemsep1pt\parskip0pt\parsep0pt 942 942 {User has added the class TEST 101.}
\item 943 943 \item
{UserX shall move the cursor over the flash card ``this is made for edit2''.} 944 944 {TEST 101 contains the flashcard ``This is made for \textbf{edit}''
\item 945 945 , which was made by other user and is not in UserX's deck.}
{UserX shall click the edit button on bottom left of the selected flashcard.} 946 946 \item
\item 947 947 {UserX has the flashcard ``I have made an error'', which was created by UserX, in their deck.}
{The System shall present a modal that contains the text of the selected flashcard.} 948 948 \end{itemize}
\item 949 949
{UserX shall be able to change the bolded text from ``edit2'' to ``fun'' by highlighting the words and click blank words.} 950 950 \item[Postconditions:]
\item 951 951 \begin{itemize}
{UserX shall click 'Save'} 952 952 \itemsep1pt\parskip0pt\parsep0pt
\item 953 953 \item
{The System shall hide the modal from UserX.} 954 954 {The selected flashcard is edited}
\item 955 955 \end{itemize}
{The selected flashcard's blanked words shall be changed to ``fun''.} 956 956
\end{enumerate} 957 957 \item[Trigger:]{The User wants to edit a card.}
958 958
\item[Expected Result:]{The selected flashcard's blanked words shall be changed to ``fun''.} 959 959 \item[Workflow:]
960 960 \begin{enumerate}
\item[Alternative Workflow B:] 961 961 \itemsep1pt\parskip0pt\parsep0pt
962 962 \item
\begin{enumerate} 963 963 {UserX shall hover the cursor over the flashcard ``this is made for \textbf{edit}''.}
\itemsep1pt\parskip0pt\parsep0pt 964 964 \item
\item 965 965 {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.}
{UserX shall move the cursor over the flash card ``this is made for edit3''.} 966 966 \item
\item 967 967 {The System shall present a modal that contains the text of the selected flashcard.}
{UserX shall click the edit button on bottom left of the selected flashcard.} 968 968 \item
\item 969 969 {UserX shall be able to change the text to ``Edit has been made''.}
{The System shall present a modal that contains the text of the selected flashcard.} 970 970 \item
\item 971 971 {UserX shall click 'Save'}
{UserX shall be able the study date to 6/12.} 972 972 \item
\item 973 973 {The System shall hide the modal from UserX.}
{UserX shall click 'Save'} 974 974 \end{enumerate}
\item 975 975
{The System shall hide the modal from UserX.} 976 976 \item[Expected Results:]{The selected flashcard's text shall be changed to ``Edit has been made''.}
\end{enumerate} 977 977
978 978 \item[Alternative Workflow A:]
\item[Expected Result:]{The selected flashcard's study date shall be changed to 6/12.} 979 979
\end{description} 980 980 \begin{enumerate}
\newpage 981 981 \itemsep1pt\parskip0pt\parsep0pt
982 982 \item
{} 983 983 {UserX shall move the cursor over the flash card ``this is made for edit2''.}
984 984 \item
\subsection{[F3] Pull Flashcard} 985 985 {UserX shall click the edit button on bottom left of the selected flashcard.}
\begin{description} 986 986 \item
\item[Description:]{This test case outlines the presentation layering step 987 987 {The System shall present a modal that contains the text of the selected flashcard.}
process of a user pulling a flashcard.} 988 988 \item
989 989 {UserX shall be able to change the bolded text from ``edit2'' to ``fun'' by highlighting the words and click blank words.}
\item[Desired Outcome:]{The User shall have the flashcard added to their deck.} 990 990 \item
\\ 991 991 {UserX shall click 'Save'}
992 992 \item
\item[User Goals:]{The User will be able to review that flashcard.} 993 993 {The System shall hide the modal from UserX.}
994 994 \item
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 995 995 {The selected flashcard's blanked words shall be changed to ``fun''.}
Login, [A3] Add a Class, [F1] Push Flashard} 996 996 \end{enumerate}
997 997
\item[Priority Level:]{``Must'' } 998 998 \item[Expected Result:]{The selected flashcard's blanked words shall be changed to ``fun''.}
999 999
\item[Status:]{Implemented} 1000 1000 \item[Alternative Workflow B:]
1001 1001
\item[Preconditions:] 1002 1002 \begin{enumerate}
\begin{itemize} 1003 1003 \itemsep1pt\parskip0pt\parsep0pt
\itemsep1pt\parskip0pt\parsep0pt 1004 1004 \item
\item 1005 1005 {UserX shall move the cursor over the flash card ``this is made for edit3''.}
{The User is logged in as UserX.} 1006 1006 \item
\item 1007 1007 {UserX shall click the edit button on bottom left of the selected flashcard.}
{User has registered for class TEST 101.} 1008 1008 \item
\item 1009 1009 {The System shall present a modal that contains the text of the selected flashcard.}
{User is at live feed for TEST 101.} 1010 1010 \item
\item 1011 1011 {UserX shall be able the study date to 6/12.}
{That flashcard with the text ``Pull me'' is in the Live Feed of class TEST 101.} 1012 1012 \item
\end{itemize} 1013 1013 {UserX shall click 'Save'}
1014 1014 \item
\item[Postconditions:] 1015 1015 {The System shall hide the modal from UserX.}
\begin{itemize} 1016 1016 \end{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1017 1017
\item 1018 1018 \item[Expected Result:]{The selected flashcard's study date shall be changed to 6/12.}
{UserX shall have that flashcard with the text ``Pull me'' added to their deck} 1019 1019 \end{description}
\item 1020 1020 \newpage
{UserX shall be able to review this flashcard later} 1021 1021
\end{itemize} 1022 1022 {}
1023 1023
\item[Trigger:]{UserX wants to add a flashcard to their deck to study it.} 1024 1024 \subsection{[F3] Pull Flashcard}
1025 1025 \begin{description}
\item[Workflow:] 1026 1026 \item[Description:]{This test case outlines the presentation layering step
1027 1027 process of a user pulling a flashcard.}
\begin{enumerate} 1028 1028
\itemsep1pt\parskip0pt\parsep0pt 1029 1029 \item[Desired Outcome:]{The User shall have the flashcard added to their deck.}
\item 1030 1030 \\
{UserX shall choose the flashcard with the text ``Pull me'' from the 1031 1031
class TEST 101 feed and hover their cursor over it.} 1032 1032 \item[User Goals:]{The User will be able to review that flashcard.}
\item 1033 1033
{The System shall present buttons on mouseover.} 1034 1034 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
\item 1035 1035 Login, [A3] Add a Class, [F1] Push Flashard}
{UserX shall click on the large plus that appears over the flashcard with the text ``Pull me''.} 1036 1036
\item 1037 1037 \item[Priority Level:]{``Must'' }
{The System shall add the flashcard into UserX's deck. 1038 1038
A checkmark shall appear on top right corner of the flashcard.} 1039 1039 \item[Status:]{Implemented}
\item 1040 1040
{UserX shall click the ``Deck'' icon on the top left to enter their 1041 1041 \item[Preconditions:]
deck.} 1042 1042 \begin{itemize}
\item 1043 1043 \itemsep1pt\parskip0pt\parsep0pt
{UserX shall check that the card with the text ``Pull me'' has been added to their class 1044 1044 \item
TEST 101 deck.} 1045 1045 {The User is logged in as UserX.}
\end{enumerate} 1046 1046 \item
1047 1047 {User has registered for class TEST 101.}
\item[Expected Result:] {The flashcard with the text ``Pull me'' is in the class 1048 1048 \item
TEST 101 deck. If UserX hovers the cursor over the flashcard at the live feed of 1049 1049 {User is at live feed for TEST 101.}
TEST 101, the original placement of the large plus button has been changed to large minus button.} 1050 1050 \item
\end{description} 1051 1051 {That flashcard with the text ``Pull me'' is in the Live Feed of class TEST 101.}
\newpage 1052 1052 \end{itemize}
1053 1053
{} 1054 1054 \item[Postconditions:]
1055 1055 \begin{itemize}
\subsection{[F4] Flag Inappropriate Cards} 1056 1056 \itemsep1pt\parskip0pt\parsep0pt
1057 1057 \item
\begin{description} 1058 1058 {UserX shall have that flashcard with the text ``Pull me'' added to their deck}
\item[Description:]{This test case outlines the presentation layering step 1059 1059 \item
process of a user flagging a card they have deemed inappropriate.} 1060 1060 {UserX shall be able to review this flashcard later}
1061 1061 \end{itemize}
\item[Desired Outcome:]{The flashcard's inappropriateness variable is 1062 1062
adjusted.} 1063 1063 \item[Trigger:]{UserX wants to add a flashcard to their deck to study it.}
\\ 1064 1064
1065 1065 \item[Workflow:]
\item[User Goals:]{To note if a card should not belong in the class and 1066 1066
should not be displayed in the feed.} 1067 1067 \begin{enumerate}
1068 1068 \itemsep1pt\parskip0pt\parsep0pt
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1069 1069 \item
Login, [A3] Add a Class, [F1] Push Flashcard} 1070 1070 {UserX shall choose the flashcard with the text ``Pull me'' from the
1071 1071 class TEST 101 feed and hover their cursor over it.}
\item[Priority Level:]{``Should''} 1072 1072 \item
1073 1073 {The System shall present buttons on mouseover.}
\item[Status:]{Implemented} 1074 1074 \item
1075 1075 {UserX shall click on the large plus that appears over the flashcard with the text ``Pull me''.}
\item[Preconditions:] 1076 1076 \item
\begin{itemize} 1077 1077 {The System shall add the flashcard into UserX's deck.
\itemsep1pt\parskip0pt\parsep0pt 1078 1078 A checkmark shall appear on top right corner of the flashcard.}
\item 1079 1079 \item
{UserX has registered for a class TEST 101.} 1080 1080 {UserX shall click the ``Deck'' icon on the top left to enter their
\item 1081 1081 deck.}
{UserX is in the live feed for class TEST 101.} 1082 1082 \item
\item 1083 1083 {UserX shall check that the card with the text ``Pull me'' has been added to their class
{Flashcard with text ``TESTY FLASHY'' has been created for TEST 101.} 1084 1084 TEST 101 deck.}
\item 1085 1085 \end{enumerate}
{That flashcard ``TESTY FLASHY'' is in the Live Feed for TEST 101.} 1086 1086
\end{itemize} 1087 1087 \item[Expected Result:] {The flashcard with the text ``Pull me'' is in the class
1088 1088 TEST 101 deck. If UserX hovers the cursor over the flashcard at the live feed of
\item[Postconditions:] 1089 1089 TEST 101, the original placement of the large plus button has been changed to large minus button.}
\begin{itemize} 1090 1090 \end{description}
\itemsep1pt\parskip0pt\parsep0pt 1091 1091 \newpage
\item 1092 1092
{User shall have that flashcard added to their deck} 1093 1093 {}
\item 1094 1094
{User can review this flashcard later} 1095 1095 \subsection{[F4] Flag Inappropriate Cards}
\end{itemize} 1096 1096
1097 1097 \begin{description}
\item[Trigger:]{UserX wants to mark a card innapropriate.} 1098 1098 \item[Description:]{This test case outlines the presentation layering step
1099 1099 process of a user flagging a card they have deemed inappropriate.}
\item[Workflow:] 1100 1100
\begin{enumerate} 1101 1101 \item[Desired Outcome:]{The flashcard's inappropriateness variable is
\itemsep1pt\parskip0pt\parsep0pt 1102 1102 adjusted.}
\item 1103 1103 \\
{UserX shall choose the flashcard with the text ``TESTY FLASHY'' from the 1104 1104
feed and hover their cursor over it.} 1105 1105 \item[User Goals:]{To note if a card should not belong in the class and
\item 1106 1106 should not be displayed in the feed.}
{The System shall present buttons on mouseover.} 1107 1107
\item 1108 1108 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
{UserX shall click on the crossed out eye icon (Hide) that appears on the card.} 1109 1109 Login, [A3] Add a Class, [F1] Push Flashcard}
\item 1110 1110
{The System shall hide the card from UserX and display a toast, ``Card hidden! If the card was spammy or abusive you may also REPORT''.} 1111 1111 \item[Priority Level:]{``Should''}
\item 1112 1112
{UserX shall click the REPORT.} 1113 1113 \item[Status:]{Implemented}
\end{enumerate} 1114 1114
1115 1115 \item[Preconditions:]
\item[Expected Result:] {The System shall display a toast, ``Report successful: thanks for letting us know!''} 1116 1116 \begin{itemize}
\end{description} 1117 1117 \itemsep1pt\parskip0pt\parsep0pt
\newpage 1118 1118 \item
1119 1119 {UserX has registered for a class TEST 101.}
{} 1120 1120 \item
1121 1121 {UserX is in the live feed for class TEST 101.}
\subsection{[F5] Filter Flashcards} 1122 1122 \item
1123 1123 {Flashcard with text ``TESTY FLASHY'' has been created for TEST 101.}
\begin{description} 1124 1124 \item
\item[Description:]{This test case outlines the presentation layer process 1125 1125 {That flashcard ``TESTY FLASHY'' is in the Live Feed for TEST 101.}
of a user filtering existing flashcards to view only a specified subset.} 1126 1126 \end{itemize}
1127 1127
\item[Desired Outcome:]{The User shall see flashcards based on the filter 1128 1128 \item[Postconditions:]
options.} 1129 1129 \begin{itemize}
1130 1130 \itemsep1pt\parskip0pt\parsep0pt
\item[User Goals:]{The User can find what they are specifically looking 1131 1131 \item
for} 1132 1132 {User shall have that flashcard added to their deck}
1133 1133 \item
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1134 1134 {User can review this flashcard later}
Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull 1135 1135 \end{itemize}
Flashcard} 1136 1136
1137 1137 \item[Trigger:]{UserX wants to mark a card innapropriate.}
\item[Priority Level:]{``Should''} 1138 1138
1139 1139 \item[Workflow:]
\item[Status:]{Implemented} 1140 1140 \begin{enumerate}
1141 1141 \itemsep1pt\parskip0pt\parsep0pt
\item[Preconditions:] 1142 1142 \item
\begin{itemize} 1143 1143 {UserX shall choose the flashcard with the text ``TESTY FLASHY'' from the
\itemsep1pt\parskip0pt\parsep0pt 1144 1144 feed and hover their cursor over it.}
\item 1145 1145 \item
{User is logged in as UserX.} 1146 1146 {The System shall present buttons on mouseover.}
\item 1147 1147 \item
{UserX has registered for the class TEST 101.} 1148 1148 {UserX shall click on the crossed out eye icon (Hide) that appears on the card.}
\item 1149 1149 \item
{There exist flashcards in TEST 101 with the text ``apple'' and ``banana'' 1150 1150 {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''.}
for each week in the quarter.} 1151 1151 \item
\item 1152 1152 {UserX shall click the REPORT.}
{There exist flashcards in TEST 101 with the text ``orange'' that are hidden 1153 1153 \end{enumerate}
for each week in the quarter.} 1154 1154
\item 1155 1155 \item[Expected Result:] {The System shall display a toast, ``Report successful: thanks for letting us know!''}
{UserX is at Card List View for the class.} 1156 1156 \end{description}
\end{itemize} 1157 1157 \newpage
1158 1158
\item[Postconditions:] 1159 1159 {}
\begin{itemize} 1160 1160
\itemsep1pt\parskip0pt\parsep0pt 1161 1161 \subsection{[F5] Filter Flashcards}
\item 1162 1162
{User only sees flashcards pertaining to selected dates.} 1163 1163 \begin{description}
\end{itemize} 1164 1164 \item[Description:]{This test case outlines the presentation layer process
1165 1165 of a user filtering existing flashcards to view only a specified subset.}
\item[Trigger:]{User is looking for specific flashcards.} 1166 1166
1167 1167 \item[Desired Outcome:]{The User shall see flashcards based on the filter
\item[Workflow:] 1168 1168 options.}
\begin{enumerate} 1169 1169
\itemsep1pt\parskip0pt\parsep0pt 1170 1170 \item[User Goals:]{The User can find what they are specifically looking
\item 1171 1171 for}
{UserX shall deselect ``Week Nine'' from top.} 1172 1172
\item 1173 1173 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
{The System shall hide all cards from Week 9.} 1174 1174 Login, [A3] Add a Class, [F1] Push Flashcard, [F3] Pull
\item 1175 1175 Flashcard}
{UserX shall search for ``app'' in the search bar in the top right.} 1176 1176
\item 1177 1177 \item[Priority Level:]{``Should''}
{The System shall display only cards including text ``app''.} 1178 1178
\item 1179 1179 \item[Status:]{Implemented}
{UserX shall click ``Show Hidden'' button in the top left and clear 1180 1180
the text in the search box.} 1181 1181 \item[Preconditions:]
\item 1182 1182 \begin{itemize}
{The System shall display all cards, excluding those from Week 9.} 1183 1183 \itemsep1pt\parskip0pt\parsep0pt
\end{enumerate} 1184 1184 \item
1185 1185 {User is logged in as UserX.}
\item[Expected Result:] {UserX shall see 9 cards with text ``apple'', 9 cards with text ``banana'', and 9 cards with text ``orange'', distributed evenly among weeks.} 1186 1186 \item
\end{description} 1187 1187 {UserX has registered for the class TEST 101.}
\newpage 1188 1188 \item
1189 1189 {There exist flashcards in TEST 101 with the text ``apple'' and ``banana''
{} 1190 1190 for each week in the quarter.}
1191 1191 \item
\subsection{[F6] Blank Out Words in Flashcard} 1192 1192 {There exist flashcards in TEST 101 with the text ``orange'' that are hidden
1193 1193 for each week in the quarter.}
\begin{description} 1194 1194 \item
\item[Description:]{This test case outlines the presentation layer process 1195 1195 {UserX is at Card List View for the class.}
of the User to create keywords in a card they are pushing.} 1196 1196 \end{itemize}
1197 1197
\item[Desired Outcome:]{The blanked out words (visually bolded) in the 1198 1198 \item[Postconditions:]
flashcard notify the System that they are keywords.} 1199 1199 \begin{itemize}
1200 1200 \itemsep1pt\parskip0pt\parsep0pt
\item[User Goals:]{The User shall mark some words as keywords so the System 1201 1201 \item
may later quiz the User by blanking out one keyword at a time and having the 1202 1202 {User only sees flashcards pertaining to selected dates.}
User enter what they think the keyword is.} 1203 1203 \end{itemize}
1204 1204
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1205 1205 \item[Trigger:]{User is looking for specific flashcards.}
Login, [A3] Add a Class, [F1] Push Flashcard} 1206 1206
1207 1207 \item[Workflow:]
\item[Priority Level:]{``Must''} 1208 1208 \begin{enumerate}
1209 1209 \itemsep1pt\parskip0pt\parsep0pt
\item[Status:]{Implemented} 1210 1210 \item
1211 1211 {UserX shall deselect ``Week Nine'' from top.}
\item[Preconditions:] 1212 1212 \item
\begin{itemize} 1213 1213 {The System shall hide all cards from Week 9.}
\itemsep1pt\parskip0pt\parsep0pt 1214 1214 \item
\item 1215 1215 {UserX shall search for ``app'' in the search bar in the top right.}
\item 1216 1216 \item
{The User is logged in as UserX.} 1217 1217 {The System shall display only cards including text ``app''.}
\item 1218 1218 \item
{The User has added the class TEST 101.} 1219 1219 {UserX shall click ``Show Hidden'' button in the top left and clear
\item 1220 1220 the text in the search box.}
{The User is at the Feed View for the class TEST 101.} 1221 1221 \item
\end{itemize} 1222 1222 {The System shall display all cards, excluding those from Week 9.}
1223 1223 \end{enumerate}
\item[Postconditions:] 1224 1224
\begin{itemize} 1225 1225 \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.}
\itemsep1pt\parskip0pt\parsep0pt 1226 1226 \end{description}
\item 1227 1227 \newpage
{The blanked out words (keyword) ``Spain'' in the flashcard are marked with underline.} 1228 1228
\end{itemize} 1229 1229 {}
1230 1230
\item[Trigger:] {The User wants their newly pushed card to have the keyword ``Spain''.} 1231 1231 \subsection{[F6] Blank Out Words in Flashcard}
1232 1232
\item[Workflow:] 1233 1233 \begin{description}
\begin{enumerate} 1234 1234 \item[Description:]{This test case outlines the presentation layer process
\itemsep1pt\parskip0pt\parsep0pt 1235 1235 of the User to create keywords in a card they are pushing.}
\item 1236 1236
{UserX shall click the Compose button (+ circle on bottom right) of Feed.} 1237 1237 \item[Desired Outcome:]{The blanked out words (visually bolded) in the
\item 1238 1238 flashcard notify the System that they are keywords.}
{The System shall bring up the composition flashcard modal.} 1239 1239
\item 1240 1240 \item[User Goals:]{The User shall mark some words as keywords so the System
{UserX shall type text ``The rain in Spain stays mainly in the plain'' 1241 1241 may later quiz the User by blanking out one keyword at a time and having the
into the composition modal, replacing ``Write a flashcard''.} 1242 1242 User enter what they think the keyword is.}
\item 1243 1243
{UserX shall highlight the word ``Spain''.} 1244 1244 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
\item {UserX shall press Blank Selected Text button.} 1245 1245 Login, [A3] Add a Class, [F1] Push Flashcard}
\item {UserX shall press Contribute button to push the flashcard.} 1246 1246
\item 1247 1247 \item[Priority Level:]{``Must''}
{The System will save the blanked out word in the Flashcard Mask of the 1248 1248
newly pushed flashcard.} 1249 1249 \item[Status:]{Implemented}
\item {The Feed shall display the new card with the keyword underlined.} 1250 1250
\end{enumerate} 1251 1251 \item[Preconditions:]
1252 1252 \begin{itemize}
\item[Expected Result:] {The System shall show ``Spain'' underlined and bolded 1253 1253 \itemsep1pt\parskip0pt\parsep0pt
in the flashcard. The flashcard is visible in the Feed and Deck of class TEST 101.} 1254 1254 \item
\end{description} 1255 1255 \item
\newpage 1256 1256 {The User is logged in as UserX.}
1257 1257 \item
{} 1258 1258 {The User has added the class TEST 101.}
1259 1259 \item
\subsection{[F7] Fix Flashcard} 1260 1260 {The User is at the Feed View for the class TEST 101.}
1261 1261 \end{itemize}
\begin{description} 1262 1262
\item[Description:]{This Test Case outlines the presentation layer process 1263 1263 \item[Postconditions:]
for the User to alter (``fix'') a flashcard they made originally and not have 1264 1264 \begin{itemize}
to make a new copy of it. It is only a ``fix'' if no other users have the 1265 1265 \itemsep1pt\parskip0pt\parsep0pt
flashcard in their Decks AND the User is the author.} 1266 1266 \item
1267 1267 {The blanked out words (keyword) ``Spain'' in the flashcard are marked with underline.}
\item[Desired Outcome:]{The User shall change one of their flashcard's text 1268 1268 \end{itemize}
and that alteration will be visible to all users in the Feed.} 1269 1269
1270 1270 \item[Trigger:] {The User wants their newly pushed card to have the keyword ``Spain''.}
\item[User Goals:]{The User shall make their own authored flashcard say 1271 1271
something different than it did originally.} 1272 1272 \item[Workflow:]
1273 1273 \begin{enumerate}
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1274 1274 \itemsep1pt\parskip0pt\parsep0pt
Login, [A3] Add a Class, [F1] Push Flashcard} 1275 1275 \item
1276 1276 {UserX shall click the Compose button (+ circle on bottom right) of Feed.}
\item[Priority Level:]{``Must''} 1277 1277 \item
1278 1278 {The System shall bring up the composition flashcard modal.}
\item[Status:]{Implemented} 1279 1279 \item
1280 1280 {UserX shall type text ``The rain in Spain stays mainly in the plain''
\item[Preconditions:] 1281 1281 into the composition modal, replacing ``Write a flashcard''.}
\begin{itemize} 1282 1282 \item
\itemsep1pt\parskip0pt\parsep0pt 1283 1283 {UserX shall highlight the word ``Spain''.}
\item 1284 1284 \item {UserX shall press Blank Selected Text button.}
{The User is logged in as UserX.} 1285 1285 \item {UserX shall press Contribute button to push the flashcard.}
\item {The User is logged in a separate browser as UserY.} 1286 1286 \item
\item 1287 1287 {The System will save the blanked out word in the Flashcard Mask of the
{UserX and UserY has enrolled in the class TEST 101.} 1288 1288 newly pushed flashcard.}
\item 1289 1289 \item {The Feed shall display the new card with the keyword underlined.}
{UserX is at the Deck View for the class TEST 101.} 1290 1290 \end{enumerate}
\item {UserY is at the Feed View for the class TEST 101.} 1291 1291
\item 1292 1292 \item[Expected Result:] {The System shall show ``Spain'' underlined and bolded
{The User has contributed and pushed a flashcard to the TEST 101 Feed, which is 1293 1293 in the flashcard. The flashcard is visible in the Feed and Deck of class TEST 101.}
also in their Deck with text 1294 1294 \end{description}
``My card is currently broken''; this flashcard is for fixing.} 1295 1295 \newpage
\end{itemize} 1296 1296
1297 1297 {}
\item[Postconditions:] 1298 1298
\begin{itemize} 1299 1299 \subsection{[F7] Fix Flashcard}
\itemsep1pt\parskip0pt\parsep0pt 1300 1300
\item 1301 1301 \begin{description}
{The authoring User shall see their alteration for that flashcard in their 1302 1302 \item[Description:]{This Test Case outlines the presentation layer process
Feed and Deck for TEST 101.} 1303 1303 for the User to alter (``fix'') a flashcard they made originally and not have
\item {Other users shall see the fixed flashcard in the Feed for TEST 101 if they 1304 1304 to make a new copy of it. It is only a ``fix'' if no other users have the
refresh the app.} 1305 1305 flashcard in their Decks AND the User is the author.}
\end{itemize} 1306 1306
1307 1307 \item[Desired Outcome:]{The User shall change one of their flashcard's text
\item[Trigger:] {UserX realizes that a card they created previously does 1308 1308 and that alteration will be visible to all users in the Feed.}
not say what they currently desire and wishes to change it.} 1309 1309
1310 1310 \item[User Goals:]{The User shall make their own authored flashcard say
\item[Workflow:] 1311 1311 something different than it did originally.}
\begin{enumerate} 1312 1312
\itemsep1pt\parskip0pt\parsep0pt 1313 1313 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
\item 1314 1314 Login, [A3] Add a Class, [F1] Push Flashcard}
{UserX shall hover the Flashcard they created with text ``My card is currently 1315 1315
broken''.} 1316 1316 \item[Priority Level:]{``Must''}
\item 1317 1317
{UserX shall select the bottom-left blue Edit Card pencil button on the flashcard.} 1318 1318 \item[Status:]{Implemented}
\item 1319 1319
{The System shall bring up the flashcard Edit modal.} 1320 1320 \item[Preconditions:]
\item 1321 1321 \begin{itemize}
{UserX shall highlight the text ``broken''.} 1322 1322 \itemsep1pt\parskip0pt\parsep0pt
\item {UserX shall change the highlighted word into ``fixed'' so that the text 1323 1323 \item
reads ``My card is currently fixed''.} 1324 1324 {The User is logged in as UserX.}
\item 1325 1325 \item {The User is logged in a separate browser as UserY.}
{UserX shall press the Save Changes button.} 1326 1326 \item
\item 1327 1327 {UserX and UserY has enrolled in the class TEST 101.}
{The System shall update the flashcard's text content.} 1328 1328 \item
\item 1329 1329 {UserX is at the Deck View for the class TEST 101.}
{The System shall close the edit flashcard modal.} 1330 1330 \item {UserY is at the Feed View for the class TEST 101.}
\item {The Client shall show the flashcard in the UserX's TEST 101 Deck with the 1331 1331 \item
fixed text.} 1332 1332 {The User has contributed and pushed a flashcard to the TEST 101 Feed, which is
1333 1333 also in their Deck with text
\item {UserY refreshes the TEST 101 Feed view and sees the flashcard ``My card is 1334 1334 ``My card is currently broken''; this flashcard is for fixing.}
currently fixed''.} 1335 1335 \end{itemize}
\end{enumerate} 1336 1336
1337 1337 \item[Postconditions:]
\item[Expected Results:]{The Client shall show the fixed flashcard 1338 1338 \begin{itemize}
in UserX's TEST 101 class Deck with the new text:``My card is currently fixed''. 1339 1339 \itemsep1pt\parskip0pt\parsep0pt
The Client shall show the fixed flashcard in UserY's TEST 101 Feed view as well, 1340 1340 \item
after page refresh.} 1341 1341 {The authoring User shall see their alteration for that flashcard in their
\end{description} 1342 1342 Feed and Deck for TEST 101.}
\newpage 1343 1343 \item {Other users shall see the fixed flashcard in the Feed for TEST 101 if they
1344 1344 refresh the app.}
{} 1345 1345 \end{itemize}
1346 1346
\subsection{[F8] Hide cards from feed} 1347 1347 \item[Trigger:] {UserX realizes that a card they created previously does
1348 1348 not say what they currently desire and wishes to change it.}
\begin{description} 1349 1349
\item[Description:]{This test case outlines the presentation layer process 1350 1350 \item[Workflow:]
for the User shall be able to hide cards from their own view, on 1351 1351 \begin{enumerate}
the Feed and Deck.} 1352 1352 \itemsep1pt\parskip0pt\parsep0pt
1353 1353 \item
\item[Desired Outcome:]{The System marks the flashcard as hidden from the 1354 1354 {UserX shall hover the Flashcard they created with text ``My card is currently
User so that the User cannot see the flashcard in the Feed or Deck.} 1355 1355 broken''.}
1356 1356 \item
\item[User Goals:]{The flashcard is no longer visible to the User in the Feed or 1357 1357 {UserX shall select the bottom-left blue Edit Card pencil button on the flashcard.}
Deck views.} 1358 1358 \item
1359 1359 {The System shall bring up the flashcard Edit modal.}
\item[Dependency Use Cases:]{[A1] User Registration, [A2] User 1360 1360 \item
Login, [A3] Add a Class, [F1] Push Flashcard} 1361 1361 {UserX shall highlight the text ``broken''.}
1362 1362 \item {UserX shall change the highlighted word into ``fixed'' so that the text
\item[Priority Level:]{``Should''} 1363 1363 reads ``My card is currently fixed''.}
1364 1364 \item
\item[Status:]{Implemented} 1365 1365 {UserX shall press the Save Changes button.}
1366 1366 \item
\item[Preconditions:] 1367 1367 {The System shall update the flashcard's text content.}
\begin{itemize} 1368 1368 \item
\itemsep1pt\parskip0pt\parsep0pt 1369 1369 {The System shall close the edit flashcard modal.}
\item 1370 1370 \item {The Client shall show the flashcard in the UserX's TEST 101 Deck with the
{The User is logged in as UserX.} 1371 1371 fixed text.}
\item 1372 1372
{The User has enrolled in the class TEST 101.} 1373 1373 \item {UserY refreshes the TEST 101 Feed view and sees the flashcard ``My card is
\item 1374 1374 currently fixed''.}
{The User is at the Feed View or Deck View (alternate workflow) 1375 1375 \end{enumerate}
for the class TEST 101.} 1376 1376
\item 1377 1377 \item[Expected Results:]{The Client shall show the fixed flashcard
{The User has composed and contributed a flashcard to the Feed with text 1378 1378 in UserX's TEST 101 class Deck with the new text:``My card is currently fixed''.
``The rain in Spain stays mainly in the plain''.} 1379 1379 The Client shall show the fixed flashcard in UserY's TEST 101 Feed view as well,
\end{itemize} 1380 1380 after page refresh.}
1381 1381 \end{description}
\item[Postconditions:] 1382 1382 \newpage
\begin{itemize} 1383 1383
\itemsep1pt\parskip0pt\parsep0pt 1384 1384 {}
\item{Flashcard is not viewable by user in the Feed or Deck views in TEST 101.} 1385 1385
\end{itemize} 1386 1386 \subsection{[F8] Hide cards from feed}
1387 1387
\item[Workflow:] 1388 1388 \begin{description}
\begin{enumerate} 1389 1389 \item[Description:]{This test case outlines the presentation layer process
\itemsep1pt\parskip0pt\parsep0pt 1390 1390 for the User shall be able to hide cards from their own view, on
\item {UserX has navigated to the Feed View of TEST 101.} 1391 1391 the Feed and Deck.}
\item 1392 1392
{UserX hovers the flashcard they added with the text ``The rain in Spain stays 1393 1393 \item[Desired Outcome:]{The System marks the flashcard as hidden from the
mainly in the plain''.} 1394 1394 User so that the User cannot see the flashcard in the Feed or Deck.}
1395 1395
\item {UserX presses Hide button, which is the red crossed-out eye.} 1396 1396 \item[User Goals:]{The flashcard is no longer visible to the User in the Feed or
1397 1397 Deck views.}
\item {The System shall hide the card.} 1398 1398
\item {The Client shall remove the card from view for UserX.} 1399 1399 \item[Dependency Use Cases:]{[A1] User Registration, [A2] User
\item {A toast is shown on the client that allows the User to report the card.} 1400 1400 Login, [A3] Add a Class, [F1] Push Flashcard}
\item {The card is not shown on the Feed or Deck.} 1401 1401
\end{enumerate} 1402 1402 \item[Priority Level:]{``Should''}
1403 1403
\item[Expected Result:]{The Client shows the Feed without the flashcard of text 1404 1404 \item[Status:]{Implemented}
``The rain in Spain stays mainly in the plain''. A toast that allows UserX to 1405 1405
report the card shows up temporarily.} 1406 1406 \item[Preconditions:]
1407 1407 \begin{itemize}
\item[Alternate Workflow:] 1408 1408 \itemsep1pt\parskip0pt\parsep0pt
1409 1409 \item
\begin{enumerate} 1410 1410 {The User is logged in as UserX.}
\itemsep1pt\parskip0pt\parsep0pt 1411 1411 \item
\item {UserX has navigated to the Deck View of TEST 101.} 1412 1412 {The User has enrolled in the class TEST 101.}
\item 1413 1413 \item
{UserX hovers the flashcard they added with the text ``The rain in Spain stays 1414 1414 {The User is at the Feed View or Deck View (alternate workflow)
mainly in the plain''.} 1415 1415 for the class TEST 101.}
1416 1416 \item
\item {UserX presses hide button, which is the red crossed-out eye.} 1417 1417 {The User has composed and contributed a flashcard to the Feed with text
1418 1418 ``The rain in Spain stays mainly in the plain''.}