<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fluan</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fluan"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Fluan"/>
	<updated>2026-06-13T02:20:22Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1690_Improvements_to_password_recovery_and_repeated_login_failures&amp;diff=106543</id>
		<title>CSC/ECE 517 Fall 2016/E1690 Improvements to password recovery and repeated login failures</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1690_Improvements_to_password_recovery_and_repeated_login_failures&amp;diff=106543"/>
		<updated>2016-12-05T16:00:09Z</updated>

		<summary type="html">&lt;p&gt;Fluan: /* Registration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E1690 Improvements to password recovery and repeated login failures==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made under E1690 FinalProject for Fall 2016, CSC/ECE 517.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Background===&lt;br /&gt;
&lt;br /&gt;
Expertiza is an Open Source web application developed on Ruby On Rails platform. It is a platform which allows students to access assignments posted by the course instructor. Expertiza also allows students to select assignment topics, form teams and submit their work. It also allows them to review other students' submissions and improve their work based on the feedback provided. The instructor can look at the feedback provided by students and rate the student based on feedback provided for others work.&lt;br /&gt;
It helps organize and upload assignments and reducing the manual review process and helps students provide a peer feedback and also learn from reviewed work. Teams can be chosen by the student or can be assigned automatically based on a priority list inputted alongside each topic available for the assignment.&lt;br /&gt;
&lt;br /&gt;
===Project Description===&lt;br /&gt;
&lt;br /&gt;
Our final project consists of two cases of the password recovery process. Use case 1, Currently, when a user forgets his/her password and wants to reset the password, Expertiza system randomly generates a new password and sends the password as plain text in a email. It is normally considered as a bad practice to send passwords as paint text. We are replacing this practice by sending a reset password link that expires after a certain amount of time. Use case 2 deals with when a user enters wrong credentials. Currently, the login page simply shows an error. Irrespective of the number of times that a user enters wrong login credentials, the system produces a general error message. We are going to be replacing this system by using the alternative 2, using a captcha to verify that the user is indeed a human and not a bot trying to run a brute force attack on the system. This will add the needed layer of security and should serve as a great solution. Below are more details of our implementation. &lt;br /&gt;
&lt;br /&gt;
===Files Created/Modified===&lt;br /&gt;
As a part of the project the files mentioned below were the ones, created/modified as needed.&lt;br /&gt;
* auth_controller.rb&lt;br /&gt;
* password_retrieval_controller.rb &lt;br /&gt;
* password_reset.rb (model)&lt;br /&gt;
* reset_password.html.erb (view)&lt;br /&gt;
&lt;br /&gt;
===Implementation===&lt;br /&gt;
We have implemented the new password recovery system by sending a reset password link to the user's email. This link will be comprised of a generated path to a newly created view for resetting the password with a uniquely randomly generated token. This parameter will be a string attribute of a new model reset_password. This link will expire after a given amount of time. Using logic to compare the createdAt timestamp as well as the current time, the application would decide if the token is expired or not.&lt;br /&gt;
&lt;br /&gt;
We are also implementing a backoff system that will require the user to complete a smart captcha after 3 failed attempts. This smart captcha will be generated through Recaptcha gem and the user will then be redirected to the login page after successfully changing the password. This will ensure that the system is not vulnerable to Brute Force attacks as well as bots.&lt;br /&gt;
&lt;br /&gt;
==Password Reset==&lt;br /&gt;
&lt;br /&gt;
===Model Schema===&lt;br /&gt;
Model: password_reset.rb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Attributes&lt;br /&gt;
*-id(autogenerated) -integer&lt;br /&gt;
*-unique_tokenhash -String&lt;br /&gt;
*-createdAt (autogenerated) -timestamp&lt;br /&gt;
*-user_email -string&lt;br /&gt;
&lt;br /&gt;
'''Model Details'''&lt;br /&gt;
&lt;br /&gt;
When the user clicks on reset password, it will redirect to a view that has an input to enter the email address of the user. Reset password button will generate a random token (Long string) which will be hashed and saved in the database of the model reset_password. An expiration date will be generated and saved along with the user_id by looking up the user table using email id. The unhashed Token value will be appended on the url emailed to the user for the password reset page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
www.expertiza.com/password_edit/check_reset_url?token=ZB71yObR-Tdssg-@#%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On clicking the url, the link will take you to password_retrieval_controller that will direct you to a reset page. Before redirecting , the controller checks the parameters in the link (username and token) and makes sure that token username pair exists and not expired. Token from the params will be hashed again and checked with the DB. This prevents an attacker who has read access to the database from making a token for some other user, reading the value that was sent in the email, then sending the same value himself. Once the controller completes all the necessary checks, it will redirect to a reset password page for that specific user (based on the user_id / username) &lt;br /&gt;
&lt;br /&gt;
Each Email Address can have only one active token saved in the database. Every time a new token is generated, it will replace the existing one which ensures that only one reset link is available. Also, this will make sure that DB content of password_reset can never exceed the number of users registered in the application. This eliminates the need to clear out expired Tokens.&lt;br /&gt;
&lt;br /&gt;
[[File:Capture password reset.JPG]]&lt;br /&gt;
&lt;br /&gt;
==Captcha==&lt;br /&gt;
&lt;br /&gt;
The project will be using reCAPTCHA gem. reCAPTCHA is a free service from Google that helps protect websites from spam and abuse. A “CAPTCHA” is a test to tell humans and robot apart. This kind of service is important for websites or web applications with lots of user generated content. The test is easy for a human to solve, but hard for bots and other malicious software to figure out.&lt;br /&gt;
&lt;br /&gt;
After 3 failed Login attempts, a captcha would appear to make sure that a bot or a malicious software is not trying to attempt login using brute force.&lt;br /&gt;
&lt;br /&gt;
[[File:Captcha.png]]&lt;br /&gt;
&lt;br /&gt;
==== Gem File ====&lt;br /&gt;
Adding this line to the Gem file allows us to have access to the recaptcha gem.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;gem &amp;quot;recaptcha&amp;quot;, require: &amp;quot;recaptcha/rails&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Registration====&lt;br /&gt;
To let reCAPTCHA work normally, we need to register the domains that the project will be deployed on [reCAPTCHA official website][https://www.google.com/recaptcha]. Currently, we can use it on expertiza.com, 0.0.0.0, and localhost. Once the registration is done, two keys will be automatically generated -- site key and secret key. The site key is used in HTML, and the secret key is used for communication between the site and Google.&lt;br /&gt;
&lt;br /&gt;
====Add reCAPTCHA to codes====&lt;br /&gt;
&lt;br /&gt;
To show reCAPTCHA in webpages is easy, all we need to do is add this code to _form.html.erb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;div class=&amp;quot;g-recaptcha&amp;quot; data-sitekey=&amp;quot;6Lci0wwUAAAAAB69GEpUbEmkIu4frJ8dgqx90o7b&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And, we need to create a recaptcha.rb file into config/initializers folder, which stores our site key and secret key.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Recaptcha.configure do |config|&lt;br /&gt;
    config.site_key  = '6Lci0wwUAAAAAB69GEpUbEmkIu4frJ8dgqx90o7b'&lt;br /&gt;
    config.secret_key = '6Lci0wwUAAAAAIZ***********RNeDD6e84q9XlM'&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Backoff System ====&lt;br /&gt;
In Auth Controller we added the following code. The variable @@attempts acts as a counter to track the amount of invalid login attempts a user makes. By utilizing the existing login code we were able to place the increment code. Once the attempts variable is greater than or equal to 3 we then force the user to use the recaptcha question in addition to their correct logic credentials. Once the new requirements to login are satisfied the user is redirected to the password retrieval, otherwise they are redirected to the root screen with the captcha question. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  @@attemps = 0&lt;br /&gt;
&lt;br /&gt;
  def login&lt;br /&gt;
  if request.get?&lt;br /&gt;
  AuthController.clear_session(session)&lt;br /&gt;
  else&lt;br /&gt;
  user = User.find_by_login(params[:login][:name])&lt;br /&gt;
  if user and user.valid_password?(params[:login][:password])&lt;br /&gt;
  after_login(user)&lt;br /&gt;
  else&lt;br /&gt;
&lt;br /&gt;
  @@attemps = @@attemps + 1&lt;br /&gt;
  logger.warn &amp;quot;Failed login attempt.&amp;quot;&lt;br /&gt;
  flash[:error] = &amp;quot;Your username or password is incorrect.&amp;quot;&lt;br /&gt;
  if @@attemps &amp;gt;= 3 ##User entered invalid login credentials at least 3 times&lt;br /&gt;
  if verify_recaptcha(model: @user)&lt;br /&gt;
  @@attemps = 0&lt;br /&gt;
  redirect_to controller: 'password_retrieval', action: 'forgotten'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  else&lt;br /&gt;
  redirect_to root_path&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
  end&lt;br /&gt;
  end # def login&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
To run the Rspecs test cases:&lt;br /&gt;
 rspec path_to_expertiza/spec/controllers/password_retrieval_controller_spec.rb &lt;br /&gt;
&lt;br /&gt;
To test from UI:&lt;br /&gt;
 i) Enter the wrong password on login page three consecutive times, you will shown with Google Captcha for the fourth attempt.&lt;br /&gt;
 ii) On entering the password, wrong the fourth time you will be redirected to &amp;quot;forgot password&amp;quot; page.&lt;br /&gt;
     It can also be reached by clicking &amp;quot;forgot password&amp;quot; page on login page.&lt;br /&gt;
 iii) Enter the email Id, for which new password has to be set. On clicking &amp;quot;Request password&amp;quot; you will get a mail with password reset link. &lt;br /&gt;
 iv) Clicking on the password reset link, you will be redirected to password reset page where you can set your new password. &lt;br /&gt;
&lt;br /&gt;
Here is a short [http://recordit.co/pXq9jM9xhr video] demonstrating the same.&lt;/div&gt;</summary>
		<author><name>Fluan</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1690_Improvements_to_password_recovery_and_repeated_login_failures&amp;diff=106541</id>
		<title>CSC/ECE 517 Fall 2016/E1690 Improvements to password recovery and repeated login failures</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1690_Improvements_to_password_recovery_and_repeated_login_failures&amp;diff=106541"/>
		<updated>2016-12-05T15:56:57Z</updated>

		<summary type="html">&lt;p&gt;Fluan: /* Captcha */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E1690 Improvements to password recovery and repeated login failures==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made under E1690 FinalProject for Fall 2016, CSC/ECE 517.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Background===&lt;br /&gt;
&lt;br /&gt;
Expertiza is an Open Source web application developed on Ruby On Rails platform. It is a platform which allows students to access assignments posted by the course instructor. Expertiza also allows students to select assignment topics, form teams and submit their work. It also allows them to review other students' submissions and improve their work based on the feedback provided. The instructor can look at the feedback provided by students and rate the student based on feedback provided for others work.&lt;br /&gt;
It helps organize and upload assignments and reducing the manual review process and helps students provide a peer feedback and also learn from reviewed work. Teams can be chosen by the student or can be assigned automatically based on a priority list inputted alongside each topic available for the assignment.&lt;br /&gt;
&lt;br /&gt;
===Project Description===&lt;br /&gt;
&lt;br /&gt;
Our final project consists of two cases of the password recovery process. Use case 1, Currently, when a user forgets his/her password and wants to reset the password, Expertiza system randomly generates a new password and sends the password as plain text in a email. It is normally considered as a bad practice to send passwords as paint text. We are replacing this practice by sending a reset password link that expires after a certain amount of time. Use case 2 deals with when a user enters wrong credentials. Currently, the login page simply shows an error. Irrespective of the number of times that a user enters wrong login credentials, the system produces a general error message. We are going to be replacing this system by using the alternative 2, using a captcha to verify that the user is indeed a human and not a bot trying to run a brute force attack on the system. This will add the needed layer of security and should serve as a great solution. Below are more details of our implementation. &lt;br /&gt;
&lt;br /&gt;
===Files Created/Modified===&lt;br /&gt;
As a part of the project the files mentioned below were the ones, created/modified as needed.&lt;br /&gt;
* auth_controller.rb&lt;br /&gt;
* password_retrieval_controller.rb &lt;br /&gt;
* password_reset.rb (model)&lt;br /&gt;
* reset_password.html.erb (view)&lt;br /&gt;
&lt;br /&gt;
===Implementation===&lt;br /&gt;
We have implemented the new password recovery system by sending a reset password link to the user's email. This link will be comprised of a generated path to a newly created view for resetting the password with a uniquely randomly generated token. This parameter will be a string attribute of a new model reset_password. This link will expire after a given amount of time. Using logic to compare the createdAt timestamp as well as the current time, the application would decide if the token is expired or not.&lt;br /&gt;
&lt;br /&gt;
We are also implementing a backoff system that will require the user to complete a smart captcha after 3 failed attempts. This smart captcha will be generated through Recaptcha gem and the user will then be redirected to the login page after successfully changing the password. This will ensure that the system is not vulnerable to Brute Force attacks as well as bots.&lt;br /&gt;
&lt;br /&gt;
==Password Reset==&lt;br /&gt;
&lt;br /&gt;
===Model Schema===&lt;br /&gt;
Model: password_reset.rb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Attributes&lt;br /&gt;
*-id(autogenerated) -integer&lt;br /&gt;
*-unique_tokenhash -String&lt;br /&gt;
*-createdAt (autogenerated) -timestamp&lt;br /&gt;
*-user_email -string&lt;br /&gt;
&lt;br /&gt;
'''Model Details'''&lt;br /&gt;
&lt;br /&gt;
When the user clicks on reset password, it will redirect to a view that has an input to enter the email address of the user. Reset password button will generate a random token (Long string) which will be hashed and saved in the database of the model reset_password. An expiration date will be generated and saved along with the user_id by looking up the user table using email id. The unhashed Token value will be appended on the url emailed to the user for the password reset page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
www.expertiza.com/password_edit/check_reset_url?token=ZB71yObR-Tdssg-@#%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On clicking the url, the link will take you to password_retrieval_controller that will direct you to a reset page. Before redirecting , the controller checks the parameters in the link (username and token) and makes sure that token username pair exists and not expired. Token from the params will be hashed again and checked with the DB. This prevents an attacker who has read access to the database from making a token for some other user, reading the value that was sent in the email, then sending the same value himself. Once the controller completes all the necessary checks, it will redirect to a reset password page for that specific user (based on the user_id / username) &lt;br /&gt;
&lt;br /&gt;
Each Email Address can have only one active token saved in the database. Every time a new token is generated, it will replace the existing one which ensures that only one reset link is available. Also, this will make sure that DB content of password_reset can never exceed the number of users registered in the application. This eliminates the need to clear out expired Tokens.&lt;br /&gt;
&lt;br /&gt;
[[File:Capture password reset.JPG]]&lt;br /&gt;
&lt;br /&gt;
==Captcha==&lt;br /&gt;
&lt;br /&gt;
The project will be using reCAPTCHA gem. reCAPTCHA is a free service from Google that helps protect websites from spam and abuse. A “CAPTCHA” is a test to tell humans and robot apart. This kind of service is important for websites or web applications with lots of user generated content. The test is easy for a human to solve, but hard for bots and other malicious software to figure out.&lt;br /&gt;
&lt;br /&gt;
After 3 failed Login attempts, a captcha would appear to make sure that a bot or a malicious software is not trying to attempt login using brute force.&lt;br /&gt;
&lt;br /&gt;
[[File:Captcha.png]]&lt;br /&gt;
&lt;br /&gt;
==== Gem File ====&lt;br /&gt;
Adding this line to the Gem file allows us to have access to the recaptcha gem.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;gem &amp;quot;recaptcha&amp;quot;, require: &amp;quot;recaptcha/rails&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Registration====&lt;br /&gt;
To let reCAPTCHA work normally, we need to register the domains that the project will be deployed on reCAPTCHA official website. Currently, we can use it on expertiza.com, 0.0.0.0, and localhost. Once the registration is done, two keys will be automatically generated -- site key and secret key. The site key is used in HTML, and the secret key is used for communication between the site and Google. &lt;br /&gt;
&lt;br /&gt;
====Add reCAPTCHA to codes====&lt;br /&gt;
&lt;br /&gt;
To show reCAPTCHA in webpages is easy, all we need to do is add this code to _form.html.erb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;div class=&amp;quot;g-recaptcha&amp;quot; data-sitekey=&amp;quot;6Lci0wwUAAAAAB69GEpUbEmkIu4frJ8dgqx90o7b&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And, we need to create a recaptcha.rb file into config/initializers folder, which stores our site key and secret key.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Recaptcha.configure do |config|&lt;br /&gt;
    config.site_key  = '6Lci0wwUAAAAAB69GEpUbEmkIu4frJ8dgqx90o7b'&lt;br /&gt;
    config.secret_key = '6Lci0wwUAAAAAIZ***********RNeDD6e84q9XlM'&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Backoff System ====&lt;br /&gt;
In Auth Controller we added the following code. The variable @@attempts acts as a counter to track the amount of invalid login attempts a user makes. By utilizing the existing login code we were able to place the increment code. Once the attempts variable is greater than or equal to 3 we then force the user to use the recaptcha question in addition to their correct logic credentials. Once the new requirements to login are satisfied the user is redirected to the password retrieval, otherwise they are redirected to the root screen with the captcha question. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  @@attemps = 0&lt;br /&gt;
&lt;br /&gt;
  def login&lt;br /&gt;
  if request.get?&lt;br /&gt;
  AuthController.clear_session(session)&lt;br /&gt;
  else&lt;br /&gt;
  user = User.find_by_login(params[:login][:name])&lt;br /&gt;
  if user and user.valid_password?(params[:login][:password])&lt;br /&gt;
  after_login(user)&lt;br /&gt;
  else&lt;br /&gt;
&lt;br /&gt;
  @@attemps = @@attemps + 1&lt;br /&gt;
  logger.warn &amp;quot;Failed login attempt.&amp;quot;&lt;br /&gt;
  flash[:error] = &amp;quot;Your username or password is incorrect.&amp;quot;&lt;br /&gt;
  if @@attemps &amp;gt;= 3 ##User entered invalid login credentials at least 3 times&lt;br /&gt;
  if verify_recaptcha(model: @user)&lt;br /&gt;
  @@attemps = 0&lt;br /&gt;
  redirect_to controller: 'password_retrieval', action: 'forgotten'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  else&lt;br /&gt;
  redirect_to root_path&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
  end&lt;br /&gt;
  end # def login&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
To run the Rspecs test cases:&lt;br /&gt;
 rspec path_to_expertiza/spec/controllers/password_retrieval_controller_spec.rb &lt;br /&gt;
&lt;br /&gt;
To test from UI:&lt;br /&gt;
 i) Enter the wrong password on login page three consecutive times, you will shown with Google Captcha for the fourth attempt.&lt;br /&gt;
 ii) On entering the password, wrong the fourth time you will be redirected to &amp;quot;forgot password&amp;quot; page.&lt;br /&gt;
     It can also be reached by clicking &amp;quot;forgot password&amp;quot; page on login page.&lt;br /&gt;
 iii) Enter the email Id, for which new password has to be set. On clicking &amp;quot;Request password&amp;quot; you will get a mail with password reset link. &lt;br /&gt;
 iv) Clicking on the password reset link, you will be redirected to password reset page where you can set your new password. &lt;br /&gt;
&lt;br /&gt;
Here is a short [http://recordit.co/pXq9jM9xhr video] demonstrating the same.&lt;/div&gt;</summary>
		<author><name>Fluan</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1666._Test_team_functionality&amp;diff=104591</id>
		<title>CSC/ECE 517 Fall 2016/E1666. Test team functionality</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1666._Test_team_functionality&amp;diff=104591"/>
		<updated>2016-11-05T02:11:08Z</updated>

		<summary type="html">&lt;p&gt;Fluan: /* Result */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
Expertiza is an open source web based peer review system developed and maintained by students and faculty at North Carolina State University. It enables students enrolled in a particular course to form online teams and complete assignments. A typical cycle of an assignment involves the following major steps:&lt;br /&gt;
&lt;br /&gt;
* A pool of topics is made available to the students to choose from and form team to complete it within a pre-set deadline.&lt;br /&gt;
* After the development phase is finished, begins the peer review phase. Here students can review work of other teams, on the basis of some predefined factors and provide their feedback.&lt;br /&gt;
* Members of a team can also provide feedback for the respective review done for their work.&lt;br /&gt;
* In some projects there is a second development phase which allows team members to improve upon their work keeping past reviews in consideration.&lt;br /&gt;
* After this second development cycle begins another review phase, where original reviewers can re-review the updated work and provide critical feedback. &lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
The purpose of this task is to write functional tests for team functionality. Once an assignment is out, a student can select this assignment and others can join in the team. To test this functionality we wrote functional tests for the various scenarios.&lt;br /&gt;
One such scenario is :&lt;br /&gt;
&lt;br /&gt;
* Once the assignment is out and a student selects it, he/she can send out invites to other students to join the team.&lt;br /&gt;
* Invited students can accept the invitation and join the team.&lt;br /&gt;
&lt;br /&gt;
== Functional Tests ==&lt;br /&gt;
&lt;br /&gt;
Functional tests ensure that the functionalities of a software system are working as expected. To write our functional tests, we used the Capybara gem available for Ruby.&lt;br /&gt;
Capybara gem allows a user to test their web application through simulations.&lt;br /&gt;
&lt;br /&gt;
== Functional Tests Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Functional Tests for accepting an invitation ===&lt;br /&gt;
&lt;br /&gt;
In Expertiza assignments, the only way for a student to join an existing team is to be invited by the leader. Therefore, we will test whether the invitation function run smoothly. But before the test, we need to initialize some information. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
before(:each) do&lt;br /&gt;
    create(:assignment, name: &amp;quot;TestTeam&amp;quot;, directory_path: 'test_team')&lt;br /&gt;
    create_list(:participant, 3)&lt;br /&gt;
    create(:assignment_node)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;submission&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;review&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;metareview&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;drop_topic&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;signup&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;team_formation&amp;quot;)&lt;br /&gt;
    create(:deadline_right)&lt;br /&gt;
    create(:deadline_right, name: 'Late')&lt;br /&gt;
    create(:deadline_right, name: 'OK')&lt;br /&gt;
    create(:assignment_due_date, deadline_type: DeadlineType.where(name: 'review').first, due_at: Time.now + (100 * 24 * 60 * 60))&lt;br /&gt;
    #create(:topic)&lt;br /&gt;
    create(:topic, topic_name: &amp;quot;work1&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, we created a team, and set the maximum students to 3. Because there can only be one student in each session of browser, we need to create different sessions for different students. The first session is for the leader who will be the first one who select this topic. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it &amp;quot;case1&amp;quot; do&lt;br /&gt;
    in_browser(:one) do&lt;br /&gt;
    #test log in as a student&lt;br /&gt;
    user = User.find_by_name('student2064')&lt;br /&gt;
    msg = user.to_yaml&lt;br /&gt;
    File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
    visit root_path&lt;br /&gt;
    fill_in 'login_name', with: 'student2064'&lt;br /&gt;
    fill_in 'login_password', with: 'password'&lt;br /&gt;
    click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
    expect(page).to have_content &amp;quot;User: student2064&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if the topic can be seen and chosen by a student&lt;br /&gt;
    click_link &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;work1&amp;quot;&lt;br /&gt;
    my_link = find(:xpath, &amp;quot;//a[contains(@href,'sign_up_sheet/sign_up?assignment_id=#{Assignment.last.id}&amp;amp;id=1')]&amp;quot;)&lt;br /&gt;
    my_link.click&lt;br /&gt;
&lt;br /&gt;
    #test after selecting a topic, a team formed&lt;br /&gt;
    click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team Name&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if a team leader can invite another student&lt;br /&gt;
    page.fill_in 'user_name', :with =&amp;gt; 'student2065'&lt;br /&gt;
    click_button('Invite')&lt;br /&gt;
    expect(page).to have_content &amp;quot;Sent invitations&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So far,  a team has been created by ‘student2064’, who is the leader. Then, we will let him send an invitation to another user  ‘student2065’. Now, let’s create a new session which allows ’student2065’ to log in. After the login, we need to test if he receive the invitation and if he accepts it, whether or not he will be in the team. If he is included in the team, he will be able to see the name of the leader, who is ‘student2064’.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
in_browser(:two) do&lt;br /&gt;
    visit '/'&lt;br /&gt;
    user = User.find_by_name('student2065')&lt;br /&gt;
    msg = user.to_yaml&lt;br /&gt;
    File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
&lt;br /&gt;
    visit root_path&lt;br /&gt;
    fill_in 'login_name', with: 'student2065'&lt;br /&gt;
    fill_in 'login_password', with: 'password'&lt;br /&gt;
    click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
    #test if a student can see an invitation&lt;br /&gt;
    expect(page).to have_content &amp;quot;User: student2065&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if a student can accept an invitation&lt;br /&gt;
    click_link &amp;quot;Accept&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team Information&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team members&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Edit name &amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Leave team&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for rejecting an invitation===&lt;br /&gt;
&lt;br /&gt;
Same as the previous one, we set up the information at the beginning, and then let ‘student2064’ to pick up a topic and send an invitation to ‘student2065’. This time, we will let ‘student2065’ to choose to reject this invitation. If he declines the invitation, the invitation will disappear. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 #test if a student can decline an invitation&lt;br /&gt;
      click_link &amp;quot;Decline&amp;quot;&lt;br /&gt;
      expect(page).to have_no_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for sending an invitation by a team member===&lt;br /&gt;
&lt;br /&gt;
Same as the first case, we let ‘student2064’ to pick up a topic and send an invitation to ‘student2065’. Then, ‘student2065’ accepts the invitation and becomes a team member. Now we test if ‘student2065’ can send an invitation to another student—‘student2066’.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      #invite another student&lt;br /&gt;
      page.fill_in 'user_name', :with =&amp;gt; 'student2066'&lt;br /&gt;
      click_button('Invite')&lt;br /&gt;
      expect(page).to have_content &amp;quot;Sent invitations&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2066&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, let’s create the third session and login as ‘student2066’. If the invitation sent by ‘student2065’ is successful, ‘student2066’ should be able to see an ‘Received Invitation’ by ‘student2065’ in ‘Your Team’ page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    in_browser(:three) do&lt;br /&gt;
      visit '/'&lt;br /&gt;
      #login as student2065&lt;br /&gt;
      user = User.find_by_name('student2066')&lt;br /&gt;
      msg = user.to_yaml&lt;br /&gt;
      File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
      visit root_path&lt;br /&gt;
      fill_in 'login_name', with: 'student2066'&lt;br /&gt;
      fill_in 'login_password', with: 'password'&lt;br /&gt;
      click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
      #test if a student can see an invitation&lt;br /&gt;
      expect(page).to have_content &amp;quot;User: student2066&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      #test if a student can accept an invitation&lt;br /&gt;
      click_link &amp;quot;Accept&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Team Information&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Team members&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Edit name &amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2066&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Leave team&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for leaving a team by a team member=== &lt;br /&gt;
&lt;br /&gt;
Everything is same to the first case except the last two lines of codes. In the last two lines, we let ‘student2065’ to leave the team, if he really leaves, he will see “You no longer have a team” in the next page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    click_link &amp;quot;Leave team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;You no longer have a team! &amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for leaving a team by a team leader===&lt;br /&gt;
&lt;br /&gt;
Everything is same to the first case before we change back to session one. If ‘student2064’ (Team leader) clicks “Leave team”, he should see  “You no longer have a team” in the next page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    in_browser(:one) do&lt;br /&gt;
      click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Leave team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;You no longer have a team! &amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for whether students choosing the same topic are in the same team===&lt;br /&gt;
&lt;br /&gt;
Since the only way for students to be in a team is by invitation, students who choose the same topic will be in different team. Our test is to let two different students select the same topic and see if their teammates contains each other. Therefore, first we let ‘student2064’ and 'student2065' sign for the same topic, and in their pages, to see if there is 'student2065' or 'student2064'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Team Name&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running the tests ==&lt;br /&gt;
&lt;br /&gt;
The tests can be run on the terminal using the command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec team_functionality_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whether the test fails or succeeds, allows us to determine which parts of the system are functioning properly.&lt;br /&gt;
&lt;br /&gt;
== Result ==&lt;br /&gt;
[[File:new1.PNG|200px|Image: 200 pixels]]&lt;br /&gt;
&lt;br /&gt;
[[File:new2.PNG|200px|Image: 200 pixels]]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
# link for forked repository [[https://github.com/hli36/expertiza.git]] &lt;br /&gt;
# Github link for original repository [[https://github.com/expertiza/expertiza.git]]&lt;br /&gt;
# Github link for Capybara [[https://github.com/jnicklas/capybara.git]]&lt;/div&gt;</summary>
		<author><name>Fluan</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1666._Test_team_functionality&amp;diff=104590</id>
		<title>CSC/ECE 517 Fall 2016/E1666. Test team functionality</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1666._Test_team_functionality&amp;diff=104590"/>
		<updated>2016-11-05T02:09:33Z</updated>

		<summary type="html">&lt;p&gt;Fluan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
Expertiza is an open source web based peer review system developed and maintained by students and faculty at North Carolina State University. It enables students enrolled in a particular course to form online teams and complete assignments. A typical cycle of an assignment involves the following major steps:&lt;br /&gt;
&lt;br /&gt;
* A pool of topics is made available to the students to choose from and form team to complete it within a pre-set deadline.&lt;br /&gt;
* After the development phase is finished, begins the peer review phase. Here students can review work of other teams, on the basis of some predefined factors and provide their feedback.&lt;br /&gt;
* Members of a team can also provide feedback for the respective review done for their work.&lt;br /&gt;
* In some projects there is a second development phase which allows team members to improve upon their work keeping past reviews in consideration.&lt;br /&gt;
* After this second development cycle begins another review phase, where original reviewers can re-review the updated work and provide critical feedback. &lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
The purpose of this task is to write functional tests for team functionality. Once an assignment is out, a student can select this assignment and others can join in the team. To test this functionality we wrote functional tests for the various scenarios.&lt;br /&gt;
One such scenario is :&lt;br /&gt;
&lt;br /&gt;
* Once the assignment is out and a student selects it, he/she can send out invites to other students to join the team.&lt;br /&gt;
* Invited students can accept the invitation and join the team.&lt;br /&gt;
&lt;br /&gt;
== Functional Tests ==&lt;br /&gt;
&lt;br /&gt;
Functional tests ensure that the functionalities of a software system are working as expected. To write our functional tests, we used the Capybara gem available for Ruby.&lt;br /&gt;
Capybara gem allows a user to test their web application through simulations.&lt;br /&gt;
&lt;br /&gt;
== Functional Tests Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Functional Tests for accepting an invitation ===&lt;br /&gt;
&lt;br /&gt;
In Expertiza assignments, the only way for a student to join an existing team is to be invited by the leader. Therefore, we will test whether the invitation function run smoothly. But before the test, we need to initialize some information. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
before(:each) do&lt;br /&gt;
    create(:assignment, name: &amp;quot;TestTeam&amp;quot;, directory_path: 'test_team')&lt;br /&gt;
    create_list(:participant, 3)&lt;br /&gt;
    create(:assignment_node)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;submission&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;review&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;metareview&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;drop_topic&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;signup&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;team_formation&amp;quot;)&lt;br /&gt;
    create(:deadline_right)&lt;br /&gt;
    create(:deadline_right, name: 'Late')&lt;br /&gt;
    create(:deadline_right, name: 'OK')&lt;br /&gt;
    create(:assignment_due_date, deadline_type: DeadlineType.where(name: 'review').first, due_at: Time.now + (100 * 24 * 60 * 60))&lt;br /&gt;
    #create(:topic)&lt;br /&gt;
    create(:topic, topic_name: &amp;quot;work1&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, we created a team, and set the maximum students to 3. Because there can only be one student in each session of browser, we need to create different sessions for different students. The first session is for the leader who will be the first one who select this topic. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it &amp;quot;case1&amp;quot; do&lt;br /&gt;
    in_browser(:one) do&lt;br /&gt;
    #test log in as a student&lt;br /&gt;
    user = User.find_by_name('student2064')&lt;br /&gt;
    msg = user.to_yaml&lt;br /&gt;
    File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
    visit root_path&lt;br /&gt;
    fill_in 'login_name', with: 'student2064'&lt;br /&gt;
    fill_in 'login_password', with: 'password'&lt;br /&gt;
    click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
    expect(page).to have_content &amp;quot;User: student2064&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if the topic can be seen and chosen by a student&lt;br /&gt;
    click_link &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;work1&amp;quot;&lt;br /&gt;
    my_link = find(:xpath, &amp;quot;//a[contains(@href,'sign_up_sheet/sign_up?assignment_id=#{Assignment.last.id}&amp;amp;id=1')]&amp;quot;)&lt;br /&gt;
    my_link.click&lt;br /&gt;
&lt;br /&gt;
    #test after selecting a topic, a team formed&lt;br /&gt;
    click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team Name&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if a team leader can invite another student&lt;br /&gt;
    page.fill_in 'user_name', :with =&amp;gt; 'student2065'&lt;br /&gt;
    click_button('Invite')&lt;br /&gt;
    expect(page).to have_content &amp;quot;Sent invitations&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So far,  a team has been created by ‘student2064’, who is the leader. Then, we will let him send an invitation to another user  ‘student2065’. Now, let’s create a new session which allows ’student2065’ to log in. After the login, we need to test if he receive the invitation and if he accepts it, whether or not he will be in the team. If he is included in the team, he will be able to see the name of the leader, who is ‘student2064’.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
in_browser(:two) do&lt;br /&gt;
    visit '/'&lt;br /&gt;
    user = User.find_by_name('student2065')&lt;br /&gt;
    msg = user.to_yaml&lt;br /&gt;
    File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
&lt;br /&gt;
    visit root_path&lt;br /&gt;
    fill_in 'login_name', with: 'student2065'&lt;br /&gt;
    fill_in 'login_password', with: 'password'&lt;br /&gt;
    click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
    #test if a student can see an invitation&lt;br /&gt;
    expect(page).to have_content &amp;quot;User: student2065&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if a student can accept an invitation&lt;br /&gt;
    click_link &amp;quot;Accept&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team Information&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team members&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Edit name &amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Leave team&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for rejecting an invitation===&lt;br /&gt;
&lt;br /&gt;
Same as the previous one, we set up the information at the beginning, and then let ‘student2064’ to pick up a topic and send an invitation to ‘student2065’. This time, we will let ‘student2065’ to choose to reject this invitation. If he declines the invitation, the invitation will disappear. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 #test if a student can decline an invitation&lt;br /&gt;
      click_link &amp;quot;Decline&amp;quot;&lt;br /&gt;
      expect(page).to have_no_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for sending an invitation by a team member===&lt;br /&gt;
&lt;br /&gt;
Same as the first case, we let ‘student2064’ to pick up a topic and send an invitation to ‘student2065’. Then, ‘student2065’ accepts the invitation and becomes a team member. Now we test if ‘student2065’ can send an invitation to another student—‘student2066’.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      #invite another student&lt;br /&gt;
      page.fill_in 'user_name', :with =&amp;gt; 'student2066'&lt;br /&gt;
      click_button('Invite')&lt;br /&gt;
      expect(page).to have_content &amp;quot;Sent invitations&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2066&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, let’s create the third session and login as ‘student2066’. If the invitation sent by ‘student2065’ is successful, ‘student2066’ should be able to see an ‘Received Invitation’ by ‘student2065’ in ‘Your Team’ page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    in_browser(:three) do&lt;br /&gt;
      visit '/'&lt;br /&gt;
      #login as student2065&lt;br /&gt;
      user = User.find_by_name('student2066')&lt;br /&gt;
      msg = user.to_yaml&lt;br /&gt;
      File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
      visit root_path&lt;br /&gt;
      fill_in 'login_name', with: 'student2066'&lt;br /&gt;
      fill_in 'login_password', with: 'password'&lt;br /&gt;
      click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
      #test if a student can see an invitation&lt;br /&gt;
      expect(page).to have_content &amp;quot;User: student2066&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      #test if a student can accept an invitation&lt;br /&gt;
      click_link &amp;quot;Accept&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Team Information&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Team members&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Edit name &amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2066&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Leave team&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for leaving a team by a team member=== &lt;br /&gt;
&lt;br /&gt;
Everything is same to the first case except the last two lines of codes. In the last two lines, we let ‘student2065’ to leave the team, if he really leaves, he will see “You no longer have a team” in the next page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    click_link &amp;quot;Leave team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;You no longer have a team! &amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for leaving a team by a team leader===&lt;br /&gt;
&lt;br /&gt;
Everything is same to the first case before we change back to session one. If ‘student2064’ (Team leader) clicks “Leave team”, he should see  “You no longer have a team” in the next page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    in_browser(:one) do&lt;br /&gt;
      click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Leave team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;You no longer have a team! &amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for whether students choosing the same topic are in the same team===&lt;br /&gt;
&lt;br /&gt;
Since the only way for students to be in a team is by invitation, students who choose the same topic will be in different team. Our test is to let two different students select the same topic and see if their teammates contains each other. Therefore, first we let ‘student2064’ and 'student2065' sign for the same topic, and in their pages, to see if there is 'student2065' or 'student2064'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Team Name&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running the tests ==&lt;br /&gt;
&lt;br /&gt;
The tests can be run on the terminal using the command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec team_functionality_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whether the test fails or succeeds, allows us to determine which parts of the system are functioning properly.&lt;br /&gt;
&lt;br /&gt;
== Result ==&lt;br /&gt;
[[File:new1.PNG]]&lt;br /&gt;
[[File:new2.PNG]]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
# link for forked repository [[https://github.com/hli36/expertiza.git]] &lt;br /&gt;
# Github link for original repository [[https://github.com/expertiza/expertiza.git]]&lt;br /&gt;
# Github link for Capybara [[https://github.com/jnicklas/capybara.git]]&lt;/div&gt;</summary>
		<author><name>Fluan</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:New2.PNG&amp;diff=104589</id>
		<title>File:New2.PNG</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:New2.PNG&amp;diff=104589"/>
		<updated>2016-11-05T02:08:05Z</updated>

		<summary type="html">&lt;p&gt;Fluan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fluan</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:New1.PNG&amp;diff=104588</id>
		<title>File:New1.PNG</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:New1.PNG&amp;diff=104588"/>
		<updated>2016-11-05T02:07:29Z</updated>

		<summary type="html">&lt;p&gt;Fluan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fluan</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1666._Test_team_functionality&amp;diff=102969</id>
		<title>CSC/ECE 517 Fall 2016/E1666. Test team functionality</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1666._Test_team_functionality&amp;diff=102969"/>
		<updated>2016-10-28T20:45:27Z</updated>

		<summary type="html">&lt;p&gt;Fluan: /* Functional Tests Implementation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
Expertiza is an open source web based peer review system developed and maintained by students and faculty at North Carolina State University. It enables students enrolled in a particular course to form online teams and complete assignments. A typical cycle of an assignment involves the following major steps:&lt;br /&gt;
&lt;br /&gt;
* A pool of topics is made available to the students to choose from and form team to complete it within a pre-set deadline.&lt;br /&gt;
* After the development phase is finished, begins the peer review phase. Here students can review work of other teams, on the basis of some predefined factors and provide their feedback.&lt;br /&gt;
* Members of a team can also provide feedback for the respective review done for their work.&lt;br /&gt;
* In some projects there is a second development phase which allows team members to improve upon their work keeping past reviews in consideration.&lt;br /&gt;
* After this second development cycle begins another review phase, where original reviewers can re-review the updated work and provide critical feedback. &lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
The purpose of this task is to write functional tests for team functionality. Once an assignment is out, a student can select this assignment and others can join in the team. To test this functionality we wrote functional tests for the various scenarios.&lt;br /&gt;
One such scenario is :&lt;br /&gt;
&lt;br /&gt;
* Once the assignment is out and a student selects it, he/she can send out invites to other students to join the team.&lt;br /&gt;
* Invited students can accept the invitation and join the team.&lt;br /&gt;
&lt;br /&gt;
== Functional Tests ==&lt;br /&gt;
&lt;br /&gt;
Functional tests ensure that the functionalities of a software system are working as expected. To write our functional tests, we used the Capybara gem available for Ruby.&lt;br /&gt;
Capybara gem allows a user to test their web application through simulations.&lt;br /&gt;
&lt;br /&gt;
== Functional Tests Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Functional Tests for accepting an invitation ===&lt;br /&gt;
&lt;br /&gt;
In Expertiza assignments, the only way for a student to join an existing team is to be invited by the leader. Therefore, we will test whether the invitation function run smoothly. But before the test, we need to initialize some information. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
before(:each) do&lt;br /&gt;
    create(:assignment, name: &amp;quot;TestTeam&amp;quot;, directory_path: 'test_team')&lt;br /&gt;
    create_list(:participant, 3)&lt;br /&gt;
    create(:assignment_node)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;submission&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;review&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;metareview&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;drop_topic&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;signup&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;team_formation&amp;quot;)&lt;br /&gt;
    create(:deadline_right)&lt;br /&gt;
    create(:deadline_right, name: 'Late')&lt;br /&gt;
    create(:deadline_right, name: 'OK')&lt;br /&gt;
    create(:assignment_due_date, deadline_type: DeadlineType.where(name: 'review').first, due_at: Time.now + (100 * 24 * 60 * 60))&lt;br /&gt;
    #create(:topic)&lt;br /&gt;
    create(:topic, topic_name: &amp;quot;work1&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, we created a team, and set the maximum students to 3. Because there can only be one student in each session of browser, we need to create different sessions for different students. The first session is for the leader who will be the first one who select this topic. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it &amp;quot;case1&amp;quot; do&lt;br /&gt;
    in_browser(:one) do&lt;br /&gt;
    #test log in as a student&lt;br /&gt;
    user = User.find_by_name('student2064')&lt;br /&gt;
    msg = user.to_yaml&lt;br /&gt;
    File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
    visit root_path&lt;br /&gt;
    fill_in 'login_name', with: 'student2064'&lt;br /&gt;
    fill_in 'login_password', with: 'password'&lt;br /&gt;
    click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
    expect(page).to have_content &amp;quot;User: student2064&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if the topic can be seen and chosen by a student&lt;br /&gt;
    click_link &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;work1&amp;quot;&lt;br /&gt;
    my_link = find(:xpath, &amp;quot;//a[contains(@href,'sign_up_sheet/sign_up?assignment_id=#{Assignment.last.id}&amp;amp;id=1')]&amp;quot;)&lt;br /&gt;
    my_link.click&lt;br /&gt;
&lt;br /&gt;
    #test after selecting a topic, a team formed&lt;br /&gt;
    click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team Name&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if a team leader can invite another student&lt;br /&gt;
    page.fill_in 'user_name', :with =&amp;gt; 'student2065'&lt;br /&gt;
    click_button('Invite')&lt;br /&gt;
    expect(page).to have_content &amp;quot;Sent invitations&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So far,  a team has been created by ‘student2064’, who is the leader. Then, we will let him send an invitation to another user  ‘student2065’. Now, let’s create a new session which allows ’student2065’ to log in. After the login, we need to test if he receive the invitation and if he accepts it, whether or not he will be in the team. If he is included in the team, he will be able to see the name of the leader, who is ‘student2064’.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
in_browser(:two) do&lt;br /&gt;
    visit '/'&lt;br /&gt;
    user = User.find_by_name('student2065')&lt;br /&gt;
    msg = user.to_yaml&lt;br /&gt;
    File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
&lt;br /&gt;
    visit root_path&lt;br /&gt;
    fill_in 'login_name', with: 'student2065'&lt;br /&gt;
    fill_in 'login_password', with: 'password'&lt;br /&gt;
    click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
    #test if a student can see an invitation&lt;br /&gt;
    expect(page).to have_content &amp;quot;User: student2065&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if a student can accept an invitation&lt;br /&gt;
    click_link &amp;quot;Accept&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team Information&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team members&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Edit name &amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Leave team&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for rejecting an invitation===&lt;br /&gt;
&lt;br /&gt;
Same as the previous one, we set up the information at the beginning, and then let ‘student2064’ to pick up a topic and send an invitation to ‘student2065’. This time, we will let ‘student2065’ to choose to reject this invitation. If he declines the invitation, the invitation will disappear. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 #test if a student can decline an invitation&lt;br /&gt;
      click_link &amp;quot;Decline&amp;quot;&lt;br /&gt;
      expect(page).to have_no_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for sending an invitation by a team member===&lt;br /&gt;
&lt;br /&gt;
Same as the first case, we let ‘student2064’ to pick up a topic and send an invitation to ‘student2065’. Then, ‘student2065’ accepts the invitation and becomes a team member. Now we test if ‘student2065’ can send an invitation to another student—‘student2066’.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      #invite another student&lt;br /&gt;
      page.fill_in 'user_name', :with =&amp;gt; 'student2066'&lt;br /&gt;
      click_button('Invite')&lt;br /&gt;
      expect(page).to have_content &amp;quot;Sent invitations&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2066&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, let’s create the third session and login as ‘student2066’. If the invitation sent by ‘student2065’ is successful, ‘student2066’ should be able to see an ‘Received Invitation’ by ‘student2065’ in ‘Your Team’ page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    in_browser(:three) do&lt;br /&gt;
      visit '/'&lt;br /&gt;
      #login as student2065&lt;br /&gt;
      user = User.find_by_name('student2066')&lt;br /&gt;
      msg = user.to_yaml&lt;br /&gt;
      File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
      visit root_path&lt;br /&gt;
      fill_in 'login_name', with: 'student2066'&lt;br /&gt;
      fill_in 'login_password', with: 'password'&lt;br /&gt;
      click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
      #test if a student can see an invitation&lt;br /&gt;
      expect(page).to have_content &amp;quot;User: student2066&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      #test if a student can accept an invitation&lt;br /&gt;
      click_link &amp;quot;Accept&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Team Information&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Team members&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Edit name &amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2066&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Leave team&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for leaving a team by a team member=== &lt;br /&gt;
&lt;br /&gt;
Everything is same to the first case except the last two lines of codes. In the last two lines, we let ‘student2065’ to leave the team, if he really leaves, he will see “You no longer have a team” in the next page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    click_link &amp;quot;Leave team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;You no longer have a team! &amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for leaving a team by a team leader===&lt;br /&gt;
&lt;br /&gt;
Everything is same to the first case before we change back to session one. If ‘student2064’ (Team leader) clicks “Leave team”, he should see  “You no longer have a team” in the next page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    in_browser(:one) do&lt;br /&gt;
      click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Leave team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;You no longer have a team! &amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for whether students choosing the same topic are in the same team===&lt;br /&gt;
&lt;br /&gt;
Since the only way for students to be in a team is by invitation, students who choose the same topic will be in different team. Our test is to let two different students select the same topic and see if their teammates contains each other. Therefore, first we let ‘student2064’ and 'student2065' sign for the same topic, and in their pages, to see if there is 'student2065' or 'student2064'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Team Name&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running the tests ==&lt;br /&gt;
&lt;br /&gt;
The tests can be run on the terminal using the command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec team_functionality_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whether the test fails or succeeds, allows us to determine which parts of the system are functioning properly.&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
# link for forked repository [[https://github.com/hli36/expertiza.git]] &lt;br /&gt;
# Github link for original repository [[https://github.com/expertiza/expertiza.git]]&lt;br /&gt;
# Github link for Capybara [[https://github.com/jnicklas/capybara.git]]&lt;/div&gt;</summary>
		<author><name>Fluan</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1666._Test_team_functionality&amp;diff=102896</id>
		<title>CSC/ECE 517 Fall 2016/E1666. Test team functionality</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1666._Test_team_functionality&amp;diff=102896"/>
		<updated>2016-10-28T20:05:16Z</updated>

		<summary type="html">&lt;p&gt;Fluan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Feature Tests for Team Functionality =&lt;br /&gt;
&lt;br /&gt;
=== Background ===&lt;br /&gt;
Expertiza is an open source web based peer review system developed and maintained by students and faculty at North Carolina State University. It enables students enrolled in a particular course to form online teams and complete assignments. A typical cycle of an assignment involves the following major steps:&lt;br /&gt;
&lt;br /&gt;
* A pool of topics is made available to the students to choose from and form team to complete it within a pre-set deadline.&lt;br /&gt;
* After the development phase is finished, begins the peer review phase. Here students can review work of other teams, on the basis of some predefined factors and provide their feedback.&lt;br /&gt;
* Members of a team can also provide feedback for the respective review done for their work.&lt;br /&gt;
* In some projects there is a second development phase which allows team members to improve upon their work keeping past reviews in consideration.&lt;br /&gt;
* After this second development cycle begins another review phase, where original reviewers can re-review the updated work and provide critical feedback. &lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
The purpose of this task is to write functional tests for team functionality. Once an assignment is out, a student can select this assignment and others can join in the team. To test this functionality we wrote functional tests for the various scenarios.&lt;br /&gt;
One such scenario is :&lt;br /&gt;
&lt;br /&gt;
* Once the assignment is out and a student selects it, he/she can send out invites to other students to join the team.&lt;br /&gt;
* Invited students can accept the invitation and join the team.&lt;br /&gt;
&lt;br /&gt;
=== Functional Tests ===&lt;br /&gt;
&lt;br /&gt;
Functional tests ensure that the functionalities of a software system are working as expected. To write our functional tests, we used the Capybara gem available for Ruby.&lt;br /&gt;
Capybara gem allows a user to test their web application through simulations.&lt;br /&gt;
&lt;br /&gt;
=== Functional Tests Implementation ===&lt;br /&gt;
&lt;br /&gt;
=== Functional Tests for accepting an invitation ===&lt;br /&gt;
&lt;br /&gt;
In Expertiza assignments, the only way for a student to join an existing team is to be invited by the leader. Therefore, we will test whether the invitation function run smoothly. But before the test, we need to initialize some information. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
before(:each) do&lt;br /&gt;
    create(:assignment, name: &amp;quot;TestTeam&amp;quot;, directory_path: 'test_team')&lt;br /&gt;
    create_list(:participant, 3)&lt;br /&gt;
    create(:assignment_node)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;submission&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;review&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;metareview&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;drop_topic&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;signup&amp;quot;)&lt;br /&gt;
    create(:deadline_type, name: &amp;quot;team_formation&amp;quot;)&lt;br /&gt;
    create(:deadline_right)&lt;br /&gt;
    create(:deadline_right, name: 'Late')&lt;br /&gt;
    create(:deadline_right, name: 'OK')&lt;br /&gt;
    create(:assignment_due_date, deadline_type: DeadlineType.where(name: 'review').first, due_at: Time.now + (100 * 24 * 60 * 60))&lt;br /&gt;
    #create(:topic)&lt;br /&gt;
    create(:topic, topic_name: &amp;quot;work1&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, we created a team, and set the maximum students to 3. Because there can only be one student in each session of browser, we need to create different sessions for different students. The first session is for the leader who will be the first one who select this topic. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it &amp;quot;case1&amp;quot; do&lt;br /&gt;
    in_browser(:one) do&lt;br /&gt;
    #test log in as a student&lt;br /&gt;
    user = User.find_by_name('student2064')&lt;br /&gt;
    msg = user.to_yaml&lt;br /&gt;
    File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
    visit root_path&lt;br /&gt;
    fill_in 'login_name', with: 'student2064'&lt;br /&gt;
    fill_in 'login_password', with: 'password'&lt;br /&gt;
    click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
    expect(page).to have_content &amp;quot;User: student2064&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if the topic can be seen and chosen by a student&lt;br /&gt;
    click_link &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;work1&amp;quot;&lt;br /&gt;
    my_link = find(:xpath, &amp;quot;//a[contains(@href,'sign_up_sheet/sign_up?assignment_id=#{Assignment.last.id}&amp;amp;id=1')]&amp;quot;)&lt;br /&gt;
    my_link.click&lt;br /&gt;
&lt;br /&gt;
    #test after selecting a topic, a team formed&lt;br /&gt;
    click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team Name&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if a team leader can invite another student&lt;br /&gt;
    page.fill_in 'user_name', :with =&amp;gt; 'student2065'&lt;br /&gt;
    click_button('Invite')&lt;br /&gt;
    expect(page).to have_content &amp;quot;Sent invitations&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So far,  a team has been created by ‘student2064’, who is the leader. Then, we will let him send an invitation to another user  ‘student2065’. Now, let’s create a new session which allows ’student2065’ to log in. After the login, we need to test if he receive the invitation and if he accepts it, whether or not he will be in the team. If he is included in the team, he will be able to see the name of the leader, who is ‘student2064’.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
in_browser(:two) do&lt;br /&gt;
    visit '/'&lt;br /&gt;
    user = User.find_by_name('student2065')&lt;br /&gt;
    msg = user.to_yaml&lt;br /&gt;
    File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
&lt;br /&gt;
    visit root_path&lt;br /&gt;
    fill_in 'login_name', with: 'student2065'&lt;br /&gt;
    fill_in 'login_password', with: 'password'&lt;br /&gt;
    click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
    #test if a student can see an invitation&lt;br /&gt;
    expect(page).to have_content &amp;quot;User: student2065&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
    click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
    click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #test if a student can accept an invitation&lt;br /&gt;
    click_link &amp;quot;Accept&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team Information&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Team members&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Edit name &amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;Leave team&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for rejecting an invitation===&lt;br /&gt;
&lt;br /&gt;
Same as the previous one, we set up the information at the beginning, and then let ‘student2064’ to pick up a topic and send an invitation to ‘student2065’. This time, we will let ‘student2065’ to choose to reject this invitation. If he declines the invitation, the invitation will disappear. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 #test if a student can decline an invitation&lt;br /&gt;
      click_link &amp;quot;Decline&amp;quot;&lt;br /&gt;
      expect(page).to have_no_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for sending an invitation by a team member===&lt;br /&gt;
&lt;br /&gt;
Same as the first case, we let ‘student2064’ to pick up a topic and send an invitation to ‘student2065’. Then, ‘student2065’ accepts the invitation and becomes a team member. Now we test if ‘student2065’ can send an invitation to another student—‘student2066’.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      #invite another student&lt;br /&gt;
      page.fill_in 'user_name', :with =&amp;gt; 'student2066'&lt;br /&gt;
      click_button('Invite')&lt;br /&gt;
      expect(page).to have_content &amp;quot;Sent invitations&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2066&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, let’s create the third session and login as ‘student2066’. If the invitation sent by ‘student2065’ is successful, ‘student2066’ should be able to see an ‘Received Invitation’ by ‘student2065’ in ‘Your Team’ page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    in_browser(:three) do&lt;br /&gt;
      visit '/'&lt;br /&gt;
      #login as student2065&lt;br /&gt;
      user = User.find_by_name('student2066')&lt;br /&gt;
      msg = user.to_yaml&lt;br /&gt;
      File.open('log/diagnostic.txt', 'a') {|f| f.write msg }&lt;br /&gt;
      visit root_path&lt;br /&gt;
      fill_in 'login_name', with: 'student2066'&lt;br /&gt;
      fill_in 'login_password', with: 'password'&lt;br /&gt;
      click_button 'SIGN IN'&lt;br /&gt;
&lt;br /&gt;
      #test if a student can see an invitation&lt;br /&gt;
      expect(page).to have_content &amp;quot;User: student2066&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Signup sheet&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Received Invitations&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      #test if a student can accept an invitation&lt;br /&gt;
      click_link &amp;quot;Accept&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Team Information&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Team members&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Edit name &amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2066&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Leave team&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for leaving a team by a team member=== &lt;br /&gt;
&lt;br /&gt;
Everything is same to the first case except the last two lines of codes. In the last two lines, we let ‘student2065’ to leave the team, if he really leaves, he will see “You no longer have a team” in the next page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    click_link &amp;quot;Leave team&amp;quot;&lt;br /&gt;
    expect(page).to have_content &amp;quot;You no longer have a team! &amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functional Tests for leaving a team by a team leader===&lt;br /&gt;
&lt;br /&gt;
Everything is same to the first case before we change back to session one. If ‘student2064’ (Team leader) clicks “Leave team”, he should see  “You no longer have a team” in the next page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    in_browser(:one) do&lt;br /&gt;
      click_link &amp;quot;Assignments&amp;quot;&lt;br /&gt;
      click_link &amp;quot;TestTeam&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;Your team&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Your team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2064&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;student2065&amp;quot;&lt;br /&gt;
      click_link &amp;quot;Leave team&amp;quot;&lt;br /&gt;
      expect(page).to have_content &amp;quot;You no longer have a team! &amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Running the tests ===&lt;br /&gt;
&lt;br /&gt;
The tests can be run on the terminal using the command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec specfile.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whether the test fails or succeeds, allows us to determine which parts of the system are functioning properly.&lt;br /&gt;
&lt;br /&gt;
=== External Links ===&lt;br /&gt;
# link for forked repository&lt;br /&gt;
# Github link for original repository&lt;br /&gt;
# Github link for Capybara&lt;/div&gt;</summary>
		<author><name>Fluan</name></author>
	</entry>
</feed>