<?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=Yyang53</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=Yyang53"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Yyang53"/>
	<updated>2026-07-17T19:45:20Z</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_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121274</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121274"/>
		<updated>2018-12-08T01:08:32Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
Expertiza supports multi-round peer reviews. Currently, in this situation, student who did not do the previous round peer reviews can still do the subsequent round peer reviews, but will lose about 50 points according to the deduction policy. Therefore, it will be fairer to provide instructor an option to decide whether a student can do the subsequent round peer reviews when s/he did not do the previous round peer reviews.&lt;br /&gt;
&lt;br /&gt;
=Design Plan=&lt;br /&gt;
==UI Improvement==&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add a checkbox (e.g., “Allow student to join reviews late”*) to allow instructor to decide whether students can do the second round peer reviews without the first round peer reviews; by default this box is unchecked and it only appears when there are multi-round peer reviews.&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
==Functionality Implementation==&lt;br /&gt;
===Explanation===&lt;br /&gt;
Currently, when students didn't request enough reviews(e.g. Each student is required to do at least 2 reviews, but s/he only request one in the first round), they can still request more reviews in the second round, but will lose points due to lack of first round reviews. Now, we want to add a functionality to split the case. Below is the flow chart that explains the improvement. * Note that whether submit or not doesn't matter, as long as request, it counts.&lt;br /&gt;
&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
===Code Level Design===&lt;br /&gt;
1. First, check whether a certain assignment is multi-rounds&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, find the following function&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def number_of_current_round(topic_id)&lt;br /&gt;
    next_due_date = DueDate.get_next_due_date(self.id, topic_id)&lt;br /&gt;
    return 0 if next_due_date.nil?&lt;br /&gt;
    next_due_date.round&lt;br /&gt;
    #next_due_date.round ||= 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def current_stage_name(topic_id = nil)&lt;br /&gt;
    if self.staggered_deadline?&lt;br /&gt;
      return (topic_id.nil? ? 'Unknown' : get_current_stage(topic_id))&lt;br /&gt;
    end&lt;br /&gt;
    due_date = find_current_stage(topic_id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
check current rounds, if &amp;gt;=2, then checkbox can be clicked.&lt;br /&gt;
&lt;br /&gt;
2. Then, Edit the database&lt;br /&gt;
&lt;br /&gt;
Go to DB, add an attribute named 'is_second_round_allowed_checked' to assignment&lt;br /&gt;
&lt;br /&gt;
3. Finally, add the function&lt;br /&gt;
&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, add a function called 'allow_second_round_review'. When rounds &amp;lt;2, do nothing; else, allow second_round reviews if box checked.&lt;br /&gt;
&lt;br /&gt;
4. Change the view of student_review as following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if check_reviewable_topics(@assignment) or @assignment.get_current_stage(@topic_id) == &amp;quot;Finished&amp;quot; %&amp;gt;&lt;br /&gt;
    &amp;lt;%= render :partial =&amp;gt; 'responses', :locals =&amp;gt; {:mappings =&amp;gt; @review_mappings, :title =&amp;gt; 'Review'} %&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.number_of_current_round(@topic_id) == 1 or (@assignment.number_of_current_round(@topic_id) &amp;gt;= 2 and @assignment.allow_doing_subsequent_review_without_first_round) %&amp;gt;   &lt;br /&gt;
      &amp;lt;% if @assignment.dynamic_reviewer_assignment? %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @num_reviews_in_progress &amp;gt;= Assignment.max_outstanding_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't have more than 2 outstanding reviews. You must complete one of your outstanding reviews before selecting another.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;% elsif @assignment.num_reviews &amp;amp;&amp;amp; @assignment.num_reviews &amp;gt;= 0 &amp;amp;&amp;amp; @num_reviews_total &amp;gt;= @assignment.num_reviews%&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't do more than &amp;lt;%=@assignment.num_reviews%&amp;gt; reviews according to assignment policy.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;%else %&amp;gt;&lt;br /&gt;
            &amp;lt;%= render :partial =&amp;gt; 'set_dynamic_review', :locals =&amp;gt; {:assignment =&amp;gt; @assignment, :participant =&amp;gt; @participant} %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% else %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where the second if-statement ensures that the student can only have request option during first peer review round or get the permission from instructor during second or more round.&lt;br /&gt;
&lt;br /&gt;
=Test Plan=&lt;br /&gt;
We plan to write a feature test for the project. Go to expertiza/spec/features folder, add a file named 'Allow_second_round_review'. Below is the details of our test.&lt;br /&gt;
==Test checkbox(Instructor side)==&lt;br /&gt;
1. Log in as instructor&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Manage…”,then “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Under “Actions”, choose “Edit”&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Review Strategy”&lt;br /&gt;
&lt;br /&gt;
5. See the checkbox “Allow student to join reviews late”&lt;br /&gt;
==Test task list(Student side)==&lt;br /&gt;
===Case 1: Check the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student cannot do the second review without the first one&lt;br /&gt;
===Case 2: Uncheck the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student can do the second review without the first one&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/assignments/edit/_review_strategy.html.erb assignments/edit/_review_strategy.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/student_task/list.html.erb student_task/list.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza Expertiza in Github]&lt;br /&gt;
&lt;br /&gt;
[[Expertiza documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Documentation on Database Tables]]&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121273</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121273"/>
		<updated>2018-12-08T01:06:26Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Code Level Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
Expertiza supports multi-round peer reviews. Currently, in this situation, student who did not do the previous round peer reviews can still do the subsequent round peer reviews, but will lose about 50 points according to the deduction policy. Therefore, it will be fairer to provide instructor an option to decide whether a student can do the subsequent round peer reviews when s/he did not do the previous round peer reviews.&lt;br /&gt;
&lt;br /&gt;
=Design Plan=&lt;br /&gt;
==UI Improvement==&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add a checkbox (e.g., “Allow student to join reviews late”*) to allow instructor to decide whether students can do the second round peer reviews without the first round peer reviews; by default this box is unchecked and it only appears when there are multi-round peer reviews.&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
==Functionality Implementation==&lt;br /&gt;
===Explanation===&lt;br /&gt;
Currently, when students didn't request enough reviews(e.g. Each student is required to do at least 2 reviews, but s/he only request one in the first round), they can still request more reviews in the second round, but will lose points due to lack of first round reviews. Now, we want to add a functionality to split the case. Below is the flow chart that explains the improvement. * Note that whether submit or not doesn't matter, as long as request, it counts.&lt;br /&gt;
&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
===Code Level Design===&lt;br /&gt;
1. First, check whether a certain assignment is multi-rounds&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, find the following function&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def number_of_current_round(topic_id)&lt;br /&gt;
    next_due_date = DueDate.get_next_due_date(self.id, topic_id)&lt;br /&gt;
    return 0 if next_due_date.nil?&lt;br /&gt;
    next_due_date.round&lt;br /&gt;
    #next_due_date.round ||= 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def current_stage_name(topic_id = nil)&lt;br /&gt;
    if self.staggered_deadline?&lt;br /&gt;
      return (topic_id.nil? ? 'Unknown' : get_current_stage(topic_id))&lt;br /&gt;
    end&lt;br /&gt;
    due_date = find_current_stage(topic_id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
check current rounds, if &amp;gt;=2, then checkbox can be clicked.&lt;br /&gt;
&lt;br /&gt;
2. Then, Edit the database&lt;br /&gt;
Go to DB, add an attribute named 'is_second_round_allowed_checked' to assignment&lt;br /&gt;
&lt;br /&gt;
3. Finally, add the function&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, add a function called 'allow_second_round_review'. When rounds &amp;lt;2, do nothing; else, allow second_round reviews if box checked.&lt;br /&gt;
&lt;br /&gt;
4. Change the view of student_review as following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if check_reviewable_topics(@assignment) or @assignment.get_current_stage(@topic_id) == &amp;quot;Finished&amp;quot; %&amp;gt;&lt;br /&gt;
    &amp;lt;%= render :partial =&amp;gt; 'responses', :locals =&amp;gt; {:mappings =&amp;gt; @review_mappings, :title =&amp;gt; 'Review'} %&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.number_of_current_round(@topic_id) == 1 or (@assignment.number_of_current_round(@topic_id) &amp;gt;= 2 and @assignment.allow_doing_subsequent_review_without_first_round) %&amp;gt;   &lt;br /&gt;
      &amp;lt;% if @assignment.dynamic_reviewer_assignment? %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @num_reviews_in_progress &amp;gt;= Assignment.max_outstanding_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't have more than 2 outstanding reviews. You must complete one of your outstanding reviews before selecting another.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;% elsif @assignment.num_reviews &amp;amp;&amp;amp; @assignment.num_reviews &amp;gt;= 0 &amp;amp;&amp;amp; @num_reviews_total &amp;gt;= @assignment.num_reviews%&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't do more than &amp;lt;%=@assignment.num_reviews%&amp;gt; reviews according to assignment policy.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;%else %&amp;gt;&lt;br /&gt;
            &amp;lt;%= render :partial =&amp;gt; 'set_dynamic_review', :locals =&amp;gt; {:assignment =&amp;gt; @assignment, :participant =&amp;gt; @participant} %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% else %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where the second if-statement ensures that the student can only have request option during first peer review round or get the permission from instructor during second or more round.&lt;br /&gt;
&lt;br /&gt;
=Test Plan=&lt;br /&gt;
We plan to write a feature test for the project. Go to expertiza/spec/features folder, add a file named 'Allow_second_round_review'. Below is the details of our test.&lt;br /&gt;
==Test checkbox(Instructor side)==&lt;br /&gt;
1. Log in as instructor&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Manage…”,then “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Under “Actions”, choose “Edit”&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Review Strategy”&lt;br /&gt;
&lt;br /&gt;
5. See the checkbox “Allow student to join reviews late”&lt;br /&gt;
==Test task list(Student side)==&lt;br /&gt;
===Case 1: Check the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student cannot do the second review without the first one&lt;br /&gt;
===Case 2: Uncheck the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student can do the second review without the first one&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/assignments/edit/_review_strategy.html.erb assignments/edit/_review_strategy.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/student_task/list.html.erb student_task/list.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza Expertiza in Github]&lt;br /&gt;
&lt;br /&gt;
[[Expertiza documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Documentation on Database Tables]]&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121267</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121267"/>
		<updated>2018-12-08T01:02:24Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Code Level Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
Expertiza supports multi-round peer reviews. Currently, in this situation, student who did not do the previous round peer reviews can still do the subsequent round peer reviews, but will lose about 50 points according to the deduction policy. Therefore, it will be fairer to provide instructor an option to decide whether a student can do the subsequent round peer reviews when s/he did not do the previous round peer reviews.&lt;br /&gt;
&lt;br /&gt;
=Design Plan=&lt;br /&gt;
==UI Improvement==&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add a checkbox (e.g., “Allow student to join reviews late”*) to allow instructor to decide whether students can do the second round peer reviews without the first round peer reviews; by default this box is unchecked and it only appears when there are multi-round peer reviews.&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
==Functionality Implementation==&lt;br /&gt;
===Explanation===&lt;br /&gt;
Currently, when students didn't request enough reviews(e.g. Each student is required to do at least 2 reviews, but s/he only request one in the first round), they can still request more reviews in the second round, but will lose points due to lack of first round reviews. Now, we want to add a functionality to split the case. Below is the flow chart that explains the improvement. * Note that whether submit or not doesn't matter, as long as request, it counts.&lt;br /&gt;
&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
===Code Level Design===&lt;br /&gt;
1. First, check whether a certain assignment is multi-rounds&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, find the following function&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def number_of_current_round(topic_id)&lt;br /&gt;
    next_due_date = DueDate.get_next_due_date(self.id, topic_id)&lt;br /&gt;
    return 0 if next_due_date.nil?&lt;br /&gt;
    next_due_date.round&lt;br /&gt;
    #next_due_date.round ||= 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def current_stage_name(topic_id = nil)&lt;br /&gt;
    if self.staggered_deadline?&lt;br /&gt;
      return (topic_id.nil? ? 'Unknown' : get_current_stage(topic_id))&lt;br /&gt;
    end&lt;br /&gt;
    due_date = find_current_stage(topic_id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
check current rounds, if &amp;gt;=2, then checkbox can be clicked.&lt;br /&gt;
2. Then, Edit the database&lt;br /&gt;
Go to DB, add an attribute named 'is_second_round_allowed_checked' to assignment&lt;br /&gt;
&lt;br /&gt;
3. Finally, add the function&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, add a function called 'allow_second_round_review'. When rounds &amp;lt;2, do nothing; else, allow second_round reviews if box checked.&lt;br /&gt;
&lt;br /&gt;
4. Change the view of student_review as following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if check_reviewable_topics(@assignment) or @assignment.get_current_stage(@topic_id) == &amp;quot;Finished&amp;quot; %&amp;gt;&lt;br /&gt;
    &amp;lt;%= render :partial =&amp;gt; 'responses', :locals =&amp;gt; {:mappings =&amp;gt; @review_mappings, :title =&amp;gt; 'Review'} %&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.number_of_current_round(@topic_id) == 1 or (@assignment.number_of_current_round(@topic_id) &amp;gt;= 2 and @assignment.allow_doing_subsequent_review_without_first_round) %&amp;gt;   &lt;br /&gt;
      &amp;lt;% if @assignment.dynamic_reviewer_assignment? %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @num_reviews_in_progress &amp;gt;= Assignment.max_outstanding_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't have more than 2 outstanding reviews. You must complete one of your outstanding reviews before selecting another.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;% elsif @assignment.num_reviews &amp;amp;&amp;amp; @assignment.num_reviews &amp;gt;= 0 &amp;amp;&amp;amp; @num_reviews_total &amp;gt;= @assignment.num_reviews%&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't do more than &amp;lt;%=@assignment.num_reviews%&amp;gt; reviews according to assignment policy.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;%else %&amp;gt;&lt;br /&gt;
            &amp;lt;%= render :partial =&amp;gt; 'set_dynamic_review', :locals =&amp;gt; {:assignment =&amp;gt; @assignment, :participant =&amp;gt; @participant} %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% else %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where the second if-statement ensures that the student can only have request option during first peer review round or get the permission from instructor during second or more round.&lt;br /&gt;
&lt;br /&gt;
=Test Plan=&lt;br /&gt;
We plan to write a feature test for the project. Go to expertiza/spec/features folder, add a file named 'Allow_second_round_review'. Below is the details of our test.&lt;br /&gt;
==Test checkbox(Instructor side)==&lt;br /&gt;
1. Log in as instructor&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Manage…”,then “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Under “Actions”, choose “Edit”&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Review Strategy”&lt;br /&gt;
&lt;br /&gt;
5. See the checkbox “Allow student to join reviews late”&lt;br /&gt;
==Test task list(Student side)==&lt;br /&gt;
===Case 1: Check the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student cannot do the second review without the first one&lt;br /&gt;
===Case 2: Uncheck the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student can do the second review without the first one&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/assignments/edit/_review_strategy.html.erb assignments/edit/_review_strategy.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/student_task/list.html.erb student_task/list.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza Expertiza in Github]&lt;br /&gt;
&lt;br /&gt;
[[Expertiza documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Documentation on Database Tables]]&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121266</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121266"/>
		<updated>2018-12-08T01:01:57Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Code Level Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
Expertiza supports multi-round peer reviews. Currently, in this situation, student who did not do the previous round peer reviews can still do the subsequent round peer reviews, but will lose about 50 points according to the deduction policy. Therefore, it will be fairer to provide instructor an option to decide whether a student can do the subsequent round peer reviews when s/he did not do the previous round peer reviews.&lt;br /&gt;
&lt;br /&gt;
=Design Plan=&lt;br /&gt;
==UI Improvement==&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add a checkbox (e.g., “Allow student to join reviews late”*) to allow instructor to decide whether students can do the second round peer reviews without the first round peer reviews; by default this box is unchecked and it only appears when there are multi-round peer reviews.&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
==Functionality Implementation==&lt;br /&gt;
===Explanation===&lt;br /&gt;
Currently, when students didn't request enough reviews(e.g. Each student is required to do at least 2 reviews, but s/he only request one in the first round), they can still request more reviews in the second round, but will lose points due to lack of first round reviews. Now, we want to add a functionality to split the case. Below is the flow chart that explains the improvement. * Note that whether submit or not doesn't matter, as long as request, it counts.&lt;br /&gt;
&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
===Code Level Design===&lt;br /&gt;
1. First, check whether a certain assignment is multi-rounds&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, find the following function&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def number_of_current_round(topic_id)&lt;br /&gt;
    next_due_date = DueDate.get_next_due_date(self.id, topic_id)&lt;br /&gt;
    return 0 if next_due_date.nil?&lt;br /&gt;
    next_due_date.round&lt;br /&gt;
    #next_due_date.round ||= 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
check rounds, if &amp;gt;=2, then checkbox can be clicked.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def current_stage_name(topic_id = nil)&lt;br /&gt;
    if self.staggered_deadline?&lt;br /&gt;
      return (topic_id.nil? ? 'Unknown' : get_current_stage(topic_id))&lt;br /&gt;
    end&lt;br /&gt;
    due_date = find_current_stage(topic_id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Then, Edit the database&lt;br /&gt;
Go to DB, add an attribute named 'is_second_round_allowed_checked' to assignment&lt;br /&gt;
&lt;br /&gt;
3. Finally, add the function&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, add a function called 'allow_second_round_review'. When rounds &amp;lt;2, do nothing; else, allow second_round reviews if box checked.&lt;br /&gt;
&lt;br /&gt;
4. Change the view of student_review as following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if check_reviewable_topics(@assignment) or @assignment.get_current_stage(@topic_id) == &amp;quot;Finished&amp;quot; %&amp;gt;&lt;br /&gt;
    &amp;lt;%= render :partial =&amp;gt; 'responses', :locals =&amp;gt; {:mappings =&amp;gt; @review_mappings, :title =&amp;gt; 'Review'} %&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.number_of_current_round(@topic_id) == 1 or (@assignment.number_of_current_round(@topic_id) &amp;gt;= 2 and @assignment.allow_doing_subsequent_review_without_first_round) %&amp;gt;   &lt;br /&gt;
      &amp;lt;% if @assignment.dynamic_reviewer_assignment? %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @num_reviews_in_progress &amp;gt;= Assignment.max_outstanding_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't have more than 2 outstanding reviews. You must complete one of your outstanding reviews before selecting another.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;% elsif @assignment.num_reviews &amp;amp;&amp;amp; @assignment.num_reviews &amp;gt;= 0 &amp;amp;&amp;amp; @num_reviews_total &amp;gt;= @assignment.num_reviews%&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't do more than &amp;lt;%=@assignment.num_reviews%&amp;gt; reviews according to assignment policy.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;%else %&amp;gt;&lt;br /&gt;
            &amp;lt;%= render :partial =&amp;gt; 'set_dynamic_review', :locals =&amp;gt; {:assignment =&amp;gt; @assignment, :participant =&amp;gt; @participant} %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% else %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where the second if-statement ensures that the student can only have request option during first peer review round or get the permission from instructor during second or more round.&lt;br /&gt;
&lt;br /&gt;
=Test Plan=&lt;br /&gt;
We plan to write a feature test for the project. Go to expertiza/spec/features folder, add a file named 'Allow_second_round_review'. Below is the details of our test.&lt;br /&gt;
==Test checkbox(Instructor side)==&lt;br /&gt;
1. Log in as instructor&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Manage…”,then “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Under “Actions”, choose “Edit”&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Review Strategy”&lt;br /&gt;
&lt;br /&gt;
5. See the checkbox “Allow student to join reviews late”&lt;br /&gt;
==Test task list(Student side)==&lt;br /&gt;
===Case 1: Check the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student cannot do the second review without the first one&lt;br /&gt;
===Case 2: Uncheck the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student can do the second review without the first one&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/assignments/edit/_review_strategy.html.erb assignments/edit/_review_strategy.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/student_task/list.html.erb student_task/list.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza Expertiza in Github]&lt;br /&gt;
&lt;br /&gt;
[[Expertiza documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Documentation on Database Tables]]&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121265</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121265"/>
		<updated>2018-12-08T01:00:50Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Code Level Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
Expertiza supports multi-round peer reviews. Currently, in this situation, student who did not do the previous round peer reviews can still do the subsequent round peer reviews, but will lose about 50 points according to the deduction policy. Therefore, it will be fairer to provide instructor an option to decide whether a student can do the subsequent round peer reviews when s/he did not do the previous round peer reviews.&lt;br /&gt;
&lt;br /&gt;
=Design Plan=&lt;br /&gt;
==UI Improvement==&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add a checkbox (e.g., “Allow student to join reviews late”*) to allow instructor to decide whether students can do the second round peer reviews without the first round peer reviews; by default this box is unchecked and it only appears when there are multi-round peer reviews.&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
==Functionality Implementation==&lt;br /&gt;
===Explanation===&lt;br /&gt;
Currently, when students didn't request enough reviews(e.g. Each student is required to do at least 2 reviews, but s/he only request one in the first round), they can still request more reviews in the second round, but will lose points due to lack of first round reviews. Now, we want to add a functionality to split the case. Below is the flow chart that explains the improvement. * Note that whether submit or not doesn't matter, as long as request, it counts.&lt;br /&gt;
&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
===Code Level Design===&lt;br /&gt;
1. First, check whether a certain assignment is multi-rounds&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, find the following function&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def current_stage_name(topic_id = nil)&lt;br /&gt;
    if self.staggered_deadline?&lt;br /&gt;
      return (topic_id.nil? ? 'Unknown' : get_current_stage(topic_id))&lt;br /&gt;
    end&lt;br /&gt;
    due_date = find_current_stage(topic_id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
check rounds, if &amp;gt;=2, then checkbox can be clicked.&lt;br /&gt;
&lt;br /&gt;
2. Then, Edit the database&lt;br /&gt;
Go to DB, add an attribute named 'is_second_round_allowed_checked' to assignment&lt;br /&gt;
&lt;br /&gt;
3. Finally, add the function&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, add a function called 'allow_second_round_review'. When rounds &amp;lt;2, do nothing; else, allow second_round reviews if box checked.&lt;br /&gt;
&lt;br /&gt;
4. Change the view of student_review as following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if check_reviewable_topics(@assignment) or @assignment.get_current_stage(@topic_id) == &amp;quot;Finished&amp;quot; %&amp;gt;&lt;br /&gt;
    &amp;lt;%= render :partial =&amp;gt; 'responses', :locals =&amp;gt; {:mappings =&amp;gt; @review_mappings, :title =&amp;gt; 'Review'} %&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.number_of_current_round(@topic_id) == 1 or (@assignment.number_of_current_round(@topic_id) &amp;gt;= 2 and @assignment.allow_doing_subsequent_review_without_first_round) %&amp;gt;   &lt;br /&gt;
      &amp;lt;% if @assignment.dynamic_reviewer_assignment? %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @num_reviews_in_progress &amp;gt;= Assignment.max_outstanding_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't have more than 2 outstanding reviews. You must complete one of your outstanding reviews before selecting another.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;% elsif @assignment.num_reviews &amp;amp;&amp;amp; @assignment.num_reviews &amp;gt;= 0 &amp;amp;&amp;amp; @num_reviews_total &amp;gt;= @assignment.num_reviews%&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't do more than &amp;lt;%=@assignment.num_reviews%&amp;gt; reviews according to assignment policy.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;%else %&amp;gt;&lt;br /&gt;
            &amp;lt;%= render :partial =&amp;gt; 'set_dynamic_review', :locals =&amp;gt; {:assignment =&amp;gt; @assignment, :participant =&amp;gt; @participant} %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% else %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where the second if-statement ensures that the student can only have request option during first peer review round or get the permission from instructor during second or more round.&lt;br /&gt;
&lt;br /&gt;
=Test Plan=&lt;br /&gt;
We plan to write a feature test for the project. Go to expertiza/spec/features folder, add a file named 'Allow_second_round_review'. Below is the details of our test.&lt;br /&gt;
==Test checkbox(Instructor side)==&lt;br /&gt;
1. Log in as instructor&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Manage…”,then “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Under “Actions”, choose “Edit”&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Review Strategy”&lt;br /&gt;
&lt;br /&gt;
5. See the checkbox “Allow student to join reviews late”&lt;br /&gt;
==Test task list(Student side)==&lt;br /&gt;
===Case 1: Check the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student cannot do the second review without the first one&lt;br /&gt;
===Case 2: Uncheck the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student can do the second review without the first one&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/assignments/edit/_review_strategy.html.erb assignments/edit/_review_strategy.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/student_task/list.html.erb student_task/list.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza Expertiza in Github]&lt;br /&gt;
&lt;br /&gt;
[[Expertiza documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Documentation on Database Tables]]&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121256</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121256"/>
		<updated>2018-12-08T00:53:26Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Code Level Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
Expertiza supports multi-round peer reviews. Currently, in this situation, student who did not do the previous round peer reviews can still do the subsequent round peer reviews, but will lose about 50 points according to the deduction policy. Therefore, it will be fairer to provide instructor an option to decide whether a student can do the subsequent round peer reviews when s/he did not do the previous round peer reviews.&lt;br /&gt;
&lt;br /&gt;
=Design Plan=&lt;br /&gt;
==UI Improvement==&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add a checkbox (e.g., “Allow student to join reviews late”*) to allow instructor to decide whether students can do the second round peer reviews without the first round peer reviews; by default this box is unchecked and it only appears when there are multi-round peer reviews.&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
==Functionality Implementation==&lt;br /&gt;
===Explanation===&lt;br /&gt;
Currently, when students didn't request enough reviews(e.g. Each student is required to do at least 2 reviews, but s/he only request one in the first round), they can still request more reviews in the second round, but will lose points due to lack of first round reviews. Now, we want to add a functionality to split the case. Below is the flow chart that explains the improvement. * Note that whether submit or not doesn't matter, as long as request, it counts.&lt;br /&gt;
&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
===Code Level Design===&lt;br /&gt;
1. First, check whether a certain assignment is multi-rounds&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, find the following function&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def current_stage_name(topic_id = nil)&lt;br /&gt;
    if self.staggered_deadline?&lt;br /&gt;
      return (topic_id.nil? ? 'Unknown' : get_current_stage(topic_id))&lt;br /&gt;
    end&lt;br /&gt;
    due_date = find_current_stage(topic_id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
check rounds, if &amp;gt;=2, then checkbox can be clicked.&lt;br /&gt;
&lt;br /&gt;
2. Then, Edit the database&lt;br /&gt;
Go to DB, add an attribute named 'is_second_round_allowed_checked' to assignment&lt;br /&gt;
&lt;br /&gt;
3. Finally, add the function&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, add a function called 'allow_second_round_review'. When rounds &amp;lt;2, do nothing; else, allow second_round reviews if box checked.&lt;br /&gt;
&lt;br /&gt;
4. Change the view of student_review as following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if check_reviewable_topics(@assignment) or @assignment.get_current_stage(@topic_id) == &amp;quot;Finished&amp;quot; %&amp;gt;&lt;br /&gt;
    &amp;lt;%= render :partial =&amp;gt; 'responses', :locals =&amp;gt; {:mappings =&amp;gt; @review_mappings, :title =&amp;gt; 'Review'} %&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.number_of_current_round(@topic_id) == 1 or (@assignment.number_of_current_round(@topic_id) &amp;gt;= 2 and @assignment.allow_doing_subsequent_review_without_first_round) %&amp;gt;   &lt;br /&gt;
      &amp;lt;% if @assignment.dynamic_reviewer_assignment? %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @num_reviews_in_progress &amp;gt;= Assignment.max_outstanding_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't have more than 2 outstanding reviews. You must complete one of your outstanding reviews before selecting another.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;% elsif @assignment.num_reviews &amp;amp;&amp;amp; @assignment.num_reviews &amp;gt;= 0 &amp;amp;&amp;amp; @num_reviews_total &amp;gt;= @assignment.num_reviews%&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't do more than &amp;lt;%=@assignment.num_reviews%&amp;gt; reviews according to assignment policy.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;%else %&amp;gt;&lt;br /&gt;
            &amp;lt;%= render :partial =&amp;gt; 'set_dynamic_review', :locals =&amp;gt; {:assignment =&amp;gt; @assignment, :participant =&amp;gt; @participant} %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% else %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Test Plan=&lt;br /&gt;
We plan to write a feature test for the project. Go to expertiza/spec/features folder, add a file named 'Allow_second_round_review'. Below is the details of our test.&lt;br /&gt;
==Test checkbox(Instructor side)==&lt;br /&gt;
1. Log in as instructor&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Manage…”,then “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Under “Actions”, choose “Edit”&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Review Strategy”&lt;br /&gt;
&lt;br /&gt;
5. See the checkbox “Allow student to join reviews late”&lt;br /&gt;
==Test task list(Student side)==&lt;br /&gt;
===Case 1: Check the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student cannot do the second review without the first one&lt;br /&gt;
===Case 2: Uncheck the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student can do the second review without the first one&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/assignments/edit/_review_strategy.html.erb assignments/edit/_review_strategy.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/student_task/list.html.erb student_task/list.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza Expertiza in Github]&lt;br /&gt;
&lt;br /&gt;
[[Expertiza documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Documentation on Database Tables]]&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121254</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=121254"/>
		<updated>2018-12-08T00:51:53Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Code Level Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
Expertiza supports multi-round peer reviews. Currently, in this situation, student who did not do the previous round peer reviews can still do the subsequent round peer reviews, but will lose about 50 points according to the deduction policy. Therefore, it will be fairer to provide instructor an option to decide whether a student can do the subsequent round peer reviews when s/he did not do the previous round peer reviews.&lt;br /&gt;
&lt;br /&gt;
=Design Plan=&lt;br /&gt;
==UI Improvement==&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add a checkbox (e.g., “Allow student to join reviews late”*) to allow instructor to decide whether students can do the second round peer reviews without the first round peer reviews; by default this box is unchecked and it only appears when there are multi-round peer reviews.&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
==Functionality Implementation==&lt;br /&gt;
===Explanation===&lt;br /&gt;
Currently, when students didn't request enough reviews(e.g. Each student is required to do at least 2 reviews, but s/he only request one in the first round), they can still request more reviews in the second round, but will lose points due to lack of first round reviews. Now, we want to add a functionality to split the case. Below is the flow chart that explains the improvement. * Note that whether submit or not doesn't matter, as long as request, it counts.&lt;br /&gt;
&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
===Code Level Design===&lt;br /&gt;
1. First, check whether a certain assignment is multi-rounds&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, find the following function&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def num_review_rounds&lt;br /&gt;
    due_dates = AssignmentDueDate.where(parent_id: self.id)&lt;br /&gt;
    rounds = 0&lt;br /&gt;
    due_dates.each do |due_date|&lt;br /&gt;
      rounds = due_date.round if due_date.round &amp;gt; rounds&lt;br /&gt;
    end&lt;br /&gt;
    rounds&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
check rounds, if &amp;gt;=2, then checkbox will be added.&lt;br /&gt;
&lt;br /&gt;
2. Then, Edit the database&lt;br /&gt;
Go to DB, add an attribute named 'is_second_round_allowed_checked' to assignment&lt;br /&gt;
&lt;br /&gt;
3. Finally, add the function&lt;br /&gt;
Go to expertiza/app/models/assignment.rb, add a function called 'allow_second_round_review'. When rounds &amp;lt;2, do nothing; else, allow second_round reviews if box checked.&lt;br /&gt;
&lt;br /&gt;
4. Change the view of student_review as following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if check_reviewable_topics(@assignment) or @assignment.get_current_stage(@topic_id) == &amp;quot;Finished&amp;quot; %&amp;gt;&lt;br /&gt;
    &amp;lt;%= render :partial =&amp;gt; 'responses', :locals =&amp;gt; {:mappings =&amp;gt; @review_mappings, :title =&amp;gt; 'Review'} %&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.number_of_current_round(@topic_id) == 1 or (@assignment.number_of_current_round(@topic_id) &amp;gt;= 2 and @assignment.allow_doing_subsequent_review_without_first_round) %&amp;gt;   &lt;br /&gt;
      &amp;lt;% if @assignment.dynamic_reviewer_assignment? %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @num_reviews_in_progress &amp;gt;= Assignment.max_outstanding_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't have more than 2 outstanding reviews. You must complete one of your outstanding reviews before selecting another.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;% elsif @assignment.num_reviews &amp;amp;&amp;amp; @assignment.num_reviews &amp;gt;= 0 &amp;amp;&amp;amp; @num_reviews_total &amp;gt;= @assignment.num_reviews%&amp;gt;&lt;br /&gt;
              &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
              &amp;lt;span&amp;gt;Note: You can't do more than &amp;lt;%=@assignment.num_reviews%&amp;gt; reviews according to assignment policy.&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;%else %&amp;gt;&lt;br /&gt;
            &amp;lt;%= render :partial =&amp;gt; 'set_dynamic_review', :locals =&amp;gt; {:assignment =&amp;gt; @assignment, :participant =&amp;gt; @participant} %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% else %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Test Plan=&lt;br /&gt;
We plan to write a feature test for the project. Go to expertiza/spec/features folder, add a file named 'Allow_second_round_review'. Below is the details of our test.&lt;br /&gt;
==Test checkbox(Instructor side)==&lt;br /&gt;
1. Log in as instructor&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Manage…”,then “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Under “Actions”, choose “Edit”&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Review Strategy”&lt;br /&gt;
&lt;br /&gt;
5. See the checkbox “Allow student to join reviews late”&lt;br /&gt;
==Test task list(Student side)==&lt;br /&gt;
===Case 1: Check the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student cannot do the second review without the first one&lt;br /&gt;
===Case 2: Uncheck the checkbox===&lt;br /&gt;
1. Log in as student&lt;br /&gt;
&lt;br /&gt;
2. Navigate to “Assignments”&lt;br /&gt;
&lt;br /&gt;
3. Choose an assignment&lt;br /&gt;
&lt;br /&gt;
4. Navigate to “Others’ work”&lt;br /&gt;
&lt;br /&gt;
5. Student can do the second review without the first one&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/assignments/edit/_review_strategy.html.erb assignments/edit/_review_strategy.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/student_task/list.html.erb student_task/list.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza Expertiza in Github]&lt;br /&gt;
&lt;br /&gt;
[[Expertiza documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Documentation on Database Tables]]&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=120263</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=120263"/>
		<updated>2018-11-20T02:53:11Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
Expertiza supports multi-round peer review. Currently, in this situation, student who did not do the previous round peer review can still do the subsequent round peer review. According to the deduction policy, some reviewees might lose points because of the reviewers who miss the previous round peer review. Therefore, it will be fairer to provide instructor an option which can decide whether a student can do the subsequent round peer review when s/he did not do the previous round peer review.&lt;br /&gt;
&lt;br /&gt;
==Design Plan==&lt;br /&gt;
===UI Improvement===&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add an option (e.g., “Allow student to join reviews late”*) to allow students to do the second round peer reviews without the first round peer review; by default this option is unchecked. Please note that this option should appear only if there are multi-round peer reviews. If there is only one round peer review, do not show this option.&lt;br /&gt;
&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
===Functionality Implementation===&lt;br /&gt;
====Visual Aids====&lt;br /&gt;
*Flow Chart&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
*UML&lt;br /&gt;
====Related Problems====&lt;br /&gt;
====Code Level Design====&lt;br /&gt;
==Test Plan==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/assignments/edit/_review_strategy.html.erb assignments/edit/_review_strategy.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/student_task/list.html.erb student_task/list.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza  Expertiza Github]&lt;br /&gt;
&lt;br /&gt;
[http://wiki.expertiza.ncsu.edu/index.php/Documentation_on_Database_Tables]&lt;br /&gt;
&lt;br /&gt;
[[http://wiki.expertiza.ncsu.edu/index.php/Main_Page]]&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=120262</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=120262"/>
		<updated>2018-11-20T02:52:55Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
Expertiza supports multi-round peer review. Currently, in this situation, student who did not do the previous round peer review can still do the subsequent round peer review. According to the deduction policy, some reviewees might lose points because of the reviewers who miss the previous round peer review. Therefore, it will be fairer to provide instructor an option which can decide whether a student can do the subsequent round peer review when s/he did not do the previous round peer review.&lt;br /&gt;
&lt;br /&gt;
==Design Plan==&lt;br /&gt;
===UI Improvement===&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add an option (e.g., “Allow student to join reviews late”*) to allow students to do the second round peer reviews without the first round peer review; by default this option is unchecked. Please note that this option should appear only if there are multi-round peer reviews. If there is only one round peer review, do not show this option.&lt;br /&gt;
&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
===Functionality Implementation===&lt;br /&gt;
====Visual Aids====&lt;br /&gt;
*Flow Chart&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
*UML&lt;br /&gt;
====Related Problems====&lt;br /&gt;
====Code Level Design====&lt;br /&gt;
==Test Plan==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/assignments/edit/_review_strategy.html.erb assignments/edit/_review_strategy.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/student_task/list.html.erb student_task/list.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza  Expertiza Github]&lt;br /&gt;
&lt;br /&gt;
[wiki.expertiza.ncsu.edu/index.php/Documentation_on_Database_Tables]&lt;br /&gt;
&lt;br /&gt;
[[http://wiki.expertiza.ncsu.edu/index.php/Main_Page]]&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=120260</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=120260"/>
		<updated>2018-11-20T02:51:23Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
Expertiza supports multi-round peer review. Currently, in this situation, student who did not do the previous round peer review can still do the subsequent round peer review. According to the deduction policy, some reviewees might lose points because of the reviewers who miss the previous round peer review. Therefore, it will be fairer to provide instructor an option which can decide whether a student can do the subsequent round peer review when s/he did not do the previous round peer review.&lt;br /&gt;
&lt;br /&gt;
==Design Plan==&lt;br /&gt;
===UI Improvement===&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add an option (e.g., “Allow student to join reviews late”*) to allow students to do the second round peer reviews without the first round peer review; by default this option is unchecked. Please note that this option should appear only if there are multi-round peer reviews. If there is only one round peer review, do not show this option.&lt;br /&gt;
&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
===Functionality Implementation===&lt;br /&gt;
====Visual Aids====&lt;br /&gt;
*Flow Chart&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
*UML&lt;br /&gt;
====Related Problems====&lt;br /&gt;
====Code Level Design====&lt;br /&gt;
==Test Plan==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/assignments/edit/_review_strategy.html.erb assignments/edit/_review_strategy.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza/blob/master/app/views/student_task/list.html.erb student_task/list.html.erb]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/expertiza/expertiza  Expertiza Github]&lt;br /&gt;
&lt;br /&gt;
[http://wiki.expertiza.ncsu.edu/index.php/Documentation_on_Database_Tables]&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=120253</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=120253"/>
		<updated>2018-11-20T02:22:36Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
Expertiza supports multi-round peer review. Currently, in this situation, student who did not do the previous round peer review can still do the subsequent round peer review. According to the deduction policy, some reviewees might lose points because of the reviewers who miss the previous round peer review. Therefore, it will be fairer to provide instructor an option which can decide whether a student can do the subsequent round peer review when s/he did not do the previous round peer review.&lt;br /&gt;
&lt;br /&gt;
==Design Plan==&lt;br /&gt;
===UI Improvement===&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add an option (e.g., “Allow student to join reviews late”*) to allow students to do the second round peer reviews without the first round peer review; by default this option is unchecked. Please note that this option should appear only if there are multi-round peer reviews. If there is only one round peer review, do not show this option.&lt;br /&gt;
&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
===Functionality Implementation===&lt;br /&gt;
====Visual Aids====&lt;br /&gt;
*Flow Chart&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
*UML&lt;br /&gt;
====Related Problems====&lt;br /&gt;
====Code Level Design====&lt;br /&gt;
==Test Plan==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Related Files ==&lt;br /&gt;
assignments/edit/_review_strategy.html.erb&lt;br /&gt;
student_task/list.html.erb&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=120252</id>
		<title>CSC/ECE 517 Fall 2018 E1870 Warn of deadlines and enforce them</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018_E1870_Warn_of_deadlines_and_enforce_them&amp;diff=120252"/>
		<updated>2018-11-20T02:21:09Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
Currently, student who did not do the previous round peer review can still do the subsequent round peer review. According to the deduction policy, some reviewees might lose points because of the reviewers who miss the previous round peer review. Therefore, it will be fairer to provide instructor an option which can decide whether a student can do the subsequent round peer review when s/he did not do the previous round peer review.&lt;br /&gt;
&lt;br /&gt;
==Design Plan==&lt;br /&gt;
===UI Improvement===&lt;br /&gt;
In assignment#edit page “Review strategy” tab, add an option (e.g., “Allow student to join reviews late”*) to allow students to do the second round peer reviews without the first round peer review; by default this option is unchecked. Please note that this option should appear only if there are multi-round peer reviews. If there is only one round peer review, do not show this option.&lt;br /&gt;
&lt;br /&gt;
*Before&lt;br /&gt;
[[File:Before1.png]]&lt;br /&gt;
*After&lt;br /&gt;
[[File:Afterr1.png]]&lt;br /&gt;
===Functionality Implementation===&lt;br /&gt;
====Visual Aids====&lt;br /&gt;
*Flow Chart&lt;br /&gt;
[[File:Diagram.png]]&lt;br /&gt;
*UML&lt;br /&gt;
====Related Problems====&lt;br /&gt;
====Code Level Design====&lt;br /&gt;
==Test Plan==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Related Files ==&lt;br /&gt;
assignments/edit/_review_strategy.html.erb&lt;br /&gt;
student_task/list.html.erb&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=119068</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=119068"/>
		<updated>2018-11-09T19:03:32Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Background */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page is for the description of unit test for E1850 OSS assignment for Fall 2018, CSC/ECE 517.&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Expertiza is an open source web based on peer review system developed and maintained by students and faculty members at North Carolina State University. It enables students who enrolled in a particular course to form online teams, complete assignments, review other's work and receive feedbacks of their works.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Review_response_map.rb is used to prepare data for peer review. But there are no unit tests for it.&lt;br /&gt;
&lt;br /&gt;
== Work to be done ==&lt;br /&gt;
*Create a new file named review_response_map_spec.rb under spec/models folder&lt;br /&gt;
*Write RSpec unit tests to make the path coverage above 90%.&lt;br /&gt;
*Coverage edge cases.&lt;br /&gt;
*Achieve high branch coverage. Use the mutant-rspec gem to measure test thoroughness and fault-finding capability of tests.&lt;br /&gt;
&lt;br /&gt;
== Files Created ==&lt;br /&gt;
*spec/models/review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
=== Mock instance ===&lt;br /&gt;
We mock the necessary instances for the test in the beginning of test file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  let(:team) { build(:assignment_team, id: 1, name: 'team no name', assignment: assignment, users: [student], parent_id: 1) }&lt;br /&gt;
  let(:team1) { build(:assignment_team, id: 2, name: 'team has name', assignment: assignment, users: [student]) }&lt;br /&gt;
  let(:review_response_map) { build(:review_response_map, id: 1, assignment: assignment, reviewer: participant, reviewee: team, reviewed_object_id: 1) }&lt;br /&gt;
  let(:review_response_map1) { build(:review_response_map, id: 2, assignment: assignment, reviewer: participant1, reviewee: team1, reviewed_object_id: 1) }&lt;br /&gt;
  let(:feedback) { FeedbackResponseMap.new(id: 1, reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1) }&lt;br /&gt;
  let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, parent_id: 1, name: 'no name', fullname: 'no one')) }&lt;br /&gt;
  let(:participant1) { build(:participant, id: 2, parent_id: 2, user: build(:student, parent_id: 1, name: 'has name', fullname: 'has one')) }&lt;br /&gt;
  let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt', rounds_of_reviews: 2) }&lt;br /&gt;
  let(:assignment1) { build(:assignment, id: 2, name: 'Test Assgt', rounds_of_reviews: 1) }&lt;br /&gt;
  let(:response) { build(:response, id: 1, map_id: 1, round: 1, response_map: review_response_map,  is_submitted: true) }&lt;br /&gt;
  let(:response1) { build(:response, id: 2, map_id: 1, round: 2, response_map: review_response_map) }&lt;br /&gt;
  let(:response2) { build(:response, id: 3, map_id: 1, round: nil, response_map: review_response_map, is_submitted: true) }&lt;br /&gt;
  let(:metareview_response_map) { MetareviewResponseMap.new(reviewed_object_id: 1) }&lt;br /&gt;
  let(:student) { build(:student, id: 1, fullname: 'no one', email: 'expertiza@mailinator.com') }&lt;br /&gt;
  let(:questionnaire) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&lt;br /&gt;
  let(:response_map) { ResponseMap.new(id: 1, reviewed_object_id: 1, reviewee_id: 1, reviewer_id: 1, type: &amp;quot;ReviewResponseMap&amp;quot;, response: [response], calibrate_to: 0) }&lt;br /&gt;
  let(:user) { User.new(id: 1, name: &amp;quot;name&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:user1) { User.new(id: 2, name: &amp;quot;name1&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:assignment_participant) { AssignmentParticipant.new(user_id: 1, parent_id: 1) }&lt;br /&gt;
  let(:assignment_participant1) { AssignmentParticipant.new(id: 1, user_id: 2, parent_id: 1) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
Write test for the methods in review_response_map.rb.&lt;br /&gt;
&lt;br /&gt;
=== Questionnaire ===&lt;br /&gt;
Questionnaire method returns a questionnaire associated with an assignment.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#questionnaire' do&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).and_return(1)&lt;br /&gt;
    allow(Questionnaire).to receive(:find_by).with(id: 1).and_return(questionnaire)&lt;br /&gt;
    expect(review_response_map.questionnaire(1)).to eq(questionnaire)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get title ===&lt;br /&gt;
Get_title method returns the title.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_title' do&lt;br /&gt;
    expect(review_response_map.get_title).to eq(&amp;quot;Review&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete ===&lt;br /&gt;
Delete method deletes the feedback_response_map and metareview_response_map and return review_response_map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#delete' do&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([feedback])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
    expect(review_response_map.delete).to equal(review_response_map)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Export fields ===&lt;br /&gt;
Export_fields method which shows the title of export csv file, &amp;quot;contributor&amp;quot; and &amp;quot;reviewed by&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export_fields' do&lt;br /&gt;
    expect(ReviewResponseMap.export_fields('options')).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Export ===&lt;br /&gt;
Export method exports the name of reviewer and reviewee and return the map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export' do&lt;br /&gt;
    csv = []&lt;br /&gt;
    parent_id = 1&lt;br /&gt;
    options = nil&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([review_response_map, review_response_map1])&lt;br /&gt;
    expect(ReviewResponseMap.export(csv, parent_id, options)).to eq([review_response_map1, review_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Import ===&lt;br /&gt;
Import method allows user to import the csv file and check it. After that, it returns the name of reviewers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#import' do&lt;br /&gt;
    row_hash = {reviewee: &amp;quot;name&amp;quot;, reviewers: [&amp;quot;name1&amp;quot;]}&lt;br /&gt;
    session = nil&lt;br /&gt;
    assignment_id = 1&lt;br /&gt;
    # when reviewee user = nil&lt;br /&gt;
    allow(User).to receive(:find_by).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Cannot find reviewee user.&amp;quot;)&lt;br /&gt;
    # when reviewee user exists but reviewee user is not a participant in this assignment&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name&amp;quot;).and_return(user)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot;)&lt;br /&gt;
    # when reviewee user exists and reviewee user is a participant in this assignment&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(assignment_participant)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(team)&lt;br /&gt;
    ## when reviewer user doesn't exist&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Cannot find reviewer user.&amp;quot;)&lt;br /&gt;
    ## when reviewer user exist&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    ### when reviewer user is not a participant in this assignment.&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot;)&lt;br /&gt;
    ### when reviewer user is a participant in this assignment.&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
    # when reviewee_team = nil&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(nil)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:create).and_return(double('team', id: 1))&lt;br /&gt;
    allow(TeamsUser).to receive(:create).with(team_id: 1, user_id: 1).and_return(double('teams_users', id: 1, team_id: 1, user_id: 1))&lt;br /&gt;
    allow(TeamNode).to receive(:create).with(parent_id: assignment_id, node_object_id: 1).and_return(double('team_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(TeamUserNode).to receive(:create).with(parent_id: 1, node_object_id: 1).and_return(double('team_user_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Show feedback ===&lt;br /&gt;
Show_feedback method returns the html associated with response.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it '#show_feedback' do&lt;br /&gt;
      allow(review_response_map).to receive(:response).and_return([response])&lt;br /&gt;
      allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
      allow(FeedbackResponseMap).to receive(:find_by).with(reviewed_object_id: 1).and_return(feedback)&lt;br /&gt;
      allow(feedback).to receive(:response).and_return([response])&lt;br /&gt;
      expect(review_response_map.show_feedback(response)).to eq(&amp;quot;&amp;lt;table width=\&amp;quot;100%\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot; width=\&amp;quot;70%\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Review &amp;lt;/b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;#\&amp;quot; name= \&amp;quot;review_1Link\&amp;quot; onClick=\&amp;quot;toggleElement('review_1','review');return false;\&amp;quot;&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;show review&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Last Reviewed:&amp;lt;/b&amp;gt;&amp;lt;span&amp;gt;Not available&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;table id=\&amp;quot;review_1\&amp;quot;&amp;quot;\&lt;br /&gt;
          &amp;quot; style=\&amp;quot;display: none;\&amp;quot; class=\&amp;quot;table table-bordered\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;Additional Comment: &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Metareview response maps ===&lt;br /&gt;
Metareview_response_maps method returns metareview_list associated with responses.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#metareview_response_maps' do&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map])&lt;br /&gt;
    expect(review_response_map.metareview_response_maps).to eq([metareview_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get responses for team round ===&lt;br /&gt;
Get_responses_for_team_round method returns the responses associated with team and round.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_responses_for_team_round' do&lt;br /&gt;
    allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(ResponseMap).to receive(:where).with(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;).and_return([response_map])&lt;br /&gt;
    expect(ReviewResponseMap.get_responses_for_team_round(team, 1)).to eq([response])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Final versions from reviewer ===&lt;br /&gt;
Final_versions_from_reviewer method returns the questionnaire and response ids associated with reviewer.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#final_versions_from_reviewer' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewer_id: 1).and_return([review_response_map])&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(participant).to receive(:parent_id).and_return(1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.final_versions_from_reviewer(1)).to eq(&amp;quot;review round1&amp;quot;: {questionnaire_id: 1, response_ids: [1]}, &amp;quot;review round2&amp;quot;: {questionnaire_id: 1, response_ids: [2]})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Review response report ===&lt;br /&gt;
Review_response_report method returns the participants associated with assignment.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#review_response_report' do&lt;br /&gt;
    id = 1&lt;br /&gt;
    type = &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    user_ids = []&lt;br /&gt;
    review_user = user&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(User).to receive_message_chain(:select, :where).and_return([user])&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:where).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq([assignment_participant])&lt;br /&gt;
    review_user = nil&lt;br /&gt;
    allow(ResponseMap).to receive_message_chain(:select, :where).and_return([response_map])&lt;br /&gt;
    allow([response_map]).to receive(:reviewer_id).and_return(1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find).with(1).and_return([assignment_participant])&lt;br /&gt;
    allow(Participant).to receive(:sort_by_name).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq([assignment_participant])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
Email method can successfully send an email.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#email' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student)&lt;br /&gt;
    allow(User).to receive(:find).with(1).and_return(student)&lt;br /&gt;
    review_response_map.reviewee_id = 1&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }.to change { ActionMailer::Base.deliveries.count }.by (1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prepare final review versions ===&lt;br /&gt;
Prepare_final_review_versions method returns the final review versions.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_final_review_versions' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(metareview_response_map).to receive(:id).and_return(1)&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map])&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq(&amp;quot;review round1&amp;quot;: {questionnaire_id: 1, response_ids: [1]}, &amp;quot;review round2&amp;quot;: {questionnaire_id: 1, response_ids: [2]})&lt;br /&gt;
    # when round = nil&lt;br /&gt;
    reviewer_id = 2&lt;br /&gt;
    allow(Participant).to receive(:find).with(2).and_return(participant1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(2).and_return(assignment1)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq(review: {questionnaire_id: nil, response_ids: [3]})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prepare review response ===&lt;br /&gt;
Prepare_review_response method returns the response id associated with assignment.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_review_response' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    review_response_map.id = 1&lt;br /&gt;
    round = 1&lt;br /&gt;
    maps = [review_response_map]&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([1])&lt;br /&gt;
    round = nil&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([3])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Running Rspec==&lt;br /&gt;
The tests can be run on the terminal from inside the expertiza folder using following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit Test Result==&lt;br /&gt;
app/models/review_response_map.rb &amp;lt;br&amp;gt;&lt;br /&gt;
100.0 % covered &amp;lt;br&amp;gt;&lt;br /&gt;
102 relevant lines. 102 lines covered and 0 lines missed.&lt;br /&gt;
&lt;br /&gt;
Full video for this test can be found at https://drive.google.com/file/d/18vr3q2dCyh3_tsFLH8w9y6Y9uhdz0Ljj/view?usp=sharing&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
https://github.com/Sauve-moi/expertiza&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=119067</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=119067"/>
		<updated>2018-11-09T19:00:57Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Import */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page is for the description of unit test for E1850 OSS assignment for Fall 2018, CSC/ECE 517.&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 members at North Carolina State University. It enables students enrolled in a particular course to form online teams, complete assignments, review other's work and receive feedbacks of your work.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Review_response_map.rb is used to prepare data for peer review. But there are no unit tests for it.&lt;br /&gt;
&lt;br /&gt;
== Work to be done ==&lt;br /&gt;
*Create a new file named review_response_map_spec.rb under spec/models folder&lt;br /&gt;
*Write RSpec unit tests to make the path coverage above 90%.&lt;br /&gt;
*Coverage edge cases.&lt;br /&gt;
*Achieve high branch coverage. Use the mutant-rspec gem to measure test thoroughness and fault-finding capability of tests.&lt;br /&gt;
&lt;br /&gt;
== Files Created ==&lt;br /&gt;
*spec/models/review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
=== Mock instance ===&lt;br /&gt;
We mock the necessary instances for the test in the beginning of test file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  let(:team) { build(:assignment_team, id: 1, name: 'team no name', assignment: assignment, users: [student], parent_id: 1) }&lt;br /&gt;
  let(:team1) { build(:assignment_team, id: 2, name: 'team has name', assignment: assignment, users: [student]) }&lt;br /&gt;
  let(:review_response_map) { build(:review_response_map, id: 1, assignment: assignment, reviewer: participant, reviewee: team, reviewed_object_id: 1) }&lt;br /&gt;
  let(:review_response_map1) { build(:review_response_map, id: 2, assignment: assignment, reviewer: participant1, reviewee: team1, reviewed_object_id: 1) }&lt;br /&gt;
  let(:feedback) { FeedbackResponseMap.new(id: 1, reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1) }&lt;br /&gt;
  let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, parent_id: 1, name: 'no name', fullname: 'no one')) }&lt;br /&gt;
  let(:participant1) { build(:participant, id: 2, parent_id: 2, user: build(:student, parent_id: 1, name: 'has name', fullname: 'has one')) }&lt;br /&gt;
  let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt', rounds_of_reviews: 2) }&lt;br /&gt;
  let(:assignment1) { build(:assignment, id: 2, name: 'Test Assgt', rounds_of_reviews: 1) }&lt;br /&gt;
  let(:response) { build(:response, id: 1, map_id: 1, round: 1, response_map: review_response_map,  is_submitted: true) }&lt;br /&gt;
  let(:response1) { build(:response, id: 2, map_id: 1, round: 2, response_map: review_response_map) }&lt;br /&gt;
  let(:response2) { build(:response, id: 3, map_id: 1, round: nil, response_map: review_response_map, is_submitted: true) }&lt;br /&gt;
  let(:metareview_response_map) { MetareviewResponseMap.new(reviewed_object_id: 1) }&lt;br /&gt;
  let(:student) { build(:student, id: 1, fullname: 'no one', email: 'expertiza@mailinator.com') }&lt;br /&gt;
  let(:questionnaire) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&lt;br /&gt;
  let(:response_map) { ResponseMap.new(id: 1, reviewed_object_id: 1, reviewee_id: 1, reviewer_id: 1, type: &amp;quot;ReviewResponseMap&amp;quot;, response: [response], calibrate_to: 0) }&lt;br /&gt;
  let(:user) { User.new(id: 1, name: &amp;quot;name&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:user1) { User.new(id: 2, name: &amp;quot;name1&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:assignment_participant) { AssignmentParticipant.new(user_id: 1, parent_id: 1) }&lt;br /&gt;
  let(:assignment_participant1) { AssignmentParticipant.new(id: 1, user_id: 2, parent_id: 1) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
Write test for the methods in review_response_map.rb.&lt;br /&gt;
&lt;br /&gt;
=== Questionnaire ===&lt;br /&gt;
Questionnaire method returns a questionnaire associated with an assignment.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#questionnaire' do&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).and_return(1)&lt;br /&gt;
    allow(Questionnaire).to receive(:find_by).with(id: 1).and_return(questionnaire)&lt;br /&gt;
    expect(review_response_map.questionnaire(1)).to eq(questionnaire)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get title ===&lt;br /&gt;
Get_title method returns the title.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_title' do&lt;br /&gt;
    expect(review_response_map.get_title).to eq(&amp;quot;Review&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete ===&lt;br /&gt;
Delete method deletes the feedback_response_map and metareview_response_map and return review_response_map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#delete' do&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([feedback])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
    expect(review_response_map.delete).to equal(review_response_map)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Export fields ===&lt;br /&gt;
Export_fields method which shows the title of export csv file, &amp;quot;contributor&amp;quot; and &amp;quot;reviewed by&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export_fields' do&lt;br /&gt;
    expect(ReviewResponseMap.export_fields('options')).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Export ===&lt;br /&gt;
Export method exports the name of reviewer and reviewee and return the map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export' do&lt;br /&gt;
    csv = []&lt;br /&gt;
    parent_id = 1&lt;br /&gt;
    options = nil&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([review_response_map, review_response_map1])&lt;br /&gt;
    expect(ReviewResponseMap.export(csv, parent_id, options)).to eq([review_response_map1, review_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Import ===&lt;br /&gt;
Import method allows user to import the csv file and check it. After that, it returns the name of reviewers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#import' do&lt;br /&gt;
    row_hash = {reviewee: &amp;quot;name&amp;quot;, reviewers: [&amp;quot;name1&amp;quot;]}&lt;br /&gt;
    session = nil&lt;br /&gt;
    assignment_id = 1&lt;br /&gt;
    # when reviewee user = nil&lt;br /&gt;
    allow(User).to receive(:find_by).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Cannot find reviewee user.&amp;quot;)&lt;br /&gt;
    # when reviewee user exists but reviewee user is not a participant in this assignment&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name&amp;quot;).and_return(user)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot;)&lt;br /&gt;
    # when reviewee user exists and reviewee user is a participant in this assignment&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(assignment_participant)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(team)&lt;br /&gt;
    ## when reviewer user doesn't exist&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Cannot find reviewer user.&amp;quot;)&lt;br /&gt;
    ## when reviewer user exist&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    ### when reviewer user is not a participant in this assignment.&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot;)&lt;br /&gt;
    ### when reviewer user is a participant in this assignment.&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
    # when reviewee_team = nil&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(nil)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:create).and_return(double('team', id: 1))&lt;br /&gt;
    allow(TeamsUser).to receive(:create).with(team_id: 1, user_id: 1).and_return(double('teams_users', id: 1, team_id: 1, user_id: 1))&lt;br /&gt;
    allow(TeamNode).to receive(:create).with(parent_id: assignment_id, node_object_id: 1).and_return(double('team_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(TeamUserNode).to receive(:create).with(parent_id: 1, node_object_id: 1).and_return(double('team_user_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Show feedback ===&lt;br /&gt;
Show_feedback method returns the html associated with response.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it '#show_feedback' do&lt;br /&gt;
      allow(review_response_map).to receive(:response).and_return([response])&lt;br /&gt;
      allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
      allow(FeedbackResponseMap).to receive(:find_by).with(reviewed_object_id: 1).and_return(feedback)&lt;br /&gt;
      allow(feedback).to receive(:response).and_return([response])&lt;br /&gt;
      expect(review_response_map.show_feedback(response)).to eq(&amp;quot;&amp;lt;table width=\&amp;quot;100%\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot; width=\&amp;quot;70%\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Review &amp;lt;/b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;#\&amp;quot; name= \&amp;quot;review_1Link\&amp;quot; onClick=\&amp;quot;toggleElement('review_1','review');return false;\&amp;quot;&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;show review&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Last Reviewed:&amp;lt;/b&amp;gt;&amp;lt;span&amp;gt;Not available&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;table id=\&amp;quot;review_1\&amp;quot;&amp;quot;\&lt;br /&gt;
          &amp;quot; style=\&amp;quot;display: none;\&amp;quot; class=\&amp;quot;table table-bordered\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;Additional Comment: &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Metareview response maps ===&lt;br /&gt;
Metareview_response_maps method returns metareview_list associated with responses.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#metareview_response_maps' do&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map])&lt;br /&gt;
    expect(review_response_map.metareview_response_maps).to eq([metareview_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get responses for team round ===&lt;br /&gt;
Get_responses_for_team_round method returns the responses associated with team and round.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_responses_for_team_round' do&lt;br /&gt;
    allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(ResponseMap).to receive(:where).with(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;).and_return([response_map])&lt;br /&gt;
    expect(ReviewResponseMap.get_responses_for_team_round(team, 1)).to eq([response])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Final versions from reviewer ===&lt;br /&gt;
Final_versions_from_reviewer method returns the questionnaire and response ids associated with reviewer.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#final_versions_from_reviewer' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewer_id: 1).and_return([review_response_map])&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(participant).to receive(:parent_id).and_return(1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.final_versions_from_reviewer(1)).to eq(&amp;quot;review round1&amp;quot;: {questionnaire_id: 1, response_ids: [1]}, &amp;quot;review round2&amp;quot;: {questionnaire_id: 1, response_ids: [2]})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Review response report ===&lt;br /&gt;
Review_response_report method returns the participants associated with assignment.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#review_response_report' do&lt;br /&gt;
    id = 1&lt;br /&gt;
    type = &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    user_ids = []&lt;br /&gt;
    review_user = user&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(User).to receive_message_chain(:select, :where).and_return([user])&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:where).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq([assignment_participant])&lt;br /&gt;
    review_user = nil&lt;br /&gt;
    allow(ResponseMap).to receive_message_chain(:select, :where).and_return([response_map])&lt;br /&gt;
    allow([response_map]).to receive(:reviewer_id).and_return(1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find).with(1).and_return([assignment_participant])&lt;br /&gt;
    allow(Participant).to receive(:sort_by_name).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq([assignment_participant])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
Email method can successfully send an email.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#email' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student)&lt;br /&gt;
    allow(User).to receive(:find).with(1).and_return(student)&lt;br /&gt;
    review_response_map.reviewee_id = 1&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }.to change { ActionMailer::Base.deliveries.count }.by (1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prepare final review versions ===&lt;br /&gt;
Prepare_final_review_versions method returns the final review versions.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_final_review_versions' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(metareview_response_map).to receive(:id).and_return(1)&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map])&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq(&amp;quot;review round1&amp;quot;: {questionnaire_id: 1, response_ids: [1]}, &amp;quot;review round2&amp;quot;: {questionnaire_id: 1, response_ids: [2]})&lt;br /&gt;
    # when round = nil&lt;br /&gt;
    reviewer_id = 2&lt;br /&gt;
    allow(Participant).to receive(:find).with(2).and_return(participant1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(2).and_return(assignment1)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq(review: {questionnaire_id: nil, response_ids: [3]})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prepare review response ===&lt;br /&gt;
Prepare_review_response method returns the response id associated with assignment.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_review_response' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    review_response_map.id = 1&lt;br /&gt;
    round = 1&lt;br /&gt;
    maps = [review_response_map]&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([1])&lt;br /&gt;
    round = nil&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([3])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Running Rspec==&lt;br /&gt;
The tests can be run on the terminal from inside the expertiza folder using following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit Test Result==&lt;br /&gt;
app/models/review_response_map.rb &amp;lt;br&amp;gt;&lt;br /&gt;
100.0 % covered &amp;lt;br&amp;gt;&lt;br /&gt;
102 relevant lines. 102 lines covered and 0 lines missed.&lt;br /&gt;
&lt;br /&gt;
Full video for this test can be found at https://drive.google.com/file/d/18vr3q2dCyh3_tsFLH8w9y6Y9uhdz0Ljj/view?usp=sharing&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
https://github.com/Sauve-moi/expertiza&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=119066</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=119066"/>
		<updated>2018-11-09T19:00:47Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Export fields */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page is for the description of unit test for E1850 OSS assignment for Fall 2018, CSC/ECE 517.&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 members at North Carolina State University. It enables students enrolled in a particular course to form online teams, complete assignments, review other's work and receive feedbacks of your work.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Review_response_map.rb is used to prepare data for peer review. But there are no unit tests for it.&lt;br /&gt;
&lt;br /&gt;
== Work to be done ==&lt;br /&gt;
*Create a new file named review_response_map_spec.rb under spec/models folder&lt;br /&gt;
*Write RSpec unit tests to make the path coverage above 90%.&lt;br /&gt;
*Coverage edge cases.&lt;br /&gt;
*Achieve high branch coverage. Use the mutant-rspec gem to measure test thoroughness and fault-finding capability of tests.&lt;br /&gt;
&lt;br /&gt;
== Files Created ==&lt;br /&gt;
*spec/models/review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
=== Mock instance ===&lt;br /&gt;
We mock the necessary instances for the test in the beginning of test file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  let(:team) { build(:assignment_team, id: 1, name: 'team no name', assignment: assignment, users: [student], parent_id: 1) }&lt;br /&gt;
  let(:team1) { build(:assignment_team, id: 2, name: 'team has name', assignment: assignment, users: [student]) }&lt;br /&gt;
  let(:review_response_map) { build(:review_response_map, id: 1, assignment: assignment, reviewer: participant, reviewee: team, reviewed_object_id: 1) }&lt;br /&gt;
  let(:review_response_map1) { build(:review_response_map, id: 2, assignment: assignment, reviewer: participant1, reviewee: team1, reviewed_object_id: 1) }&lt;br /&gt;
  let(:feedback) { FeedbackResponseMap.new(id: 1, reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1) }&lt;br /&gt;
  let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, parent_id: 1, name: 'no name', fullname: 'no one')) }&lt;br /&gt;
  let(:participant1) { build(:participant, id: 2, parent_id: 2, user: build(:student, parent_id: 1, name: 'has name', fullname: 'has one')) }&lt;br /&gt;
  let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt', rounds_of_reviews: 2) }&lt;br /&gt;
  let(:assignment1) { build(:assignment, id: 2, name: 'Test Assgt', rounds_of_reviews: 1) }&lt;br /&gt;
  let(:response) { build(:response, id: 1, map_id: 1, round: 1, response_map: review_response_map,  is_submitted: true) }&lt;br /&gt;
  let(:response1) { build(:response, id: 2, map_id: 1, round: 2, response_map: review_response_map) }&lt;br /&gt;
  let(:response2) { build(:response, id: 3, map_id: 1, round: nil, response_map: review_response_map, is_submitted: true) }&lt;br /&gt;
  let(:metareview_response_map) { MetareviewResponseMap.new(reviewed_object_id: 1) }&lt;br /&gt;
  let(:student) { build(:student, id: 1, fullname: 'no one', email: 'expertiza@mailinator.com') }&lt;br /&gt;
  let(:questionnaire) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&lt;br /&gt;
  let(:response_map) { ResponseMap.new(id: 1, reviewed_object_id: 1, reviewee_id: 1, reviewer_id: 1, type: &amp;quot;ReviewResponseMap&amp;quot;, response: [response], calibrate_to: 0) }&lt;br /&gt;
  let(:user) { User.new(id: 1, name: &amp;quot;name&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:user1) { User.new(id: 2, name: &amp;quot;name1&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:assignment_participant) { AssignmentParticipant.new(user_id: 1, parent_id: 1) }&lt;br /&gt;
  let(:assignment_participant1) { AssignmentParticipant.new(id: 1, user_id: 2, parent_id: 1) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
Write test for the methods in review_response_map.rb.&lt;br /&gt;
&lt;br /&gt;
=== Questionnaire ===&lt;br /&gt;
Questionnaire method returns a questionnaire associated with an assignment.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#questionnaire' do&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).and_return(1)&lt;br /&gt;
    allow(Questionnaire).to receive(:find_by).with(id: 1).and_return(questionnaire)&lt;br /&gt;
    expect(review_response_map.questionnaire(1)).to eq(questionnaire)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get title ===&lt;br /&gt;
Get_title method returns the title.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_title' do&lt;br /&gt;
    expect(review_response_map.get_title).to eq(&amp;quot;Review&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete ===&lt;br /&gt;
Delete method deletes the feedback_response_map and metareview_response_map and return review_response_map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#delete' do&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([feedback])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
    expect(review_response_map.delete).to equal(review_response_map)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Export fields ===&lt;br /&gt;
Export_fields method which shows the title of export csv file, &amp;quot;contributor&amp;quot; and &amp;quot;reviewed by&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export_fields' do&lt;br /&gt;
    expect(ReviewResponseMap.export_fields('options')).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Export ===&lt;br /&gt;
Export method exports the name of reviewer and reviewee and return the map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export' do&lt;br /&gt;
    csv = []&lt;br /&gt;
    parent_id = 1&lt;br /&gt;
    options = nil&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([review_response_map, review_response_map1])&lt;br /&gt;
    expect(ReviewResponseMap.export(csv, parent_id, options)).to eq([review_response_map1, review_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Import ===&lt;br /&gt;
Import method allow user to import the csv file and check it. After that, it returns the name of reviewers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#import' do&lt;br /&gt;
    row_hash = {reviewee: &amp;quot;name&amp;quot;, reviewers: [&amp;quot;name1&amp;quot;]}&lt;br /&gt;
    session = nil&lt;br /&gt;
    assignment_id = 1&lt;br /&gt;
    # when reviewee user = nil&lt;br /&gt;
    allow(User).to receive(:find_by).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Cannot find reviewee user.&amp;quot;)&lt;br /&gt;
    # when reviewee user exists but reviewee user is not a participant in this assignment&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name&amp;quot;).and_return(user)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot;)&lt;br /&gt;
    # when reviewee user exists and reviewee user is a participant in this assignment&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(assignment_participant)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(team)&lt;br /&gt;
    ## when reviewer user doesn't exist&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Cannot find reviewer user.&amp;quot;)&lt;br /&gt;
    ## when reviewer user exist&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    ### when reviewer user is not a participant in this assignment.&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(nil)&lt;br /&gt;
    expect { ReviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, message = &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot;)&lt;br /&gt;
    ### when reviewer user is a participant in this assignment.&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
    # when reviewee_team = nil&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(nil)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:create).and_return(double('team', id: 1))&lt;br /&gt;
    allow(TeamsUser).to receive(:create).with(team_id: 1, user_id: 1).and_return(double('teams_users', id: 1, team_id: 1, user_id: 1))&lt;br /&gt;
    allow(TeamNode).to receive(:create).with(parent_id: assignment_id, node_object_id: 1).and_return(double('team_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(TeamUserNode).to receive(:create).with(parent_id: 1, node_object_id: 1).and_return(double('team_user_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Show feedback ===&lt;br /&gt;
Show_feedback method returns the html associated with response.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it '#show_feedback' do&lt;br /&gt;
      allow(review_response_map).to receive(:response).and_return([response])&lt;br /&gt;
      allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
      allow(FeedbackResponseMap).to receive(:find_by).with(reviewed_object_id: 1).and_return(feedback)&lt;br /&gt;
      allow(feedback).to receive(:response).and_return([response])&lt;br /&gt;
      expect(review_response_map.show_feedback(response)).to eq(&amp;quot;&amp;lt;table width=\&amp;quot;100%\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot; width=\&amp;quot;70%\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Review &amp;lt;/b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;#\&amp;quot; name= \&amp;quot;review_1Link\&amp;quot; onClick=\&amp;quot;toggleElement('review_1','review');return false;\&amp;quot;&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;show review&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Last Reviewed:&amp;lt;/b&amp;gt;&amp;lt;span&amp;gt;Not available&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;table id=\&amp;quot;review_1\&amp;quot;&amp;quot;\&lt;br /&gt;
          &amp;quot; style=\&amp;quot;display: none;\&amp;quot; class=\&amp;quot;table table-bordered\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;Additional Comment: &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Metareview response maps ===&lt;br /&gt;
Metareview_response_maps method returns metareview_list associated with responses.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#metareview_response_maps' do&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map])&lt;br /&gt;
    expect(review_response_map.metareview_response_maps).to eq([metareview_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get responses for team round ===&lt;br /&gt;
Get_responses_for_team_round method returns the responses associated with team and round.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_responses_for_team_round' do&lt;br /&gt;
    allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(ResponseMap).to receive(:where).with(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;).and_return([response_map])&lt;br /&gt;
    expect(ReviewResponseMap.get_responses_for_team_round(team, 1)).to eq([response])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Final versions from reviewer ===&lt;br /&gt;
Final_versions_from_reviewer method returns the questionnaire and response ids associated with reviewer.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#final_versions_from_reviewer' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewer_id: 1).and_return([review_response_map])&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(participant).to receive(:parent_id).and_return(1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.final_versions_from_reviewer(1)).to eq(&amp;quot;review round1&amp;quot;: {questionnaire_id: 1, response_ids: [1]}, &amp;quot;review round2&amp;quot;: {questionnaire_id: 1, response_ids: [2]})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Review response report ===&lt;br /&gt;
Review_response_report method returns the participants associated with assignment.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#review_response_report' do&lt;br /&gt;
    id = 1&lt;br /&gt;
    type = &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    user_ids = []&lt;br /&gt;
    review_user = user&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(User).to receive_message_chain(:select, :where).and_return([user])&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:where).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq([assignment_participant])&lt;br /&gt;
    review_user = nil&lt;br /&gt;
    allow(ResponseMap).to receive_message_chain(:select, :where).and_return([response_map])&lt;br /&gt;
    allow([response_map]).to receive(:reviewer_id).and_return(1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find).with(1).and_return([assignment_participant])&lt;br /&gt;
    allow(Participant).to receive(:sort_by_name).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq([assignment_participant])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
Email method can successfully send an email.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#email' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student)&lt;br /&gt;
    allow(User).to receive(:find).with(1).and_return(student)&lt;br /&gt;
    review_response_map.reviewee_id = 1&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }.to change { ActionMailer::Base.deliveries.count }.by (1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prepare final review versions ===&lt;br /&gt;
Prepare_final_review_versions method returns the final review versions.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_final_review_versions' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(metareview_response_map).to receive(:id).and_return(1)&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map])&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq(&amp;quot;review round1&amp;quot;: {questionnaire_id: 1, response_ids: [1]}, &amp;quot;review round2&amp;quot;: {questionnaire_id: 1, response_ids: [2]})&lt;br /&gt;
    # when round = nil&lt;br /&gt;
    reviewer_id = 2&lt;br /&gt;
    allow(Participant).to receive(:find).with(2).and_return(participant1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(2).and_return(assignment1)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq(review: {questionnaire_id: nil, response_ids: [3]})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prepare review response ===&lt;br /&gt;
Prepare_review_response method returns the response id associated with assignment.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_review_response' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    review_response_map.id = 1&lt;br /&gt;
    round = 1&lt;br /&gt;
    maps = [review_response_map]&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([1])&lt;br /&gt;
    round = nil&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([3])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Running Rspec==&lt;br /&gt;
The tests can be run on the terminal from inside the expertiza folder using following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit Test Result==&lt;br /&gt;
app/models/review_response_map.rb &amp;lt;br&amp;gt;&lt;br /&gt;
100.0 % covered &amp;lt;br&amp;gt;&lt;br /&gt;
102 relevant lines. 102 lines covered and 0 lines missed.&lt;br /&gt;
&lt;br /&gt;
Full video for this test can be found at https://drive.google.com/file/d/18vr3q2dCyh3_tsFLH8w9y6Y9uhdz0Ljj/view?usp=sharing&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
https://github.com/Sauve-moi/expertiza&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118712</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118712"/>
		<updated>2018-11-06T03:49:42Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Unit Test Result */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page is for the description of unit test for E1850 OSS assignment for Fall 2018, CSC/ECE 517.&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 members at North Carolina State University. It enables students enrolled in a particular course to form online teams, complete assignments, review other's work and receive feedbacks of your work.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Review_response_map.rb is used to prepare data for peer review. But there are no unit tests for it.&lt;br /&gt;
&lt;br /&gt;
== Work to be done ==&lt;br /&gt;
*Create a new file named review_response_map_spec.rb under spec/models folder&lt;br /&gt;
*Write RSpec unit tests to make the path coverage above 90%.&lt;br /&gt;
*Coverage as many edge cases as we can.&lt;br /&gt;
*Achieve as high branch coverage as we can. Use the mutant-rspec gem to measure test thoroughness and fault-finding capability of our tests.&lt;br /&gt;
&lt;br /&gt;
== Files Created ==&lt;br /&gt;
*spec/models/review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Unit Test ==&lt;br /&gt;
=== mock instance ===&lt;br /&gt;
We mock the necessary instance for all test in the beginning of test file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  let(:team) { build(:assignment_team, id: 1, name: 'team no name', assignment: assignment, users: [student], parent_id: 1) }&lt;br /&gt;
  let(:team1) { build(:assignment_team, id: 2, name: 'team has name', assignment: assignment, users: [student]) }&lt;br /&gt;
  let(:review_response_map) { build(:review_response_map, id: 1, assignment: assignment, reviewer: participant, reviewee: team, reviewed_object_id: 1) }&lt;br /&gt;
  let(:review_response_map1) { build(:review_response_map, id: 2, assignment: assignment, reviewer: participant1, reviewee: team1, reviewed_object_id: 1) }&lt;br /&gt;
  let(:feed_back_response_map) { double('feed_back_response_map', reviewed_object_id: 1) }&lt;br /&gt;
  let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, parent_id: 1, name: 'no name', fullname: 'no one')) }&lt;br /&gt;
  let(:participant1) { build(:participant, id: 2, parent_id: 2, user: build(:student, parent_id: 1, name: 'has name', fullname: 'has one')) }&lt;br /&gt;
  let(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt', rounds_of_reviews: 2 ) }&lt;br /&gt;
  let(:assignment1) { build(:assignment, id: 2, name: 'Test Assgt', rounds_of_reviews: 1 ) }&lt;br /&gt;
  let(:response) { build(:response, id: 1, map_id: 1, round: 1, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:response1) { build(:response, id: 2, map_id: 1, round: 2, response_map: review_response_map, scores: [answer]) }&lt;br /&gt;
  let(:response2) { build(:response, id: 3, map_id: 1, round: nil, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:answer) { Answer.new(answer: 1, comments: 'Answer text', question_id: 1) }&lt;br /&gt;
  let(:question) { Criterion.new(id: 1, weight: 2, break_before: true) }&lt;br /&gt;
  let(:feedback) { FeedbackResponseMap.new(id: 1, reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1) }&lt;br /&gt;
  let(:metareview_response_map) { double('metareviewmap')}&lt;br /&gt;
  let(:metareview_response_map1) { MetareviewResponseMap.new(reviewed_object_id: 1)}&lt;br /&gt;
  let(:student) {build(:student, id: 1, fullname: 'no one', email: 'expertiza@mailinator.com') }&lt;br /&gt;
  let(:assignment_questionnaire){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 1, questionnaire_id: 1) }&lt;br /&gt;
  let(:assignment_questionnaire1){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 2, questionnaire_id: 1) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&lt;br /&gt;
  let(:response_map) { ResponseMap.new(id: 1, reviewed_object_id: 1, reviewee_id: 1, reviewer_id: 1, type: &amp;quot;ReviewResponseMap&amp;quot;, response: [response], calibrate_to: 0) }&lt;br /&gt;
  let(:user) {User.new(id:1 , name: &amp;quot;name&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:user1) { User.new(id: 2, name: &amp;quot;name1&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:assignment_participant) { AssignmentParticipant.new(user_id: 1, parent_id: 1) }&lt;br /&gt;
  let(:assignment_participant1) { AssignmentParticipant.new(id: 1, user_id: 2, parent_id: 1) }&lt;br /&gt;
  let(:teams_users) {TeamsUser.new(user_id: 1, team_id: 1)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== questionnaire ===&lt;br /&gt;
Test the questionnaire using find_by to get specific questionnaire of map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#questionnaire' do&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Questionnaire).to receive(:find_by).with(id: 1).and_return(questionnaire1)&lt;br /&gt;
    expect(review_response_map.questionnaire(1)).to eq(questionnaire1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get title ===&lt;br /&gt;
Test the get_title method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_title' do&lt;br /&gt;
    expect(review_response_map.get_title).to eq(&amp;quot;Review&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== delete ===&lt;br /&gt;
Test the delete method of review_response_map which contains delete feedback_response_map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#delete' do&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([feedback])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.delete).to equal(review_response_map)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export fields ===&lt;br /&gt;
Test the export_fields method which show the title of export csv file should be &amp;quot;contributor&amp;quot; and &amp;quot;reviewed by&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export_fields' do&lt;br /&gt;
    expect(ReviewResponseMap.export_fields('Missing &amp;quot;_options&amp;quot;')).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export ===&lt;br /&gt;
Test the export method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export' do&lt;br /&gt;
    csv = []&lt;br /&gt;
    parent_id = 1&lt;br /&gt;
    _options = _options&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([review_response_map, review_response_map1])&lt;br /&gt;
    expect(ReviewResponseMap.export(csv, parent_id, _options)).to eq([review_response_map1, review_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== import ===&lt;br /&gt;
Test the import method which includes errors casued by various reasons.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#import' do&lt;br /&gt;
    row_hash={reviewee: &amp;quot;name&amp;quot;, reviewers: [&amp;quot;name1&amp;quot;]}&lt;br /&gt;
    _session = nil&lt;br /&gt;
    assignment_id = 1&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name&amp;quot;).and_return(user)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(assignment_participant)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(team)&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
    # when reviewee_team = nil&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(nil)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:create).and_return(double('team', id: 1))&lt;br /&gt;
    allow(TeamsUser).to receive(:create).with(team_id: 1, user_id: 1).and_return(double('teams_users', id: 1, team_id: 1, user_id: 1))&lt;br /&gt;
    allow(TeamNode).to receive(:create).with(parent_id: assignment_id, node_object_id: 1).and_return(double('team_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(TeamUserNode).to receive(:create).with(parent_id: 1, node_object_id: 1).and_return(double('team_user_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== show feedback ===&lt;br /&gt;
Test show_feedback method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#show_feedback' do&lt;br /&gt;
    allow(review_response_map).to receive(:response).and_return([response])&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:find_by).with(reviewed_object_id: 1).and_return(feedback)&lt;br /&gt;
    allow(feedback).to receive(:response).and_return([response])&lt;br /&gt;
    expect(review_response_map.show_feedback(response)).to eq(&amp;quot;&amp;lt;table width=\&amp;quot;100%\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot; width=\&amp;quot;70%\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Review &amp;lt;/b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;#\&amp;quot; name= \&amp;quot;review_1Link\&amp;quot; onClick=\&amp;quot;toggleElement('review_1','review');return false;\&amp;quot;&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;show review&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Last Reviewed:&amp;lt;/b&amp;gt;&amp;lt;span&amp;gt;Not available&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;table id=\&amp;quot;review_1\&amp;quot;&amp;quot;\&lt;br /&gt;
          &amp;quot; style=\&amp;quot;display: none;\&amp;quot; class=\&amp;quot;table table-bordered\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;Additional Comment: &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== metareview response maps ===&lt;br /&gt;
Test metareview_response_maps method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#metareview_response_maps' do&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.metareview_response_maps).to eq([metareview_response_map1])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get responses for team round ===&lt;br /&gt;
Test get_responses_for_team_round method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_responses_for_team_round' do&lt;br /&gt;
    allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
    allow(team).to receive(:id).and_return(1)&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(ResponseMap).to receive(:where).with(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;).and_return([response_map])&lt;br /&gt;
    expect(ReviewResponseMap.get_responses_for_team_round(team, 1)).to eq([response])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== final versions from reviewer ===&lt;br /&gt;
Test final_versions_from_reviewer method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#final_versions_from_reviewer' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewer_id: 1).and_return([review_response_map])&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(participant).to receive(:parent_id).and_return(1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.final_versions_from_reviewer(1)).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== review response report ===&lt;br /&gt;
Test review_response_report method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#review_response_report' do&lt;br /&gt;
    id = 1&lt;br /&gt;
    type = &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    user_ids = []&lt;br /&gt;
    review_user = user&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(User).to receive_message_chain(:select, :where).and_return([user])&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:where).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
    review_user = nil&lt;br /&gt;
    allow(ResponseMap).to receive_message_chain(:select, :where).and_return([response_map])&lt;br /&gt;
    allow([response_map]).to receive(:reviewer_id).and_return(1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find).with(1).and_return([assignment_participant])&lt;br /&gt;
    allow(Participant).to receive(:sort_by_name).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== email ===&lt;br /&gt;
Test email method which can successfully send an email.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#email' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student)&lt;br /&gt;
    allow(User).to receive(:find).with(1).and_return(student)&lt;br /&gt;
    review_response_map.reviewee_id = 1&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect{review_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }.to change { ActionMailer::Base.deliveries.count }.by (1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare final review versions ===&lt;br /&gt;
Test the prepare_final_review_versions method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_final_review_versions' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(metareview_response_map1).to receive(:id).and_return(1)&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
    reviewer_id = 2&lt;br /&gt;
    allow(Participant).to receive(:find).with(2).and_return(participant1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(2).and_return(assignment1)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({ review:{questionnaire_id: nil, response_ids:[3]}})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare review response ===&lt;br /&gt;
Test prepare_review_response method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_review_response' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    review_response_map.id = 1&lt;br /&gt;
    round = 1&lt;br /&gt;
    maps = [review_response_map]&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([1])&lt;br /&gt;
    round = nil&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([3])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Running Rspec==&lt;br /&gt;
The tests can be run on the terminal from inside the expertiza folder using following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit Test Result==&lt;br /&gt;
app/models/review_response_map.rb &amp;lt;br&amp;gt;&lt;br /&gt;
100.0 % covered &amp;lt;br&amp;gt;&lt;br /&gt;
102 relevant lines. 102 lines covered and 0 lines missed.&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118711</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118711"/>
		<updated>2018-11-06T03:49:30Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Unit Test Result */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page is for the description of unit test for E1850 OSS assignment for Fall 2018, CSC/ECE 517.&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 members at North Carolina State University. It enables students enrolled in a particular course to form online teams, complete assignments, review other's work and receive feedbacks of your work.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Review_response_map.rb is used to prepare data for peer review. But there are no unit tests for it.&lt;br /&gt;
&lt;br /&gt;
== Work to be done ==&lt;br /&gt;
*Create a new file named review_response_map_spec.rb under spec/models folder&lt;br /&gt;
*Write RSpec unit tests to make the path coverage above 90%.&lt;br /&gt;
*Coverage as many edge cases as we can.&lt;br /&gt;
*Achieve as high branch coverage as we can. Use the mutant-rspec gem to measure test thoroughness and fault-finding capability of our tests.&lt;br /&gt;
&lt;br /&gt;
== Files Created ==&lt;br /&gt;
*spec/models/review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Unit Test ==&lt;br /&gt;
=== mock instance ===&lt;br /&gt;
We mock the necessary instance for all test in the beginning of test file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  let(:team) { build(:assignment_team, id: 1, name: 'team no name', assignment: assignment, users: [student], parent_id: 1) }&lt;br /&gt;
  let(:team1) { build(:assignment_team, id: 2, name: 'team has name', assignment: assignment, users: [student]) }&lt;br /&gt;
  let(:review_response_map) { build(:review_response_map, id: 1, assignment: assignment, reviewer: participant, reviewee: team, reviewed_object_id: 1) }&lt;br /&gt;
  let(:review_response_map1) { build(:review_response_map, id: 2, assignment: assignment, reviewer: participant1, reviewee: team1, reviewed_object_id: 1) }&lt;br /&gt;
  let(:feed_back_response_map) { double('feed_back_response_map', reviewed_object_id: 1) }&lt;br /&gt;
  let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, parent_id: 1, name: 'no name', fullname: 'no one')) }&lt;br /&gt;
  let(:participant1) { build(:participant, id: 2, parent_id: 2, user: build(:student, parent_id: 1, name: 'has name', fullname: 'has one')) }&lt;br /&gt;
  let(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt', rounds_of_reviews: 2 ) }&lt;br /&gt;
  let(:assignment1) { build(:assignment, id: 2, name: 'Test Assgt', rounds_of_reviews: 1 ) }&lt;br /&gt;
  let(:response) { build(:response, id: 1, map_id: 1, round: 1, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:response1) { build(:response, id: 2, map_id: 1, round: 2, response_map: review_response_map, scores: [answer]) }&lt;br /&gt;
  let(:response2) { build(:response, id: 3, map_id: 1, round: nil, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:answer) { Answer.new(answer: 1, comments: 'Answer text', question_id: 1) }&lt;br /&gt;
  let(:question) { Criterion.new(id: 1, weight: 2, break_before: true) }&lt;br /&gt;
  let(:feedback) { FeedbackResponseMap.new(id: 1, reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1) }&lt;br /&gt;
  let(:metareview_response_map) { double('metareviewmap')}&lt;br /&gt;
  let(:metareview_response_map1) { MetareviewResponseMap.new(reviewed_object_id: 1)}&lt;br /&gt;
  let(:student) {build(:student, id: 1, fullname: 'no one', email: 'expertiza@mailinator.com') }&lt;br /&gt;
  let(:assignment_questionnaire){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 1, questionnaire_id: 1) }&lt;br /&gt;
  let(:assignment_questionnaire1){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 2, questionnaire_id: 1) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&lt;br /&gt;
  let(:response_map) { ResponseMap.new(id: 1, reviewed_object_id: 1, reviewee_id: 1, reviewer_id: 1, type: &amp;quot;ReviewResponseMap&amp;quot;, response: [response], calibrate_to: 0) }&lt;br /&gt;
  let(:user) {User.new(id:1 , name: &amp;quot;name&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:user1) { User.new(id: 2, name: &amp;quot;name1&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:assignment_participant) { AssignmentParticipant.new(user_id: 1, parent_id: 1) }&lt;br /&gt;
  let(:assignment_participant1) { AssignmentParticipant.new(id: 1, user_id: 2, parent_id: 1) }&lt;br /&gt;
  let(:teams_users) {TeamsUser.new(user_id: 1, team_id: 1)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== questionnaire ===&lt;br /&gt;
Test the questionnaire using find_by to get specific questionnaire of map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#questionnaire' do&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Questionnaire).to receive(:find_by).with(id: 1).and_return(questionnaire1)&lt;br /&gt;
    expect(review_response_map.questionnaire(1)).to eq(questionnaire1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get title ===&lt;br /&gt;
Test the get_title method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_title' do&lt;br /&gt;
    expect(review_response_map.get_title).to eq(&amp;quot;Review&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== delete ===&lt;br /&gt;
Test the delete method of review_response_map which contains delete feedback_response_map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#delete' do&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([feedback])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.delete).to equal(review_response_map)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export fields ===&lt;br /&gt;
Test the export_fields method which show the title of export csv file should be &amp;quot;contributor&amp;quot; and &amp;quot;reviewed by&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export_fields' do&lt;br /&gt;
    expect(ReviewResponseMap.export_fields('Missing &amp;quot;_options&amp;quot;')).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export ===&lt;br /&gt;
Test the export method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export' do&lt;br /&gt;
    csv = []&lt;br /&gt;
    parent_id = 1&lt;br /&gt;
    _options = _options&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([review_response_map, review_response_map1])&lt;br /&gt;
    expect(ReviewResponseMap.export(csv, parent_id, _options)).to eq([review_response_map1, review_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== import ===&lt;br /&gt;
Test the import method which includes errors casued by various reasons.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#import' do&lt;br /&gt;
    row_hash={reviewee: &amp;quot;name&amp;quot;, reviewers: [&amp;quot;name1&amp;quot;]}&lt;br /&gt;
    _session = nil&lt;br /&gt;
    assignment_id = 1&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name&amp;quot;).and_return(user)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(assignment_participant)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(team)&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
    # when reviewee_team = nil&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(nil)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:create).and_return(double('team', id: 1))&lt;br /&gt;
    allow(TeamsUser).to receive(:create).with(team_id: 1, user_id: 1).and_return(double('teams_users', id: 1, team_id: 1, user_id: 1))&lt;br /&gt;
    allow(TeamNode).to receive(:create).with(parent_id: assignment_id, node_object_id: 1).and_return(double('team_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(TeamUserNode).to receive(:create).with(parent_id: 1, node_object_id: 1).and_return(double('team_user_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== show feedback ===&lt;br /&gt;
Test show_feedback method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#show_feedback' do&lt;br /&gt;
    allow(review_response_map).to receive(:response).and_return([response])&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:find_by).with(reviewed_object_id: 1).and_return(feedback)&lt;br /&gt;
    allow(feedback).to receive(:response).and_return([response])&lt;br /&gt;
    expect(review_response_map.show_feedback(response)).to eq(&amp;quot;&amp;lt;table width=\&amp;quot;100%\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot; width=\&amp;quot;70%\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Review &amp;lt;/b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;#\&amp;quot; name= \&amp;quot;review_1Link\&amp;quot; onClick=\&amp;quot;toggleElement('review_1','review');return false;\&amp;quot;&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;show review&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Last Reviewed:&amp;lt;/b&amp;gt;&amp;lt;span&amp;gt;Not available&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;table id=\&amp;quot;review_1\&amp;quot;&amp;quot;\&lt;br /&gt;
          &amp;quot; style=\&amp;quot;display: none;\&amp;quot; class=\&amp;quot;table table-bordered\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;Additional Comment: &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== metareview response maps ===&lt;br /&gt;
Test metareview_response_maps method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#metareview_response_maps' do&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.metareview_response_maps).to eq([metareview_response_map1])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get responses for team round ===&lt;br /&gt;
Test get_responses_for_team_round method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_responses_for_team_round' do&lt;br /&gt;
    allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
    allow(team).to receive(:id).and_return(1)&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(ResponseMap).to receive(:where).with(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;).and_return([response_map])&lt;br /&gt;
    expect(ReviewResponseMap.get_responses_for_team_round(team, 1)).to eq([response])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== final versions from reviewer ===&lt;br /&gt;
Test final_versions_from_reviewer method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#final_versions_from_reviewer' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewer_id: 1).and_return([review_response_map])&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(participant).to receive(:parent_id).and_return(1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.final_versions_from_reviewer(1)).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== review response report ===&lt;br /&gt;
Test review_response_report method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#review_response_report' do&lt;br /&gt;
    id = 1&lt;br /&gt;
    type = &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    user_ids = []&lt;br /&gt;
    review_user = user&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(User).to receive_message_chain(:select, :where).and_return([user])&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:where).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
    review_user = nil&lt;br /&gt;
    allow(ResponseMap).to receive_message_chain(:select, :where).and_return([response_map])&lt;br /&gt;
    allow([response_map]).to receive(:reviewer_id).and_return(1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find).with(1).and_return([assignment_participant])&lt;br /&gt;
    allow(Participant).to receive(:sort_by_name).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== email ===&lt;br /&gt;
Test email method which can successfully send an email.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#email' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student)&lt;br /&gt;
    allow(User).to receive(:find).with(1).and_return(student)&lt;br /&gt;
    review_response_map.reviewee_id = 1&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect{review_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }.to change { ActionMailer::Base.deliveries.count }.by (1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare final review versions ===&lt;br /&gt;
Test the prepare_final_review_versions method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_final_review_versions' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(metareview_response_map1).to receive(:id).and_return(1)&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
    reviewer_id = 2&lt;br /&gt;
    allow(Participant).to receive(:find).with(2).and_return(participant1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(2).and_return(assignment1)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({ review:{questionnaire_id: nil, response_ids:[3]}})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare review response ===&lt;br /&gt;
Test prepare_review_response method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_review_response' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    review_response_map.id = 1&lt;br /&gt;
    round = 1&lt;br /&gt;
    maps = [review_response_map]&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([1])&lt;br /&gt;
    round = nil&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([3])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Running Rspec==&lt;br /&gt;
The tests can be run on the terminal from inside the expertiza folder using following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit Test Result==&lt;br /&gt;
app/models/review_response_map.rb &amp;lt;br&amp;gt;&lt;br /&gt;
100.0 % covered&lt;br /&gt;
102 relevant lines. 102 lines covered and 0 lines missed.&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118710</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118710"/>
		<updated>2018-11-06T03:49:11Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* Unit Test Result */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page is for the description of unit test for E1850 OSS assignment for Fall 2018, CSC/ECE 517.&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 members at North Carolina State University. It enables students enrolled in a particular course to form online teams, complete assignments, review other's work and receive feedbacks of your work.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Review_response_map.rb is used to prepare data for peer review. But there are no unit tests for it.&lt;br /&gt;
&lt;br /&gt;
== Work to be done ==&lt;br /&gt;
*Create a new file named review_response_map_spec.rb under spec/models folder&lt;br /&gt;
*Write RSpec unit tests to make the path coverage above 90%.&lt;br /&gt;
*Coverage as many edge cases as we can.&lt;br /&gt;
*Achieve as high branch coverage as we can. Use the mutant-rspec gem to measure test thoroughness and fault-finding capability of our tests.&lt;br /&gt;
&lt;br /&gt;
== Files Created ==&lt;br /&gt;
*spec/models/review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Unit Test ==&lt;br /&gt;
=== mock instance ===&lt;br /&gt;
We mock the necessary instance for all test in the beginning of test file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  let(:team) { build(:assignment_team, id: 1, name: 'team no name', assignment: assignment, users: [student], parent_id: 1) }&lt;br /&gt;
  let(:team1) { build(:assignment_team, id: 2, name: 'team has name', assignment: assignment, users: [student]) }&lt;br /&gt;
  let(:review_response_map) { build(:review_response_map, id: 1, assignment: assignment, reviewer: participant, reviewee: team, reviewed_object_id: 1) }&lt;br /&gt;
  let(:review_response_map1) { build(:review_response_map, id: 2, assignment: assignment, reviewer: participant1, reviewee: team1, reviewed_object_id: 1) }&lt;br /&gt;
  let(:feed_back_response_map) { double('feed_back_response_map', reviewed_object_id: 1) }&lt;br /&gt;
  let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, parent_id: 1, name: 'no name', fullname: 'no one')) }&lt;br /&gt;
  let(:participant1) { build(:participant, id: 2, parent_id: 2, user: build(:student, parent_id: 1, name: 'has name', fullname: 'has one')) }&lt;br /&gt;
  let(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt', rounds_of_reviews: 2 ) }&lt;br /&gt;
  let(:assignment1) { build(:assignment, id: 2, name: 'Test Assgt', rounds_of_reviews: 1 ) }&lt;br /&gt;
  let(:response) { build(:response, id: 1, map_id: 1, round: 1, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:response1) { build(:response, id: 2, map_id: 1, round: 2, response_map: review_response_map, scores: [answer]) }&lt;br /&gt;
  let(:response2) { build(:response, id: 3, map_id: 1, round: nil, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:answer) { Answer.new(answer: 1, comments: 'Answer text', question_id: 1) }&lt;br /&gt;
  let(:question) { Criterion.new(id: 1, weight: 2, break_before: true) }&lt;br /&gt;
  let(:feedback) { FeedbackResponseMap.new(id: 1, reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1) }&lt;br /&gt;
  let(:metareview_response_map) { double('metareviewmap')}&lt;br /&gt;
  let(:metareview_response_map1) { MetareviewResponseMap.new(reviewed_object_id: 1)}&lt;br /&gt;
  let(:student) {build(:student, id: 1, fullname: 'no one', email: 'expertiza@mailinator.com') }&lt;br /&gt;
  let(:assignment_questionnaire){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 1, questionnaire_id: 1) }&lt;br /&gt;
  let(:assignment_questionnaire1){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 2, questionnaire_id: 1) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&lt;br /&gt;
  let(:response_map) { ResponseMap.new(id: 1, reviewed_object_id: 1, reviewee_id: 1, reviewer_id: 1, type: &amp;quot;ReviewResponseMap&amp;quot;, response: [response], calibrate_to: 0) }&lt;br /&gt;
  let(:user) {User.new(id:1 , name: &amp;quot;name&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:user1) { User.new(id: 2, name: &amp;quot;name1&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:assignment_participant) { AssignmentParticipant.new(user_id: 1, parent_id: 1) }&lt;br /&gt;
  let(:assignment_participant1) { AssignmentParticipant.new(id: 1, user_id: 2, parent_id: 1) }&lt;br /&gt;
  let(:teams_users) {TeamsUser.new(user_id: 1, team_id: 1)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== questionnaire ===&lt;br /&gt;
Test the questionnaire using find_by to get specific questionnaire of map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#questionnaire' do&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Questionnaire).to receive(:find_by).with(id: 1).and_return(questionnaire1)&lt;br /&gt;
    expect(review_response_map.questionnaire(1)).to eq(questionnaire1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get title ===&lt;br /&gt;
Test the get_title method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_title' do&lt;br /&gt;
    expect(review_response_map.get_title).to eq(&amp;quot;Review&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== delete ===&lt;br /&gt;
Test the delete method of review_response_map which contains delete feedback_response_map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#delete' do&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([feedback])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.delete).to equal(review_response_map)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export fields ===&lt;br /&gt;
Test the export_fields method which show the title of export csv file should be &amp;quot;contributor&amp;quot; and &amp;quot;reviewed by&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export_fields' do&lt;br /&gt;
    expect(ReviewResponseMap.export_fields('Missing &amp;quot;_options&amp;quot;')).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export ===&lt;br /&gt;
Test the export method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export' do&lt;br /&gt;
    csv = []&lt;br /&gt;
    parent_id = 1&lt;br /&gt;
    _options = _options&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([review_response_map, review_response_map1])&lt;br /&gt;
    expect(ReviewResponseMap.export(csv, parent_id, _options)).to eq([review_response_map1, review_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== import ===&lt;br /&gt;
Test the import method which includes errors casued by various reasons.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#import' do&lt;br /&gt;
    row_hash={reviewee: &amp;quot;name&amp;quot;, reviewers: [&amp;quot;name1&amp;quot;]}&lt;br /&gt;
    _session = nil&lt;br /&gt;
    assignment_id = 1&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name&amp;quot;).and_return(user)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(assignment_participant)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(team)&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
    # when reviewee_team = nil&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(nil)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:create).and_return(double('team', id: 1))&lt;br /&gt;
    allow(TeamsUser).to receive(:create).with(team_id: 1, user_id: 1).and_return(double('teams_users', id: 1, team_id: 1, user_id: 1))&lt;br /&gt;
    allow(TeamNode).to receive(:create).with(parent_id: assignment_id, node_object_id: 1).and_return(double('team_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(TeamUserNode).to receive(:create).with(parent_id: 1, node_object_id: 1).and_return(double('team_user_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== show feedback ===&lt;br /&gt;
Test show_feedback method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#show_feedback' do&lt;br /&gt;
    allow(review_response_map).to receive(:response).and_return([response])&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:find_by).with(reviewed_object_id: 1).and_return(feedback)&lt;br /&gt;
    allow(feedback).to receive(:response).and_return([response])&lt;br /&gt;
    expect(review_response_map.show_feedback(response)).to eq(&amp;quot;&amp;lt;table width=\&amp;quot;100%\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot; width=\&amp;quot;70%\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Review &amp;lt;/b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;#\&amp;quot; name= \&amp;quot;review_1Link\&amp;quot; onClick=\&amp;quot;toggleElement('review_1','review');return false;\&amp;quot;&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;show review&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Last Reviewed:&amp;lt;/b&amp;gt;&amp;lt;span&amp;gt;Not available&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;table id=\&amp;quot;review_1\&amp;quot;&amp;quot;\&lt;br /&gt;
          &amp;quot; style=\&amp;quot;display: none;\&amp;quot; class=\&amp;quot;table table-bordered\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;Additional Comment: &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== metareview response maps ===&lt;br /&gt;
Test metareview_response_maps method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#metareview_response_maps' do&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.metareview_response_maps).to eq([metareview_response_map1])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get responses for team round ===&lt;br /&gt;
Test get_responses_for_team_round method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_responses_for_team_round' do&lt;br /&gt;
    allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
    allow(team).to receive(:id).and_return(1)&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(ResponseMap).to receive(:where).with(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;).and_return([response_map])&lt;br /&gt;
    expect(ReviewResponseMap.get_responses_for_team_round(team, 1)).to eq([response])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== final versions from reviewer ===&lt;br /&gt;
Test final_versions_from_reviewer method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#final_versions_from_reviewer' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewer_id: 1).and_return([review_response_map])&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(participant).to receive(:parent_id).and_return(1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.final_versions_from_reviewer(1)).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== review response report ===&lt;br /&gt;
Test review_response_report method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#review_response_report' do&lt;br /&gt;
    id = 1&lt;br /&gt;
    type = &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    user_ids = []&lt;br /&gt;
    review_user = user&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(User).to receive_message_chain(:select, :where).and_return([user])&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:where).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
    review_user = nil&lt;br /&gt;
    allow(ResponseMap).to receive_message_chain(:select, :where).and_return([response_map])&lt;br /&gt;
    allow([response_map]).to receive(:reviewer_id).and_return(1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find).with(1).and_return([assignment_participant])&lt;br /&gt;
    allow(Participant).to receive(:sort_by_name).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== email ===&lt;br /&gt;
Test email method which can successfully send an email.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#email' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student)&lt;br /&gt;
    allow(User).to receive(:find).with(1).and_return(student)&lt;br /&gt;
    review_response_map.reviewee_id = 1&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect{review_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }.to change { ActionMailer::Base.deliveries.count }.by (1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare final review versions ===&lt;br /&gt;
Test the prepare_final_review_versions method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_final_review_versions' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(metareview_response_map1).to receive(:id).and_return(1)&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
    reviewer_id = 2&lt;br /&gt;
    allow(Participant).to receive(:find).with(2).and_return(participant1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(2).and_return(assignment1)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({ review:{questionnaire_id: nil, response_ids:[3]}})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare review response ===&lt;br /&gt;
Test prepare_review_response method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_review_response' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    review_response_map.id = 1&lt;br /&gt;
    round = 1&lt;br /&gt;
    maps = [review_response_map]&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([1])&lt;br /&gt;
    round = nil&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([3])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Running Rspec==&lt;br /&gt;
The tests can be run on the terminal from inside the expertiza folder using following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit Test Result==&lt;br /&gt;
app/models/review_response_map.rb&lt;br /&gt;
100.0 % covered&lt;br /&gt;
102 relevant lines. 102 lines covered and 0 lines missed.&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118709</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118709"/>
		<updated>2018-11-06T03:45:54Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* prepare final review versions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page is for the description of unit test for E1850 OSS assignment for Fall 2018, CSC/ECE 517.&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 members at North Carolina State University. It enables students enrolled in a particular course to form online teams, complete assignments, review other's work and receive feedbacks of your work.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Review_response_map.rb is used to prepare data for peer review. But there are no unit tests for it.&lt;br /&gt;
&lt;br /&gt;
== Work to be done ==&lt;br /&gt;
*Create a new file named review_response_map_spec.rb under spec/models folder&lt;br /&gt;
*Write RSpec unit tests to make the path coverage above 90%.&lt;br /&gt;
*Coverage as many edge cases as we can.&lt;br /&gt;
*Achieve as high branch coverage as we can. Use the mutant-rspec gem to measure test thoroughness and fault-finding capability of our tests.&lt;br /&gt;
&lt;br /&gt;
== Files Created ==&lt;br /&gt;
*spec/models/review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Unit Test ==&lt;br /&gt;
=== mock instance ===&lt;br /&gt;
We mock the necessary instance for all test in the beginning of test file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  let(:team) { build(:assignment_team, id: 1, name: 'team no name', assignment: assignment, users: [student], parent_id: 1) }&lt;br /&gt;
  let(:team1) { build(:assignment_team, id: 2, name: 'team has name', assignment: assignment, users: [student]) }&lt;br /&gt;
  let(:review_response_map) { build(:review_response_map, id: 1, assignment: assignment, reviewer: participant, reviewee: team, reviewed_object_id: 1) }&lt;br /&gt;
  let(:review_response_map1) { build(:review_response_map, id: 2, assignment: assignment, reviewer: participant1, reviewee: team1, reviewed_object_id: 1) }&lt;br /&gt;
  let(:feed_back_response_map) { double('feed_back_response_map', reviewed_object_id: 1) }&lt;br /&gt;
  let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, parent_id: 1, name: 'no name', fullname: 'no one')) }&lt;br /&gt;
  let(:participant1) { build(:participant, id: 2, parent_id: 2, user: build(:student, parent_id: 1, name: 'has name', fullname: 'has one')) }&lt;br /&gt;
  let(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt', rounds_of_reviews: 2 ) }&lt;br /&gt;
  let(:assignment1) { build(:assignment, id: 2, name: 'Test Assgt', rounds_of_reviews: 1 ) }&lt;br /&gt;
  let(:response) { build(:response, id: 1, map_id: 1, round: 1, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:response1) { build(:response, id: 2, map_id: 1, round: 2, response_map: review_response_map, scores: [answer]) }&lt;br /&gt;
  let(:response2) { build(:response, id: 3, map_id: 1, round: nil, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:answer) { Answer.new(answer: 1, comments: 'Answer text', question_id: 1) }&lt;br /&gt;
  let(:question) { Criterion.new(id: 1, weight: 2, break_before: true) }&lt;br /&gt;
  let(:feedback) { FeedbackResponseMap.new(id: 1, reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1) }&lt;br /&gt;
  let(:metareview_response_map) { double('metareviewmap')}&lt;br /&gt;
  let(:metareview_response_map1) { MetareviewResponseMap.new(reviewed_object_id: 1)}&lt;br /&gt;
  let(:student) {build(:student, id: 1, fullname: 'no one', email: 'expertiza@mailinator.com') }&lt;br /&gt;
  let(:assignment_questionnaire){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 1, questionnaire_id: 1) }&lt;br /&gt;
  let(:assignment_questionnaire1){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 2, questionnaire_id: 1) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&lt;br /&gt;
  let(:response_map) { ResponseMap.new(id: 1, reviewed_object_id: 1, reviewee_id: 1, reviewer_id: 1, type: &amp;quot;ReviewResponseMap&amp;quot;, response: [response], calibrate_to: 0) }&lt;br /&gt;
  let(:user) {User.new(id:1 , name: &amp;quot;name&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:user1) { User.new(id: 2, name: &amp;quot;name1&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:assignment_participant) { AssignmentParticipant.new(user_id: 1, parent_id: 1) }&lt;br /&gt;
  let(:assignment_participant1) { AssignmentParticipant.new(id: 1, user_id: 2, parent_id: 1) }&lt;br /&gt;
  let(:teams_users) {TeamsUser.new(user_id: 1, team_id: 1)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== questionnaire ===&lt;br /&gt;
Test the questionnaire using find_by to get specific questionnaire of map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#questionnaire' do&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Questionnaire).to receive(:find_by).with(id: 1).and_return(questionnaire1)&lt;br /&gt;
    expect(review_response_map.questionnaire(1)).to eq(questionnaire1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get title ===&lt;br /&gt;
Test the get_title method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_title' do&lt;br /&gt;
    expect(review_response_map.get_title).to eq(&amp;quot;Review&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== delete ===&lt;br /&gt;
Test the delete method of review_response_map which contains delete feedback_response_map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#delete' do&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([feedback])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.delete).to equal(review_response_map)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export fields ===&lt;br /&gt;
Test the export_fields method which show the title of export csv file should be &amp;quot;contributor&amp;quot; and &amp;quot;reviewed by&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export_fields' do&lt;br /&gt;
    expect(ReviewResponseMap.export_fields('Missing &amp;quot;_options&amp;quot;')).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export ===&lt;br /&gt;
Test the export method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export' do&lt;br /&gt;
    csv = []&lt;br /&gt;
    parent_id = 1&lt;br /&gt;
    _options = _options&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([review_response_map, review_response_map1])&lt;br /&gt;
    expect(ReviewResponseMap.export(csv, parent_id, _options)).to eq([review_response_map1, review_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== import ===&lt;br /&gt;
Test the import method which includes errors casued by various reasons.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#import' do&lt;br /&gt;
    row_hash={reviewee: &amp;quot;name&amp;quot;, reviewers: [&amp;quot;name1&amp;quot;]}&lt;br /&gt;
    _session = nil&lt;br /&gt;
    assignment_id = 1&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name&amp;quot;).and_return(user)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(assignment_participant)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(team)&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
    # when reviewee_team = nil&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(nil)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:create).and_return(double('team', id: 1))&lt;br /&gt;
    allow(TeamsUser).to receive(:create).with(team_id: 1, user_id: 1).and_return(double('teams_users', id: 1, team_id: 1, user_id: 1))&lt;br /&gt;
    allow(TeamNode).to receive(:create).with(parent_id: assignment_id, node_object_id: 1).and_return(double('team_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(TeamUserNode).to receive(:create).with(parent_id: 1, node_object_id: 1).and_return(double('team_user_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== show feedback ===&lt;br /&gt;
Test show_feedback method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#show_feedback' do&lt;br /&gt;
    allow(review_response_map).to receive(:response).and_return([response])&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:find_by).with(reviewed_object_id: 1).and_return(feedback)&lt;br /&gt;
    allow(feedback).to receive(:response).and_return([response])&lt;br /&gt;
    expect(review_response_map.show_feedback(response)).to eq(&amp;quot;&amp;lt;table width=\&amp;quot;100%\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot; width=\&amp;quot;70%\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Review &amp;lt;/b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;#\&amp;quot; name= \&amp;quot;review_1Link\&amp;quot; onClick=\&amp;quot;toggleElement('review_1','review');return false;\&amp;quot;&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;show review&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Last Reviewed:&amp;lt;/b&amp;gt;&amp;lt;span&amp;gt;Not available&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;table id=\&amp;quot;review_1\&amp;quot;&amp;quot;\&lt;br /&gt;
          &amp;quot; style=\&amp;quot;display: none;\&amp;quot; class=\&amp;quot;table table-bordered\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;Additional Comment: &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== metareview response maps ===&lt;br /&gt;
Test metareview_response_maps method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#metareview_response_maps' do&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.metareview_response_maps).to eq([metareview_response_map1])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get responses for team round ===&lt;br /&gt;
Test get_responses_for_team_round method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_responses_for_team_round' do&lt;br /&gt;
    allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
    allow(team).to receive(:id).and_return(1)&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(ResponseMap).to receive(:where).with(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;).and_return([response_map])&lt;br /&gt;
    expect(ReviewResponseMap.get_responses_for_team_round(team, 1)).to eq([response])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== final versions from reviewer ===&lt;br /&gt;
Test final_versions_from_reviewer method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#final_versions_from_reviewer' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewer_id: 1).and_return([review_response_map])&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(participant).to receive(:parent_id).and_return(1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.final_versions_from_reviewer(1)).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== review response report ===&lt;br /&gt;
Test review_response_report method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#review_response_report' do&lt;br /&gt;
    id = 1&lt;br /&gt;
    type = &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    user_ids = []&lt;br /&gt;
    review_user = user&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(User).to receive_message_chain(:select, :where).and_return([user])&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:where).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
    review_user = nil&lt;br /&gt;
    allow(ResponseMap).to receive_message_chain(:select, :where).and_return([response_map])&lt;br /&gt;
    allow([response_map]).to receive(:reviewer_id).and_return(1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find).with(1).and_return([assignment_participant])&lt;br /&gt;
    allow(Participant).to receive(:sort_by_name).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== email ===&lt;br /&gt;
Test email method which can successfully send an email.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#email' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student)&lt;br /&gt;
    allow(User).to receive(:find).with(1).and_return(student)&lt;br /&gt;
    review_response_map.reviewee_id = 1&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect{review_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }.to change { ActionMailer::Base.deliveries.count }.by (1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare final review versions ===&lt;br /&gt;
Test the prepare_final_review_versions method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_final_review_versions' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(metareview_response_map1).to receive(:id).and_return(1)&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
    reviewer_id = 2&lt;br /&gt;
    allow(Participant).to receive(:find).with(2).and_return(participant1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(2).and_return(assignment1)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({ review:{questionnaire_id: nil, response_ids:[3]}})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare review response ===&lt;br /&gt;
Test prepare_review_response method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_review_response' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    review_response_map.id = 1&lt;br /&gt;
    round = 1&lt;br /&gt;
    maps = [review_response_map]&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([1])&lt;br /&gt;
    round = nil&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([3])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Running Rspec==&lt;br /&gt;
The tests can be run on the terminal from inside the expertiza folder using following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit Test Result==&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118708</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118708"/>
		<updated>2018-11-06T03:45:37Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: /* review response report */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page is for the description of unit test for E1850 OSS assignment for Fall 2018, CSC/ECE 517.&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 members at North Carolina State University. It enables students enrolled in a particular course to form online teams, complete assignments, review other's work and receive feedbacks of your work.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Review_response_map.rb is used to prepare data for peer review. But there are no unit tests for it.&lt;br /&gt;
&lt;br /&gt;
== Work to be done ==&lt;br /&gt;
*Create a new file named review_response_map_spec.rb under spec/models folder&lt;br /&gt;
*Write RSpec unit tests to make the path coverage above 90%.&lt;br /&gt;
*Coverage as many edge cases as we can.&lt;br /&gt;
*Achieve as high branch coverage as we can. Use the mutant-rspec gem to measure test thoroughness and fault-finding capability of our tests.&lt;br /&gt;
&lt;br /&gt;
== Files Created ==&lt;br /&gt;
*spec/models/review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Unit Test ==&lt;br /&gt;
=== mock instance ===&lt;br /&gt;
We mock the necessary instance for all test in the beginning of test file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  let(:team) { build(:assignment_team, id: 1, name: 'team no name', assignment: assignment, users: [student], parent_id: 1) }&lt;br /&gt;
  let(:team1) { build(:assignment_team, id: 2, name: 'team has name', assignment: assignment, users: [student]) }&lt;br /&gt;
  let(:review_response_map) { build(:review_response_map, id: 1, assignment: assignment, reviewer: participant, reviewee: team, reviewed_object_id: 1) }&lt;br /&gt;
  let(:review_response_map1) { build(:review_response_map, id: 2, assignment: assignment, reviewer: participant1, reviewee: team1, reviewed_object_id: 1) }&lt;br /&gt;
  let(:feed_back_response_map) { double('feed_back_response_map', reviewed_object_id: 1) }&lt;br /&gt;
  let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, parent_id: 1, name: 'no name', fullname: 'no one')) }&lt;br /&gt;
  let(:participant1) { build(:participant, id: 2, parent_id: 2, user: build(:student, parent_id: 1, name: 'has name', fullname: 'has one')) }&lt;br /&gt;
  let(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt', rounds_of_reviews: 2 ) }&lt;br /&gt;
  let(:assignment1) { build(:assignment, id: 2, name: 'Test Assgt', rounds_of_reviews: 1 ) }&lt;br /&gt;
  let(:response) { build(:response, id: 1, map_id: 1, round: 1, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:response1) { build(:response, id: 2, map_id: 1, round: 2, response_map: review_response_map, scores: [answer]) }&lt;br /&gt;
  let(:response2) { build(:response, id: 3, map_id: 1, round: nil, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:answer) { Answer.new(answer: 1, comments: 'Answer text', question_id: 1) }&lt;br /&gt;
  let(:question) { Criterion.new(id: 1, weight: 2, break_before: true) }&lt;br /&gt;
  let(:feedback) { FeedbackResponseMap.new(id: 1, reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1) }&lt;br /&gt;
  let(:metareview_response_map) { double('metareviewmap')}&lt;br /&gt;
  let(:metareview_response_map1) { MetareviewResponseMap.new(reviewed_object_id: 1)}&lt;br /&gt;
  let(:student) {build(:student, id: 1, fullname: 'no one', email: 'expertiza@mailinator.com') }&lt;br /&gt;
  let(:assignment_questionnaire){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 1, questionnaire_id: 1) }&lt;br /&gt;
  let(:assignment_questionnaire1){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 2, questionnaire_id: 1) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&lt;br /&gt;
  let(:response_map) { ResponseMap.new(id: 1, reviewed_object_id: 1, reviewee_id: 1, reviewer_id: 1, type: &amp;quot;ReviewResponseMap&amp;quot;, response: [response], calibrate_to: 0) }&lt;br /&gt;
  let(:user) {User.new(id:1 , name: &amp;quot;name&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:user1) { User.new(id: 2, name: &amp;quot;name1&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:assignment_participant) { AssignmentParticipant.new(user_id: 1, parent_id: 1) }&lt;br /&gt;
  let(:assignment_participant1) { AssignmentParticipant.new(id: 1, user_id: 2, parent_id: 1) }&lt;br /&gt;
  let(:teams_users) {TeamsUser.new(user_id: 1, team_id: 1)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== questionnaire ===&lt;br /&gt;
Test the questionnaire using find_by to get specific questionnaire of map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#questionnaire' do&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Questionnaire).to receive(:find_by).with(id: 1).and_return(questionnaire1)&lt;br /&gt;
    expect(review_response_map.questionnaire(1)).to eq(questionnaire1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get title ===&lt;br /&gt;
Test the get_title method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_title' do&lt;br /&gt;
    expect(review_response_map.get_title).to eq(&amp;quot;Review&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== delete ===&lt;br /&gt;
Test the delete method of review_response_map which contains delete feedback_response_map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#delete' do&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([feedback])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.delete).to equal(review_response_map)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export fields ===&lt;br /&gt;
Test the export_fields method which show the title of export csv file should be &amp;quot;contributor&amp;quot; and &amp;quot;reviewed by&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export_fields' do&lt;br /&gt;
    expect(ReviewResponseMap.export_fields('Missing &amp;quot;_options&amp;quot;')).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export ===&lt;br /&gt;
Test the export method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export' do&lt;br /&gt;
    csv = []&lt;br /&gt;
    parent_id = 1&lt;br /&gt;
    _options = _options&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([review_response_map, review_response_map1])&lt;br /&gt;
    expect(ReviewResponseMap.export(csv, parent_id, _options)).to eq([review_response_map1, review_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== import ===&lt;br /&gt;
Test the import method which includes errors casued by various reasons.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#import' do&lt;br /&gt;
    row_hash={reviewee: &amp;quot;name&amp;quot;, reviewers: [&amp;quot;name1&amp;quot;]}&lt;br /&gt;
    _session = nil&lt;br /&gt;
    assignment_id = 1&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name&amp;quot;).and_return(user)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(assignment_participant)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(team)&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
    # when reviewee_team = nil&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(nil)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:create).and_return(double('team', id: 1))&lt;br /&gt;
    allow(TeamsUser).to receive(:create).with(team_id: 1, user_id: 1).and_return(double('teams_users', id: 1, team_id: 1, user_id: 1))&lt;br /&gt;
    allow(TeamNode).to receive(:create).with(parent_id: assignment_id, node_object_id: 1).and_return(double('team_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(TeamUserNode).to receive(:create).with(parent_id: 1, node_object_id: 1).and_return(double('team_user_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== show feedback ===&lt;br /&gt;
Test show_feedback method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#show_feedback' do&lt;br /&gt;
    allow(review_response_map).to receive(:response).and_return([response])&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:find_by).with(reviewed_object_id: 1).and_return(feedback)&lt;br /&gt;
    allow(feedback).to receive(:response).and_return([response])&lt;br /&gt;
    expect(review_response_map.show_feedback(response)).to eq(&amp;quot;&amp;lt;table width=\&amp;quot;100%\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot; width=\&amp;quot;70%\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Review &amp;lt;/b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;#\&amp;quot; name= \&amp;quot;review_1Link\&amp;quot; onClick=\&amp;quot;toggleElement('review_1','review');return false;\&amp;quot;&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;show review&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Last Reviewed:&amp;lt;/b&amp;gt;&amp;lt;span&amp;gt;Not available&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;table id=\&amp;quot;review_1\&amp;quot;&amp;quot;\&lt;br /&gt;
          &amp;quot; style=\&amp;quot;display: none;\&amp;quot; class=\&amp;quot;table table-bordered\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;Additional Comment: &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== metareview response maps ===&lt;br /&gt;
Test metareview_response_maps method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#metareview_response_maps' do&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.metareview_response_maps).to eq([metareview_response_map1])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get responses for team round ===&lt;br /&gt;
Test get_responses_for_team_round method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_responses_for_team_round' do&lt;br /&gt;
    allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
    allow(team).to receive(:id).and_return(1)&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(ResponseMap).to receive(:where).with(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;).and_return([response_map])&lt;br /&gt;
    expect(ReviewResponseMap.get_responses_for_team_round(team, 1)).to eq([response])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== final versions from reviewer ===&lt;br /&gt;
Test final_versions_from_reviewer method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#final_versions_from_reviewer' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewer_id: 1).and_return([review_response_map])&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(participant).to receive(:parent_id).and_return(1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.final_versions_from_reviewer(1)).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== review response report ===&lt;br /&gt;
Test review_response_report method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#review_response_report' do&lt;br /&gt;
    id = 1&lt;br /&gt;
    type = &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    user_ids = []&lt;br /&gt;
    review_user = user&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(User).to receive_message_chain(:select, :where).and_return([user])&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:where).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
    review_user = nil&lt;br /&gt;
    allow(ResponseMap).to receive_message_chain(:select, :where).and_return([response_map])&lt;br /&gt;
    allow([response_map]).to receive(:reviewer_id).and_return(1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find).with(1).and_return([assignment_participant])&lt;br /&gt;
    allow(Participant).to receive(:sort_by_name).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== email ===&lt;br /&gt;
Test email method which can successfully send an email.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#email' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student)&lt;br /&gt;
    allow(User).to receive(:find).with(1).and_return(student)&lt;br /&gt;
    review_response_map.reviewee_id = 1&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect{review_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }.to change { ActionMailer::Base.deliveries.count }.by (1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare final review versions ===&lt;br /&gt;
Test the prepare_final_review_versions method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_final_review_versions' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(metareview_response_map1).to receive(:id).and_return(1)&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
    # when round = nil&lt;br /&gt;
    reviewer_id = 2&lt;br /&gt;
    allow(Participant).to receive(:find).with(2).and_return(participant1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(2).and_return(assignment1)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({ review:{questionnaire_id: nil, response_ids:[3]}})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare review response ===&lt;br /&gt;
Test prepare_review_response method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_review_response' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    review_response_map.id = 1&lt;br /&gt;
    round = 1&lt;br /&gt;
    maps = [review_response_map]&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([1])&lt;br /&gt;
    round = nil&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([3])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Running Rspec==&lt;br /&gt;
The tests can be run on the terminal from inside the expertiza folder using following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit Test Result==&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118707</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118707"/>
		<updated>2018-11-06T03:45:04Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page is for the description of unit test for E1850 OSS assignment for Fall 2018, CSC/ECE 517.&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 members at North Carolina State University. It enables students enrolled in a particular course to form online teams, complete assignments, review other's work and receive feedbacks of your work.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Review_response_map.rb is used to prepare data for peer review. But there are no unit tests for it.&lt;br /&gt;
&lt;br /&gt;
== Work to be done ==&lt;br /&gt;
*Create a new file named review_response_map_spec.rb under spec/models folder&lt;br /&gt;
*Write RSpec unit tests to make the path coverage above 90%.&lt;br /&gt;
*Coverage as many edge cases as we can.&lt;br /&gt;
*Achieve as high branch coverage as we can. Use the mutant-rspec gem to measure test thoroughness and fault-finding capability of our tests.&lt;br /&gt;
&lt;br /&gt;
== Files Created ==&lt;br /&gt;
*spec/models/review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Unit Test ==&lt;br /&gt;
=== mock instance ===&lt;br /&gt;
We mock the necessary instance for all test in the beginning of test file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  let(:team) { build(:assignment_team, id: 1, name: 'team no name', assignment: assignment, users: [student], parent_id: 1) }&lt;br /&gt;
  let(:team1) { build(:assignment_team, id: 2, name: 'team has name', assignment: assignment, users: [student]) }&lt;br /&gt;
  let(:review_response_map) { build(:review_response_map, id: 1, assignment: assignment, reviewer: participant, reviewee: team, reviewed_object_id: 1) }&lt;br /&gt;
  let(:review_response_map1) { build(:review_response_map, id: 2, assignment: assignment, reviewer: participant1, reviewee: team1, reviewed_object_id: 1) }&lt;br /&gt;
  let(:feed_back_response_map) { double('feed_back_response_map', reviewed_object_id: 1) }&lt;br /&gt;
  let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, parent_id: 1, name: 'no name', fullname: 'no one')) }&lt;br /&gt;
  let(:participant1) { build(:participant, id: 2, parent_id: 2, user: build(:student, parent_id: 1, name: 'has name', fullname: 'has one')) }&lt;br /&gt;
  let(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt', rounds_of_reviews: 2 ) }&lt;br /&gt;
  let(:assignment1) { build(:assignment, id: 2, name: 'Test Assgt', rounds_of_reviews: 1 ) }&lt;br /&gt;
  let(:response) { build(:response, id: 1, map_id: 1, round: 1, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:response1) { build(:response, id: 2, map_id: 1, round: 2, response_map: review_response_map, scores: [answer]) }&lt;br /&gt;
  let(:response2) { build(:response, id: 3, map_id: 1, round: nil, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:answer) { Answer.new(answer: 1, comments: 'Answer text', question_id: 1) }&lt;br /&gt;
  let(:question) { Criterion.new(id: 1, weight: 2, break_before: true) }&lt;br /&gt;
  let(:feedback) { FeedbackResponseMap.new(id: 1, reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1) }&lt;br /&gt;
  let(:metareview_response_map) { double('metareviewmap')}&lt;br /&gt;
  let(:metareview_response_map1) { MetareviewResponseMap.new(reviewed_object_id: 1)}&lt;br /&gt;
  let(:student) {build(:student, id: 1, fullname: 'no one', email: 'expertiza@mailinator.com') }&lt;br /&gt;
  let(:assignment_questionnaire){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 1, questionnaire_id: 1) }&lt;br /&gt;
  let(:assignment_questionnaire1){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 2, questionnaire_id: 1) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&lt;br /&gt;
  let(:response_map) { ResponseMap.new(id: 1, reviewed_object_id: 1, reviewee_id: 1, reviewer_id: 1, type: &amp;quot;ReviewResponseMap&amp;quot;, response: [response], calibrate_to: 0) }&lt;br /&gt;
  let(:user) {User.new(id:1 , name: &amp;quot;name&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:user1) { User.new(id: 2, name: &amp;quot;name1&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:assignment_participant) { AssignmentParticipant.new(user_id: 1, parent_id: 1) }&lt;br /&gt;
  let(:assignment_participant1) { AssignmentParticipant.new(id: 1, user_id: 2, parent_id: 1) }&lt;br /&gt;
  let(:teams_users) {TeamsUser.new(user_id: 1, team_id: 1)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== questionnaire ===&lt;br /&gt;
Test the questionnaire using find_by to get specific questionnaire of map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#questionnaire' do&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Questionnaire).to receive(:find_by).with(id: 1).and_return(questionnaire1)&lt;br /&gt;
    expect(review_response_map.questionnaire(1)).to eq(questionnaire1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get title ===&lt;br /&gt;
Test the get_title method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_title' do&lt;br /&gt;
    expect(review_response_map.get_title).to eq(&amp;quot;Review&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== delete ===&lt;br /&gt;
Test the delete method of review_response_map which contains delete feedback_response_map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#delete' do&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([feedback])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.delete).to equal(review_response_map)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export fields ===&lt;br /&gt;
Test the export_fields method which show the title of export csv file should be &amp;quot;contributor&amp;quot; and &amp;quot;reviewed by&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export_fields' do&lt;br /&gt;
    expect(ReviewResponseMap.export_fields('Missing &amp;quot;_options&amp;quot;')).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export ===&lt;br /&gt;
Test the export method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export' do&lt;br /&gt;
    csv = []&lt;br /&gt;
    parent_id = 1&lt;br /&gt;
    _options = _options&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([review_response_map, review_response_map1])&lt;br /&gt;
    expect(ReviewResponseMap.export(csv, parent_id, _options)).to eq([review_response_map1, review_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== import ===&lt;br /&gt;
Test the import method which includes errors casued by various reasons.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#import' do&lt;br /&gt;
    row_hash={reviewee: &amp;quot;name&amp;quot;, reviewers: [&amp;quot;name1&amp;quot;]}&lt;br /&gt;
    _session = nil&lt;br /&gt;
    assignment_id = 1&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name&amp;quot;).and_return(user)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(assignment_participant)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(team)&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
    # when reviewee_team = nil&lt;br /&gt;
    allow(AssignmentTeam).to receive(:team).with(assignment_participant).and_return(nil)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:create).and_return(double('team', id: 1))&lt;br /&gt;
    allow(TeamsUser).to receive(:create).with(team_id: 1, user_id: 1).and_return(double('teams_users', id: 1, team_id: 1, user_id: 1))&lt;br /&gt;
    allow(TeamNode).to receive(:create).with(parent_id: assignment_id, node_object_id: 1).and_return(double('team_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(TeamUserNode).to receive(:create).with(parent_id: 1, node_object_id: 1).and_return(double('team_user_node', id: 1, parent_id: 1, node_object_id: 1))&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find_by).with(user_id: 2, parent_id: 1).and_return(assignment_participant1)&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:find_or_create_by).with(reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1, calibrate_to: false).and_return(review_response_map)&lt;br /&gt;
    expect(ReviewResponseMap.import(row_hash, _session, 1)).to eq([&amp;quot;name1&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== show feedback ===&lt;br /&gt;
Test show_feedback method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#show_feedback' do&lt;br /&gt;
    allow(review_response_map).to receive(:response).and_return([response])&lt;br /&gt;
    allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
    allow(FeedbackResponseMap).to receive(:find_by).with(reviewed_object_id: 1).and_return(feedback)&lt;br /&gt;
    allow(feedback).to receive(:response).and_return([response])&lt;br /&gt;
    expect(review_response_map.show_feedback(response)).to eq(&amp;quot;&amp;lt;table width=\&amp;quot;100%\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot; width=\&amp;quot;70%\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Review &amp;lt;/b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;#\&amp;quot; name= \&amp;quot;review_1Link\&amp;quot; onClick=\&amp;quot;toggleElement('review_1','review');return false;\&amp;quot;&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;show review&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=\&amp;quot;left\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Last Reviewed:&amp;lt;/b&amp;gt;&amp;lt;span&amp;gt;Not available&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;table id=\&amp;quot;review_1\&amp;quot;&amp;quot;\&lt;br /&gt;
          &amp;quot; style=\&amp;quot;display: none;\&amp;quot; class=\&amp;quot;table table-bordered\&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;\&lt;br /&gt;
          &amp;quot;Additional Comment: &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== metareview response maps ===&lt;br /&gt;
Test metareview_response_maps method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#metareview_response_maps' do&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([metareview_response_map1])&lt;br /&gt;
    expect(review_response_map.metareview_response_maps).to eq([metareview_response_map1])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get responses for team round ===&lt;br /&gt;
Test get_responses_for_team_round method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_responses_for_team_round' do&lt;br /&gt;
    allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
    allow(team).to receive(:id).and_return(1)&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(ResponseMap).to receive(:where).with(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;).and_return([response_map])&lt;br /&gt;
    expect(ReviewResponseMap.get_responses_for_team_round(team, 1)).to eq([response])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== final versions from reviewer ===&lt;br /&gt;
Test final_versions_from_reviewer method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#final_versions_from_reviewer' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewer_id: 1).and_return([review_response_map])&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(participant).to receive(:parent_id).and_return(1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.final_versions_from_reviewer(1)).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== review response report ===&lt;br /&gt;
Test review_response_report method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#review_response_report' do&lt;br /&gt;
    id = 1&lt;br /&gt;
    type = &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    user_ids = []&lt;br /&gt;
    review_user = user&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    # allow(User).to receive(:where).with('fullname LIKE ?', '%' + review_user[:fullname] + '%').and_return([user])&lt;br /&gt;
    # allow([user]).to receive(:select).with('DISTINCT id').and_return([user])&lt;br /&gt;
&lt;br /&gt;
    allow(User).to receive_message_chain(:select, :where).and_return([user])&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:where).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
    review_user = nil&lt;br /&gt;
    # allow(ResponseMap).to receive(:where).with('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0).and_return([response_map])&lt;br /&gt;
    # allow([response_map]).to receive(:select).with('DISTINCT reviewer_id').and_return([response_map])&lt;br /&gt;
&lt;br /&gt;
    allow(ResponseMap).to receive_message_chain(:select, :where).and_return([response_map])&lt;br /&gt;
    allow([response_map]).to receive(:reviewer_id).and_return(1)&lt;br /&gt;
    allow(AssignmentParticipant).to receive(:find).with(1).and_return([assignment_participant])&lt;br /&gt;
    allow(Participant).to receive(:sort_by_name).and_return([assignment_participant])&lt;br /&gt;
    expect(ReviewResponseMap.review_response_report(id, Assignment.find(Participant.find(reviewer_id).parent_id), type, review_user)).to eq( [assignment_participant] )&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== email ===&lt;br /&gt;
Test email method which can successfully send an email.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#email' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student)&lt;br /&gt;
    allow(User).to receive(:find).with(1).and_return(student)&lt;br /&gt;
    review_response_map.reviewee_id = 1&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect{review_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }.to change { ActionMailer::Base.deliveries.count }.by (1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare final review versions ===&lt;br /&gt;
Test the prepare_final_review_versions method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_final_review_versions' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(metareview_response_map1).to receive(:id).and_return(1)&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 2).and_return([response1])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(2).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({&amp;quot;review round1&amp;quot;:{questionnaire_id: 1, response_ids:[1]}, &amp;quot;review round2&amp;quot;:{questionnaire_id: 1, response_ids:[2] }})&lt;br /&gt;
    # when round = nil&lt;br /&gt;
    reviewer_id = 2&lt;br /&gt;
    allow(Participant).to receive(:find).with(2).and_return(participant1)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(2).and_return(assignment1)&lt;br /&gt;
    allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id:1).and_return([metareview_response_map1])&lt;br /&gt;
&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_final_review_versions(Assignment.find(Participant.find(reviewer_id).parent_id), MetareviewResponseMap.where(reviewed_object_id: 1))).to eq({ review:{questionnaire_id: nil, response_ids:[3]}})&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare review response ===&lt;br /&gt;
Test prepare_review_response method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#prepare_review_response' do&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    review_response_map.id = 1&lt;br /&gt;
    round = 1&lt;br /&gt;
    maps = [review_response_map]&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1, round: 1).and_return([response])&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([1])&lt;br /&gt;
    round = nil&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(nil).and_return(1)&lt;br /&gt;
    allow(Response).to receive(:where).with(map_id: 1).and_return([response2])&lt;br /&gt;
    expect(ReviewResponseMap.prepare_review_response(assignment, maps, review_final_versions, round)).to eq([3])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Running Rspec==&lt;br /&gt;
The tests can be run on the terminal from inside the expertiza folder using following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit Test Result==&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118702</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118702"/>
		<updated>2018-11-06T03:17:40Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page is for the description of unit test for E1850 OSS assignment for Fall 2018, CSC/ECE 517.&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 members at North Carolina State University. It enables students enrolled in a particular course to form online teams, complete assignments, review other's work and receive feedbacks of your work.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Review_response_map.rb is used to prepare data for peer review. But there are no unit tests for it.&lt;br /&gt;
&lt;br /&gt;
== Work to be done ==&lt;br /&gt;
*Create a new file named review_response_map_spec.rb under spec/models folder&lt;br /&gt;
*Write RSpec unit tests to make the path coverage above 90%.&lt;br /&gt;
*Coverage as many edge cases as we can.&lt;br /&gt;
*Achieve as high branch coverage as we can. Use the mutant-rspec gem to measure test thoroughness and fault-finding capability of our tests.&lt;br /&gt;
&lt;br /&gt;
== Files Created ==&lt;br /&gt;
*spec/models/review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Unit Test ==&lt;br /&gt;
=== mock instance ===&lt;br /&gt;
We mock the necessary instance for all test in the beginning of test file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  let(:team) { build(:assignment_team, id: 1, name: 'team no name', assignment: assignment, users: [student], parent_id: 1) }&lt;br /&gt;
  let(:team1) { build(:assignment_team, id: 2, name: 'team has name', assignment: assignment, users: [student]) }&lt;br /&gt;
  let(:review_response_map) { build(:review_response_map, id: 1, assignment: assignment, reviewer: participant, reviewee: team, reviewed_object_id: 1) }&lt;br /&gt;
  let(:review_response_map1) { build(:review_response_map, id: 2, assignment: assignment, reviewer: participant1, reviewee: team1, reviewed_object_id: 1) }&lt;br /&gt;
  let(:feed_back_response_map) { double('feed_back_response_map', reviewed_object_id: 1) }&lt;br /&gt;
  let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, parent_id: 1, name: 'no name', fullname: 'no one')) }&lt;br /&gt;
  let(:participant1) { build(:participant, id: 2, parent_id: 2, user: build(:student, parent_id: 1, name: 'has name', fullname: 'has one')) }&lt;br /&gt;
  let(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt', rounds_of_reviews: 2 ) }&lt;br /&gt;
  let(:assignment1) { build(:assignment, id: 2, name: 'Test Assgt', rounds_of_reviews: 1 ) }&lt;br /&gt;
  let(:response) { build(:response, id: 1, map_id: 1, round: 1, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:response1) { build(:response, id: 2, map_id: 1, round: 2, response_map: review_response_map, scores: [answer]) }&lt;br /&gt;
  let(:response2) { build(:response, id: 3, map_id: 1, round: nil, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:answer) { Answer.new(answer: 1, comments: 'Answer text', question_id: 1) }&lt;br /&gt;
  let(:question) { Criterion.new(id: 1, weight: 2, break_before: true) }&lt;br /&gt;
  let(:feedback) { FeedbackResponseMap.new(id: 1, reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1) }&lt;br /&gt;
  let(:metareview_response_map) { double('metareviewmap')}&lt;br /&gt;
  let(:metareview_response_map1) { MetareviewResponseMap.new(reviewed_object_id: 1)}&lt;br /&gt;
  let(:student) {build(:student, id: 1, fullname: 'no one', email: 'expertiza@mailinator.com') }&lt;br /&gt;
  let(:assignment_questionnaire){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 1, questionnaire_id: 1) }&lt;br /&gt;
  let(:assignment_questionnaire1){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 2, questionnaire_id: 1) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&lt;br /&gt;
  let(:response_map) { ResponseMap.new(id: 1, reviewed_object_id: 1, reviewee_id: 1, reviewer_id: 1, type: &amp;quot;ReviewResponseMap&amp;quot;, response: [response], calibrate_to: 0) }&lt;br /&gt;
  let(:user) {User.new(id:1 , name: &amp;quot;name&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:user1) { User.new(id: 2, name: &amp;quot;name1&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:assignment_participant) { AssignmentParticipant.new(user_id: 1, parent_id: 1) }&lt;br /&gt;
  let(:assignment_participant1) { AssignmentParticipant.new(id: 1, user_id: 2, parent_id: 1) }&lt;br /&gt;
  let(:teams_users) {TeamsUser.new(user_id: 1, team_id: 1)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== questionnaire ===&lt;br /&gt;
Test the questionnaire using find_by to get specific questionnaire of map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#questionnaire' do&lt;br /&gt;
    round = 1&lt;br /&gt;
    allow(assignment).to receive(:review_questionnaire_id).with(1).and_return(1)&lt;br /&gt;
    allow(Questionnaire).to receive(:find_by).with(id: 1).and_return(questionnaire1)&lt;br /&gt;
    expect(review_response_map.questionnaire(1)).to eq(questionnaire1)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get title ===&lt;br /&gt;
Test the get_title method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#get_title' do&lt;br /&gt;
    expect(review_response_map.get_title).to eq(&amp;quot;Review&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== delete ===&lt;br /&gt;
Test the delete method of review_response_map which contains delete feedback_response_map.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#delete' do&lt;br /&gt;
    response_map = double(&amp;quot;ResponseMap&amp;quot;, :reviewed_object_id =&amp;gt; 2)&lt;br /&gt;
    expect(review_response_map.delete).to equal(review_response_map)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export fields ===&lt;br /&gt;
Test the export_fields method which show the title of export csv file should be &amp;quot;contributor&amp;quot; and &amp;quot;reviewed by&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export_fields' do&lt;br /&gt;
    expect(ReviewResponseMap.export_fields('Missing &amp;quot;_options&amp;quot;')).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== export ===&lt;br /&gt;
Test the export method.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  it '#export' do&lt;br /&gt;
    csv = []&lt;br /&gt;
    parent_id = 1&lt;br /&gt;
    _options = _options&lt;br /&gt;
    allow(ReviewResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([review_response_map, review_response_map1])&lt;br /&gt;
    expect(ReviewResponseMap.export(csv, parent_id, _options)).to eq([review_response_map1, review_response_map])&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Running Rspec==&lt;br /&gt;
The tests can be run on the terminal from inside the expertiza folder using following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit Test Result==&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118698</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118698"/>
		<updated>2018-11-06T02:46:54Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page is for the description of unit test for E1850 OSS assignment for Fall 2018, CSC/ECE 517.&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 members at North Carolina State University. It enables students enrolled in a particular course to form online teams, complete assignments, review other's work and receive feedbacks of your work.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Review_response_map.rb is used to prepare data for peer review. But there are no unit tests for it.&lt;br /&gt;
&lt;br /&gt;
== Work to be done ==&lt;br /&gt;
*Create a new file named review_response_map_spec.rb under spec/models folder&lt;br /&gt;
*Write RSpec unit tests to make the path coverage above 90%.&lt;br /&gt;
*Coverage as many edge cases as we can.&lt;br /&gt;
*Achieve as high branch coverage as we can. Use the mutant-rspec gem to measure test thoroughness and fault-finding capability of our tests.&lt;br /&gt;
&lt;br /&gt;
== Files Created ==&lt;br /&gt;
*spec/models/review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Unit Test ==&lt;br /&gt;
=== mock instance ===&lt;br /&gt;
We mock the necessary instance for all test in the beginning of test file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:team) { build(:assignment_team, id: 1, name: 'team no name', assignment: assignment, users: [student], parent_id: 1) }&lt;br /&gt;
  let(:team1) { build(:assignment_team, id: 2, name: 'team has name', assignment: assignment, users: [student]) }&lt;br /&gt;
  let(:review_response_map) { build(:review_response_map, id: 1, assignment: assignment, reviewer: participant, reviewee: team, reviewed_object_id: 1) }&lt;br /&gt;
  let(:review_response_map1) { build(:review_response_map, id: 2, assignment: assignment, reviewer: participant1, reviewee: team1, reviewed_object_id: 1) }&lt;br /&gt;
  let(:feed_back_response_map) { double('feed_back_response_map', reviewed_object_id: 1) }&lt;br /&gt;
  let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, parent_id: 1, name: 'no name', fullname: 'no one')) }&lt;br /&gt;
  let(:participant1) { build(:participant, id: 2, parent_id: 2, user: build(:student, parent_id: 1, name: 'has name', fullname: 'has one')) }&lt;br /&gt;
  let(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt', rounds_of_reviews: 2 ) }&lt;br /&gt;
  let(:assignment1) { build(:assignment, id: 2, name: 'Test Assgt', rounds_of_reviews: 1 ) }&lt;br /&gt;
  let(:response) { build(:response, id: 1, map_id: 1, round: 1, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:response1) { build(:response, id: 2, map_id: 1, round: 2, response_map: review_response_map, scores: [answer]) }&lt;br /&gt;
  let(:response2) { build(:response, id: 3, map_id: 1, round: nil, response_map: review_response_map, scores: [answer], is_submitted: true) }&lt;br /&gt;
  let(:answer) { Answer.new(answer: 1, comments: 'Answer text', question_id: 1) }&lt;br /&gt;
  let(:question) { Criterion.new(id: 1, weight: 2, break_before: true) }&lt;br /&gt;
  let(:feedback) { FeedbackResponseMap.new(id: 1, reviewed_object_id: 1, reviewer_id: 1, reviewee_id: 1) }&lt;br /&gt;
  let(:metareview_response_map) { double('metareviewmap')}&lt;br /&gt;
  let(:metareview_response_map1) { MetareviewResponseMap.new(reviewed_object_id: 1)}&lt;br /&gt;
  let(:student) {build(:student, id: 1, fullname: 'no one', email: 'expertiza@mailinator.com') }&lt;br /&gt;
  let(:assignment_questionnaire){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 1, questionnaire_id: 1) }&lt;br /&gt;
  let(:assignment_questionnaire1){ AssignmentQuestionnaire.new(assignment_id: 1, used_in_round: 2, questionnaire_id: 1) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&lt;br /&gt;
  let(:response_map) { ResponseMap.new(id: 1, reviewed_object_id: 1, reviewee_id: 1, reviewer_id: 1, type: &amp;quot;ReviewResponseMap&amp;quot;, response: [response], calibrate_to: 0) }&lt;br /&gt;
  let(:user) {User.new(id:1 , name: &amp;quot;name&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:user1) { User.new(id: 2, name: &amp;quot;name1&amp;quot;, fullname: 'fullname') }&lt;br /&gt;
  let(:assignment_participant) { AssignmentParticipant.new(user_id: 1, parent_id: 1) }&lt;br /&gt;
  let(:assignment_participant1) { AssignmentParticipant.new(id: 1, user_id: 2, parent_id: 1) }&lt;br /&gt;
  let(:teams_users) {TeamsUser.new(user_id: 1, team_id: 1)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Running Rspec==&lt;br /&gt;
The tests can be run on the terminal from inside the expertiza folder using following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 rspec spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit Test Result==&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118147</id>
		<title>E1850. Write unit tests for review response map.rb team100</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850._Write_unit_tests_for_review_response_map.rb_team100&amp;diff=118147"/>
		<updated>2018-11-02T21:08:09Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: Created page with &amp;quot;E1850&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;E1850&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1850_My_project&amp;diff=118137</id>
		<title>E1850 My project</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1850_My_project&amp;diff=118137"/>
		<updated>2018-11-02T20:59:26Z</updated>

		<summary type="html">&lt;p&gt;Yyang53: Created page with &amp;quot;The definition of review response map: to prepare the data for review assignment such as peer review.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The definition of review response map: to prepare the data for review assignment such as peer review.&lt;/div&gt;</summary>
		<author><name>Yyang53</name></author>
	</entry>
</feed>