<?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=Pchen23</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=Pchen23"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Pchen23"/>
	<updated>2026-05-30T21:31:30Z</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/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121654</id>
		<title>CSC/ECE 517 Fall 2018/E1879 Student Generated Questions Added To Rubric</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121654"/>
		<updated>2018-12-18T18:44:46Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Introduction'''&lt;br /&gt;
----&lt;br /&gt;
The rubrics in expertiza are created by instructors. These Rubrics only contain questions that are related to the existed topics. Now, Expertiza only supports students to pull questionnaires is specific rubrics to get some help. Even that they can ask about anything that is relevant to all the projects that will be submitted But when students encounter difficult problems which are not in the existed topics, and they want to get special advice on that new field, the demand for creating supplementary review questionnaire raises. This project (E1879) aims to solve this problem by allowing students to add questions to the standard instructor generated rubric so that they can get specific feedback on from the reviewers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Proposed solution'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
We will add the Supplementary Review Questions to the current Review Questions, and show these student-generated questions under the rubric given by instructor. Even though these questions won't be graded, they will eventually provide diversity for feedback. It will increase the benefit that each team gets because they can get feedback that is specific to their project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Implementation'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
''Design Strategy''&lt;br /&gt;
&lt;br /&gt;
In Expertiza, all kinds of rubrics and surveys are subclasses of Questionnaire. A Questionnaire can contain “questions” of several types (e.g., checkboxes, dropdowns, text boxes). So that we will add a new subclass of Questionnaire named SupplementaryReviewQuestionnaire to achieve our goal.&lt;br /&gt;
 &lt;br /&gt;
First, we want the professor to control if the students can create their own supplementary questions by using a checkbox to indicate. If the professor allow students to create their own questions, there will be a button in the students &amp;quot;Your work&amp;quot; page which can let the students jump to the same page that an instructor lands on when creating a new rubric. Then we will add the questionnaire id of this new SupplementaryReviewQuestionnaire to the Team table when students create their own questionnaire in order to show the corresponding supplementary questions to the reviewers. And when showing review questions to the reviewers we will look up the questionnaire id in Team table and modify the view to add the supplementary questions to review page. Finally, after the reviewers finish the review and submit their responds, we will change the view and let the team member can see the feedback of their supplementary questions.&lt;br /&gt;
&lt;br /&gt;
''Changes in the User Interface''&lt;br /&gt;
&lt;br /&gt;
1. Assignment Page&lt;br /&gt;
&lt;br /&gt;
We add a checkbox for the professor to indicate if student can add their own questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_1.png]]&lt;br /&gt;
   &lt;br /&gt;
2. A button called &amp;quot;Create Supplementary Rubric&amp;quot; will appear in the student's &amp;quot;Your Work&amp;quot; section when the Instructor has allowed students to create supplementary review questions. So when a student clicks the button he/she can add the desired questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_2.png]]&lt;br /&gt;
&lt;br /&gt;
3. The page where student will be directed to when he/she clicks the Create Supplementary Rubric button. Students can add Questions to the created Supplementary Review questionnaire here.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_3.png]]&lt;br /&gt;
&lt;br /&gt;
4. Review Page&lt;br /&gt;
&lt;br /&gt;
The students own supplementary questions are leading by a heading &amp;quot;Supplementary Review Questions&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_4.png]]&lt;br /&gt;
&lt;br /&gt;
5. Review Results Page&lt;br /&gt;
&lt;br /&gt;
The supplementary review results will be showed to the team like other results. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_5.png]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''Use Cases'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Use case of creating a Supplementary Review Questionnaire&lt;br /&gt;
&lt;br /&gt;
[[File:case1.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Use case of reviewing questions for reviewers.&lt;br /&gt;
&lt;br /&gt;
[[File:case2.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Use case of reviewing responses of questions.&lt;br /&gt;
&lt;br /&gt;
[[File:case3.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Test Plan'''&lt;br /&gt;
----&lt;br /&gt;
Actually, we need to add tests for the following:&lt;br /&gt;
&lt;br /&gt;
1. To check the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; appears in the &amp;quot;Your Work&amp;quot; section of a student.&lt;br /&gt;
&lt;br /&gt;
2. To check if the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; redirects to page which allows to create questionnaire.&lt;br /&gt;
&lt;br /&gt;
3. To check if the questionnaire ID is stored in the Team table.&lt;br /&gt;
&lt;br /&gt;
4. To check if the reviewers can see the supplementary questions that were added by the team as part of the review questions.&lt;br /&gt;
&lt;br /&gt;
5. To check if the responses of the Supplementary Review Questions have been added to the responses of the existing review questions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''File which are added/modified'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Models&lt;br /&gt;
&lt;br /&gt;
app/models/team.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_supplementary_review_questionnaire_id_of_team(team_id)&lt;br /&gt;
    team = Team.find(team_id)&lt;br /&gt;
    if team.blank?&lt;br /&gt;
      nil&lt;br /&gt;
    else&lt;br /&gt;
      team.supplementary_review_questionnaire_id&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/models/supplementary_review_questionnaire.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # This is one type of Questionnaire and  as intuitively expected this model class&lt;br /&gt;
 # derives from Questionnaire.&lt;br /&gt;
 class SupplementaryReviewQuestionnaire &amp;lt; Questionnaire&lt;br /&gt;
   # Make me better.&lt;br /&gt;
   attr_accessible&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/models/response.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def construct_review_response code, self_id, show_tags = nil, current_user = nil&lt;br /&gt;
    code += '&amp;lt;table id=&amp;quot;review_' + self_id + '&amp;quot; style=&amp;quot;display: none;&amp;quot; class=&amp;quot;table table-bordered&amp;quot;&amp;gt;'&lt;br /&gt;
    answers = Answer.where(response_id: self.response_id)&lt;br /&gt;
    team_id = response_map.reviewee_id&lt;br /&gt;
    supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(team_id)&lt;br /&gt;
    unless answers.empty?&lt;br /&gt;
      questionnaire = self.questionnaire_by_answer(answers.first)&lt;br /&gt;
&lt;br /&gt;
      unless supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        supplementary_review_questionnaire = Questionnaire.find(supplementary_review_questionnaire_id)&lt;br /&gt;
        supplementary_review_questions = supplementary_review_questionnaire.questions.sort_by(&amp;amp;:seq)&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      questionnaire_max = questionnaire.max_question_score&lt;br /&gt;
      questions = questionnaire.questions.sort_by(&amp;amp;:seq)&lt;br /&gt;
&lt;br /&gt;
      unless supplementary_review_questionnaire.nil?&lt;br /&gt;
        questions += supplementary_review_questions&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # get the tag settings this questionnaire&lt;br /&gt;
      tag_prompt_deployments = show_tags ? TagPromptDeployment.where(questionnaire_id: questionnaire.id, assignment_id: self.map.assignment.id) : nil&lt;br /&gt;
      code = add_table_rows questionnaire_max, questions, answers, code, tag_prompt_deployments, current_user&lt;br /&gt;
    end&lt;br /&gt;
    comment = if !self.additional_comment.nil?&lt;br /&gt;
                self.additional_comment.gsub('^p', '').gsub(/\n/, '&amp;lt;BR/&amp;gt;')&lt;br /&gt;
              else&lt;br /&gt;
                ''&lt;br /&gt;
              end&lt;br /&gt;
    code += '&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Additional Comment: &amp;lt;/b&amp;gt;' + comment + '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;'&lt;br /&gt;
    code += '&amp;lt;/table&amp;gt;'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Views:&lt;br /&gt;
&lt;br /&gt;
app/views/assignments/edit/_rubrics.html.erb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;!--Add a allow studuent-generated questionnaires checkbox. --&amp;gt;&lt;br /&gt;
 &amp;lt;input name=&amp;quot;assignment_form[assignment][supplementary_review_questionnaire]&amp;quot; type=&amp;quot;hidden&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;%= check_box_tag('assignment_form[assignment][supplementary_review_questionnaire]', 'true', @assignment_form.assignment.supplementary_review_questionnaire) %&amp;gt;&lt;br /&gt;
 &amp;lt;%= label_tag('assignment_form[assignment][supplementary_review_questionnaire]', 'Allow student-generated questions added to rubric?') %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/views/response/response.html.erb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      &amp;lt;br&amp;gt;&lt;br /&gt;
       &amp;lt;% unless @supplementary_review_questions.nil? %&amp;gt;&lt;br /&gt;
       &amp;lt;tr&amp;gt;&lt;br /&gt;
         &amp;lt;td&amp;gt;&lt;br /&gt;
           &amp;lt;h2&amp;gt;Supplementary Review Questions&amp;lt;/h2&amp;gt;&lt;br /&gt;
         &amp;lt;/td&amp;gt;&lt;br /&gt;
       &amp;lt;/tr&amp;gt;&lt;br /&gt;
         &amp;lt;% @supplementary_review_questions.each do |question| %&amp;gt;&lt;br /&gt;
         &amp;lt;tr&amp;gt;&lt;br /&gt;
           &amp;lt;td&amp;gt;&lt;br /&gt;
             &amp;lt;% answer = Answer.where(question_id: question.id, response_id: @response.id).first if !@response.nil? %&amp;gt;&lt;br /&gt;
             &amp;lt;% if question.instance_of? Criterion %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer, @questionnaire.min_question_score, @questionnaire.max_question_score, @dropdown_or_scale) %&amp;gt;&lt;br /&gt;
               &amp;lt;%= tinymce %&amp;gt;&lt;br /&gt;
             &amp;lt;% elsif question.instance_of? Scale %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer, @questionnaire.min_question_score, @questionnaire.max_question_score) %&amp;gt;&lt;br /&gt;
               &amp;lt;%= tinymce %&amp;gt;&lt;br /&gt;
             &amp;lt;% elsif question.instance_of? UploadFile %&amp;gt;&lt;br /&gt;
             &amp;lt;% else %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer) %&amp;gt;&lt;br /&gt;
             &amp;lt;% end %&amp;gt;&lt;br /&gt;
           &amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;td width=&amp;quot;25%&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;% if [Criterion, TextArea].include? question.class %&amp;gt;&lt;br /&gt;
                 &amp;lt;div id=&amp;quot;analysis_&amp;lt;%= i.to_s %&amp;gt;_comments&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
             &amp;lt;% end %&amp;gt;&lt;br /&gt;
           &amp;lt;/td&amp;gt;&lt;br /&gt;
         &amp;lt;/tr&amp;gt;&lt;br /&gt;
         &amp;lt;% i += 1 %&amp;gt;&lt;br /&gt;
         &amp;lt;% end %&amp;gt;&lt;br /&gt;
       &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/views/submitted_content/_main.html.erb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if stage != &amp;quot;Finished&amp;quot; and controller.controller_name == 'submitted_content' and @can_submit %&amp;gt;&lt;br /&gt;
  &amp;lt;h2&amp;gt;Add Supplementary Review Questions:&amp;lt;/h2&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.supplementary_review_questionnaire? %&amp;gt;&lt;br /&gt;
      &amp;lt;%= button_to &amp;quot;Create Supplementary Rubric&amp;quot;, {:controller =&amp;gt; &amp;quot;questionnaires&amp;quot;, :action =&amp;gt; &amp;quot;create_supplementary_review_questionnaire&amp;quot;, :id =&amp;gt; participant.id } %&amp;gt;&lt;br /&gt;
    &amp;lt;% else %&amp;gt;&lt;br /&gt;
      The instructor hasn't enabled this feature for this assignment&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Controllers:&lt;br /&gt;
&lt;br /&gt;
app/controllers/response_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Prepare the parameters when student clicks &amp;quot;Edit&amp;quot;&lt;br /&gt;
  def edit&lt;br /&gt;
    assign_instance_vars&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if @prev.present?&lt;br /&gt;
      @sorted = @review_scores.sort {|m1, m2| m1.version_num.to_i &amp;amp;&amp;amp; m2.version_num.to_i ? m2.version_num.to_i &amp;lt;=&amp;gt; m1.version_num.to_i : (m1.version_num ? -1 : 1) }&lt;br /&gt;
      @largest_version_num = @sorted[0]&lt;br /&gt;
    end&lt;br /&gt;
    @modified_object = @response.response_id&lt;br /&gt;
    # set more handy variables for the view&lt;br /&gt;
    set_content&lt;br /&gt;
    @review_scores = []&lt;br /&gt;
    @questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @supplementary_review_questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @questionnaire = set_questionnaire&lt;br /&gt;
    render action: 'response'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # Update the response and answers when student &amp;quot;edit&amp;quot; existing response&lt;br /&gt;
  def update&lt;br /&gt;
    render nothing: true unless action_allowed?&lt;br /&gt;
    # the response to be updated&lt;br /&gt;
    @response = Response.find(params[:id])&lt;br /&gt;
    msg = &amp;quot;&amp;quot;&lt;br /&gt;
    begin&lt;br /&gt;
      @map = @response.map&lt;br /&gt;
      @response.update_attribute('additional_comment', params[:review][:comments])&lt;br /&gt;
&lt;br /&gt;
      set_questionnaire&lt;br /&gt;
      questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
        questions += supplementary_review_questions&lt;br /&gt;
      end&lt;br /&gt;
      create_answers(params, questions) unless params[:responses].nil?&lt;br /&gt;
&lt;br /&gt;
      @response.update_attribute('is_submitted', true) if params['isSubmit'] &amp;amp;&amp;amp; params['isSubmit'] == 'Yes'&lt;br /&gt;
      @response.notify_instructor_on_difference if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; @response.is_submitted &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
    rescue StandardError&lt;br /&gt;
      msg = &amp;quot;Your response was not saved. Cause:189 #{$ERROR_INFO}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    ExpertizaLogger.info LoggerMessage.new(controller_name, session[:user].name, &amp;quot;Your response was submitted: #{@response.is_submitted}&amp;quot;, request)&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 def create&lt;br /&gt;
    map_id = params[:id]&lt;br /&gt;
    map_id = params[:map_id] unless params[:map_id].nil? # pass map_id as a hidden field in the review form&lt;br /&gt;
    @map = ResponseMap.find(map_id)&lt;br /&gt;
    @team_id = @map.reviewee_id&lt;br /&gt;
&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if params[:review][:questionnaire_id]&lt;br /&gt;
      @questionnaire = Questionnaire.find(params[:review][:questionnaire_id])&lt;br /&gt;
      @round = params[:review][:round]&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      @round = nil&lt;br /&gt;
    end&lt;br /&gt;
    is_submitted = (params[:isSubmit] == 'Yes')&lt;br /&gt;
    was_submitted = false&lt;br /&gt;
    @response = Response.where(map_id: @map.id, round: @round.to_i).first&lt;br /&gt;
    if @response.nil?&lt;br /&gt;
      @response = Response.create(&lt;br /&gt;
        map_id: @map.id,&lt;br /&gt;
        additional_comment: params[:review][:comments],&lt;br /&gt;
        round: @round.to_i,&lt;br /&gt;
        is_submitted: is_submitted&lt;br /&gt;
      )&lt;br /&gt;
    end&lt;br /&gt;
    was_submitted = @response.is_submitted&lt;br /&gt;
    @response.update(additional_comment: params[:review][:comments], is_submitted: is_submitted) # ignore if autoupdate try to save when the response object is not yet created.&lt;br /&gt;
&lt;br /&gt;
    # ,:version_num=&amp;gt;@version)&lt;br /&gt;
    # Change the order for displaying questions for editing response views.&lt;br /&gt;
    questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      questions += supplementary_review_questions&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    create_answers(params, questions) if params[:responses]&lt;br /&gt;
    msg = &amp;quot;Your response was successfully saved.&amp;quot;&lt;br /&gt;
    error_msg = &amp;quot;&amp;quot;&lt;br /&gt;
    # only notify if is_submitted changes from false to true&lt;br /&gt;
    if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; (was_submitted == false &amp;amp;&amp;amp; @response.is_submitted) &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
      @response.notify_instructor_on_difference&lt;br /&gt;
      @response.email&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, error_msg: error_msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # new_response if a flag parameter indicating that if user is requesting a new rubric to fill&lt;br /&gt;
  # if true: we figure out which questionnaire to use based on current time and records in assignment_questionnaires table&lt;br /&gt;
  # e.g. student click &amp;quot;Begin&amp;quot; or &amp;quot;Update&amp;quot; to start filling out a rubric for others' work&lt;br /&gt;
  # if false: we figure out which questionnaire to display base on @response object&lt;br /&gt;
  # e.g. student click &amp;quot;Edit&amp;quot; or &amp;quot;View&amp;quot;&lt;br /&gt;
  def set_content(new_response = false)&lt;br /&gt;
    @title = @map.get_title&lt;br /&gt;
    if @map.survey?&lt;br /&gt;
      @survey_parent = @map.survey_parent&lt;br /&gt;
    else&lt;br /&gt;
      @assignment = @map.assignment&lt;br /&gt;
    end&lt;br /&gt;
    @participant = @map.reviewer&lt;br /&gt;
    @contributor = @map.contributor&lt;br /&gt;
    new_response ? set_questionnaire_for_new_response : set_questionnaire&lt;br /&gt;
    set_dropdown_or_scale&lt;br /&gt;
    @questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      @supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @min = @questionnaire.min_question_score&lt;br /&gt;
    @max = @questionnaire.max_question_score&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire_for_new_response&lt;br /&gt;
    case @map.type&lt;br /&gt;
    when &amp;quot;ReviewResponseMap&amp;quot;, &amp;quot;SelfReviewResponseMap&amp;quot;&lt;br /&gt;
      reviewees_topic = SignedUpTeam.topic_id_by_team_id(@contributor.id)&lt;br /&gt;
      @current_round = @assignment.number_of_current_round(reviewees_topic)&lt;br /&gt;
      @questionnaire = @map.questionnaire(@current_round)&lt;br /&gt;
&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@contributor.id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    when&lt;br /&gt;
      &amp;quot;MetareviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;TeammateReviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;FeedbackResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;CourseSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;AssignmentSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;GlobalSurveyResponseMap&amp;quot;&lt;br /&gt;
      @questionnaire = @map.questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire&lt;br /&gt;
    # if user is not filling a new rubric, the @response object should be available.&lt;br /&gt;
    # we can find the questionnaire from the question_id in answers&lt;br /&gt;
    answer = @response.scores.first&lt;br /&gt;
    @questionnaire = @response.questionnaire_by_answer(answer)&lt;br /&gt;
&lt;br /&gt;
    supplementary_review_answer = @response.scores.last&lt;br /&gt;
    @supplementary_review_questionnaire = @response.questionnaire_by_answer(supplementary_review_answer)&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/controllers/grades_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def view_team&lt;br /&gt;
    @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
    @assignment = @participant.assignment&lt;br /&gt;
    @team = @participant.team&lt;br /&gt;
    @team_id = @team.id&lt;br /&gt;
    @questions = {}&lt;br /&gt;
    questionnaires = @assignment.questionnaires&lt;br /&gt;
    retrieve_questions questionnaires&lt;br /&gt;
    @pscore = @participant.scores(@questions)&lt;br /&gt;
    @vmlist = []&lt;br /&gt;
&lt;br /&gt;
    # loop through each questionnaire, and populate the view model for all data necessary&lt;br /&gt;
    # to render the html tables.&lt;br /&gt;
    counter_for_same_rubric = 0&lt;br /&gt;
    questionnaires.each do |questionnaire|&lt;br /&gt;
      @round = nil&lt;br /&gt;
      if @assignment.varying_rubrics_by_round? &amp;amp;&amp;amp; questionnaire.type == &amp;quot;ReviewQuestionnaire&amp;quot;&lt;br /&gt;
        questionnaires = AssignmentQuestionnaire.where(assignment_id: @assignment.id, questionnaire_id: questionnaire.id)&lt;br /&gt;
        if questionnaires.count &amp;gt; 1&lt;br /&gt;
          @round = questionnaires[counter_for_same_rubric].used_in_round&lt;br /&gt;
          counter_for_same_rubric += 1&lt;br /&gt;
        else&lt;br /&gt;
          @round = questionnaires[0].used_in_round&lt;br /&gt;
          counter_for_same_rubric = 0&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vm = VmQuestionResponse.new(questionnaire, @assignment, @round)&lt;br /&gt;
      supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        supplementary_review_questionnaire = Questionnaire.find(supplementary_review_questionnaire_id)&lt;br /&gt;
        unless supplementary_review_questionnaire.nil?&lt;br /&gt;
          supplementary_review_questions = supplementary_review_questionnaire.questions&lt;br /&gt;
          questionnaire.questions += supplementary_review_questions&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vmquestions = questionnaire.questions&lt;br /&gt;
      vm.add_questions(vmquestions)&lt;br /&gt;
      vm.add_team_members(@team)&lt;br /&gt;
      vm.add_reviews(@participant, @team, @assignment.varying_rubrics_by_round?)&lt;br /&gt;
      vm.get_number_of_comments_greater_than_10_words&lt;br /&gt;
      @vmlist &amp;lt;&amp;lt; vm&lt;br /&gt;
    end&lt;br /&gt;
    @current_role_name = current_role_name&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/controllers/questionnaires_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   def create_supplementary_review_questionnaire&lt;br /&gt;
     @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
     @team = Team.find(@participant.team.id)&lt;br /&gt;
     if @team.supplementary_review_questionnaire_id.nil?&lt;br /&gt;
       @questionnaire = Questionnaire.create(privete: false, name: &amp;quot;supplementary_review_questionnaire_&amp;quot; + @team.id.to_s,&lt;br /&gt;
         instructor_id: @team_id, min_question_score: 0, max_question_score: 5, type: &amp;quot;Questionnaire&amp;quot;, display_type: &amp;quot;Review&amp;quot;&lt;br /&gt;
         instruction_loc: Questionnaire::DEFAULT_QUESTIONNAIRE_URL)&lt;br /&gt;
       if @questionnaire.save&lt;br /&gt;
         @team.supplementary_review_questionnaire_id = @questionnaire.id&lt;br /&gt;
         @team.save&lt;br /&gt;
         flash[:success] = 'You have successfully created a rubric!'&lt;br /&gt;
       else&lt;br /&gt;
         flash[:error] = $ERROR_INFO&lt;br /&gt;
       end&lt;br /&gt;
     else&lt;br /&gt;
       @questionnaire = Questionnaire.find(@team.supplementary_review_questionnaire_id)&lt;br /&gt;
     end&lt;br /&gt;
     redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
   end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Config:&lt;br /&gt;
&lt;br /&gt;
routes.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  resources :questionnaires, only: %i[new create edit update] do&lt;br /&gt;
    collection do&lt;br /&gt;
      get :copy&lt;br /&gt;
      get :list&lt;br /&gt;
      post :list_questionnaires&lt;br /&gt;
      get :new_quiz&lt;br /&gt;
      get :select_questionnaire_type&lt;br /&gt;
      post :select_questionnaire_type&lt;br /&gt;
      get :toggle_access&lt;br /&gt;
      get :view&lt;br /&gt;
      post :create_quiz_questionnaire&lt;br /&gt;
      post :update_quiz&lt;br /&gt;
      post :add_new_questions&lt;br /&gt;
      post :save_all_questions&lt;br /&gt;
      post :create_supplementary_review_questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  resources :author_feedback_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :metareview_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :teammate_review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :assignment_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :global_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :course_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :bookmarkrating_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :supplementary_review_questionnaire, controller: :questionnaires&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Team members'''&lt;br /&gt;
----&lt;br /&gt;
Yanchen Zhao&lt;br /&gt;
&lt;br /&gt;
Pingping Chen&lt;br /&gt;
&lt;br /&gt;
Jianshu Zhang&lt;br /&gt;
&lt;br /&gt;
Zirun Han&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Links'''&lt;br /&gt;
----&lt;br /&gt;
Expertiza on Github:https://github.com/zyczyh/expertiza&lt;br /&gt;
&lt;br /&gt;
Pull Request:https://github.com/expertiza/expertiza/pull/1325&lt;br /&gt;
&lt;br /&gt;
Expertiza YouTube channel:https://youtu.be/3PUNknSbU-k&lt;/div&gt;</summary>
		<author><name>Pchen23</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121651</id>
		<title>CSC/ECE 517 Fall 2018/E1879 Student Generated Questions Added To Rubric</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121651"/>
		<updated>2018-12-18T18:42:21Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Introduction'''&lt;br /&gt;
----&lt;br /&gt;
The rubrics in expertiza are created by instructors. These Rubrics only contain questions that are related to the existed topics. Now, Expertiza only supports students to pull questionnaires is specific rubrics to get some help. Even that they can ask about anything that is relevant to all the projects that will be submitted But when students encounter difficult problems which are not in the existed topics, and they want to get special advice on that new field, the demand for creating supplementary review questionnaire raises. This project (E1879) aims to solve this problem by allowing students to add questions to the standard instructor generated rubric so that they can get specific feedback on from the reviewers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Proposed solution'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
We will add the Supplementary Review Questions to the current Review Questions, and show these student-generated questions under the rubric given by instructor. Even though these questions won't be graded, they will eventually provide diversity for feedback. It will increase the benefit that each team gets because they can get feedback that is specific to their project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Implementation'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
''Design Strategy''&lt;br /&gt;
&lt;br /&gt;
In Expertiza, all kinds of rubrics and surveys are subclasses of Questionnaire. A Questionnaire can contain “questions” of several types (e.g., checkboxes, dropdowns, text boxes). So that we will add a new subclass of Questionnaire named SupplementaryReviewQuestionnaire to achieve our goal.&lt;br /&gt;
 &lt;br /&gt;
First, we want the professor to control if the students can create their own supplementary questions by using a checkbox to indicate. If the professor allow students to create their own questions, there will be a button in the students &amp;quot;Your work&amp;quot; page which can let the students jump to the same page that an instructor lands on when creating a new rubric. Then we will add the questionnaire id of this new SupplementaryReviewQuestionnaire to the Team table when students create their own questionnaire in order to show the corresponding supplementary questions to the reviewers. And when showing review questions to the reviewers we will look up the questionnaire id in Team table and modify the view to add the supplementary questions to review page. Finally, after the reviewers finish the review and submit their responds, we will change the view and let the team member can see the feedback of their supplementary questions.&lt;br /&gt;
&lt;br /&gt;
''Changes in the User Interface''&lt;br /&gt;
&lt;br /&gt;
1. Assignment Page&lt;br /&gt;
&lt;br /&gt;
We add a checkbox for the professor to indicate if student can add their own questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_1.png]]&lt;br /&gt;
   &lt;br /&gt;
2. A button called &amp;quot;Create Supplementary Rubric&amp;quot; will appear in the student's &amp;quot;Your Work&amp;quot; section when the Instructor has allowed students to create supplementary review questions. So when a student clicks the button he/she can add the desired questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_2.png]]&lt;br /&gt;
&lt;br /&gt;
3. The page where student will be directed to when he/she clicks the Create Supplementary Rubric button. Students can add Questions to the created Supplementary Review questionnaire here.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_3.png]]&lt;br /&gt;
&lt;br /&gt;
4. Review Page&lt;br /&gt;
&lt;br /&gt;
The students own supplementary questions are leading by a heading &amp;quot;Supplementary Review Questions&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_4.png]]&lt;br /&gt;
&lt;br /&gt;
5. Review Results Page&lt;br /&gt;
&lt;br /&gt;
The supplementary review results will be showed to the team like other results. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_5.png]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''Use Cases'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Use case of creating a Supplementary Review Questionnaire&lt;br /&gt;
&lt;br /&gt;
[[File:case1.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Use case of reviewing questions for reviewers.&lt;br /&gt;
&lt;br /&gt;
[[File:case2.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Use case of reviewing responses of questions.&lt;br /&gt;
&lt;br /&gt;
[[File:case3.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Test Plan'''&lt;br /&gt;
----&lt;br /&gt;
Actually, we need to add tests for the following:&lt;br /&gt;
&lt;br /&gt;
1. To check the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; appears in the &amp;quot;Your Work&amp;quot; section of a student.&lt;br /&gt;
&lt;br /&gt;
2. To check if the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; redirects to page which allows to create questionnaire.&lt;br /&gt;
&lt;br /&gt;
3. To check if the questionnaire ID is stored in the Team table.&lt;br /&gt;
&lt;br /&gt;
4. To check if the reviewers can see the supplementary questions that were added by the team as part of the review questions.&lt;br /&gt;
&lt;br /&gt;
5. To check if the responses of the Supplementary Review Questions have been added to the responses of the existing review questions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''File which are added/modified'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Models&lt;br /&gt;
&lt;br /&gt;
app/models/team.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_supplementary_review_questionnaire_id_of_team(team_id)&lt;br /&gt;
    team = Team.find(team_id)&lt;br /&gt;
    if team.blank?&lt;br /&gt;
      nil&lt;br /&gt;
    else&lt;br /&gt;
      team.supplementary_review_questionnaire_id&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/models/supplementary_review_questionnaire.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # This is one type of Questionnaire and  as intuitively expected this model class&lt;br /&gt;
 # derives from Questionnaire.&lt;br /&gt;
 class SupplementaryReviewQuestionnaire &amp;lt; Questionnaire&lt;br /&gt;
   # Make me better.&lt;br /&gt;
   attr_accessible&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/models/response.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def construct_review_response code, self_id, show_tags = nil, current_user = nil&lt;br /&gt;
    code += '&amp;lt;table id=&amp;quot;review_' + self_id + '&amp;quot; style=&amp;quot;display: none;&amp;quot; class=&amp;quot;table table-bordered&amp;quot;&amp;gt;'&lt;br /&gt;
    answers = Answer.where(response_id: self.response_id)&lt;br /&gt;
    team_id = response_map.reviewee_id&lt;br /&gt;
    supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(team_id)&lt;br /&gt;
    unless answers.empty?&lt;br /&gt;
      questionnaire = self.questionnaire_by_answer(answers.first)&lt;br /&gt;
&lt;br /&gt;
      unless supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        supplementary_review_questionnaire = Questionnaire.find(supplementary_review_questionnaire_id)&lt;br /&gt;
        supplementary_review_questions = supplementary_review_questionnaire.questions.sort_by(&amp;amp;:seq)&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      questionnaire_max = questionnaire.max_question_score&lt;br /&gt;
      questions = questionnaire.questions.sort_by(&amp;amp;:seq)&lt;br /&gt;
&lt;br /&gt;
      unless supplementary_review_questionnaire.nil?&lt;br /&gt;
        questions += supplementary_review_questions&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # get the tag settings this questionnaire&lt;br /&gt;
      tag_prompt_deployments = show_tags ? TagPromptDeployment.where(questionnaire_id: questionnaire.id, assignment_id: self.map.assignment.id) : nil&lt;br /&gt;
      code = add_table_rows questionnaire_max, questions, answers, code, tag_prompt_deployments, current_user&lt;br /&gt;
    end&lt;br /&gt;
    comment = if !self.additional_comment.nil?&lt;br /&gt;
                self.additional_comment.gsub('^p', '').gsub(/\n/, '&amp;lt;BR/&amp;gt;')&lt;br /&gt;
              else&lt;br /&gt;
                ''&lt;br /&gt;
              end&lt;br /&gt;
    code += '&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Additional Comment: &amp;lt;/b&amp;gt;' + comment + '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;'&lt;br /&gt;
    code += '&amp;lt;/table&amp;gt;'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Views:&lt;br /&gt;
&lt;br /&gt;
app/views/response/response.html.erb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      &amp;lt;br&amp;gt;&lt;br /&gt;
       &amp;lt;% unless @supplementary_review_questions.nil? %&amp;gt;&lt;br /&gt;
       &amp;lt;tr&amp;gt;&lt;br /&gt;
         &amp;lt;td&amp;gt;&lt;br /&gt;
           &amp;lt;h2&amp;gt;Supplementary Review Questions&amp;lt;/h2&amp;gt;&lt;br /&gt;
         &amp;lt;/td&amp;gt;&lt;br /&gt;
       &amp;lt;/tr&amp;gt;&lt;br /&gt;
         &amp;lt;% @supplementary_review_questions.each do |question| %&amp;gt;&lt;br /&gt;
         &amp;lt;tr&amp;gt;&lt;br /&gt;
           &amp;lt;td&amp;gt;&lt;br /&gt;
             &amp;lt;% answer = Answer.where(question_id: question.id, response_id: @response.id).first if !@response.nil? %&amp;gt;&lt;br /&gt;
             &amp;lt;% if question.instance_of? Criterion %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer, @questionnaire.min_question_score, @questionnaire.max_question_score, @dropdown_or_scale) %&amp;gt;&lt;br /&gt;
               &amp;lt;%= tinymce %&amp;gt;&lt;br /&gt;
             &amp;lt;% elsif question.instance_of? Scale %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer, @questionnaire.min_question_score, @questionnaire.max_question_score) %&amp;gt;&lt;br /&gt;
               &amp;lt;%= tinymce %&amp;gt;&lt;br /&gt;
             &amp;lt;% elsif question.instance_of? UploadFile %&amp;gt;&lt;br /&gt;
             &amp;lt;% else %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer) %&amp;gt;&lt;br /&gt;
             &amp;lt;% end %&amp;gt;&lt;br /&gt;
           &amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;td width=&amp;quot;25%&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;% if [Criterion, TextArea].include? question.class %&amp;gt;&lt;br /&gt;
                 &amp;lt;div id=&amp;quot;analysis_&amp;lt;%= i.to_s %&amp;gt;_comments&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
             &amp;lt;% end %&amp;gt;&lt;br /&gt;
           &amp;lt;/td&amp;gt;&lt;br /&gt;
         &amp;lt;/tr&amp;gt;&lt;br /&gt;
         &amp;lt;% i += 1 %&amp;gt;&lt;br /&gt;
         &amp;lt;% end %&amp;gt;&lt;br /&gt;
       &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/views/submitted_content/_main.html.erb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if stage != &amp;quot;Finished&amp;quot; and controller.controller_name == 'submitted_content' and @can_submit %&amp;gt;&lt;br /&gt;
  &amp;lt;h2&amp;gt;Add Supplementary Review Questions:&amp;lt;/h2&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.supplementary_review_questionnaire? %&amp;gt;&lt;br /&gt;
      &amp;lt;%= button_to &amp;quot;Create Supplementary Rubric&amp;quot;, {:controller =&amp;gt; &amp;quot;questionnaires&amp;quot;, :action =&amp;gt; &amp;quot;create_supplementary_review_questionnaire&amp;quot;, :id =&amp;gt; participant.id } %&amp;gt;&lt;br /&gt;
    &amp;lt;% else %&amp;gt;&lt;br /&gt;
      The instructor hasn't enabled this feature for this assignment&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Controllers:&lt;br /&gt;
&lt;br /&gt;
app/controllers/response_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Prepare the parameters when student clicks &amp;quot;Edit&amp;quot;&lt;br /&gt;
  def edit&lt;br /&gt;
    assign_instance_vars&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if @prev.present?&lt;br /&gt;
      @sorted = @review_scores.sort {|m1, m2| m1.version_num.to_i &amp;amp;&amp;amp; m2.version_num.to_i ? m2.version_num.to_i &amp;lt;=&amp;gt; m1.version_num.to_i : (m1.version_num ? -1 : 1) }&lt;br /&gt;
      @largest_version_num = @sorted[0]&lt;br /&gt;
    end&lt;br /&gt;
    @modified_object = @response.response_id&lt;br /&gt;
    # set more handy variables for the view&lt;br /&gt;
    set_content&lt;br /&gt;
    @review_scores = []&lt;br /&gt;
    @questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @supplementary_review_questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @questionnaire = set_questionnaire&lt;br /&gt;
    render action: 'response'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # Update the response and answers when student &amp;quot;edit&amp;quot; existing response&lt;br /&gt;
  def update&lt;br /&gt;
    render nothing: true unless action_allowed?&lt;br /&gt;
    # the response to be updated&lt;br /&gt;
    @response = Response.find(params[:id])&lt;br /&gt;
    msg = &amp;quot;&amp;quot;&lt;br /&gt;
    begin&lt;br /&gt;
      @map = @response.map&lt;br /&gt;
      @response.update_attribute('additional_comment', params[:review][:comments])&lt;br /&gt;
&lt;br /&gt;
      set_questionnaire&lt;br /&gt;
      questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
        questions += supplementary_review_questions&lt;br /&gt;
      end&lt;br /&gt;
      create_answers(params, questions) unless params[:responses].nil?&lt;br /&gt;
&lt;br /&gt;
      @response.update_attribute('is_submitted', true) if params['isSubmit'] &amp;amp;&amp;amp; params['isSubmit'] == 'Yes'&lt;br /&gt;
      @response.notify_instructor_on_difference if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; @response.is_submitted &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
    rescue StandardError&lt;br /&gt;
      msg = &amp;quot;Your response was not saved. Cause:189 #{$ERROR_INFO}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    ExpertizaLogger.info LoggerMessage.new(controller_name, session[:user].name, &amp;quot;Your response was submitted: #{@response.is_submitted}&amp;quot;, request)&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 def create&lt;br /&gt;
    map_id = params[:id]&lt;br /&gt;
    map_id = params[:map_id] unless params[:map_id].nil? # pass map_id as a hidden field in the review form&lt;br /&gt;
    @map = ResponseMap.find(map_id)&lt;br /&gt;
    @team_id = @map.reviewee_id&lt;br /&gt;
&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if params[:review][:questionnaire_id]&lt;br /&gt;
      @questionnaire = Questionnaire.find(params[:review][:questionnaire_id])&lt;br /&gt;
      @round = params[:review][:round]&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      @round = nil&lt;br /&gt;
    end&lt;br /&gt;
    is_submitted = (params[:isSubmit] == 'Yes')&lt;br /&gt;
    was_submitted = false&lt;br /&gt;
    @response = Response.where(map_id: @map.id, round: @round.to_i).first&lt;br /&gt;
    if @response.nil?&lt;br /&gt;
      @response = Response.create(&lt;br /&gt;
        map_id: @map.id,&lt;br /&gt;
        additional_comment: params[:review][:comments],&lt;br /&gt;
        round: @round.to_i,&lt;br /&gt;
        is_submitted: is_submitted&lt;br /&gt;
      )&lt;br /&gt;
    end&lt;br /&gt;
    was_submitted = @response.is_submitted&lt;br /&gt;
    @response.update(additional_comment: params[:review][:comments], is_submitted: is_submitted) # ignore if autoupdate try to save when the response object is not yet created.&lt;br /&gt;
&lt;br /&gt;
    # ,:version_num=&amp;gt;@version)&lt;br /&gt;
    # Change the order for displaying questions for editing response views.&lt;br /&gt;
    questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      questions += supplementary_review_questions&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    create_answers(params, questions) if params[:responses]&lt;br /&gt;
    msg = &amp;quot;Your response was successfully saved.&amp;quot;&lt;br /&gt;
    error_msg = &amp;quot;&amp;quot;&lt;br /&gt;
    # only notify if is_submitted changes from false to true&lt;br /&gt;
    if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; (was_submitted == false &amp;amp;&amp;amp; @response.is_submitted) &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
      @response.notify_instructor_on_difference&lt;br /&gt;
      @response.email&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, error_msg: error_msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # new_response if a flag parameter indicating that if user is requesting a new rubric to fill&lt;br /&gt;
  # if true: we figure out which questionnaire to use based on current time and records in assignment_questionnaires table&lt;br /&gt;
  # e.g. student click &amp;quot;Begin&amp;quot; or &amp;quot;Update&amp;quot; to start filling out a rubric for others' work&lt;br /&gt;
  # if false: we figure out which questionnaire to display base on @response object&lt;br /&gt;
  # e.g. student click &amp;quot;Edit&amp;quot; or &amp;quot;View&amp;quot;&lt;br /&gt;
  def set_content(new_response = false)&lt;br /&gt;
    @title = @map.get_title&lt;br /&gt;
    if @map.survey?&lt;br /&gt;
      @survey_parent = @map.survey_parent&lt;br /&gt;
    else&lt;br /&gt;
      @assignment = @map.assignment&lt;br /&gt;
    end&lt;br /&gt;
    @participant = @map.reviewer&lt;br /&gt;
    @contributor = @map.contributor&lt;br /&gt;
    new_response ? set_questionnaire_for_new_response : set_questionnaire&lt;br /&gt;
    set_dropdown_or_scale&lt;br /&gt;
    @questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      @supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @min = @questionnaire.min_question_score&lt;br /&gt;
    @max = @questionnaire.max_question_score&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire_for_new_response&lt;br /&gt;
    case @map.type&lt;br /&gt;
    when &amp;quot;ReviewResponseMap&amp;quot;, &amp;quot;SelfReviewResponseMap&amp;quot;&lt;br /&gt;
      reviewees_topic = SignedUpTeam.topic_id_by_team_id(@contributor.id)&lt;br /&gt;
      @current_round = @assignment.number_of_current_round(reviewees_topic)&lt;br /&gt;
      @questionnaire = @map.questionnaire(@current_round)&lt;br /&gt;
&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@contributor.id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    when&lt;br /&gt;
      &amp;quot;MetareviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;TeammateReviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;FeedbackResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;CourseSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;AssignmentSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;GlobalSurveyResponseMap&amp;quot;&lt;br /&gt;
      @questionnaire = @map.questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire&lt;br /&gt;
    # if user is not filling a new rubric, the @response object should be available.&lt;br /&gt;
    # we can find the questionnaire from the question_id in answers&lt;br /&gt;
    answer = @response.scores.first&lt;br /&gt;
    @questionnaire = @response.questionnaire_by_answer(answer)&lt;br /&gt;
&lt;br /&gt;
    supplementary_review_answer = @response.scores.last&lt;br /&gt;
    @supplementary_review_questionnaire = @response.questionnaire_by_answer(supplementary_review_answer)&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/controllers/grades_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def view_team&lt;br /&gt;
    @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
    @assignment = @participant.assignment&lt;br /&gt;
    @team = @participant.team&lt;br /&gt;
    @team_id = @team.id&lt;br /&gt;
    @questions = {}&lt;br /&gt;
    questionnaires = @assignment.questionnaires&lt;br /&gt;
    retrieve_questions questionnaires&lt;br /&gt;
    @pscore = @participant.scores(@questions)&lt;br /&gt;
    @vmlist = []&lt;br /&gt;
&lt;br /&gt;
    # loop through each questionnaire, and populate the view model for all data necessary&lt;br /&gt;
    # to render the html tables.&lt;br /&gt;
    counter_for_same_rubric = 0&lt;br /&gt;
    questionnaires.each do |questionnaire|&lt;br /&gt;
      @round = nil&lt;br /&gt;
      if @assignment.varying_rubrics_by_round? &amp;amp;&amp;amp; questionnaire.type == &amp;quot;ReviewQuestionnaire&amp;quot;&lt;br /&gt;
        questionnaires = AssignmentQuestionnaire.where(assignment_id: @assignment.id, questionnaire_id: questionnaire.id)&lt;br /&gt;
        if questionnaires.count &amp;gt; 1&lt;br /&gt;
          @round = questionnaires[counter_for_same_rubric].used_in_round&lt;br /&gt;
          counter_for_same_rubric += 1&lt;br /&gt;
        else&lt;br /&gt;
          @round = questionnaires[0].used_in_round&lt;br /&gt;
          counter_for_same_rubric = 0&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vm = VmQuestionResponse.new(questionnaire, @assignment, @round)&lt;br /&gt;
      supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        supplementary_review_questionnaire = Questionnaire.find(supplementary_review_questionnaire_id)&lt;br /&gt;
        unless supplementary_review_questionnaire.nil?&lt;br /&gt;
          supplementary_review_questions = supplementary_review_questionnaire.questions&lt;br /&gt;
          questionnaire.questions += supplementary_review_questions&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vmquestions = questionnaire.questions&lt;br /&gt;
      vm.add_questions(vmquestions)&lt;br /&gt;
      vm.add_team_members(@team)&lt;br /&gt;
      vm.add_reviews(@participant, @team, @assignment.varying_rubrics_by_round?)&lt;br /&gt;
      vm.get_number_of_comments_greater_than_10_words&lt;br /&gt;
      @vmlist &amp;lt;&amp;lt; vm&lt;br /&gt;
    end&lt;br /&gt;
    @current_role_name = current_role_name&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/controllers/questionnaires_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   def create_supplementary_review_questionnaire&lt;br /&gt;
     @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
     @team = Team.find(@participant.team.id)&lt;br /&gt;
     if @team.supplementary_review_questionnaire_id.nil?&lt;br /&gt;
       @questionnaire = Questionnaire.create(privete: false, name: &amp;quot;supplementary_review_questionnaire_&amp;quot; + @team.id.to_s,&lt;br /&gt;
         instructor_id: @team_id, min_question_score: 0, max_question_score: 5, type: &amp;quot;Questionnaire&amp;quot;, display_type: &amp;quot;Review&amp;quot;&lt;br /&gt;
         instruction_loc: Questionnaire::DEFAULT_QUESTIONNAIRE_URL)&lt;br /&gt;
       if @questionnaire.save&lt;br /&gt;
         @team.supplementary_review_questionnaire_id = @questionnaire.id&lt;br /&gt;
         @team.save&lt;br /&gt;
         flash[:success] = 'You have successfully created a rubric!'&lt;br /&gt;
       else&lt;br /&gt;
         flash[:error] = $ERROR_INFO&lt;br /&gt;
       end&lt;br /&gt;
     else&lt;br /&gt;
       @questionnaire = Questionnaire.find(@team.supplementary_review_questionnaire_id)&lt;br /&gt;
     end&lt;br /&gt;
     redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
   end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Config:&lt;br /&gt;
&lt;br /&gt;
routes.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  resources :questionnaires, only: %i[new create edit update] do&lt;br /&gt;
    collection do&lt;br /&gt;
      get :copy&lt;br /&gt;
      get :list&lt;br /&gt;
      post :list_questionnaires&lt;br /&gt;
      get :new_quiz&lt;br /&gt;
      get :select_questionnaire_type&lt;br /&gt;
      post :select_questionnaire_type&lt;br /&gt;
      get :toggle_access&lt;br /&gt;
      get :view&lt;br /&gt;
      post :create_quiz_questionnaire&lt;br /&gt;
      post :update_quiz&lt;br /&gt;
      post :add_new_questions&lt;br /&gt;
      post :save_all_questions&lt;br /&gt;
      post :create_supplementary_review_questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  resources :author_feedback_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :metareview_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :teammate_review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :assignment_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :global_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :course_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :bookmarkrating_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :supplementary_review_questionnaire, controller: :questionnaires&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Team members'''&lt;br /&gt;
----&lt;br /&gt;
Yanchen Zhao&lt;br /&gt;
&lt;br /&gt;
Pingping Chen&lt;br /&gt;
&lt;br /&gt;
Jianshu Zhang&lt;br /&gt;
&lt;br /&gt;
Zirun Han&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Links'''&lt;br /&gt;
----&lt;br /&gt;
Expertiza on Github:https://github.com/zyczyh/expertiza&lt;br /&gt;
&lt;br /&gt;
Pull Request:https://github.com/expertiza/expertiza/pull/1325&lt;br /&gt;
&lt;br /&gt;
Expertiza YouTube channel:https://youtu.be/3PUNknSbU-k&lt;/div&gt;</summary>
		<author><name>Pchen23</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121650</id>
		<title>CSC/ECE 517 Fall 2018/E1879 Student Generated Questions Added To Rubric</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121650"/>
		<updated>2018-12-18T18:39:37Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Introduction'''&lt;br /&gt;
----&lt;br /&gt;
The rubrics in expertiza are created by instructors. These Rubrics only contain questions that are related to the existed topics. Now, Expertiza only supports students to pull questionnaires is specific rubrics to get some help. Even that they can ask about anything that is relevant to all the projects that will be submitted But when students encounter difficult problems which are not in the existed topics, and they want to get special advice on that new field, the demand for creating supplementary review questionnaire raises. This project (E1879) aims to solve this problem by allowing students to add questions to the standard instructor generated rubric so that they can get specific feedback on from the reviewers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Proposed solution'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
We will add the Supplementary Review Questions to the current Review Questions, and show these student-generated questions under the rubric given by instructor. Even though these questions won't be graded, they will eventually provide diversity for feedback. It will increase the benefit that each team gets because they can get feedback that is specific to their project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Implementation'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
''Design Strategy''&lt;br /&gt;
&lt;br /&gt;
In Expertiza, all kinds of rubrics and surveys are subclasses of Questionnaire. A Questionnaire can contain “questions” of several types (e.g., checkboxes, dropdowns, text boxes). So that we will add a new subclass of Questionnaire named SupplementaryReviewQuestionnaire to achieve our goal.&lt;br /&gt;
 &lt;br /&gt;
First, we want the professor to control if the students can create their own supplementary questions by using a checkbox to indicate. If the professor allow students to create their own questions, there will be a button in the students &amp;quot;Your work&amp;quot; page which can let the students jump to the same page that an instructor lands on when creating a new rubric. Then we will add the questionnaire id of this new SupplementaryReviewQuestionnaire to the Team table when students create their own questionnaire in order to show the corresponding supplementary questions to the reviewers. And when showing review questions to the reviewers we will look up the questionnaire id in Team table and modify the view to add the supplementary questions to review page. Finally, after the reviewers finish the review and submit their responds, we will change the view and let the team member can see the feedback of their supplementary questions.&lt;br /&gt;
&lt;br /&gt;
''Changes in the User Interface''&lt;br /&gt;
&lt;br /&gt;
1. Assignment Page&lt;br /&gt;
&lt;br /&gt;
We add a checkbox for the professor to indicate if student can add their own questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_1.png]]&lt;br /&gt;
   &lt;br /&gt;
2. A button called &amp;quot;Create Supplementary Rubric&amp;quot; will appear in the student's &amp;quot;Your Work&amp;quot; section when the Instructor has allowed students to create supplementary review questions. So when a student clicks the button he/she can add the desired questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_2.png]]&lt;br /&gt;
&lt;br /&gt;
3. The page where student will be directed to when he/she clicks the Create Supplementary Rubric button. Students can add Questions to the created Supplementary Review questionnaire here.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_3.png]]&lt;br /&gt;
&lt;br /&gt;
4. Review Page&lt;br /&gt;
&lt;br /&gt;
The students own supplementary questions are leading by a heading &amp;quot;Supplementary Review Questions&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_4.png]]&lt;br /&gt;
&lt;br /&gt;
5. Review Results Page&lt;br /&gt;
&lt;br /&gt;
The supplementary review results will be showed to the team like other results. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_5.png]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''Use Cases'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Use case of creating a Supplementary Review Questionnaire&lt;br /&gt;
&lt;br /&gt;
[[File:case1.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Use case of reviewing questions for reviewers.&lt;br /&gt;
&lt;br /&gt;
[[File:case2.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Use case of reviewing responses of questions.&lt;br /&gt;
&lt;br /&gt;
[[File:case3.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Test Plan'''&lt;br /&gt;
----&lt;br /&gt;
Actually, we need to add tests for the following:&lt;br /&gt;
&lt;br /&gt;
1. To check the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; appears in the &amp;quot;Your Work&amp;quot; section of a student.&lt;br /&gt;
&lt;br /&gt;
2. To check if the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; redirects to page which allows to create questionnaire.&lt;br /&gt;
&lt;br /&gt;
3. To check if the questionnaire ID is stored in the Team table.&lt;br /&gt;
&lt;br /&gt;
4. To check if the reviewers can see the supplementary questions that were added by the team as part of the review questions.&lt;br /&gt;
&lt;br /&gt;
5. To check if the responses of the Supplementary Review Questions have been added to the responses of the existing review questions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''File which are added/modified'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Models&lt;br /&gt;
&lt;br /&gt;
app/models/team.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_supplementary_review_questionnaire_id_of_team(team_id)&lt;br /&gt;
    team = Team.find(team_id)&lt;br /&gt;
    if team.blank?&lt;br /&gt;
      nil&lt;br /&gt;
    else&lt;br /&gt;
      team.supplementary_review_questionnaire_id&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/models/response.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def construct_review_response code, self_id, show_tags = nil, current_user = nil&lt;br /&gt;
    code += '&amp;lt;table id=&amp;quot;review_' + self_id + '&amp;quot; style=&amp;quot;display: none;&amp;quot; class=&amp;quot;table table-bordered&amp;quot;&amp;gt;'&lt;br /&gt;
    answers = Answer.where(response_id: self.response_id)&lt;br /&gt;
    team_id = response_map.reviewee_id&lt;br /&gt;
    supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(team_id)&lt;br /&gt;
    unless answers.empty?&lt;br /&gt;
      questionnaire = self.questionnaire_by_answer(answers.first)&lt;br /&gt;
&lt;br /&gt;
      unless supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        supplementary_review_questionnaire = Questionnaire.find(supplementary_review_questionnaire_id)&lt;br /&gt;
        supplementary_review_questions = supplementary_review_questionnaire.questions.sort_by(&amp;amp;:seq)&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      questionnaire_max = questionnaire.max_question_score&lt;br /&gt;
      questions = questionnaire.questions.sort_by(&amp;amp;:seq)&lt;br /&gt;
&lt;br /&gt;
      unless supplementary_review_questionnaire.nil?&lt;br /&gt;
        questions += supplementary_review_questions&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # get the tag settings this questionnaire&lt;br /&gt;
      tag_prompt_deployments = show_tags ? TagPromptDeployment.where(questionnaire_id: questionnaire.id, assignment_id: self.map.assignment.id) : nil&lt;br /&gt;
      code = add_table_rows questionnaire_max, questions, answers, code, tag_prompt_deployments, current_user&lt;br /&gt;
    end&lt;br /&gt;
    comment = if !self.additional_comment.nil?&lt;br /&gt;
                self.additional_comment.gsub('^p', '').gsub(/\n/, '&amp;lt;BR/&amp;gt;')&lt;br /&gt;
              else&lt;br /&gt;
                ''&lt;br /&gt;
              end&lt;br /&gt;
    code += '&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Additional Comment: &amp;lt;/b&amp;gt;' + comment + '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;'&lt;br /&gt;
    code += '&amp;lt;/table&amp;gt;'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Views:&lt;br /&gt;
&lt;br /&gt;
app/views/response/response.html.erb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      &amp;lt;br&amp;gt;&lt;br /&gt;
       &amp;lt;% unless @supplementary_review_questions.nil? %&amp;gt;&lt;br /&gt;
       &amp;lt;tr&amp;gt;&lt;br /&gt;
         &amp;lt;td&amp;gt;&lt;br /&gt;
           &amp;lt;h2&amp;gt;Supplementary Review Questions&amp;lt;/h2&amp;gt;&lt;br /&gt;
         &amp;lt;/td&amp;gt;&lt;br /&gt;
       &amp;lt;/tr&amp;gt;&lt;br /&gt;
         &amp;lt;% @supplementary_review_questions.each do |question| %&amp;gt;&lt;br /&gt;
         &amp;lt;tr&amp;gt;&lt;br /&gt;
           &amp;lt;td&amp;gt;&lt;br /&gt;
             &amp;lt;% answer = Answer.where(question_id: question.id, response_id: @response.id).first if !@response.nil? %&amp;gt;&lt;br /&gt;
             &amp;lt;% if question.instance_of? Criterion %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer, @questionnaire.min_question_score, @questionnaire.max_question_score, @dropdown_or_scale) %&amp;gt;&lt;br /&gt;
               &amp;lt;%= tinymce %&amp;gt;&lt;br /&gt;
             &amp;lt;% elsif question.instance_of? Scale %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer, @questionnaire.min_question_score, @questionnaire.max_question_score) %&amp;gt;&lt;br /&gt;
               &amp;lt;%= tinymce %&amp;gt;&lt;br /&gt;
             &amp;lt;% elsif question.instance_of? UploadFile %&amp;gt;&lt;br /&gt;
             &amp;lt;% else %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer) %&amp;gt;&lt;br /&gt;
             &amp;lt;% end %&amp;gt;&lt;br /&gt;
           &amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;td width=&amp;quot;25%&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;% if [Criterion, TextArea].include? question.class %&amp;gt;&lt;br /&gt;
                 &amp;lt;div id=&amp;quot;analysis_&amp;lt;%= i.to_s %&amp;gt;_comments&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
             &amp;lt;% end %&amp;gt;&lt;br /&gt;
           &amp;lt;/td&amp;gt;&lt;br /&gt;
         &amp;lt;/tr&amp;gt;&lt;br /&gt;
         &amp;lt;% i += 1 %&amp;gt;&lt;br /&gt;
         &amp;lt;% end %&amp;gt;&lt;br /&gt;
       &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/views/submitted_content/_main.html.erb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if stage != &amp;quot;Finished&amp;quot; and controller.controller_name == 'submitted_content' and @can_submit %&amp;gt;&lt;br /&gt;
  &amp;lt;h2&amp;gt;Add Supplementary Review Questions:&amp;lt;/h2&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.supplementary_review_questionnaire? %&amp;gt;&lt;br /&gt;
      &amp;lt;%= button_to &amp;quot;Create Supplementary Rubric&amp;quot;, {:controller =&amp;gt; &amp;quot;questionnaires&amp;quot;, :action =&amp;gt; &amp;quot;create_supplementary_review_questionnaire&amp;quot;, :id =&amp;gt; participant.id } %&amp;gt;&lt;br /&gt;
    &amp;lt;% else %&amp;gt;&lt;br /&gt;
      The instructor hasn't enabled this feature for this assignment&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Controllers:&lt;br /&gt;
&lt;br /&gt;
app/controllers/response_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Prepare the parameters when student clicks &amp;quot;Edit&amp;quot;&lt;br /&gt;
  def edit&lt;br /&gt;
    assign_instance_vars&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if @prev.present?&lt;br /&gt;
      @sorted = @review_scores.sort {|m1, m2| m1.version_num.to_i &amp;amp;&amp;amp; m2.version_num.to_i ? m2.version_num.to_i &amp;lt;=&amp;gt; m1.version_num.to_i : (m1.version_num ? -1 : 1) }&lt;br /&gt;
      @largest_version_num = @sorted[0]&lt;br /&gt;
    end&lt;br /&gt;
    @modified_object = @response.response_id&lt;br /&gt;
    # set more handy variables for the view&lt;br /&gt;
    set_content&lt;br /&gt;
    @review_scores = []&lt;br /&gt;
    @questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @supplementary_review_questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @questionnaire = set_questionnaire&lt;br /&gt;
    render action: 'response'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # Update the response and answers when student &amp;quot;edit&amp;quot; existing response&lt;br /&gt;
  def update&lt;br /&gt;
    render nothing: true unless action_allowed?&lt;br /&gt;
    # the response to be updated&lt;br /&gt;
    @response = Response.find(params[:id])&lt;br /&gt;
    msg = &amp;quot;&amp;quot;&lt;br /&gt;
    begin&lt;br /&gt;
      @map = @response.map&lt;br /&gt;
      @response.update_attribute('additional_comment', params[:review][:comments])&lt;br /&gt;
&lt;br /&gt;
      set_questionnaire&lt;br /&gt;
      questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
        questions += supplementary_review_questions&lt;br /&gt;
      end&lt;br /&gt;
      create_answers(params, questions) unless params[:responses].nil?&lt;br /&gt;
&lt;br /&gt;
      @response.update_attribute('is_submitted', true) if params['isSubmit'] &amp;amp;&amp;amp; params['isSubmit'] == 'Yes'&lt;br /&gt;
      @response.notify_instructor_on_difference if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; @response.is_submitted &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
    rescue StandardError&lt;br /&gt;
      msg = &amp;quot;Your response was not saved. Cause:189 #{$ERROR_INFO}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    ExpertizaLogger.info LoggerMessage.new(controller_name, session[:user].name, &amp;quot;Your response was submitted: #{@response.is_submitted}&amp;quot;, request)&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 def create&lt;br /&gt;
    map_id = params[:id]&lt;br /&gt;
    map_id = params[:map_id] unless params[:map_id].nil? # pass map_id as a hidden field in the review form&lt;br /&gt;
    @map = ResponseMap.find(map_id)&lt;br /&gt;
    @team_id = @map.reviewee_id&lt;br /&gt;
&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if params[:review][:questionnaire_id]&lt;br /&gt;
      @questionnaire = Questionnaire.find(params[:review][:questionnaire_id])&lt;br /&gt;
      @round = params[:review][:round]&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      @round = nil&lt;br /&gt;
    end&lt;br /&gt;
    is_submitted = (params[:isSubmit] == 'Yes')&lt;br /&gt;
    was_submitted = false&lt;br /&gt;
    @response = Response.where(map_id: @map.id, round: @round.to_i).first&lt;br /&gt;
    if @response.nil?&lt;br /&gt;
      @response = Response.create(&lt;br /&gt;
        map_id: @map.id,&lt;br /&gt;
        additional_comment: params[:review][:comments],&lt;br /&gt;
        round: @round.to_i,&lt;br /&gt;
        is_submitted: is_submitted&lt;br /&gt;
      )&lt;br /&gt;
    end&lt;br /&gt;
    was_submitted = @response.is_submitted&lt;br /&gt;
    @response.update(additional_comment: params[:review][:comments], is_submitted: is_submitted) # ignore if autoupdate try to save when the response object is not yet created.&lt;br /&gt;
&lt;br /&gt;
    # ,:version_num=&amp;gt;@version)&lt;br /&gt;
    # Change the order for displaying questions for editing response views.&lt;br /&gt;
    questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      questions += supplementary_review_questions&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    create_answers(params, questions) if params[:responses]&lt;br /&gt;
    msg = &amp;quot;Your response was successfully saved.&amp;quot;&lt;br /&gt;
    error_msg = &amp;quot;&amp;quot;&lt;br /&gt;
    # only notify if is_submitted changes from false to true&lt;br /&gt;
    if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; (was_submitted == false &amp;amp;&amp;amp; @response.is_submitted) &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
      @response.notify_instructor_on_difference&lt;br /&gt;
      @response.email&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, error_msg: error_msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # new_response if a flag parameter indicating that if user is requesting a new rubric to fill&lt;br /&gt;
  # if true: we figure out which questionnaire to use based on current time and records in assignment_questionnaires table&lt;br /&gt;
  # e.g. student click &amp;quot;Begin&amp;quot; or &amp;quot;Update&amp;quot; to start filling out a rubric for others' work&lt;br /&gt;
  # if false: we figure out which questionnaire to display base on @response object&lt;br /&gt;
  # e.g. student click &amp;quot;Edit&amp;quot; or &amp;quot;View&amp;quot;&lt;br /&gt;
  def set_content(new_response = false)&lt;br /&gt;
    @title = @map.get_title&lt;br /&gt;
    if @map.survey?&lt;br /&gt;
      @survey_parent = @map.survey_parent&lt;br /&gt;
    else&lt;br /&gt;
      @assignment = @map.assignment&lt;br /&gt;
    end&lt;br /&gt;
    @participant = @map.reviewer&lt;br /&gt;
    @contributor = @map.contributor&lt;br /&gt;
    new_response ? set_questionnaire_for_new_response : set_questionnaire&lt;br /&gt;
    set_dropdown_or_scale&lt;br /&gt;
    @questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      @supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @min = @questionnaire.min_question_score&lt;br /&gt;
    @max = @questionnaire.max_question_score&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire_for_new_response&lt;br /&gt;
    case @map.type&lt;br /&gt;
    when &amp;quot;ReviewResponseMap&amp;quot;, &amp;quot;SelfReviewResponseMap&amp;quot;&lt;br /&gt;
      reviewees_topic = SignedUpTeam.topic_id_by_team_id(@contributor.id)&lt;br /&gt;
      @current_round = @assignment.number_of_current_round(reviewees_topic)&lt;br /&gt;
      @questionnaire = @map.questionnaire(@current_round)&lt;br /&gt;
&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@contributor.id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    when&lt;br /&gt;
      &amp;quot;MetareviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;TeammateReviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;FeedbackResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;CourseSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;AssignmentSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;GlobalSurveyResponseMap&amp;quot;&lt;br /&gt;
      @questionnaire = @map.questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire&lt;br /&gt;
    # if user is not filling a new rubric, the @response object should be available.&lt;br /&gt;
    # we can find the questionnaire from the question_id in answers&lt;br /&gt;
    answer = @response.scores.first&lt;br /&gt;
    @questionnaire = @response.questionnaire_by_answer(answer)&lt;br /&gt;
&lt;br /&gt;
    supplementary_review_answer = @response.scores.last&lt;br /&gt;
    @supplementary_review_questionnaire = @response.questionnaire_by_answer(supplementary_review_answer)&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/controllers/grades_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def view_team&lt;br /&gt;
    @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
    @assignment = @participant.assignment&lt;br /&gt;
    @team = @participant.team&lt;br /&gt;
    @team_id = @team.id&lt;br /&gt;
    @questions = {}&lt;br /&gt;
    questionnaires = @assignment.questionnaires&lt;br /&gt;
    retrieve_questions questionnaires&lt;br /&gt;
    @pscore = @participant.scores(@questions)&lt;br /&gt;
    @vmlist = []&lt;br /&gt;
&lt;br /&gt;
    # loop through each questionnaire, and populate the view model for all data necessary&lt;br /&gt;
    # to render the html tables.&lt;br /&gt;
    counter_for_same_rubric = 0&lt;br /&gt;
    questionnaires.each do |questionnaire|&lt;br /&gt;
      @round = nil&lt;br /&gt;
      if @assignment.varying_rubrics_by_round? &amp;amp;&amp;amp; questionnaire.type == &amp;quot;ReviewQuestionnaire&amp;quot;&lt;br /&gt;
        questionnaires = AssignmentQuestionnaire.where(assignment_id: @assignment.id, questionnaire_id: questionnaire.id)&lt;br /&gt;
        if questionnaires.count &amp;gt; 1&lt;br /&gt;
          @round = questionnaires[counter_for_same_rubric].used_in_round&lt;br /&gt;
          counter_for_same_rubric += 1&lt;br /&gt;
        else&lt;br /&gt;
          @round = questionnaires[0].used_in_round&lt;br /&gt;
          counter_for_same_rubric = 0&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vm = VmQuestionResponse.new(questionnaire, @assignment, @round)&lt;br /&gt;
      supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        supplementary_review_questionnaire = Questionnaire.find(supplementary_review_questionnaire_id)&lt;br /&gt;
        unless supplementary_review_questionnaire.nil?&lt;br /&gt;
          supplementary_review_questions = supplementary_review_questionnaire.questions&lt;br /&gt;
          questionnaire.questions += supplementary_review_questions&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vmquestions = questionnaire.questions&lt;br /&gt;
      vm.add_questions(vmquestions)&lt;br /&gt;
      vm.add_team_members(@team)&lt;br /&gt;
      vm.add_reviews(@participant, @team, @assignment.varying_rubrics_by_round?)&lt;br /&gt;
      vm.get_number_of_comments_greater_than_10_words&lt;br /&gt;
      @vmlist &amp;lt;&amp;lt; vm&lt;br /&gt;
    end&lt;br /&gt;
    @current_role_name = current_role_name&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/controllers/questionnaires_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   def create_supplementary_review_questionnaire&lt;br /&gt;
     @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
     @team = Team.find(@participant.team.id)&lt;br /&gt;
     if @team.supplementary_review_questionnaire_id.nil?&lt;br /&gt;
       @questionnaire = Questionnaire.create(privete: false, name: &amp;quot;supplementary_review_questionnaire_&amp;quot; + @team.id.to_s,&lt;br /&gt;
         instructor_id: @team_id, min_question_score: 0, max_question_score: 5, type: &amp;quot;Questionnaire&amp;quot;, display_type: &amp;quot;Review&amp;quot;&lt;br /&gt;
         instruction_loc: Questionnaire::DEFAULT_QUESTIONNAIRE_URL)&lt;br /&gt;
       if @questionnaire.save&lt;br /&gt;
         @team.supplementary_review_questionnaire_id = @questionnaire.id&lt;br /&gt;
         @team.save&lt;br /&gt;
         flash[:success] = 'You have successfully created a rubric!'&lt;br /&gt;
       else&lt;br /&gt;
         flash[:error] = $ERROR_INFO&lt;br /&gt;
       end&lt;br /&gt;
     else&lt;br /&gt;
       @questionnaire = Questionnaire.find(@team.supplementary_review_questionnaire_id)&lt;br /&gt;
     end&lt;br /&gt;
     redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
   end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Config:&lt;br /&gt;
&lt;br /&gt;
routes.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  resources :questionnaires, only: %i[new create edit update] do&lt;br /&gt;
    collection do&lt;br /&gt;
      get :copy&lt;br /&gt;
      get :list&lt;br /&gt;
      post :list_questionnaires&lt;br /&gt;
      get :new_quiz&lt;br /&gt;
      get :select_questionnaire_type&lt;br /&gt;
      post :select_questionnaire_type&lt;br /&gt;
      get :toggle_access&lt;br /&gt;
      get :view&lt;br /&gt;
      post :create_quiz_questionnaire&lt;br /&gt;
      post :update_quiz&lt;br /&gt;
      post :add_new_questions&lt;br /&gt;
      post :save_all_questions&lt;br /&gt;
      post :create_supplementary_review_questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  resources :author_feedback_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :metareview_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :teammate_review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :assignment_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :global_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :course_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :bookmarkrating_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :supplementary_review_questionnaire, controller: :questionnaires&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Team members'''&lt;br /&gt;
----&lt;br /&gt;
Yanchen Zhao&lt;br /&gt;
&lt;br /&gt;
Pingping Chen&lt;br /&gt;
&lt;br /&gt;
Jianshu Zhang&lt;br /&gt;
&lt;br /&gt;
Zirun Han&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Links'''&lt;br /&gt;
----&lt;br /&gt;
Expertiza on Github:https://github.com/zyczyh/expertiza&lt;br /&gt;
&lt;br /&gt;
Pull Request:https://github.com/expertiza/expertiza/pull/1325&lt;br /&gt;
&lt;br /&gt;
Expertiza YouTube channel:https://youtu.be/3PUNknSbU-k&lt;/div&gt;</summary>
		<author><name>Pchen23</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121647</id>
		<title>CSC/ECE 517 Fall 2018/E1879 Student Generated Questions Added To Rubric</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121647"/>
		<updated>2018-12-18T18:38:02Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Introduction'''&lt;br /&gt;
----&lt;br /&gt;
The rubrics in expertiza are created by instructors. These Rubrics only contain questions that are related to the existed topics. Now, Expertiza only supports students to pull questionnaires is specific rubrics to get some help. Even that they can ask about anything that is relevant to all the projects that will be submitted But when students encounter difficult problems which are not in the existed topics, and they want to get special advice on that new field, the demand for creating supplementary review questionnaire raises. This project (E1879) aims to solve this problem by allowing students to add questions to the standard instructor generated rubric so that they can get specific feedback on from the reviewers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Proposed solution'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
We will add the Supplementary Review Questions to the current Review Questions, and show these student-generated questions under the rubric given by instructor. Even though these questions won't be graded, they will eventually provide diversity for feedback. It will increase the benefit that each team gets because they can get feedback that is specific to their project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Implementation'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
''Design Strategy''&lt;br /&gt;
&lt;br /&gt;
In Expertiza, all kinds of rubrics and surveys are subclasses of Questionnaire. A Questionnaire can contain “questions” of several types (e.g., checkboxes, dropdowns, text boxes). So that we will add a new subclass of Questionnaire named SupplementaryReviewQuestionnaire to achieve our goal.&lt;br /&gt;
 &lt;br /&gt;
First, we want the professor to control if the students can create their own supplementary questions by using a checkbox to indicate. If the professor allow students to create their own questions, there will be a button in the students &amp;quot;Your work&amp;quot; page which can let the students jump to the same page that an instructor lands on when creating a new rubric. Then we will add the questionnaire id of this new SupplementaryReviewQuestionnaire to the Team table when students create their own questionnaire in order to show the corresponding supplementary questions to the reviewers. And when showing review questions to the reviewers we will look up the questionnaire id in Team table and modify the view to add the supplementary questions to review page. Finally, after the reviewers finish the review and submit their responds, we will change the view and let the team member can see the feedback of their supplementary questions.&lt;br /&gt;
&lt;br /&gt;
''Changes in the User Interface''&lt;br /&gt;
&lt;br /&gt;
1. Assignment Page&lt;br /&gt;
&lt;br /&gt;
We add a checkbox for the professor to indicate if student can add their own questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_1.png]]&lt;br /&gt;
   &lt;br /&gt;
2. A button called &amp;quot;Create Supplementary Rubric&amp;quot; will appear in the student's &amp;quot;Your Work&amp;quot; section when the Instructor has allowed students to create supplementary review questions. So when a student clicks the button he/she can add the desired questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_2.png]]&lt;br /&gt;
&lt;br /&gt;
3. The page where student will be directed to when he/she clicks the Create Supplementary Rubric button. Students can add Questions to the created Supplementary Review questionnaire here.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_3.png]]&lt;br /&gt;
&lt;br /&gt;
4. Review Page&lt;br /&gt;
&lt;br /&gt;
The students own supplementary questions are leading by a heading &amp;quot;Supplementary Review Questions&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_4.png]]&lt;br /&gt;
&lt;br /&gt;
5. Review Results Page&lt;br /&gt;
&lt;br /&gt;
The supplementary review results will be showed to the team like other results. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_5.png]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''Use Cases'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Use case of creating a Supplementary Review Questionnaire&lt;br /&gt;
&lt;br /&gt;
[[File:case1.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Use case of reviewing questions for reviewers.&lt;br /&gt;
&lt;br /&gt;
[[File:case2.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Use case of reviewing responses of questions.&lt;br /&gt;
&lt;br /&gt;
[[File:case3.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Test Plan'''&lt;br /&gt;
----&lt;br /&gt;
Actually, we need to add tests for the following:&lt;br /&gt;
&lt;br /&gt;
1. To check the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; appears in the &amp;quot;Your Work&amp;quot; section of a student.&lt;br /&gt;
&lt;br /&gt;
2. To check if the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; redirects to page which allows to create questionnaire.&lt;br /&gt;
&lt;br /&gt;
3. To check if the questionnaire ID is stored in the Team table.&lt;br /&gt;
&lt;br /&gt;
4. To check if the reviewers can see the supplementary questions that were added by the team as part of the review questions.&lt;br /&gt;
&lt;br /&gt;
5. To check if the responses of the Supplementary Review Questions have been added to the responses of the existing review questions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''File which are added/modified'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Models&lt;br /&gt;
&lt;br /&gt;
app/models/team.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_supplementary_review_questionnaire_id_of_team(team_id)&lt;br /&gt;
    team = Team.find(team_id)&lt;br /&gt;
    if team.blank?&lt;br /&gt;
      nil&lt;br /&gt;
    else&lt;br /&gt;
      team.supplementary_review_questionnaire_id&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/models/response.rb&lt;br /&gt;
&lt;br /&gt;
2. Viewers:&lt;br /&gt;
&lt;br /&gt;
app/views/grades/view_team.html.erb&lt;br /&gt;
&lt;br /&gt;
app/views/response/response.html.erb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      &amp;lt;br&amp;gt;&lt;br /&gt;
       &amp;lt;% unless @supplementary_review_questions.nil? %&amp;gt;&lt;br /&gt;
       &amp;lt;tr&amp;gt;&lt;br /&gt;
         &amp;lt;td&amp;gt;&lt;br /&gt;
           &amp;lt;h2&amp;gt;Supplementary Review Questions&amp;lt;/h2&amp;gt;&lt;br /&gt;
         &amp;lt;/td&amp;gt;&lt;br /&gt;
       &amp;lt;/tr&amp;gt;&lt;br /&gt;
         &amp;lt;% @supplementary_review_questions.each do |question| %&amp;gt;&lt;br /&gt;
         &amp;lt;tr&amp;gt;&lt;br /&gt;
           &amp;lt;td&amp;gt;&lt;br /&gt;
             &amp;lt;% answer = Answer.where(question_id: question.id, response_id: @response.id).first if !@response.nil? %&amp;gt;&lt;br /&gt;
             &amp;lt;% if question.instance_of? Criterion %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer, @questionnaire.min_question_score, @questionnaire.max_question_score, @dropdown_or_scale) %&amp;gt;&lt;br /&gt;
               &amp;lt;%= tinymce %&amp;gt;&lt;br /&gt;
             &amp;lt;% elsif question.instance_of? Scale %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer, @questionnaire.min_question_score, @questionnaire.max_question_score) %&amp;gt;&lt;br /&gt;
               &amp;lt;%= tinymce %&amp;gt;&lt;br /&gt;
             &amp;lt;% elsif question.instance_of? UploadFile %&amp;gt;&lt;br /&gt;
             &amp;lt;% else %&amp;gt;&lt;br /&gt;
               &amp;lt;%= question.complete(i, answer) %&amp;gt;&lt;br /&gt;
             &amp;lt;% end %&amp;gt;&lt;br /&gt;
           &amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;td width=&amp;quot;25%&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;% if [Criterion, TextArea].include? question.class %&amp;gt;&lt;br /&gt;
                 &amp;lt;div id=&amp;quot;analysis_&amp;lt;%= i.to_s %&amp;gt;_comments&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
             &amp;lt;% end %&amp;gt;&lt;br /&gt;
           &amp;lt;/td&amp;gt;&lt;br /&gt;
         &amp;lt;/tr&amp;gt;&lt;br /&gt;
         &amp;lt;% i += 1 %&amp;gt;&lt;br /&gt;
         &amp;lt;% end %&amp;gt;&lt;br /&gt;
       &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/views/submitted_content/_main.html.erb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if stage != &amp;quot;Finished&amp;quot; and controller.controller_name == 'submitted_content' and @can_submit %&amp;gt;&lt;br /&gt;
  &amp;lt;h2&amp;gt;Add Supplementary Review Questions:&amp;lt;/h2&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.supplementary_review_questionnaire? %&amp;gt;&lt;br /&gt;
      &amp;lt;%= button_to &amp;quot;Create Supplementary Rubric&amp;quot;, {:controller =&amp;gt; &amp;quot;questionnaires&amp;quot;, :action =&amp;gt; &amp;quot;create_supplementary_review_questionnaire&amp;quot;, :id =&amp;gt; participant.id } %&amp;gt;&lt;br /&gt;
    &amp;lt;% else %&amp;gt;&lt;br /&gt;
      The instructor hasn't enabled this feature for this assignment&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Controllers:&lt;br /&gt;
&lt;br /&gt;
app/controllers/response_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Prepare the parameters when student clicks &amp;quot;Edit&amp;quot;&lt;br /&gt;
  def edit&lt;br /&gt;
    assign_instance_vars&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if @prev.present?&lt;br /&gt;
      @sorted = @review_scores.sort {|m1, m2| m1.version_num.to_i &amp;amp;&amp;amp; m2.version_num.to_i ? m2.version_num.to_i &amp;lt;=&amp;gt; m1.version_num.to_i : (m1.version_num ? -1 : 1) }&lt;br /&gt;
      @largest_version_num = @sorted[0]&lt;br /&gt;
    end&lt;br /&gt;
    @modified_object = @response.response_id&lt;br /&gt;
    # set more handy variables for the view&lt;br /&gt;
    set_content&lt;br /&gt;
    @review_scores = []&lt;br /&gt;
    @questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @supplementary_review_questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @questionnaire = set_questionnaire&lt;br /&gt;
    render action: 'response'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # Update the response and answers when student &amp;quot;edit&amp;quot; existing response&lt;br /&gt;
  def update&lt;br /&gt;
    render nothing: true unless action_allowed?&lt;br /&gt;
    # the response to be updated&lt;br /&gt;
    @response = Response.find(params[:id])&lt;br /&gt;
    msg = &amp;quot;&amp;quot;&lt;br /&gt;
    begin&lt;br /&gt;
      @map = @response.map&lt;br /&gt;
      @response.update_attribute('additional_comment', params[:review][:comments])&lt;br /&gt;
&lt;br /&gt;
      set_questionnaire&lt;br /&gt;
      questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
        questions += supplementary_review_questions&lt;br /&gt;
      end&lt;br /&gt;
      create_answers(params, questions) unless params[:responses].nil?&lt;br /&gt;
&lt;br /&gt;
      @response.update_attribute('is_submitted', true) if params['isSubmit'] &amp;amp;&amp;amp; params['isSubmit'] == 'Yes'&lt;br /&gt;
      @response.notify_instructor_on_difference if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; @response.is_submitted &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
    rescue StandardError&lt;br /&gt;
      msg = &amp;quot;Your response was not saved. Cause:189 #{$ERROR_INFO}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    ExpertizaLogger.info LoggerMessage.new(controller_name, session[:user].name, &amp;quot;Your response was submitted: #{@response.is_submitted}&amp;quot;, request)&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 def create&lt;br /&gt;
    map_id = params[:id]&lt;br /&gt;
    map_id = params[:map_id] unless params[:map_id].nil? # pass map_id as a hidden field in the review form&lt;br /&gt;
    @map = ResponseMap.find(map_id)&lt;br /&gt;
    @team_id = @map.reviewee_id&lt;br /&gt;
&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if params[:review][:questionnaire_id]&lt;br /&gt;
      @questionnaire = Questionnaire.find(params[:review][:questionnaire_id])&lt;br /&gt;
      @round = params[:review][:round]&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      @round = nil&lt;br /&gt;
    end&lt;br /&gt;
    is_submitted = (params[:isSubmit] == 'Yes')&lt;br /&gt;
    was_submitted = false&lt;br /&gt;
    @response = Response.where(map_id: @map.id, round: @round.to_i).first&lt;br /&gt;
    if @response.nil?&lt;br /&gt;
      @response = Response.create(&lt;br /&gt;
        map_id: @map.id,&lt;br /&gt;
        additional_comment: params[:review][:comments],&lt;br /&gt;
        round: @round.to_i,&lt;br /&gt;
        is_submitted: is_submitted&lt;br /&gt;
      )&lt;br /&gt;
    end&lt;br /&gt;
    was_submitted = @response.is_submitted&lt;br /&gt;
    @response.update(additional_comment: params[:review][:comments], is_submitted: is_submitted) # ignore if autoupdate try to save when the response object is not yet created.&lt;br /&gt;
&lt;br /&gt;
    # ,:version_num=&amp;gt;@version)&lt;br /&gt;
    # Change the order for displaying questions for editing response views.&lt;br /&gt;
    questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      questions += supplementary_review_questions&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    create_answers(params, questions) if params[:responses]&lt;br /&gt;
    msg = &amp;quot;Your response was successfully saved.&amp;quot;&lt;br /&gt;
    error_msg = &amp;quot;&amp;quot;&lt;br /&gt;
    # only notify if is_submitted changes from false to true&lt;br /&gt;
    if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; (was_submitted == false &amp;amp;&amp;amp; @response.is_submitted) &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
      @response.notify_instructor_on_difference&lt;br /&gt;
      @response.email&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, error_msg: error_msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # new_response if a flag parameter indicating that if user is requesting a new rubric to fill&lt;br /&gt;
  # if true: we figure out which questionnaire to use based on current time and records in assignment_questionnaires table&lt;br /&gt;
  # e.g. student click &amp;quot;Begin&amp;quot; or &amp;quot;Update&amp;quot; to start filling out a rubric for others' work&lt;br /&gt;
  # if false: we figure out which questionnaire to display base on @response object&lt;br /&gt;
  # e.g. student click &amp;quot;Edit&amp;quot; or &amp;quot;View&amp;quot;&lt;br /&gt;
  def set_content(new_response = false)&lt;br /&gt;
    @title = @map.get_title&lt;br /&gt;
    if @map.survey?&lt;br /&gt;
      @survey_parent = @map.survey_parent&lt;br /&gt;
    else&lt;br /&gt;
      @assignment = @map.assignment&lt;br /&gt;
    end&lt;br /&gt;
    @participant = @map.reviewer&lt;br /&gt;
    @contributor = @map.contributor&lt;br /&gt;
    new_response ? set_questionnaire_for_new_response : set_questionnaire&lt;br /&gt;
    set_dropdown_or_scale&lt;br /&gt;
    @questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      @supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @min = @questionnaire.min_question_score&lt;br /&gt;
    @max = @questionnaire.max_question_score&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire_for_new_response&lt;br /&gt;
    case @map.type&lt;br /&gt;
    when &amp;quot;ReviewResponseMap&amp;quot;, &amp;quot;SelfReviewResponseMap&amp;quot;&lt;br /&gt;
      reviewees_topic = SignedUpTeam.topic_id_by_team_id(@contributor.id)&lt;br /&gt;
      @current_round = @assignment.number_of_current_round(reviewees_topic)&lt;br /&gt;
      @questionnaire = @map.questionnaire(@current_round)&lt;br /&gt;
&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@contributor.id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    when&lt;br /&gt;
      &amp;quot;MetareviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;TeammateReviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;FeedbackResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;CourseSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;AssignmentSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;GlobalSurveyResponseMap&amp;quot;&lt;br /&gt;
      @questionnaire = @map.questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire&lt;br /&gt;
    # if user is not filling a new rubric, the @response object should be available.&lt;br /&gt;
    # we can find the questionnaire from the question_id in answers&lt;br /&gt;
    answer = @response.scores.first&lt;br /&gt;
    @questionnaire = @response.questionnaire_by_answer(answer)&lt;br /&gt;
&lt;br /&gt;
    supplementary_review_answer = @response.scores.last&lt;br /&gt;
    @supplementary_review_questionnaire = @response.questionnaire_by_answer(supplementary_review_answer)&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/controllers/grades_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def view_team&lt;br /&gt;
    @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
    @assignment = @participant.assignment&lt;br /&gt;
    @team = @participant.team&lt;br /&gt;
    @team_id = @team.id&lt;br /&gt;
    @questions = {}&lt;br /&gt;
    questionnaires = @assignment.questionnaires&lt;br /&gt;
    retrieve_questions questionnaires&lt;br /&gt;
    @pscore = @participant.scores(@questions)&lt;br /&gt;
    @vmlist = []&lt;br /&gt;
&lt;br /&gt;
    # loop through each questionnaire, and populate the view model for all data necessary&lt;br /&gt;
    # to render the html tables.&lt;br /&gt;
    counter_for_same_rubric = 0&lt;br /&gt;
    questionnaires.each do |questionnaire|&lt;br /&gt;
      @round = nil&lt;br /&gt;
      if @assignment.varying_rubrics_by_round? &amp;amp;&amp;amp; questionnaire.type == &amp;quot;ReviewQuestionnaire&amp;quot;&lt;br /&gt;
        questionnaires = AssignmentQuestionnaire.where(assignment_id: @assignment.id, questionnaire_id: questionnaire.id)&lt;br /&gt;
        if questionnaires.count &amp;gt; 1&lt;br /&gt;
          @round = questionnaires[counter_for_same_rubric].used_in_round&lt;br /&gt;
          counter_for_same_rubric += 1&lt;br /&gt;
        else&lt;br /&gt;
          @round = questionnaires[0].used_in_round&lt;br /&gt;
          counter_for_same_rubric = 0&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vm = VmQuestionResponse.new(questionnaire, @assignment, @round)&lt;br /&gt;
      supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        supplementary_review_questionnaire = Questionnaire.find(supplementary_review_questionnaire_id)&lt;br /&gt;
        unless supplementary_review_questionnaire.nil?&lt;br /&gt;
          supplementary_review_questions = supplementary_review_questionnaire.questions&lt;br /&gt;
          questionnaire.questions += supplementary_review_questions&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vmquestions = questionnaire.questions&lt;br /&gt;
      vm.add_questions(vmquestions)&lt;br /&gt;
      vm.add_team_members(@team)&lt;br /&gt;
      vm.add_reviews(@participant, @team, @assignment.varying_rubrics_by_round?)&lt;br /&gt;
      vm.get_number_of_comments_greater_than_10_words&lt;br /&gt;
      @vmlist &amp;lt;&amp;lt; vm&lt;br /&gt;
    end&lt;br /&gt;
    @current_role_name = current_role_name&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/controllers/questionnaires_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   def create_supplementary_review_questionnaire&lt;br /&gt;
     @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
     @team = Team.find(@participant.team.id)&lt;br /&gt;
     if @team.supplementary_review_questionnaire_id.nil?&lt;br /&gt;
       @questionnaire = Questionnaire.create(privete: false, name: &amp;quot;supplementary_review_questionnaire_&amp;quot; + @team.id.to_s,&lt;br /&gt;
         instructor_id: @team_id, min_question_score: 0, max_question_score: 5, type: &amp;quot;Questionnaire&amp;quot;, display_type: &amp;quot;Review&amp;quot;&lt;br /&gt;
         instruction_loc: Questionnaire::DEFAULT_QUESTIONNAIRE_URL)&lt;br /&gt;
       if @questionnaire.save&lt;br /&gt;
         @team.supplementary_review_questionnaire_id = @questionnaire.id&lt;br /&gt;
         @team.save&lt;br /&gt;
         flash[:success] = 'You have successfully created a rubric!'&lt;br /&gt;
       else&lt;br /&gt;
         flash[:error] = $ERROR_INFO&lt;br /&gt;
       end&lt;br /&gt;
     else&lt;br /&gt;
       @questionnaire = Questionnaire.find(@team.supplementary_review_questionnaire_id)&lt;br /&gt;
     end&lt;br /&gt;
     redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
   end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Config:&lt;br /&gt;
&lt;br /&gt;
routes.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  resources :questionnaires, only: %i[new create edit update] do&lt;br /&gt;
    collection do&lt;br /&gt;
      get :copy&lt;br /&gt;
      get :list&lt;br /&gt;
      post :list_questionnaires&lt;br /&gt;
      get :new_quiz&lt;br /&gt;
      get :select_questionnaire_type&lt;br /&gt;
      post :select_questionnaire_type&lt;br /&gt;
      get :toggle_access&lt;br /&gt;
      get :view&lt;br /&gt;
      post :create_quiz_questionnaire&lt;br /&gt;
      post :update_quiz&lt;br /&gt;
      post :add_new_questions&lt;br /&gt;
      post :save_all_questions&lt;br /&gt;
      post :create_supplementary_review_questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  resources :author_feedback_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :metareview_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :teammate_review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :assignment_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :global_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :course_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :bookmarkrating_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :supplementary_review_questionnaire, controller: :questionnaires&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Team members'''&lt;br /&gt;
----&lt;br /&gt;
Yanchen Zhao&lt;br /&gt;
&lt;br /&gt;
Pingping Chen&lt;br /&gt;
&lt;br /&gt;
Jianshu Zhang&lt;br /&gt;
&lt;br /&gt;
Zirun Han&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Links'''&lt;br /&gt;
----&lt;br /&gt;
Expertiza on Github:https://github.com/zyczyh/expertiza&lt;br /&gt;
&lt;br /&gt;
Pull Request:https://github.com/expertiza/expertiza/pull/1325&lt;br /&gt;
&lt;br /&gt;
Expertiza YouTube channel:https://youtu.be/3PUNknSbU-k&lt;/div&gt;</summary>
		<author><name>Pchen23</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121643</id>
		<title>CSC/ECE 517 Fall 2018/E1879 Student Generated Questions Added To Rubric</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121643"/>
		<updated>2018-12-18T18:35:33Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Introduction'''&lt;br /&gt;
----&lt;br /&gt;
The rubrics in expertiza are created by instructors. These Rubrics only contain questions that are related to the existed topics. Now, Expertiza only supports students to pull questionnaires is specific rubrics to get some help. Even that they can ask about anything that is relevant to all the projects that will be submitted But when students encounter difficult problems which are not in the existed topics, and they want to get special advice on that new field, the demand for creating supplementary review questionnaire raises. This project (E1879) aims to solve this problem by allowing students to add questions to the standard instructor generated rubric so that they can get specific feedback on from the reviewers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Proposed solution'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
We will add the Supplementary Review Questions to the current Review Questions, and show these student-generated questions under the rubric given by instructor. Even though these questions won't be graded, they will eventually provide diversity for feedback. It will increase the benefit that each team gets because they can get feedback that is specific to their project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Implementation'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
''Design Strategy''&lt;br /&gt;
&lt;br /&gt;
In Expertiza, all kinds of rubrics and surveys are subclasses of Questionnaire. A Questionnaire can contain “questions” of several types (e.g., checkboxes, dropdowns, text boxes). So that we will add a new subclass of Questionnaire named SupplementaryReviewQuestionnaire to achieve our goal.&lt;br /&gt;
 &lt;br /&gt;
First, we want the professor to control if the students can create their own supplementary questions by using a checkbox to indicate. If the professor allow students to create their own questions, there will be a button in the students &amp;quot;Your work&amp;quot; page which can let the students jump to the same page that an instructor lands on when creating a new rubric. Then we will add the questionnaire id of this new SupplementaryReviewQuestionnaire to the Team table when students create their own questionnaire in order to show the corresponding supplementary questions to the reviewers. And when showing review questions to the reviewers we will look up the questionnaire id in Team table and modify the view to add the supplementary questions to review page. Finally, after the reviewers finish the review and submit their responds, we will change the view and let the team member can see the feedback of their supplementary questions.&lt;br /&gt;
&lt;br /&gt;
''Changes in the User Interface''&lt;br /&gt;
&lt;br /&gt;
1. Assignment Page&lt;br /&gt;
&lt;br /&gt;
We add a checkbox for the professor to indicate if student can add their own questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_1.png]]&lt;br /&gt;
   &lt;br /&gt;
2. A button called &amp;quot;Create Supplementary Rubric&amp;quot; will appear in the student's &amp;quot;Your Work&amp;quot; section when the Instructor has allowed students to create supplementary review questions. So when a student clicks the button he/she can add the desired questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_2.png]]&lt;br /&gt;
&lt;br /&gt;
3. The page where student will be directed to when he/she clicks the Create Supplementary Rubric button. Students can add Questions to the created Supplementary Review questionnaire here.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_3.png]]&lt;br /&gt;
&lt;br /&gt;
4. Review Page&lt;br /&gt;
&lt;br /&gt;
The students own supplementary questions are leading by a heading &amp;quot;Supplementary Review Questions&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_4.png]]&lt;br /&gt;
&lt;br /&gt;
5. Review Results Page&lt;br /&gt;
&lt;br /&gt;
The supplementary review results will be showed to the team like other results. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_5.png]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''Use Cases'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Use case of creating a Supplementary Review Questionnaire&lt;br /&gt;
&lt;br /&gt;
[[File:case1.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Use case of reviewing questions for reviewers.&lt;br /&gt;
&lt;br /&gt;
[[File:case2.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Use case of reviewing responses of questions.&lt;br /&gt;
&lt;br /&gt;
[[File:case3.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Test Plan'''&lt;br /&gt;
----&lt;br /&gt;
Actually, we need to add tests for the following:&lt;br /&gt;
&lt;br /&gt;
1. To check the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; appears in the &amp;quot;Your Work&amp;quot; section of a student.&lt;br /&gt;
&lt;br /&gt;
2. To check if the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; redirects to page which allows to create questionnaire.&lt;br /&gt;
&lt;br /&gt;
3. To check if the questionnaire ID is stored in the Team table.&lt;br /&gt;
&lt;br /&gt;
4. To check if the reviewers can see the supplementary questions that were added by the team as part of the review questions.&lt;br /&gt;
&lt;br /&gt;
5. To check if the responses of the Supplementary Review Questions have been added to the responses of the existing review questions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''File which are added/modified'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Models&lt;br /&gt;
&lt;br /&gt;
app/models/team.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_supplementary_review_questionnaire_id_of_team(team_id)&lt;br /&gt;
    team = Team.find(team_id)&lt;br /&gt;
    if team.blank?&lt;br /&gt;
      nil&lt;br /&gt;
    else&lt;br /&gt;
      team.supplementary_review_questionnaire_id&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/models/response.rb&lt;br /&gt;
&lt;br /&gt;
2. Viewers:&lt;br /&gt;
&lt;br /&gt;
app/views/grades/view_team.html.erb&lt;br /&gt;
&lt;br /&gt;
app/views/response/response.html.erb&lt;br /&gt;
&lt;br /&gt;
app/views/submitted_content/_main.html.erb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% if stage != &amp;quot;Finished&amp;quot; and controller.controller_name == 'submitted_content' and @can_submit %&amp;gt;&lt;br /&gt;
  &amp;lt;h2&amp;gt;Add Supplementary Review Questions:&amp;lt;/h2&amp;gt;&lt;br /&gt;
    &amp;lt;% if @assignment.supplementary_review_questionnaire? %&amp;gt;&lt;br /&gt;
      &amp;lt;%= button_to &amp;quot;Create Supplementary Rubric&amp;quot;, {:controller =&amp;gt; &amp;quot;questionnaires&amp;quot;, :action =&amp;gt; &amp;quot;create_supplementary_review_questionnaire&amp;quot;, :id =&amp;gt; participant.id } %&amp;gt;&lt;br /&gt;
    &amp;lt;% else %&amp;gt;&lt;br /&gt;
      The instructor hasn't enabled this feature for this assignment&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Controllers:&lt;br /&gt;
&lt;br /&gt;
app/controllers/response_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Prepare the parameters when student clicks &amp;quot;Edit&amp;quot;&lt;br /&gt;
  def edit&lt;br /&gt;
    assign_instance_vars&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if @prev.present?&lt;br /&gt;
      @sorted = @review_scores.sort {|m1, m2| m1.version_num.to_i &amp;amp;&amp;amp; m2.version_num.to_i ? m2.version_num.to_i &amp;lt;=&amp;gt; m1.version_num.to_i : (m1.version_num ? -1 : 1) }&lt;br /&gt;
      @largest_version_num = @sorted[0]&lt;br /&gt;
    end&lt;br /&gt;
    @modified_object = @response.response_id&lt;br /&gt;
    # set more handy variables for the view&lt;br /&gt;
    set_content&lt;br /&gt;
    @review_scores = []&lt;br /&gt;
    @questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @supplementary_review_questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @questionnaire = set_questionnaire&lt;br /&gt;
    render action: 'response'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # Update the response and answers when student &amp;quot;edit&amp;quot; existing response&lt;br /&gt;
  def update&lt;br /&gt;
    render nothing: true unless action_allowed?&lt;br /&gt;
    # the response to be updated&lt;br /&gt;
    @response = Response.find(params[:id])&lt;br /&gt;
    msg = &amp;quot;&amp;quot;&lt;br /&gt;
    begin&lt;br /&gt;
      @map = @response.map&lt;br /&gt;
      @response.update_attribute('additional_comment', params[:review][:comments])&lt;br /&gt;
&lt;br /&gt;
      set_questionnaire&lt;br /&gt;
      questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
        questions += supplementary_review_questions&lt;br /&gt;
      end&lt;br /&gt;
      create_answers(params, questions) unless params[:responses].nil?&lt;br /&gt;
&lt;br /&gt;
      @response.update_attribute('is_submitted', true) if params['isSubmit'] &amp;amp;&amp;amp; params['isSubmit'] == 'Yes'&lt;br /&gt;
      @response.notify_instructor_on_difference if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; @response.is_submitted &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
    rescue StandardError&lt;br /&gt;
      msg = &amp;quot;Your response was not saved. Cause:189 #{$ERROR_INFO}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    ExpertizaLogger.info LoggerMessage.new(controller_name, session[:user].name, &amp;quot;Your response was submitted: #{@response.is_submitted}&amp;quot;, request)&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 def create&lt;br /&gt;
    map_id = params[:id]&lt;br /&gt;
    map_id = params[:map_id] unless params[:map_id].nil? # pass map_id as a hidden field in the review form&lt;br /&gt;
    @map = ResponseMap.find(map_id)&lt;br /&gt;
    @team_id = @map.reviewee_id&lt;br /&gt;
&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if params[:review][:questionnaire_id]&lt;br /&gt;
      @questionnaire = Questionnaire.find(params[:review][:questionnaire_id])&lt;br /&gt;
      @round = params[:review][:round]&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      @round = nil&lt;br /&gt;
    end&lt;br /&gt;
    is_submitted = (params[:isSubmit] == 'Yes')&lt;br /&gt;
    was_submitted = false&lt;br /&gt;
    @response = Response.where(map_id: @map.id, round: @round.to_i).first&lt;br /&gt;
    if @response.nil?&lt;br /&gt;
      @response = Response.create(&lt;br /&gt;
        map_id: @map.id,&lt;br /&gt;
        additional_comment: params[:review][:comments],&lt;br /&gt;
        round: @round.to_i,&lt;br /&gt;
        is_submitted: is_submitted&lt;br /&gt;
      )&lt;br /&gt;
    end&lt;br /&gt;
    was_submitted = @response.is_submitted&lt;br /&gt;
    @response.update(additional_comment: params[:review][:comments], is_submitted: is_submitted) # ignore if autoupdate try to save when the response object is not yet created.&lt;br /&gt;
&lt;br /&gt;
    # ,:version_num=&amp;gt;@version)&lt;br /&gt;
    # Change the order for displaying questions for editing response views.&lt;br /&gt;
    questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      questions += supplementary_review_questions&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    create_answers(params, questions) if params[:responses]&lt;br /&gt;
    msg = &amp;quot;Your response was successfully saved.&amp;quot;&lt;br /&gt;
    error_msg = &amp;quot;&amp;quot;&lt;br /&gt;
    # only notify if is_submitted changes from false to true&lt;br /&gt;
    if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; (was_submitted == false &amp;amp;&amp;amp; @response.is_submitted) &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
      @response.notify_instructor_on_difference&lt;br /&gt;
      @response.email&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, error_msg: error_msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # new_response if a flag parameter indicating that if user is requesting a new rubric to fill&lt;br /&gt;
  # if true: we figure out which questionnaire to use based on current time and records in assignment_questionnaires table&lt;br /&gt;
  # e.g. student click &amp;quot;Begin&amp;quot; or &amp;quot;Update&amp;quot; to start filling out a rubric for others' work&lt;br /&gt;
  # if false: we figure out which questionnaire to display base on @response object&lt;br /&gt;
  # e.g. student click &amp;quot;Edit&amp;quot; or &amp;quot;View&amp;quot;&lt;br /&gt;
  def set_content(new_response = false)&lt;br /&gt;
    @title = @map.get_title&lt;br /&gt;
    if @map.survey?&lt;br /&gt;
      @survey_parent = @map.survey_parent&lt;br /&gt;
    else&lt;br /&gt;
      @assignment = @map.assignment&lt;br /&gt;
    end&lt;br /&gt;
    @participant = @map.reviewer&lt;br /&gt;
    @contributor = @map.contributor&lt;br /&gt;
    new_response ? set_questionnaire_for_new_response : set_questionnaire&lt;br /&gt;
    set_dropdown_or_scale&lt;br /&gt;
    @questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      @supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @min = @questionnaire.min_question_score&lt;br /&gt;
    @max = @questionnaire.max_question_score&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire_for_new_response&lt;br /&gt;
    case @map.type&lt;br /&gt;
    when &amp;quot;ReviewResponseMap&amp;quot;, &amp;quot;SelfReviewResponseMap&amp;quot;&lt;br /&gt;
      reviewees_topic = SignedUpTeam.topic_id_by_team_id(@contributor.id)&lt;br /&gt;
      @current_round = @assignment.number_of_current_round(reviewees_topic)&lt;br /&gt;
      @questionnaire = @map.questionnaire(@current_round)&lt;br /&gt;
&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@contributor.id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    when&lt;br /&gt;
      &amp;quot;MetareviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;TeammateReviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;FeedbackResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;CourseSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;AssignmentSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;GlobalSurveyResponseMap&amp;quot;&lt;br /&gt;
      @questionnaire = @map.questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire&lt;br /&gt;
    # if user is not filling a new rubric, the @response object should be available.&lt;br /&gt;
    # we can find the questionnaire from the question_id in answers&lt;br /&gt;
    answer = @response.scores.first&lt;br /&gt;
    @questionnaire = @response.questionnaire_by_answer(answer)&lt;br /&gt;
&lt;br /&gt;
    supplementary_review_answer = @response.scores.last&lt;br /&gt;
    @supplementary_review_questionnaire = @response.questionnaire_by_answer(supplementary_review_answer)&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/controllers/grades_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def view_team&lt;br /&gt;
    @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
    @assignment = @participant.assignment&lt;br /&gt;
    @team = @participant.team&lt;br /&gt;
    @team_id = @team.id&lt;br /&gt;
    @questions = {}&lt;br /&gt;
    questionnaires = @assignment.questionnaires&lt;br /&gt;
    retrieve_questions questionnaires&lt;br /&gt;
    @pscore = @participant.scores(@questions)&lt;br /&gt;
    @vmlist = []&lt;br /&gt;
&lt;br /&gt;
    # loop through each questionnaire, and populate the view model for all data necessary&lt;br /&gt;
    # to render the html tables.&lt;br /&gt;
    counter_for_same_rubric = 0&lt;br /&gt;
    questionnaires.each do |questionnaire|&lt;br /&gt;
      @round = nil&lt;br /&gt;
      if @assignment.varying_rubrics_by_round? &amp;amp;&amp;amp; questionnaire.type == &amp;quot;ReviewQuestionnaire&amp;quot;&lt;br /&gt;
        questionnaires = AssignmentQuestionnaire.where(assignment_id: @assignment.id, questionnaire_id: questionnaire.id)&lt;br /&gt;
        if questionnaires.count &amp;gt; 1&lt;br /&gt;
          @round = questionnaires[counter_for_same_rubric].used_in_round&lt;br /&gt;
          counter_for_same_rubric += 1&lt;br /&gt;
        else&lt;br /&gt;
          @round = questionnaires[0].used_in_round&lt;br /&gt;
          counter_for_same_rubric = 0&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vm = VmQuestionResponse.new(questionnaire, @assignment, @round)&lt;br /&gt;
      supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        supplementary_review_questionnaire = Questionnaire.find(supplementary_review_questionnaire_id)&lt;br /&gt;
        unless supplementary_review_questionnaire.nil?&lt;br /&gt;
          supplementary_review_questions = supplementary_review_questionnaire.questions&lt;br /&gt;
          questionnaire.questions += supplementary_review_questions&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vmquestions = questionnaire.questions&lt;br /&gt;
      vm.add_questions(vmquestions)&lt;br /&gt;
      vm.add_team_members(@team)&lt;br /&gt;
      vm.add_reviews(@participant, @team, @assignment.varying_rubrics_by_round?)&lt;br /&gt;
      vm.get_number_of_comments_greater_than_10_words&lt;br /&gt;
      @vmlist &amp;lt;&amp;lt; vm&lt;br /&gt;
    end&lt;br /&gt;
    @current_role_name = current_role_name&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/controllers/questionnaires_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   def create_supplementary_review_questionnaire&lt;br /&gt;
     @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
     @team = Team.find(@participant.team.id)&lt;br /&gt;
     if @team.supplementary_review_questionnaire_id.nil?&lt;br /&gt;
       @questionnaire = Questionnaire.create(privete: false, name: &amp;quot;supplementary_review_questionnaire_&amp;quot; + @team.id.to_s,&lt;br /&gt;
         instructor_id: @team_id, min_question_score: 0, max_question_score: 5, type: &amp;quot;Questionnaire&amp;quot;, display_type: &amp;quot;Review&amp;quot;&lt;br /&gt;
         instruction_loc: Questionnaire::DEFAULT_QUESTIONNAIRE_URL)&lt;br /&gt;
       if @questionnaire.save&lt;br /&gt;
         @team.supplementary_review_questionnaire_id = @questionnaire.id&lt;br /&gt;
         @team.save&lt;br /&gt;
         flash[:success] = 'You have successfully created a rubric!'&lt;br /&gt;
       else&lt;br /&gt;
         flash[:error] = $ERROR_INFO&lt;br /&gt;
       end&lt;br /&gt;
     else&lt;br /&gt;
       @questionnaire = Questionnaire.find(@team.supplementary_review_questionnaire_id)&lt;br /&gt;
     end&lt;br /&gt;
     redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
   end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Config:&lt;br /&gt;
&lt;br /&gt;
routes.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  resources :questionnaires, only: %i[new create edit update] do&lt;br /&gt;
    collection do&lt;br /&gt;
      get :copy&lt;br /&gt;
      get :list&lt;br /&gt;
      post :list_questionnaires&lt;br /&gt;
      get :new_quiz&lt;br /&gt;
      get :select_questionnaire_type&lt;br /&gt;
      post :select_questionnaire_type&lt;br /&gt;
      get :toggle_access&lt;br /&gt;
      get :view&lt;br /&gt;
      post :create_quiz_questionnaire&lt;br /&gt;
      post :update_quiz&lt;br /&gt;
      post :add_new_questions&lt;br /&gt;
      post :save_all_questions&lt;br /&gt;
      post :create_supplementary_review_questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  resources :author_feedback_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :metareview_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :teammate_review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :assignment_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :global_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :course_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :bookmarkrating_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :supplementary_review_questionnaire, controller: :questionnaires&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Team members'''&lt;br /&gt;
----&lt;br /&gt;
Yanchen Zhao&lt;br /&gt;
&lt;br /&gt;
Pingping Chen&lt;br /&gt;
&lt;br /&gt;
Jianshu Zhang&lt;br /&gt;
&lt;br /&gt;
Zirun Han&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Links'''&lt;br /&gt;
----&lt;br /&gt;
Expertiza on Github:https://github.com/zyczyh/expertiza&lt;br /&gt;
&lt;br /&gt;
Pull Request:https://github.com/expertiza/expertiza/pull/1325&lt;br /&gt;
&lt;br /&gt;
Expertiza YouTube channel:https://youtu.be/3PUNknSbU-k&lt;/div&gt;</summary>
		<author><name>Pchen23</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121641</id>
		<title>CSC/ECE 517 Fall 2018/E1879 Student Generated Questions Added To Rubric</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121641"/>
		<updated>2018-12-18T18:32:06Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Introduction'''&lt;br /&gt;
----&lt;br /&gt;
The rubrics in expertiza are created by instructors. These Rubrics only contain questions that are related to the existed topics. Now, Expertiza only supports students to pull questionnaires is specific rubrics to get some help. Even that they can ask about anything that is relevant to all the projects that will be submitted But when students encounter difficult problems which are not in the existed topics, and they want to get special advice on that new field, the demand for creating supplementary review questionnaire raises. This project (E1879) aims to solve this problem by allowing students to add questions to the standard instructor generated rubric so that they can get specific feedback on from the reviewers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Proposed solution'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
We will add the Supplementary Review Questions to the current Review Questions, and show these student-generated questions under the rubric given by instructor. Even though these questions won't be graded, they will eventually provide diversity for feedback. It will increase the benefit that each team gets because they can get feedback that is specific to their project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Implementation'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
''Design Strategy''&lt;br /&gt;
&lt;br /&gt;
In Expertiza, all kinds of rubrics and surveys are subclasses of Questionnaire. A Questionnaire can contain “questions” of several types (e.g., checkboxes, dropdowns, text boxes). So that we will add a new subclass of Questionnaire named SupplementaryReviewQuestionnaire to achieve our goal.&lt;br /&gt;
 &lt;br /&gt;
First, we want the professor to control if the students can create their own supplementary questions by using a checkbox to indicate. If the professor allow students to create their own questions, there will be a button in the students &amp;quot;Your work&amp;quot; page which can let the students jump to the same page that an instructor lands on when creating a new rubric. Then we will add the questionnaire id of this new SupplementaryReviewQuestionnaire to the Team table when students create their own questionnaire in order to show the corresponding supplementary questions to the reviewers. And when showing review questions to the reviewers we will look up the questionnaire id in Team table and modify the view to add the supplementary questions to review page. Finally, after the reviewers finish the review and submit their responds, we will change the view and let the team member can see the feedback of their supplementary questions.&lt;br /&gt;
&lt;br /&gt;
''Changes in the User Interface''&lt;br /&gt;
&lt;br /&gt;
1. Assignment Page&lt;br /&gt;
&lt;br /&gt;
We add a checkbox for the professor to indicate if student can add their own questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_1.png]]&lt;br /&gt;
   &lt;br /&gt;
2. A button called &amp;quot;Create Supplementary Rubric&amp;quot; will appear in the student's &amp;quot;Your Work&amp;quot; section when the Instructor has allowed students to create supplementary review questions. So when a student clicks the button he/she can add the desired questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_2.png]]&lt;br /&gt;
&lt;br /&gt;
3. The page where student will be directed to when he/she clicks the Create Supplementary Rubric button. Students can add Questions to the created Supplementary Review questionnaire here.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_3.png]]&lt;br /&gt;
&lt;br /&gt;
4. Review Page&lt;br /&gt;
&lt;br /&gt;
The students own supplementary questions are leading by a heading &amp;quot;Supplementary Review Questions&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_4.png]]&lt;br /&gt;
&lt;br /&gt;
5. Review Results Page&lt;br /&gt;
&lt;br /&gt;
The supplementary review results will be showed to the team like other results. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_5.png]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''Use Cases'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Use case of creating a Supplementary Review Questionnaire&lt;br /&gt;
&lt;br /&gt;
[[File:case1.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Use case of reviewing questions for reviewers.&lt;br /&gt;
&lt;br /&gt;
[[File:case2.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Use case of reviewing responses of questions.&lt;br /&gt;
&lt;br /&gt;
[[File:case3.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Test Plan'''&lt;br /&gt;
----&lt;br /&gt;
Actually, we need to add tests for the following:&lt;br /&gt;
&lt;br /&gt;
1. To check the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; appears in the &amp;quot;Your Work&amp;quot; section of a student.&lt;br /&gt;
&lt;br /&gt;
2. To check if the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; redirects to page which allows to create questionnaire.&lt;br /&gt;
&lt;br /&gt;
3. To check if the questionnaire ID is stored in the Team table.&lt;br /&gt;
&lt;br /&gt;
4. To check if the reviewers can see the supplementary questions that were added by the team as part of the review questions.&lt;br /&gt;
&lt;br /&gt;
5. To check if the responses of the Supplementary Review Questions have been added to the responses of the existing review questions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''File which are added/modified'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Models&lt;br /&gt;
&lt;br /&gt;
app/models/team.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_supplementary_review_questionnaire_id_of_team(team_id)&lt;br /&gt;
    team = Team.find(team_id)&lt;br /&gt;
    if team.blank?&lt;br /&gt;
      nil&lt;br /&gt;
    else&lt;br /&gt;
      team.supplementary_review_questionnaire_id&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/models/response.rb&lt;br /&gt;
&lt;br /&gt;
2. Viewers:&lt;br /&gt;
&lt;br /&gt;
app/viewers/grades/view_team.html.erb&lt;br /&gt;
&lt;br /&gt;
app/viewers/response/response.html.erb&lt;br /&gt;
&lt;br /&gt;
app/viewers/submitted_content/_main.html.erb&lt;br /&gt;
&lt;br /&gt;
3. Controllers:&lt;br /&gt;
&lt;br /&gt;
app/controllers/response_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Prepare the parameters when student clicks &amp;quot;Edit&amp;quot;&lt;br /&gt;
  def edit&lt;br /&gt;
    assign_instance_vars&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if @prev.present?&lt;br /&gt;
      @sorted = @review_scores.sort {|m1, m2| m1.version_num.to_i &amp;amp;&amp;amp; m2.version_num.to_i ? m2.version_num.to_i &amp;lt;=&amp;gt; m1.version_num.to_i : (m1.version_num ? -1 : 1) }&lt;br /&gt;
      @largest_version_num = @sorted[0]&lt;br /&gt;
    end&lt;br /&gt;
    @modified_object = @response.response_id&lt;br /&gt;
    # set more handy variables for the view&lt;br /&gt;
    set_content&lt;br /&gt;
    @review_scores = []&lt;br /&gt;
    @questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @supplementary_review_questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @questionnaire = set_questionnaire&lt;br /&gt;
    render action: 'response'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # Update the response and answers when student &amp;quot;edit&amp;quot; existing response&lt;br /&gt;
  def update&lt;br /&gt;
    render nothing: true unless action_allowed?&lt;br /&gt;
    # the response to be updated&lt;br /&gt;
    @response = Response.find(params[:id])&lt;br /&gt;
    msg = &amp;quot;&amp;quot;&lt;br /&gt;
    begin&lt;br /&gt;
      @map = @response.map&lt;br /&gt;
      @response.update_attribute('additional_comment', params[:review][:comments])&lt;br /&gt;
&lt;br /&gt;
      set_questionnaire&lt;br /&gt;
      questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
        questions += supplementary_review_questions&lt;br /&gt;
      end&lt;br /&gt;
      create_answers(params, questions) unless params[:responses].nil?&lt;br /&gt;
&lt;br /&gt;
      @response.update_attribute('is_submitted', true) if params['isSubmit'] &amp;amp;&amp;amp; params['isSubmit'] == 'Yes'&lt;br /&gt;
      @response.notify_instructor_on_difference if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; @response.is_submitted &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
    rescue StandardError&lt;br /&gt;
      msg = &amp;quot;Your response was not saved. Cause:189 #{$ERROR_INFO}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    ExpertizaLogger.info LoggerMessage.new(controller_name, session[:user].name, &amp;quot;Your response was submitted: #{@response.is_submitted}&amp;quot;, request)&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 def create&lt;br /&gt;
    map_id = params[:id]&lt;br /&gt;
    map_id = params[:map_id] unless params[:map_id].nil? # pass map_id as a hidden field in the review form&lt;br /&gt;
    @map = ResponseMap.find(map_id)&lt;br /&gt;
    @team_id = @map.reviewee_id&lt;br /&gt;
&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if params[:review][:questionnaire_id]&lt;br /&gt;
      @questionnaire = Questionnaire.find(params[:review][:questionnaire_id])&lt;br /&gt;
      @round = params[:review][:round]&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      @round = nil&lt;br /&gt;
    end&lt;br /&gt;
    is_submitted = (params[:isSubmit] == 'Yes')&lt;br /&gt;
    was_submitted = false&lt;br /&gt;
    @response = Response.where(map_id: @map.id, round: @round.to_i).first&lt;br /&gt;
    if @response.nil?&lt;br /&gt;
      @response = Response.create(&lt;br /&gt;
        map_id: @map.id,&lt;br /&gt;
        additional_comment: params[:review][:comments],&lt;br /&gt;
        round: @round.to_i,&lt;br /&gt;
        is_submitted: is_submitted&lt;br /&gt;
      )&lt;br /&gt;
    end&lt;br /&gt;
    was_submitted = @response.is_submitted&lt;br /&gt;
    @response.update(additional_comment: params[:review][:comments], is_submitted: is_submitted) # ignore if autoupdate try to save when the response object is not yet created.&lt;br /&gt;
&lt;br /&gt;
    # ,:version_num=&amp;gt;@version)&lt;br /&gt;
    # Change the order for displaying questions for editing response views.&lt;br /&gt;
    questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      questions += supplementary_review_questions&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    create_answers(params, questions) if params[:responses]&lt;br /&gt;
    msg = &amp;quot;Your response was successfully saved.&amp;quot;&lt;br /&gt;
    error_msg = &amp;quot;&amp;quot;&lt;br /&gt;
    # only notify if is_submitted changes from false to true&lt;br /&gt;
    if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; (was_submitted == false &amp;amp;&amp;amp; @response.is_submitted) &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
      @response.notify_instructor_on_difference&lt;br /&gt;
      @response.email&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, error_msg: error_msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # new_response if a flag parameter indicating that if user is requesting a new rubric to fill&lt;br /&gt;
  # if true: we figure out which questionnaire to use based on current time and records in assignment_questionnaires table&lt;br /&gt;
  # e.g. student click &amp;quot;Begin&amp;quot; or &amp;quot;Update&amp;quot; to start filling out a rubric for others' work&lt;br /&gt;
  # if false: we figure out which questionnaire to display base on @response object&lt;br /&gt;
  # e.g. student click &amp;quot;Edit&amp;quot; or &amp;quot;View&amp;quot;&lt;br /&gt;
  def set_content(new_response = false)&lt;br /&gt;
    @title = @map.get_title&lt;br /&gt;
    if @map.survey?&lt;br /&gt;
      @survey_parent = @map.survey_parent&lt;br /&gt;
    else&lt;br /&gt;
      @assignment = @map.assignment&lt;br /&gt;
    end&lt;br /&gt;
    @participant = @map.reviewer&lt;br /&gt;
    @contributor = @map.contributor&lt;br /&gt;
    new_response ? set_questionnaire_for_new_response : set_questionnaire&lt;br /&gt;
    set_dropdown_or_scale&lt;br /&gt;
    @questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      @supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @min = @questionnaire.min_question_score&lt;br /&gt;
    @max = @questionnaire.max_question_score&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire_for_new_response&lt;br /&gt;
    case @map.type&lt;br /&gt;
    when &amp;quot;ReviewResponseMap&amp;quot;, &amp;quot;SelfReviewResponseMap&amp;quot;&lt;br /&gt;
      reviewees_topic = SignedUpTeam.topic_id_by_team_id(@contributor.id)&lt;br /&gt;
      @current_round = @assignment.number_of_current_round(reviewees_topic)&lt;br /&gt;
      @questionnaire = @map.questionnaire(@current_round)&lt;br /&gt;
&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@contributor.id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    when&lt;br /&gt;
      &amp;quot;MetareviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;TeammateReviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;FeedbackResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;CourseSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;AssignmentSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;GlobalSurveyResponseMap&amp;quot;&lt;br /&gt;
      @questionnaire = @map.questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire&lt;br /&gt;
    # if user is not filling a new rubric, the @response object should be available.&lt;br /&gt;
    # we can find the questionnaire from the question_id in answers&lt;br /&gt;
    answer = @response.scores.first&lt;br /&gt;
    @questionnaire = @response.questionnaire_by_answer(answer)&lt;br /&gt;
&lt;br /&gt;
    supplementary_review_answer = @response.scores.last&lt;br /&gt;
    @supplementary_review_questionnaire = @response.questionnaire_by_answer(supplementary_review_answer)&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/controllers/grades_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def view_team&lt;br /&gt;
    @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
    @assignment = @participant.assignment&lt;br /&gt;
    @team = @participant.team&lt;br /&gt;
    @team_id = @team.id&lt;br /&gt;
    @questions = {}&lt;br /&gt;
    questionnaires = @assignment.questionnaires&lt;br /&gt;
    retrieve_questions questionnaires&lt;br /&gt;
    @pscore = @participant.scores(@questions)&lt;br /&gt;
    @vmlist = []&lt;br /&gt;
&lt;br /&gt;
    # loop through each questionnaire, and populate the view model for all data necessary&lt;br /&gt;
    # to render the html tables.&lt;br /&gt;
    counter_for_same_rubric = 0&lt;br /&gt;
    questionnaires.each do |questionnaire|&lt;br /&gt;
      @round = nil&lt;br /&gt;
      if @assignment.varying_rubrics_by_round? &amp;amp;&amp;amp; questionnaire.type == &amp;quot;ReviewQuestionnaire&amp;quot;&lt;br /&gt;
        questionnaires = AssignmentQuestionnaire.where(assignment_id: @assignment.id, questionnaire_id: questionnaire.id)&lt;br /&gt;
        if questionnaires.count &amp;gt; 1&lt;br /&gt;
          @round = questionnaires[counter_for_same_rubric].used_in_round&lt;br /&gt;
          counter_for_same_rubric += 1&lt;br /&gt;
        else&lt;br /&gt;
          @round = questionnaires[0].used_in_round&lt;br /&gt;
          counter_for_same_rubric = 0&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vm = VmQuestionResponse.new(questionnaire, @assignment, @round)&lt;br /&gt;
      supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        supplementary_review_questionnaire = Questionnaire.find(supplementary_review_questionnaire_id)&lt;br /&gt;
        unless supplementary_review_questionnaire.nil?&lt;br /&gt;
          supplementary_review_questions = supplementary_review_questionnaire.questions&lt;br /&gt;
          questionnaire.questions += supplementary_review_questions&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vmquestions = questionnaire.questions&lt;br /&gt;
      vm.add_questions(vmquestions)&lt;br /&gt;
      vm.add_team_members(@team)&lt;br /&gt;
      vm.add_reviews(@participant, @team, @assignment.varying_rubrics_by_round?)&lt;br /&gt;
      vm.get_number_of_comments_greater_than_10_words&lt;br /&gt;
      @vmlist &amp;lt;&amp;lt; vm&lt;br /&gt;
    end&lt;br /&gt;
    @current_role_name = current_role_name&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app/controllers/questionnaires_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   def create_supplementary_review_questionnaire&lt;br /&gt;
     @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
     @team = Team.find(@participant.team.id)&lt;br /&gt;
     if @team.supplementary_review_questionnaire_id.nil?&lt;br /&gt;
       @questionnaire = Questionnaire.create(privete: false, name: &amp;quot;supplementary_review_questionnaire_&amp;quot; + @team.id.to_s,&lt;br /&gt;
         instructor_id: @team_id, min_question_score: 0, max_question_score: 5, type: &amp;quot;Questionnaire&amp;quot;, display_type: &amp;quot;Review&amp;quot;&lt;br /&gt;
         instruction_loc: Questionnaire::DEFAULT_QUESTIONNAIRE_URL)&lt;br /&gt;
       if @questionnaire.save&lt;br /&gt;
         @team.supplementary_review_questionnaire_id = @questionnaire.id&lt;br /&gt;
         @team.save&lt;br /&gt;
         flash[:success] = 'You have successfully created a rubric!'&lt;br /&gt;
       else&lt;br /&gt;
         flash[:error] = $ERROR_INFO&lt;br /&gt;
       end&lt;br /&gt;
     else&lt;br /&gt;
       @questionnaire = Questionnaire.find(@team.supplementary_review_questionnaire_id)&lt;br /&gt;
     end&lt;br /&gt;
     redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
   end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Config:&lt;br /&gt;
&lt;br /&gt;
routes.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  resources :questionnaires, only: %i[new create edit update] do&lt;br /&gt;
    collection do&lt;br /&gt;
      get :copy&lt;br /&gt;
      get :list&lt;br /&gt;
      post :list_questionnaires&lt;br /&gt;
      get :new_quiz&lt;br /&gt;
      get :select_questionnaire_type&lt;br /&gt;
      post :select_questionnaire_type&lt;br /&gt;
      get :toggle_access&lt;br /&gt;
      get :view&lt;br /&gt;
      post :create_quiz_questionnaire&lt;br /&gt;
      post :update_quiz&lt;br /&gt;
      post :add_new_questions&lt;br /&gt;
      post :save_all_questions&lt;br /&gt;
      post :create_supplementary_review_questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  resources :author_feedback_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :metareview_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :teammate_review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :assignment_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :global_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :course_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :bookmarkrating_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :supplementary_review_questionnaire, controller: :questionnaires&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Team members'''&lt;br /&gt;
----&lt;br /&gt;
Yanchen Zhao&lt;br /&gt;
&lt;br /&gt;
Pingping Chen&lt;br /&gt;
&lt;br /&gt;
Jianshu Zhang&lt;br /&gt;
&lt;br /&gt;
Zirun Han&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Links'''&lt;br /&gt;
----&lt;br /&gt;
Expertiza on Github:https://github.com/zyczyh/expertiza&lt;br /&gt;
&lt;br /&gt;
Pull Request:https://github.com/expertiza/expertiza/pull/1325&lt;br /&gt;
&lt;br /&gt;
Expertiza YouTube channel:https://youtu.be/3PUNknSbU-k&lt;/div&gt;</summary>
		<author><name>Pchen23</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121638</id>
		<title>CSC/ECE 517 Fall 2018/E1879 Student Generated Questions Added To Rubric</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121638"/>
		<updated>2018-12-18T18:29:49Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Introduction'''&lt;br /&gt;
----&lt;br /&gt;
The rubrics in expertiza are created by instructors. These Rubrics only contain questions that are related to the existed topics. Now, Expertiza only supports students to pull questionnaires is specific rubrics to get some help. Even that they can ask about anything that is relevant to all the projects that will be submitted But when students encounter difficult problems which are not in the existed topics, and they want to get special advice on that new field, the demand for creating supplementary review questionnaire raises. This project (E1879) aims to solve this problem by allowing students to add questions to the standard instructor generated rubric so that they can get specific feedback on from the reviewers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Proposed solution'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
We will add the Supplementary Review Questions to the current Review Questions, and show these student-generated questions under the rubric given by instructor. Even though these questions won't be graded, they will eventually provide diversity for feedback. It will increase the benefit that each team gets because they can get feedback that is specific to their project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Implementation'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
''Design Strategy''&lt;br /&gt;
&lt;br /&gt;
In Expertiza, all kinds of rubrics and surveys are subclasses of Questionnaire. A Questionnaire can contain “questions” of several types (e.g., checkboxes, dropdowns, text boxes). So that we will add a new subclass of Questionnaire named SupplementaryReviewQuestionnaire to achieve our goal.&lt;br /&gt;
 &lt;br /&gt;
First, we want the professor to control if the students can create their own supplementary questions by using a checkbox to indicate. If the professor allow students to create their own questions, there will be a button in the students &amp;quot;Your work&amp;quot; page which can let the students jump to the same page that an instructor lands on when creating a new rubric. Then we will add the questionnaire id of this new SupplementaryReviewQuestionnaire to the Team table when students create their own questionnaire in order to show the corresponding supplementary questions to the reviewers. And when showing review questions to the reviewers we will look up the questionnaire id in Team table and modify the view to add the supplementary questions to review page. Finally, after the reviewers finish the review and submit their responds, we will change the view and let the team member can see the feedback of their supplementary questions.&lt;br /&gt;
&lt;br /&gt;
''Changes in the User Interface''&lt;br /&gt;
&lt;br /&gt;
1. Assignment Page&lt;br /&gt;
&lt;br /&gt;
We add a checkbox for the professor to indicate if student can add their own questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_1.png]]&lt;br /&gt;
   &lt;br /&gt;
2. A button called &amp;quot;Create Supplementary Rubric&amp;quot; will appear in the student's &amp;quot;Your Work&amp;quot; section when the Instructor has allowed students to create supplementary review questions. So when a student clicks the button he/she can add the desired questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_2.png]]&lt;br /&gt;
&lt;br /&gt;
3. The page where student will be directed to when he/she clicks the Create Supplementary Rubric button. Students can add Questions to the created Supplementary Review questionnaire here.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_3.png]]&lt;br /&gt;
&lt;br /&gt;
4. Review Page&lt;br /&gt;
&lt;br /&gt;
The students own supplementary questions are leading by a heading &amp;quot;Supplementary Review Questions&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_4.png]]&lt;br /&gt;
&lt;br /&gt;
5. Review Results Page&lt;br /&gt;
&lt;br /&gt;
The supplementary review results will be showed to the team like other results. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_5.png]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''Use Cases'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Use case of creating a Supplementary Review Questionnaire&lt;br /&gt;
&lt;br /&gt;
[[File:case1.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Use case of reviewing questions for reviewers.&lt;br /&gt;
&lt;br /&gt;
[[File:case2.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Use case of reviewing responses of questions.&lt;br /&gt;
&lt;br /&gt;
[[File:case3.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Test Plan'''&lt;br /&gt;
----&lt;br /&gt;
Actually, we need to add tests for the following:&lt;br /&gt;
&lt;br /&gt;
1. To check the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; appears in the &amp;quot;Your Work&amp;quot; section of a student.&lt;br /&gt;
&lt;br /&gt;
2. To check if the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; redirects to page which allows to create questionnaire.&lt;br /&gt;
&lt;br /&gt;
3. To check if the questionnaire ID is stored in the Team table.&lt;br /&gt;
&lt;br /&gt;
4. To check if the reviewers can see the supplementary questions that were added by the team as part of the review questions.&lt;br /&gt;
&lt;br /&gt;
5. To check if the responses of the Supplementary Review Questions have been added to the responses of the existing review questions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''File which are added/modified'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Models&lt;br /&gt;
&lt;br /&gt;
app/models/team.rb&lt;br /&gt;
&lt;br /&gt;
app/models/response.rb&lt;br /&gt;
&lt;br /&gt;
2. Viewers:&lt;br /&gt;
&lt;br /&gt;
app/viewers/grades/view_team.html.erb&lt;br /&gt;
&lt;br /&gt;
app/viewers/response/response.html.erb&lt;br /&gt;
&lt;br /&gt;
app/viewers/submitted_content/_main.html.erb&lt;br /&gt;
&lt;br /&gt;
3. Controllers:&lt;br /&gt;
&lt;br /&gt;
app/controllers/response_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Prepare the parameters when student clicks &amp;quot;Edit&amp;quot;&lt;br /&gt;
  def edit&lt;br /&gt;
    assign_instance_vars&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if @prev.present?&lt;br /&gt;
      @sorted = @review_scores.sort {|m1, m2| m1.version_num.to_i &amp;amp;&amp;amp; m2.version_num.to_i ? m2.version_num.to_i &amp;lt;=&amp;gt; m1.version_num.to_i : (m1.version_num ? -1 : 1) }&lt;br /&gt;
      @largest_version_num = @sorted[0]&lt;br /&gt;
    end&lt;br /&gt;
    @modified_object = @response.response_id&lt;br /&gt;
    # set more handy variables for the view&lt;br /&gt;
    set_content&lt;br /&gt;
    @review_scores = []&lt;br /&gt;
    @questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @supplementary_review_questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @questionnaire = set_questionnaire&lt;br /&gt;
    render action: 'response'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # Update the response and answers when student &amp;quot;edit&amp;quot; existing response&lt;br /&gt;
  def update&lt;br /&gt;
    render nothing: true unless action_allowed?&lt;br /&gt;
    # the response to be updated&lt;br /&gt;
    @response = Response.find(params[:id])&lt;br /&gt;
    msg = &amp;quot;&amp;quot;&lt;br /&gt;
    begin&lt;br /&gt;
      @map = @response.map&lt;br /&gt;
      @response.update_attribute('additional_comment', params[:review][:comments])&lt;br /&gt;
&lt;br /&gt;
      set_questionnaire&lt;br /&gt;
      questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
        questions += supplementary_review_questions&lt;br /&gt;
      end&lt;br /&gt;
      create_answers(params, questions) unless params[:responses].nil?&lt;br /&gt;
&lt;br /&gt;
      @response.update_attribute('is_submitted', true) if params['isSubmit'] &amp;amp;&amp;amp; params['isSubmit'] == 'Yes'&lt;br /&gt;
      @response.notify_instructor_on_difference if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; @response.is_submitted &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
    rescue StandardError&lt;br /&gt;
      msg = &amp;quot;Your response was not saved. Cause:189 #{$ERROR_INFO}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    ExpertizaLogger.info LoggerMessage.new(controller_name, session[:user].name, &amp;quot;Your response was submitted: #{@response.is_submitted}&amp;quot;, request)&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 def create&lt;br /&gt;
    map_id = params[:id]&lt;br /&gt;
    map_id = params[:map_id] unless params[:map_id].nil? # pass map_id as a hidden field in the review form&lt;br /&gt;
    @map = ResponseMap.find(map_id)&lt;br /&gt;
    @team_id = @map.reviewee_id&lt;br /&gt;
&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if params[:review][:questionnaire_id]&lt;br /&gt;
      @questionnaire = Questionnaire.find(params[:review][:questionnaire_id])&lt;br /&gt;
      @round = params[:review][:round]&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      @round = nil&lt;br /&gt;
    end&lt;br /&gt;
    is_submitted = (params[:isSubmit] == 'Yes')&lt;br /&gt;
    was_submitted = false&lt;br /&gt;
    @response = Response.where(map_id: @map.id, round: @round.to_i).first&lt;br /&gt;
    if @response.nil?&lt;br /&gt;
      @response = Response.create(&lt;br /&gt;
        map_id: @map.id,&lt;br /&gt;
        additional_comment: params[:review][:comments],&lt;br /&gt;
        round: @round.to_i,&lt;br /&gt;
        is_submitted: is_submitted&lt;br /&gt;
      )&lt;br /&gt;
    end&lt;br /&gt;
    was_submitted = @response.is_submitted&lt;br /&gt;
    @response.update(additional_comment: params[:review][:comments], is_submitted: is_submitted) # ignore if autoupdate try to save when the response object is not yet created.&lt;br /&gt;
&lt;br /&gt;
    # ,:version_num=&amp;gt;@version)&lt;br /&gt;
    # Change the order for displaying questions for editing response views.&lt;br /&gt;
    questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      questions += supplementary_review_questions&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    create_answers(params, questions) if params[:responses]&lt;br /&gt;
    msg = &amp;quot;Your response was successfully saved.&amp;quot;&lt;br /&gt;
    error_msg = &amp;quot;&amp;quot;&lt;br /&gt;
    # only notify if is_submitted changes from false to true&lt;br /&gt;
    if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; (was_submitted == false &amp;amp;&amp;amp; @response.is_submitted) &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
      @response.notify_instructor_on_difference&lt;br /&gt;
      @response.email&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, error_msg: error_msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # new_response if a flag parameter indicating that if user is requesting a new rubric to fill&lt;br /&gt;
  # if true: we figure out which questionnaire to use based on current time and records in assignment_questionnaires table&lt;br /&gt;
  # e.g. student click &amp;quot;Begin&amp;quot; or &amp;quot;Update&amp;quot; to start filling out a rubric for others' work&lt;br /&gt;
  # if false: we figure out which questionnaire to display base on @response object&lt;br /&gt;
  # e.g. student click &amp;quot;Edit&amp;quot; or &amp;quot;View&amp;quot;&lt;br /&gt;
  def set_content(new_response = false)&lt;br /&gt;
    @title = @map.get_title&lt;br /&gt;
    if @map.survey?&lt;br /&gt;
      @survey_parent = @map.survey_parent&lt;br /&gt;
    else&lt;br /&gt;
      @assignment = @map.assignment&lt;br /&gt;
    end&lt;br /&gt;
    @participant = @map.reviewer&lt;br /&gt;
    @contributor = @map.contributor&lt;br /&gt;
    new_response ? set_questionnaire_for_new_response : set_questionnaire&lt;br /&gt;
    set_dropdown_or_scale&lt;br /&gt;
    @questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      @supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @min = @questionnaire.min_question_score&lt;br /&gt;
    @max = @questionnaire.max_question_score&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire_for_new_response&lt;br /&gt;
    case @map.type&lt;br /&gt;
    when &amp;quot;ReviewResponseMap&amp;quot;, &amp;quot;SelfReviewResponseMap&amp;quot;&lt;br /&gt;
      reviewees_topic = SignedUpTeam.topic_id_by_team_id(@contributor.id)&lt;br /&gt;
      @current_round = @assignment.number_of_current_round(reviewees_topic)&lt;br /&gt;
      @questionnaire = @map.questionnaire(@current_round)&lt;br /&gt;
&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@contributor.id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    when&lt;br /&gt;
      &amp;quot;MetareviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;TeammateReviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;FeedbackResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;CourseSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;AssignmentSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;GlobalSurveyResponseMap&amp;quot;&lt;br /&gt;
      @questionnaire = @map.questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire&lt;br /&gt;
    # if user is not filling a new rubric, the @response object should be available.&lt;br /&gt;
    # we can find the questionnaire from the question_id in answers&lt;br /&gt;
    answer = @response.scores.first&lt;br /&gt;
    @questionnaire = @response.questionnaire_by_answer(answer)&lt;br /&gt;
&lt;br /&gt;
    supplementary_review_answer = @response.scores.last&lt;br /&gt;
    @supplementary_review_questionnaire = @response.questionnaire_by_answer(supplementary_review_answer)&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/controllers/grades_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def view_team&lt;br /&gt;
    @participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
    @assignment = @participant.assignment&lt;br /&gt;
    @team = @participant.team&lt;br /&gt;
    @team_id = @team.id&lt;br /&gt;
    @questions = {}&lt;br /&gt;
    questionnaires = @assignment.questionnaires&lt;br /&gt;
    retrieve_questions questionnaires&lt;br /&gt;
    @pscore = @participant.scores(@questions)&lt;br /&gt;
    @vmlist = []&lt;br /&gt;
&lt;br /&gt;
    # loop through each questionnaire, and populate the view model for all data necessary&lt;br /&gt;
    # to render the html tables.&lt;br /&gt;
    counter_for_same_rubric = 0&lt;br /&gt;
    questionnaires.each do |questionnaire|&lt;br /&gt;
      @round = nil&lt;br /&gt;
      if @assignment.varying_rubrics_by_round? &amp;amp;&amp;amp; questionnaire.type == &amp;quot;ReviewQuestionnaire&amp;quot;&lt;br /&gt;
        questionnaires = AssignmentQuestionnaire.where(assignment_id: @assignment.id, questionnaire_id: questionnaire.id)&lt;br /&gt;
        if questionnaires.count &amp;gt; 1&lt;br /&gt;
          @round = questionnaires[counter_for_same_rubric].used_in_round&lt;br /&gt;
          counter_for_same_rubric += 1&lt;br /&gt;
        else&lt;br /&gt;
          @round = questionnaires[0].used_in_round&lt;br /&gt;
          counter_for_same_rubric = 0&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vm = VmQuestionResponse.new(questionnaire, @assignment, @round)&lt;br /&gt;
      supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        supplementary_review_questionnaire = Questionnaire.find(supplementary_review_questionnaire_id)&lt;br /&gt;
        unless supplementary_review_questionnaire.nil?&lt;br /&gt;
          supplementary_review_questions = supplementary_review_questionnaire.questions&lt;br /&gt;
          questionnaire.questions += supplementary_review_questions&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      vmquestions = questionnaire.questions&lt;br /&gt;
      vm.add_questions(vmquestions)&lt;br /&gt;
      vm.add_team_members(@team)&lt;br /&gt;
      vm.add_reviews(@participant, @team, @assignment.varying_rubrics_by_round?)&lt;br /&gt;
      vm.get_number_of_comments_greater_than_10_words&lt;br /&gt;
      @vmlist &amp;lt;&amp;lt; vm&lt;br /&gt;
    end&lt;br /&gt;
    @current_role_name = current_role_name&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. Config:&lt;br /&gt;
&lt;br /&gt;
routes.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  resources :questionnaires, only: %i[new create edit update] do&lt;br /&gt;
    collection do&lt;br /&gt;
      get :copy&lt;br /&gt;
      get :list&lt;br /&gt;
      post :list_questionnaires&lt;br /&gt;
      get :new_quiz&lt;br /&gt;
      get :select_questionnaire_type&lt;br /&gt;
      post :select_questionnaire_type&lt;br /&gt;
      get :toggle_access&lt;br /&gt;
      get :view&lt;br /&gt;
      post :create_quiz_questionnaire&lt;br /&gt;
      post :update_quiz&lt;br /&gt;
      post :add_new_questions&lt;br /&gt;
      post :save_all_questions&lt;br /&gt;
      post :create_supplementary_review_questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  resources :author_feedback_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :metareview_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :teammate_review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :assignment_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :global_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :course_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :bookmarkrating_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :supplementary_review_questionnaire, controller: :questionnaires&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Team members'''&lt;br /&gt;
----&lt;br /&gt;
Yanchen Zhao&lt;br /&gt;
&lt;br /&gt;
Pingping Chen&lt;br /&gt;
&lt;br /&gt;
Jianshu Zhang&lt;br /&gt;
&lt;br /&gt;
Zirun Han&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Links'''&lt;br /&gt;
----&lt;br /&gt;
Expertiza on Github:https://github.com/zyczyh/expertiza&lt;br /&gt;
&lt;br /&gt;
Pull Request:https://github.com/expertiza/expertiza/pull/1325&lt;br /&gt;
&lt;br /&gt;
Expertiza YouTube channel:https://youtu.be/3PUNknSbU-k&lt;/div&gt;</summary>
		<author><name>Pchen23</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121633</id>
		<title>CSC/ECE 517 Fall 2018/E1879 Student Generated Questions Added To Rubric</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121633"/>
		<updated>2018-12-18T18:25:20Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Introduction'''&lt;br /&gt;
----&lt;br /&gt;
The rubrics in expertiza are created by instructors. These Rubrics only contain questions that are related to the existed topics. Now, Expertiza only supports students to pull questionnaires is specific rubrics to get some help. Even that they can ask about anything that is relevant to all the projects that will be submitted But when students encounter difficult problems which are not in the existed topics, and they want to get special advice on that new field, the demand for creating supplementary review questionnaire raises. This project (E1879) aims to solve this problem by allowing students to add questions to the standard instructor generated rubric so that they can get specific feedback on from the reviewers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Proposed solution'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
We will add the Supplementary Review Questions to the current Review Questions, and show these student-generated questions under the rubric given by instructor. Even though these questions won't be graded, they will eventually provide diversity for feedback. It will increase the benefit that each team gets because they can get feedback that is specific to their project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Implementation'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
''Design Strategy''&lt;br /&gt;
&lt;br /&gt;
In Expertiza, all kinds of rubrics and surveys are subclasses of Questionnaire. A Questionnaire can contain “questions” of several types (e.g., checkboxes, dropdowns, text boxes). So that we will add a new subclass of Questionnaire named SupplementaryReviewQuestionnaire to achieve our goal.&lt;br /&gt;
 &lt;br /&gt;
First, we want the professor to control if the students can create their own supplementary questions by using a checkbox to indicate. If the professor allow students to create their own questions, there will be a button in the students &amp;quot;Your work&amp;quot; page which can let the students jump to the same page that an instructor lands on when creating a new rubric. Then we will add the questionnaire id of this new SupplementaryReviewQuestionnaire to the Team table when students create their own questionnaire in order to show the corresponding supplementary questions to the reviewers. And when showing review questions to the reviewers we will look up the questionnaire id in Team table and modify the view to add the supplementary questions to review page. Finally, after the reviewers finish the review and submit their responds, we will change the view and let the team member can see the feedback of their supplementary questions.&lt;br /&gt;
&lt;br /&gt;
''Changes in the User Interface''&lt;br /&gt;
&lt;br /&gt;
1. Assignment Page&lt;br /&gt;
&lt;br /&gt;
We add a checkbox for the professor to indicate if student can add their own questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_1.png]]&lt;br /&gt;
   &lt;br /&gt;
2. A button called &amp;quot;Create Supplementary Rubric&amp;quot; will appear in the student's &amp;quot;Your Work&amp;quot; section when the Instructor has allowed students to create supplementary review questions. So when a student clicks the button he/she can add the desired questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_2.png]]&lt;br /&gt;
&lt;br /&gt;
3. The page where student will be directed to when he/she clicks the Create Supplementary Rubric button. Students can add Questions to the created Supplementary Review questionnaire here.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_3.png]]&lt;br /&gt;
&lt;br /&gt;
4. Review Page&lt;br /&gt;
&lt;br /&gt;
The students own supplementary questions are leading by a heading &amp;quot;Supplementary Review Questions&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_4.png]]&lt;br /&gt;
&lt;br /&gt;
5. Review Results Page&lt;br /&gt;
&lt;br /&gt;
The supplementary review results will be showed to the team like other results. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_5.png]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''Use Cases'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Use case of creating a Supplementary Review Questionnaire&lt;br /&gt;
&lt;br /&gt;
[[File:case1.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Use case of reviewing questions for reviewers.&lt;br /&gt;
&lt;br /&gt;
[[File:case2.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Use case of reviewing responses of questions.&lt;br /&gt;
&lt;br /&gt;
[[File:case3.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Test Plan'''&lt;br /&gt;
----&lt;br /&gt;
Actually, we need to add tests for the following:&lt;br /&gt;
&lt;br /&gt;
1. To check the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; appears in the &amp;quot;Your Work&amp;quot; section of a student.&lt;br /&gt;
&lt;br /&gt;
2. To check if the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; redirects to page which allows to create questionnaire.&lt;br /&gt;
&lt;br /&gt;
3. To check if the questionnaire ID is stored in the Team table.&lt;br /&gt;
&lt;br /&gt;
4. To check if the reviewers can see the supplementary questions that were added by the team as part of the review questions.&lt;br /&gt;
&lt;br /&gt;
5. To check if the responses of the Supplementary Review Questions have been added to the responses of the existing review questions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''File which are added/modified'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Models&lt;br /&gt;
&lt;br /&gt;
app/models/team.rb&lt;br /&gt;
&lt;br /&gt;
app/models/response.rb&lt;br /&gt;
&lt;br /&gt;
2. Viewers:&lt;br /&gt;
&lt;br /&gt;
app/viewers/grades/view_team.html.erb&lt;br /&gt;
&lt;br /&gt;
app/viewers/response/response.html.erb&lt;br /&gt;
&lt;br /&gt;
app/viewers/submitted_content/_main.html.erb&lt;br /&gt;
&lt;br /&gt;
3. Controllers:&lt;br /&gt;
&lt;br /&gt;
app/controllers/response_controller.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Prepare the parameters when student clicks &amp;quot;Edit&amp;quot;&lt;br /&gt;
  def edit&lt;br /&gt;
    assign_instance_vars&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if @prev.present?&lt;br /&gt;
      @sorted = @review_scores.sort {|m1, m2| m1.version_num.to_i &amp;amp;&amp;amp; m2.version_num.to_i ? m2.version_num.to_i &amp;lt;=&amp;gt; m1.version_num.to_i : (m1.version_num ? -1 : 1) }&lt;br /&gt;
      @largest_version_num = @sorted[0]&lt;br /&gt;
    end&lt;br /&gt;
    @modified_object = @response.response_id&lt;br /&gt;
    # set more handy variables for the view&lt;br /&gt;
    set_content&lt;br /&gt;
    @review_scores = []&lt;br /&gt;
    @questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @supplementary_review_questions.each do |question|&lt;br /&gt;
      @review_scores &amp;lt;&amp;lt; Answer.where(response_id: @response.response_id, question_id: question.id).first&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @questionnaire = set_questionnaire&lt;br /&gt;
    render action: 'response'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # Update the response and answers when student &amp;quot;edit&amp;quot; existing response&lt;br /&gt;
  def update&lt;br /&gt;
    render nothing: true unless action_allowed?&lt;br /&gt;
    # the response to be updated&lt;br /&gt;
    @response = Response.find(params[:id])&lt;br /&gt;
    msg = &amp;quot;&amp;quot;&lt;br /&gt;
    begin&lt;br /&gt;
      @map = @response.map&lt;br /&gt;
      @response.update_attribute('additional_comment', params[:review][:comments])&lt;br /&gt;
&lt;br /&gt;
      set_questionnaire&lt;br /&gt;
      questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
        questions += supplementary_review_questions&lt;br /&gt;
      end&lt;br /&gt;
      create_answers(params, questions) unless params[:responses].nil?&lt;br /&gt;
&lt;br /&gt;
      @response.update_attribute('is_submitted', true) if params['isSubmit'] &amp;amp;&amp;amp; params['isSubmit'] == 'Yes'&lt;br /&gt;
      @response.notify_instructor_on_difference if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; @response.is_submitted &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
    rescue StandardError&lt;br /&gt;
      msg = &amp;quot;Your response was not saved. Cause:189 #{$ERROR_INFO}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    ExpertizaLogger.info LoggerMessage.new(controller_name, session[:user].name, &amp;quot;Your response was submitted: #{@response.is_submitted}&amp;quot;, request)&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 def create&lt;br /&gt;
    map_id = params[:id]&lt;br /&gt;
    map_id = params[:map_id] unless params[:map_id].nil? # pass map_id as a hidden field in the review form&lt;br /&gt;
    @map = ResponseMap.find(map_id)&lt;br /&gt;
    @team_id = @map.reviewee_id&lt;br /&gt;
&lt;br /&gt;
    get_all_responses&lt;br /&gt;
    if params[:review][:questionnaire_id]&lt;br /&gt;
      @questionnaire = Questionnaire.find(params[:review][:questionnaire_id])&lt;br /&gt;
      @round = params[:review][:round]&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@team_id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      @round = nil&lt;br /&gt;
    end&lt;br /&gt;
    is_submitted = (params[:isSubmit] == 'Yes')&lt;br /&gt;
    was_submitted = false&lt;br /&gt;
    @response = Response.where(map_id: @map.id, round: @round.to_i).first&lt;br /&gt;
    if @response.nil?&lt;br /&gt;
      @response = Response.create(&lt;br /&gt;
        map_id: @map.id,&lt;br /&gt;
        additional_comment: params[:review][:comments],&lt;br /&gt;
        round: @round.to_i,&lt;br /&gt;
        is_submitted: is_submitted&lt;br /&gt;
      )&lt;br /&gt;
    end&lt;br /&gt;
    was_submitted = @response.is_submitted&lt;br /&gt;
    @response.update(additional_comment: params[:review][:comments], is_submitted: is_submitted) # ignore if autoupdate try to save when the response object is not yet created.&lt;br /&gt;
&lt;br /&gt;
    # ,:version_num=&amp;gt;@version)&lt;br /&gt;
    # Change the order for displaying questions for editing response views.&lt;br /&gt;
    questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
      questions += supplementary_review_questions&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    create_answers(params, questions) if params[:responses]&lt;br /&gt;
    msg = &amp;quot;Your response was successfully saved.&amp;quot;&lt;br /&gt;
    error_msg = &amp;quot;&amp;quot;&lt;br /&gt;
    # only notify if is_submitted changes from false to true&lt;br /&gt;
    if (@map.is_a? ReviewResponseMap) &amp;amp;&amp;amp; (was_submitted == false &amp;amp;&amp;amp; @response.is_submitted) &amp;amp;&amp;amp; @response.significant_difference?&lt;br /&gt;
      @response.notify_instructor_on_difference&lt;br /&gt;
      @response.email&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'response', action: 'save', id: @map.map_id,&lt;br /&gt;
                return: params[:return], msg: msg, error_msg: error_msg, review: params[:review], save_options: params[:save_options]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # new_response if a flag parameter indicating that if user is requesting a new rubric to fill&lt;br /&gt;
  # if true: we figure out which questionnaire to use based on current time and records in assignment_questionnaires table&lt;br /&gt;
  # e.g. student click &amp;quot;Begin&amp;quot; or &amp;quot;Update&amp;quot; to start filling out a rubric for others' work&lt;br /&gt;
  # if false: we figure out which questionnaire to display base on @response object&lt;br /&gt;
  # e.g. student click &amp;quot;Edit&amp;quot; or &amp;quot;View&amp;quot;&lt;br /&gt;
  def set_content(new_response = false)&lt;br /&gt;
    @title = @map.get_title&lt;br /&gt;
    if @map.survey?&lt;br /&gt;
      @survey_parent = @map.survey_parent&lt;br /&gt;
    else&lt;br /&gt;
      @assignment = @map.assignment&lt;br /&gt;
    end&lt;br /&gt;
    @participant = @map.reviewer&lt;br /&gt;
    @contributor = @map.contributor&lt;br /&gt;
    new_response ? set_questionnaire_for_new_response : set_questionnaire&lt;br /&gt;
    set_dropdown_or_scale&lt;br /&gt;
    @questions = sort_questions(@questionnaire.questions)&lt;br /&gt;
&lt;br /&gt;
    unless @supplementary_review_questionnaire.nil?&lt;br /&gt;
      @supplementary_review_questions = sort_questions(@supplementary_review_questionnaire.questions)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @min = @questionnaire.min_question_score&lt;br /&gt;
    @max = @questionnaire.max_question_score&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire_for_new_response&lt;br /&gt;
    case @map.type&lt;br /&gt;
    when &amp;quot;ReviewResponseMap&amp;quot;, &amp;quot;SelfReviewResponseMap&amp;quot;&lt;br /&gt;
      reviewees_topic = SignedUpTeam.topic_id_by_team_id(@contributor.id)&lt;br /&gt;
      @current_round = @assignment.number_of_current_round(reviewees_topic)&lt;br /&gt;
      @questionnaire = @map.questionnaire(@current_round)&lt;br /&gt;
&lt;br /&gt;
      @supplementary_review_questionnaire_id = Team.get_supplementary_review_questionnaire_id_of_team(@contributor.id)&lt;br /&gt;
      unless @supplementary_review_questionnaire_id.nil?&lt;br /&gt;
        @supplementary_review_questionnaire = Questionnaire.find(@supplementary_review_questionnaire_id)&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    when&lt;br /&gt;
      &amp;quot;MetareviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;TeammateReviewResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;FeedbackResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;CourseSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;AssignmentSurveyResponseMap&amp;quot;,&lt;br /&gt;
      &amp;quot;GlobalSurveyResponseMap&amp;quot;&lt;br /&gt;
      @questionnaire = @map.questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def set_questionnaire&lt;br /&gt;
    # if user is not filling a new rubric, the @response object should be available.&lt;br /&gt;
    # we can find the questionnaire from the question_id in answers&lt;br /&gt;
    answer = @response.scores.first&lt;br /&gt;
    @questionnaire = @response.questionnaire_by_answer(answer)&lt;br /&gt;
&lt;br /&gt;
    supplementary_review_answer = @response.scores.last&lt;br /&gt;
    @supplementary_review_questionnaire = @response.questionnaire_by_answer(supplementary_review_answer)&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/controllers/grades_controller.rb&lt;br /&gt;
&lt;br /&gt;
app/controllers/submitted_content_controller.rb&lt;br /&gt;
&lt;br /&gt;
4. Config:&lt;br /&gt;
&lt;br /&gt;
routes.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  resources :questionnaires, only: %i[new create edit update] do&lt;br /&gt;
    collection do&lt;br /&gt;
      get :copy&lt;br /&gt;
      get :list&lt;br /&gt;
      post :list_questionnaires&lt;br /&gt;
      get :new_quiz&lt;br /&gt;
      get :select_questionnaire_type&lt;br /&gt;
      post :select_questionnaire_type&lt;br /&gt;
      get :toggle_access&lt;br /&gt;
      get :view&lt;br /&gt;
      post :create_quiz_questionnaire&lt;br /&gt;
      post :update_quiz&lt;br /&gt;
      post :add_new_questions&lt;br /&gt;
      post :save_all_questions&lt;br /&gt;
      post :create_supplementary_review_questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  resources :author_feedback_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :metareview_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :teammate_review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :assignment_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :global_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :course_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :bookmarkrating_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :supplementary_review_questionnaire, controller: :questionnaires&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Team members'''&lt;br /&gt;
----&lt;br /&gt;
Yanchen Zhao&lt;br /&gt;
&lt;br /&gt;
Pingping Chen&lt;br /&gt;
&lt;br /&gt;
Jianshu Zhang&lt;br /&gt;
&lt;br /&gt;
Zirun Han&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Links'''&lt;br /&gt;
----&lt;br /&gt;
Expertiza on Github:https://github.com/zyczyh/expertiza&lt;br /&gt;
&lt;br /&gt;
Pull Request:https://github.com/expertiza/expertiza/pull/1325&lt;br /&gt;
&lt;br /&gt;
Expertiza YouTube channel:https://youtu.be/3PUNknSbU-k&lt;/div&gt;</summary>
		<author><name>Pchen23</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121628</id>
		<title>CSC/ECE 517 Fall 2018/E1879 Student Generated Questions Added To Rubric</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2018/E1879_Student_Generated_Questions_Added_To_Rubric&amp;diff=121628"/>
		<updated>2018-12-18T18:19:33Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Introduction'''&lt;br /&gt;
----&lt;br /&gt;
The rubrics in expertiza are created by instructors. These Rubrics only contain questions that are related to the existed topics. Now, Expertiza only supports students to pull questionnaires is specific rubrics to get some help. Even that they can ask about anything that is relevant to all the projects that will be submitted But when students encounter difficult problems which are not in the existed topics, and they want to get special advice on that new field, the demand for creating supplementary review questionnaire raises. This project (E1879) aims to solve this problem by allowing students to add questions to the standard instructor generated rubric so that they can get specific feedback on from the reviewers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Proposed solution'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
We will add the Supplementary Review Questions to the current Review Questions, and show these student-generated questions under the rubric given by instructor. Even though these questions won't be graded, they will eventually provide diversity for feedback. It will increase the benefit that each team gets because they can get feedback that is specific to their project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Implementation'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
''Design Strategy''&lt;br /&gt;
&lt;br /&gt;
In Expertiza, all kinds of rubrics and surveys are subclasses of Questionnaire. A Questionnaire can contain “questions” of several types (e.g., checkboxes, dropdowns, text boxes). So that we will add a new subclass of Questionnaire named SupplementaryReviewQuestionnaire to achieve our goal.&lt;br /&gt;
 &lt;br /&gt;
First, we want the professor to control if the students can create their own supplementary questions by using a checkbox to indicate. If the professor allow students to create their own questions, there will be a button in the students &amp;quot;Your work&amp;quot; page which can let the students jump to the same page that an instructor lands on when creating a new rubric. Then we will add the questionnaire id of this new SupplementaryReviewQuestionnaire to the Team table when students create their own questionnaire in order to show the corresponding supplementary questions to the reviewers. And when showing review questions to the reviewers we will look up the questionnaire id in Team table and modify the view to add the supplementary questions to review page. Finally, after the reviewers finish the review and submit their responds, we will change the view and let the team member can see the feedback of their supplementary questions.&lt;br /&gt;
&lt;br /&gt;
''Changes in the User Interface''&lt;br /&gt;
&lt;br /&gt;
1. Assignment Page&lt;br /&gt;
&lt;br /&gt;
We add a checkbox for the professor to indicate if student can add their own questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_1.png]]&lt;br /&gt;
   &lt;br /&gt;
2. A button called &amp;quot;Create Supplementary Rubric&amp;quot; will appear in the student's &amp;quot;Your Work&amp;quot; section when the Instructor has allowed students to create supplementary review questions. So when a student clicks the button he/she can add the desired questions.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_2.png]]&lt;br /&gt;
&lt;br /&gt;
3. The page where student will be directed to when he/she clicks the Create Supplementary Rubric button. Students can add Questions to the created Supplementary Review questionnaire here.&lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_3.png]]&lt;br /&gt;
&lt;br /&gt;
4. Review Page&lt;br /&gt;
&lt;br /&gt;
The students own supplementary questions are leading by a heading &amp;quot;Supplementary Review Questions&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_4.png]]&lt;br /&gt;
&lt;br /&gt;
5. Review Results Page&lt;br /&gt;
&lt;br /&gt;
The supplementary review results will be showed to the team like other results. &lt;br /&gt;
&lt;br /&gt;
[[File:Yzhao47_5.png]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''Use Cases'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Use case of creating a Supplementary Review Questionnaire&lt;br /&gt;
&lt;br /&gt;
[[File:case1.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Use case of reviewing questions for reviewers.&lt;br /&gt;
&lt;br /&gt;
[[File:case2.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Use case of reviewing responses of questions.&lt;br /&gt;
&lt;br /&gt;
[[File:case3.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Test Plan'''&lt;br /&gt;
----&lt;br /&gt;
Actually, we need to add tests for the following:&lt;br /&gt;
&lt;br /&gt;
1. To check the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; appears in the &amp;quot;Your Work&amp;quot; section of a student.&lt;br /&gt;
&lt;br /&gt;
2. To check if the link for &amp;quot;Supplementary Review Questionnaire&amp;quot; redirects to page which allows to create questionnaire.&lt;br /&gt;
&lt;br /&gt;
3. To check if the questionnaire ID is stored in the Team table.&lt;br /&gt;
&lt;br /&gt;
4. To check if the reviewers can see the supplementary questions that were added by the team as part of the review questions.&lt;br /&gt;
&lt;br /&gt;
5. To check if the responses of the Supplementary Review Questions have been added to the responses of the existing review questions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''File which are added/modified'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1. Models&lt;br /&gt;
&lt;br /&gt;
app/models/team.rb&lt;br /&gt;
&lt;br /&gt;
app/models/response.rb&lt;br /&gt;
&lt;br /&gt;
2. Viewers:&lt;br /&gt;
&lt;br /&gt;
app/viewers/grades/view_team.html.erb&lt;br /&gt;
&lt;br /&gt;
app/viewers/response/response.html.erb&lt;br /&gt;
&lt;br /&gt;
app/viewers/submitted_content/_main.html.erb&lt;br /&gt;
&lt;br /&gt;
3. Controllers:&lt;br /&gt;
&lt;br /&gt;
app/controllers/response_controller.rb&lt;br /&gt;
&lt;br /&gt;
app/controllers/grades_controller.rb&lt;br /&gt;
&lt;br /&gt;
app/controllers/submitted_content_controller.rb&lt;br /&gt;
&lt;br /&gt;
4. Config:&lt;br /&gt;
&lt;br /&gt;
routes.rb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  resources :questionnaires, only: %i[new create edit update] do&lt;br /&gt;
    collection do&lt;br /&gt;
      get :copy&lt;br /&gt;
      get :list&lt;br /&gt;
      post :list_questionnaires&lt;br /&gt;
      get :new_quiz&lt;br /&gt;
      get :select_questionnaire_type&lt;br /&gt;
      post :select_questionnaire_type&lt;br /&gt;
      get :toggle_access&lt;br /&gt;
      get :view&lt;br /&gt;
      post :create_quiz_questionnaire&lt;br /&gt;
      post :update_quiz&lt;br /&gt;
      post :add_new_questions&lt;br /&gt;
      post :save_all_questions&lt;br /&gt;
      post :create_supplementary_review_questionnaire&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  resources :author_feedback_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :metareview_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :teammate_review_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :assignment_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :global_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :course_survey_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :bookmarkrating_questionnaires, controller: :questionnaires&lt;br /&gt;
  resources :supplementary_review_questionnaire, controller: :questionnaires&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Team members'''&lt;br /&gt;
----&lt;br /&gt;
Yanchen Zhao&lt;br /&gt;
&lt;br /&gt;
Pingping Chen&lt;br /&gt;
&lt;br /&gt;
Jianshu Zhang&lt;br /&gt;
&lt;br /&gt;
Zirun Han&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Links'''&lt;br /&gt;
----&lt;br /&gt;
Expertiza on Github:https://github.com/zyczyh/expertiza&lt;br /&gt;
&lt;br /&gt;
Pull Request:https://github.com/expertiza/expertiza/pull/1325&lt;br /&gt;
&lt;br /&gt;
Expertiza YouTube channel:https://youtu.be/3PUNknSbU-k&lt;/div&gt;</summary>
		<author><name>Pchen23</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=119121</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=119121"/>
		<updated>2018-11-09T22:09:54Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* 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 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;
=== Setup expertiza environment===&lt;br /&gt;
Follow the instruction on http://wiki.expertiza.ncsu.edu/index.php/Development:Setup:OSX#Get_Expertiza&lt;br /&gt;
&lt;br /&gt;
=== Model functions ===&lt;br /&gt;
To better test the methods, we read the whole review response map model and understand the functionalities of what we want to test.&lt;br /&gt;
&lt;br /&gt;
:*Questionnaire: find the specific questionnaire.&lt;br /&gt;
&lt;br /&gt;
:*Get title: set the title.&lt;br /&gt;
&lt;br /&gt;
:*Delete: delete the feedback response map and metareview response map.&lt;br /&gt;
&lt;br /&gt;
:*Export fields: set the fields of export.&lt;br /&gt;
&lt;br /&gt;
:*Export: export the review response map.&lt;br /&gt;
&lt;br /&gt;
:*Import: import the review response map from local.&lt;br /&gt;
&lt;br /&gt;
:*Show feedback: show the feedback via html.&lt;br /&gt;
&lt;br /&gt;
:*Metareview response maps: fetch all the metareview response map and return.&lt;br /&gt;
&lt;br /&gt;
:*Get responses for team round: get the responses for given round.&lt;br /&gt;
&lt;br /&gt;
:*Final versions from reviewer: return the final review version from reviewers.&lt;br /&gt;
&lt;br /&gt;
:*Review response report: find the reviewers for a given assignment.&lt;br /&gt;
&lt;br /&gt;
:*Email: send an email to the members in a team.&lt;br /&gt;
&lt;br /&gt;
:*Prepare final review versions: prepare the final review versions for an assignment.&lt;br /&gt;
&lt;br /&gt;
:*Prepare review response: return the review responses id for an assignment.&lt;br /&gt;
&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When reviewee user = nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When reviewee user exists but reviewee user is not a participant in this assignment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When reviewee user exists and reviewee user is a participant in this assignment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When reviewer user doesn't exist.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When reviewer user exists.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(user1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When reviewer user is not a participant in this assignment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When reviewer user is a participant in this assignment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When reviewee_team = nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When review user exists.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When review user doesn't exists.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When round exists.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When round = nil.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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>Pchen23</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=119116</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=119116"/>
		<updated>2018-11-09T22:05:46Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* 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 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;
=== Setup expertiza environment===&lt;br /&gt;
Follow the instruction on http://wiki.expertiza.ncsu.edu/index.php/Development:Setup:OSX#Get_Expertiza&lt;br /&gt;
&lt;br /&gt;
=== Model functions ===&lt;br /&gt;
To better test the methods, we read the whole review response map model and understand the functionalities of what we want to test.&lt;br /&gt;
&lt;br /&gt;
:*Questionnaire: find the specific questionnaire.&lt;br /&gt;
&lt;br /&gt;
:*Get title: set the title.&lt;br /&gt;
&lt;br /&gt;
:*Delete: delete the feedback response map and metareview response map.&lt;br /&gt;
&lt;br /&gt;
:*Export fields: set the fields of export.&lt;br /&gt;
&lt;br /&gt;
:*Export: export the review response map.&lt;br /&gt;
&lt;br /&gt;
:*Import: import the review response map from local.&lt;br /&gt;
&lt;br /&gt;
:*Show feedback: show the feedback via html.&lt;br /&gt;
&lt;br /&gt;
:*Metareview response maps: fetch all the metareview response map and return.&lt;br /&gt;
&lt;br /&gt;
:*Get responses for team round: get the responses for given round.&lt;br /&gt;
&lt;br /&gt;
:*Final versions from reviewer: return the final review version from reviewers.&lt;br /&gt;
&lt;br /&gt;
:*Review response report: find the reviewers for a given assignment.&lt;br /&gt;
&lt;br /&gt;
:*Email: send an email to the members in a team.&lt;br /&gt;
&lt;br /&gt;
:*Prepare final review versions: prepare the final review versions for an assignment.&lt;br /&gt;
&lt;br /&gt;
:*Prepare review response: return the review responses id for an assignment.&lt;br /&gt;
&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When review user exists.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When review user doesn't exists.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When round exists.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When round = nil.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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>Pchen23</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=119113</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=119113"/>
		<updated>2018-11-09T22:04:01Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* 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 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;
=== Setup expertiza environment===&lt;br /&gt;
Follow the instruction on http://wiki.expertiza.ncsu.edu/index.php/Development:Setup:OSX#Get_Expertiza&lt;br /&gt;
&lt;br /&gt;
=== Model functions ===&lt;br /&gt;
To better test the methods, we read the whole review response map model and understand the functionalities of what we want to test.&lt;br /&gt;
&lt;br /&gt;
:*Questionnaire: find the specific questionnaire.&lt;br /&gt;
&lt;br /&gt;
:*Get title: set the title.&lt;br /&gt;
&lt;br /&gt;
:*Delete: delete the feedback response map and metareview response map.&lt;br /&gt;
&lt;br /&gt;
:*Export fields: set the fields of export.&lt;br /&gt;
&lt;br /&gt;
:*Export: export the review response map.&lt;br /&gt;
&lt;br /&gt;
:*Import: import the review response map from local.&lt;br /&gt;
&lt;br /&gt;
:*Show feedback: show the feedback via html.&lt;br /&gt;
&lt;br /&gt;
:*Metareview response maps: fetch all the metareview response map and return.&lt;br /&gt;
&lt;br /&gt;
:*Get responses for team round: get the responses for given round.&lt;br /&gt;
&lt;br /&gt;
:*Final versions from reviewer: return the final review version from reviewers.&lt;br /&gt;
&lt;br /&gt;
:*Review response report: find the reviewers for a given assignment.&lt;br /&gt;
&lt;br /&gt;
:*Email: send an email to the members in a team.&lt;br /&gt;
&lt;br /&gt;
:*Prepare final review versions: prepare the final review versions for an assignment.&lt;br /&gt;
&lt;br /&gt;
:*Prepare review response: return the review responses id for an assignment.&lt;br /&gt;
&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;
&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When round exists.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When round = nil.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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>Pchen23</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=119109</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=119109"/>
		<updated>2018-11-09T22:00:08Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* 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 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;
=== Setup expertiza environment===&lt;br /&gt;
Follow the instruction on http://wiki.expertiza.ncsu.edu/index.php/Development:Setup:OSX#Get_Expertiza&lt;br /&gt;
&lt;br /&gt;
=== Model functions ===&lt;br /&gt;
To better test the methods, we read the whole review response map model and understand the functionalities of what we want to test.&lt;br /&gt;
&lt;br /&gt;
:*Questionnaire: find the specific questionnaire.&lt;br /&gt;
&lt;br /&gt;
:*Get title: set the title.&lt;br /&gt;
&lt;br /&gt;
:*Delete: delete the feedback response map and metareview response map.&lt;br /&gt;
&lt;br /&gt;
:*Export fields: set the fields of export.&lt;br /&gt;
&lt;br /&gt;
:*Export: export the review response map.&lt;br /&gt;
&lt;br /&gt;
:*Import: import the review response map from local.&lt;br /&gt;
&lt;br /&gt;
:*Show feedback: show the feedback via html.&lt;br /&gt;
&lt;br /&gt;
:*Metareview response maps: fetch all the metareview response map and return.&lt;br /&gt;
&lt;br /&gt;
:*Get responses for team round: get the responses for given round.&lt;br /&gt;
&lt;br /&gt;
:*Final versions from reviewer: return the final review version from reviewers.&lt;br /&gt;
&lt;br /&gt;
:*Review response report: find the reviewers for a given assignment.&lt;br /&gt;
&lt;br /&gt;
:*Email: send an email to the members in a team.&lt;br /&gt;
&lt;br /&gt;
:*Prepare final review versions: prepare the final review versions for an assignment.&lt;br /&gt;
&lt;br /&gt;
:*Prepare review response: return the review responses id for an assignment.&lt;br /&gt;
&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;
&lt;br /&gt;
When round exists.&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When round = nil.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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>Pchen23</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=119108</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=119108"/>
		<updated>2018-11-09T21:59:50Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* 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 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;
=== Setup expertiza environment===&lt;br /&gt;
Follow the instruction on http://wiki.expertiza.ncsu.edu/index.php/Development:Setup:OSX#Get_Expertiza&lt;br /&gt;
&lt;br /&gt;
=== Model functions ===&lt;br /&gt;
To better test the methods, we read the whole review response map model and understand the functionalities of what we want to test.&lt;br /&gt;
&lt;br /&gt;
:*Questionnaire: find the specific questionnaire.&lt;br /&gt;
&lt;br /&gt;
:*Get title: set the title.&lt;br /&gt;
&lt;br /&gt;
:*Delete: delete the feedback response map and metareview response map.&lt;br /&gt;
&lt;br /&gt;
:*Export fields: set the fields of export.&lt;br /&gt;
&lt;br /&gt;
:*Export: export the review response map.&lt;br /&gt;
&lt;br /&gt;
:*Import: import the review response map from local.&lt;br /&gt;
&lt;br /&gt;
:*Show feedback: show the feedback via html.&lt;br /&gt;
&lt;br /&gt;
:*Metareview response maps: fetch all the metareview response map and return.&lt;br /&gt;
&lt;br /&gt;
:*Get responses for team round: get the responses for given round.&lt;br /&gt;
&lt;br /&gt;
:*Final versions from reviewer: return the final review version from reviewers.&lt;br /&gt;
&lt;br /&gt;
:*Review response report: find the reviewers for a given assignment.&lt;br /&gt;
&lt;br /&gt;
:*Email: send an email to the members in a team.&lt;br /&gt;
&lt;br /&gt;
:*Prepare final review versions: prepare the final review versions for an assignment.&lt;br /&gt;
&lt;br /&gt;
:*Prepare review response: return the review responses id for an assignment.&lt;br /&gt;
&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;
When round exists.&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 When round = nil.&lt;br /&gt;
&amp;lt;pre&amp;gt;&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>Pchen23</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=119107</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=119107"/>
		<updated>2018-11-09T21:58:42Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* 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 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;
=== Setup expertiza environment===&lt;br /&gt;
Follow the instruction on http://wiki.expertiza.ncsu.edu/index.php/Development:Setup:OSX#Get_Expertiza&lt;br /&gt;
&lt;br /&gt;
=== Model functions ===&lt;br /&gt;
To better test the methods, we read the whole review response map model and understand the functionalities of what we want to test.&lt;br /&gt;
&lt;br /&gt;
:*Questionnaire: find the specific questionnaire.&lt;br /&gt;
&lt;br /&gt;
:*Get title: set the title.&lt;br /&gt;
&lt;br /&gt;
:*Delete: delete the feedback response map and metareview response map.&lt;br /&gt;
&lt;br /&gt;
:*Export fields: set the fields of export.&lt;br /&gt;
&lt;br /&gt;
:*Export: export the review response map.&lt;br /&gt;
&lt;br /&gt;
:*Import: import the review response map from local.&lt;br /&gt;
&lt;br /&gt;
:*Show feedback: show the feedback via html.&lt;br /&gt;
&lt;br /&gt;
:*Metareview response maps: fetch all the metareview response map and return.&lt;br /&gt;
&lt;br /&gt;
:*Get responses for team round: get the responses for given round.&lt;br /&gt;
&lt;br /&gt;
:*Final versions from reviewer: return the final review version from reviewers.&lt;br /&gt;
&lt;br /&gt;
:*Review response report: find the reviewers for a given assignment.&lt;br /&gt;
&lt;br /&gt;
:*Email: send an email to the members in a team.&lt;br /&gt;
&lt;br /&gt;
:*Prepare final review versions: prepare the final review versions for an assignment.&lt;br /&gt;
&lt;br /&gt;
:*Prepare review response: return the review responses id for an assignment.&lt;br /&gt;
&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>Pchen23</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=119105</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=119105"/>
		<updated>2018-11-09T21:57:10Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Model functions */&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;
=== Setup expertiza environment===&lt;br /&gt;
Follow the instruction on http://wiki.expertiza.ncsu.edu/index.php/Development:Setup:OSX#Get_Expertiza&lt;br /&gt;
&lt;br /&gt;
=== Model functions ===&lt;br /&gt;
To better test the methods, we read the whole review response map model and understand the functionalities of what we want to test.&lt;br /&gt;
&lt;br /&gt;
:*Questionnaire: find the specific questionnaire.&lt;br /&gt;
&lt;br /&gt;
:*Get title: set the title.&lt;br /&gt;
&lt;br /&gt;
:*Delete: delete the feedback response map and metareview response map.&lt;br /&gt;
&lt;br /&gt;
:*Export fields: set the fields of export.&lt;br /&gt;
&lt;br /&gt;
:*Export: export the review response map.&lt;br /&gt;
&lt;br /&gt;
:*Import: import the review response map from local.&lt;br /&gt;
&lt;br /&gt;
:*Show feedback: show the feedback via html.&lt;br /&gt;
&lt;br /&gt;
:*Metareview response maps: fetch all the metareview response map and return.&lt;br /&gt;
&lt;br /&gt;
:*Get responses for team round: get the responses for given round.&lt;br /&gt;
&lt;br /&gt;
:*Final versions from reviewer: return the final review version from reviewers.&lt;br /&gt;
&lt;br /&gt;
:*Review response report: find the reviewers for a given assignment.&lt;br /&gt;
&lt;br /&gt;
:*Email: send an email to the members in a team.&lt;br /&gt;
&lt;br /&gt;
:*Prepare final review versions: prepare the final review versions for an assignment.&lt;br /&gt;
&lt;br /&gt;
:*Prepare review response: return the review responses id for an assignment.&lt;br /&gt;
&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>Pchen23</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=119104</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=119104"/>
		<updated>2018-11-09T21:56:21Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Model functions */&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;
=== Setup expertiza environment===&lt;br /&gt;
Follow the instruction on http://wiki.expertiza.ncsu.edu/index.php/Development:Setup:OSX#Get_Expertiza&lt;br /&gt;
&lt;br /&gt;
=== Model functions ===&lt;br /&gt;
To better test the methods, we read the whole review response map model and understand the functionalities of what we want to test.&lt;br /&gt;
&lt;br /&gt;
Questionnaire: find the specific questionnaire.&lt;br /&gt;
&lt;br /&gt;
Get title: set the title.&lt;br /&gt;
&lt;br /&gt;
Delete: delete the feedback response map and metareview response map.&lt;br /&gt;
&lt;br /&gt;
Export fields: set the fields of export.&lt;br /&gt;
&lt;br /&gt;
Export: export the review response map.&lt;br /&gt;
&lt;br /&gt;
Import: import the review response map from local.&lt;br /&gt;
&lt;br /&gt;
Show feedback: show the feedback via html.&lt;br /&gt;
&lt;br /&gt;
Metareview response maps: fetch all the metareview response map and return.&lt;br /&gt;
&lt;br /&gt;
Get responses for team round: get the responses for given round.&lt;br /&gt;
&lt;br /&gt;
Final versions from reviewer: return the final review version from reviewers.&lt;br /&gt;
&lt;br /&gt;
Review response report: find the reviewers for a given assignment.&lt;br /&gt;
&lt;br /&gt;
Email: send an email to the members in a team.&lt;br /&gt;
&lt;br /&gt;
Prepare final review versions: prepare the final review versions for an assignment.&lt;br /&gt;
&lt;br /&gt;
Prepare review response: return the review responses id for an assignment.&lt;br /&gt;
&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>Pchen23</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=119103</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=119103"/>
		<updated>2018-11-09T21:55:48Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Model functions */&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;
=== Setup expertiza environment===&lt;br /&gt;
Follow the instruction on http://wiki.expertiza.ncsu.edu/index.php/Development:Setup:OSX#Get_Expertiza&lt;br /&gt;
&lt;br /&gt;
=== Model functions ===&lt;br /&gt;
To better test the methods, we read the whole review response map model and understand the functionalities of what we want to test.&lt;br /&gt;
&lt;br /&gt;
Questionnaire: find the specific questionnaire.&lt;br /&gt;
&lt;br /&gt;
Get title: set the title.&lt;br /&gt;
&lt;br /&gt;
Delete: delete the feedback response map and metareview response map.&lt;br /&gt;
Export fields: set the fields of export.&lt;br /&gt;
Export: export the review response map.&lt;br /&gt;
Import: import the review response map from local.&lt;br /&gt;
Show feedback: show the feedback via html.&lt;br /&gt;
Metareview response maps: fetch all the metareview response map and return&lt;br /&gt;
Get responses for team round: get the responses for given round.&lt;br /&gt;
Final versions from reviewer: return the final review version from reviewers.&lt;br /&gt;
Review response report: find the reviewers for a given assignment.&lt;br /&gt;
Email: send an email to the members in a team.&lt;br /&gt;
Prepare final review versions: prepare the final review versions for an assignment.&lt;br /&gt;
Prepare review response: return the review responses id for an assignment.&lt;br /&gt;
&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>Pchen23</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=119101</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=119101"/>
		<updated>2018-11-09T21:55:21Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Model functions */&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;
=== Setup expertiza environment===&lt;br /&gt;
Follow the instruction on http://wiki.expertiza.ncsu.edu/index.php/Development:Setup:OSX#Get_Expertiza&lt;br /&gt;
&lt;br /&gt;
=== Model functions ===&lt;br /&gt;
To better test the methods, we read the whole review response map model and understand the functionalities of what we want to test.&lt;br /&gt;
Questionnaire: find the specific questionnaire.&lt;br /&gt;
Get title: set the title.&lt;br /&gt;
Delete: delete the feedback response map and metareview response map.&lt;br /&gt;
Export fields: set the fields of export.&lt;br /&gt;
Export: export the review response map.&lt;br /&gt;
Import: import the review response map from local.&lt;br /&gt;
Show feedback: show the feedback via html.&lt;br /&gt;
Metareview response maps: fetch all the metareview response map and return&lt;br /&gt;
Get responses for team round: get the responses for given round.&lt;br /&gt;
Final versions from reviewer: return the final review version from reviewers.&lt;br /&gt;
Review response report: find the reviewers for a given assignment.&lt;br /&gt;
Email: send an email to the members in a team.&lt;br /&gt;
Prepare final review versions: prepare the final review versions for an assignment.&lt;br /&gt;
Prepare review response: return the review responses id for an assignment.&lt;br /&gt;
&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>Pchen23</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=119071</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=119071"/>
		<updated>2018-11-09T19:07:35Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Test Plan */&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;
=== Setup expertiza environment===&lt;br /&gt;
Follow the instruction on http://wiki.expertiza.ncsu.edu/index.php/Development:Setup:OSX#Get_Expertiza&lt;br /&gt;
&lt;br /&gt;
=== Model functions ===&lt;br /&gt;
&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>Pchen23</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=119064</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=119064"/>
		<updated>2018-11-09T18:41:06Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Work to be done */&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 show 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>Pchen23</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=119062</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=119062"/>
		<updated>2018-11-09T18:30:48Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Implementation */&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;
== 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 show 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>Pchen23</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=119061</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=119061"/>
		<updated>2018-11-09T18:29:47Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Implementation */&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;
== 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;
&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 show 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>Pchen23</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=119060</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=119060"/>
		<updated>2018-11-09T18:29:37Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Test Plan */&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;
== 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;
&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;
== Implementation ==&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 show 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>Pchen23</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=119059</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=119059"/>
		<updated>2018-11-09T18:29:23Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Test Plan */&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;
== 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;
&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;
== Implementation ==&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 show 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>Pchen23</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=119058</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=119058"/>
		<updated>2018-11-09T18:28:58Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Test Plan */&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;
== 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;
=== 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;
== Implementation ==&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 show 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>Pchen23</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=118794</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=118794"/>
		<updated>2018-11-07T04:58:07Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Test Plan */&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;
== 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;
=== 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 show 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>Pchen23</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=118793</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=118793"/>
		<updated>2018-11-07T04:49:35Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Export */&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;
== 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;
=== 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).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;
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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
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;
    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;
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_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;
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;
    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;
==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>Pchen23</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=118792</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=118792"/>
		<updated>2018-11-07T04:48:57Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Mock instance */&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;
== 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;
=== 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).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;
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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
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;
    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;
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_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;
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;
    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;
==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>Pchen23</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=118791</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=118791"/>
		<updated>2018-11-07T04:48:48Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Mock instance */&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;
== 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;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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).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;
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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
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;
    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;
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_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;
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;
    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;
==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>Pchen23</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=118790</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=118790"/>
		<updated>2018-11-06T20:28:06Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Get title */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
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).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;
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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
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;
    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;
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_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;
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;
    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;
==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>Pchen23</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=118789</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=118789"/>
		<updated>2018-11-06T20:27:57Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Questionnaire */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
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).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;
Get_title 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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
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;
    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;
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_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;
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;
    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;
==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>Pchen23</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=118788</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=118788"/>
		<updated>2018-11-06T20:27:36Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Prepare review response */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
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;
    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;
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_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;
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;
    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;
==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>Pchen23</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=118787</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=118787"/>
		<updated>2018-11-06T20:26:34Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* 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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
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;
    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;
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_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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118786</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=118786"/>
		<updated>2018-11-06T20:23:31Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Email */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
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;
    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;
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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118785</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=118785"/>
		<updated>2018-11-06T20:22:36Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* 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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
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;
    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;
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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118784</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=118784"/>
		<updated>2018-11-06T20:16:46Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Final versions from reviewer */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
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;
    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;
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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118783</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=118783"/>
		<updated>2018-11-06T20:09:20Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Get responses for team round */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
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;
    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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118782</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=118782"/>
		<updated>2018-11-06T20:05:02Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: &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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
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_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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118781</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=118781"/>
		<updated>2018-11-06T16:38:33Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* 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 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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
Export_fields method which show 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('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;
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 = _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;
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;
    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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def show_feedback(response)&lt;br /&gt;
    return unless self.response.any? and response&lt;br /&gt;
    map = FeedbackResponseMap.find_by(reviewed_object_id: response.id)&lt;br /&gt;
    return map.response.last.display_as_html if map and map.response.any?&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def metareview_response_maps&lt;br /&gt;
    responses = Response.where(map_id: self.id)&lt;br /&gt;
    metareview_list = []&lt;br /&gt;
    responses.each do |response|&lt;br /&gt;
      metareview_response_maps = MetareviewResponseMap.where(reviewed_object_id: response.id)&lt;br /&gt;
      metareview_response_maps.each {|metareview_response_map| metareview_list &amp;lt;&amp;lt; metareview_response_map }&lt;br /&gt;
    end&lt;br /&gt;
    metareview_list&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118778</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=118778"/>
		<updated>2018-11-06T16:36:23Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Export */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
Export_fields method which show 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('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;
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 = _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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, _session, assignment_id)&lt;br /&gt;
    reviewee_user_name = row_hash[:reviewee].to_s&lt;br /&gt;
    reviewee_user = User.find_by(name: reviewee_user_name)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Cannot find reviewee user.&amp;quot; unless reviewee_user&lt;br /&gt;
    reviewee_participant = AssignmentParticipant.find_by(user_id: reviewee_user.id, parent_id: assignment_id)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot; unless reviewee_participant&lt;br /&gt;
    reviewee_team = AssignmentTeam.team(reviewee_participant)&lt;br /&gt;
    if reviewee_team.nil? # lazy team creation: if the reviewee does not have team, create one.&lt;br /&gt;
      reviewee_team = AssignmentTeam.create(name: 'Team' + '_' + rand(1000).to_s,&lt;br /&gt;
                                            parent_id: assignment_id, type: 'AssignmentTeam')&lt;br /&gt;
      t_user = TeamsUser.create(team_id: reviewee_team.id, user_id: reviewee_user.id)&lt;br /&gt;
      team_node = TeamNode.create(parent_id: assignment_id, node_object_id: reviewee_team.id)&lt;br /&gt;
      TeamUserNode.create(parent_id: team_node.id, node_object_id: t_user.id)&lt;br /&gt;
    end&lt;br /&gt;
    row_hash[:reviewers].each do |reviewer|&lt;br /&gt;
      reviewer_user_name = reviewer.to_s&lt;br /&gt;
      reviewer_user = User.find_by(name: reviewer_user_name)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Cannot find reviewer user.&amp;quot; unless reviewer_user&lt;br /&gt;
      next if reviewer_user_name.empty?&lt;br /&gt;
      reviewer_participant = AssignmentParticipant.find_by(user_id: reviewer_user.id, parent_id: assignment_id)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot; unless reviewer_participant&lt;br /&gt;
      ReviewResponseMap.find_or_create_by(reviewed_object_id: assignment_id,&lt;br /&gt;
                                          reviewer_id: reviewer_participant.id,&lt;br /&gt;
                                          reviewee_id: reviewee_team.id,&lt;br /&gt;
                                          calibrate_to: false)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def show_feedback(response)&lt;br /&gt;
    return unless self.response.any? and response&lt;br /&gt;
    map = FeedbackResponseMap.find_by(reviewed_object_id: response.id)&lt;br /&gt;
    return map.response.last.display_as_html if map and map.response.any?&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def metareview_response_maps&lt;br /&gt;
    responses = Response.where(map_id: self.id)&lt;br /&gt;
    metareview_list = []&lt;br /&gt;
    responses.each do |response|&lt;br /&gt;
      metareview_response_maps = MetareviewResponseMap.where(reviewed_object_id: response.id)&lt;br /&gt;
      metareview_response_maps.each {|metareview_response_map| metareview_list &amp;lt;&amp;lt; metareview_response_map }&lt;br /&gt;
    end&lt;br /&gt;
    metareview_list&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118777</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=118777"/>
		<updated>2018-11-06T16:35:16Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* 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 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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
Export_fields method which show 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('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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = where(reviewed_object_id: parent_id).to_a&lt;br /&gt;
    mappings.sort! {|a, b| a.reviewee.name &amp;lt;=&amp;gt; b.reviewee.name }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.reviewee.name,&lt;br /&gt;
        map.reviewer.name&lt;br /&gt;
      ]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, _session, assignment_id)&lt;br /&gt;
    reviewee_user_name = row_hash[:reviewee].to_s&lt;br /&gt;
    reviewee_user = User.find_by(name: reviewee_user_name)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Cannot find reviewee user.&amp;quot; unless reviewee_user&lt;br /&gt;
    reviewee_participant = AssignmentParticipant.find_by(user_id: reviewee_user.id, parent_id: assignment_id)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot; unless reviewee_participant&lt;br /&gt;
    reviewee_team = AssignmentTeam.team(reviewee_participant)&lt;br /&gt;
    if reviewee_team.nil? # lazy team creation: if the reviewee does not have team, create one.&lt;br /&gt;
      reviewee_team = AssignmentTeam.create(name: 'Team' + '_' + rand(1000).to_s,&lt;br /&gt;
                                            parent_id: assignment_id, type: 'AssignmentTeam')&lt;br /&gt;
      t_user = TeamsUser.create(team_id: reviewee_team.id, user_id: reviewee_user.id)&lt;br /&gt;
      team_node = TeamNode.create(parent_id: assignment_id, node_object_id: reviewee_team.id)&lt;br /&gt;
      TeamUserNode.create(parent_id: team_node.id, node_object_id: t_user.id)&lt;br /&gt;
    end&lt;br /&gt;
    row_hash[:reviewers].each do |reviewer|&lt;br /&gt;
      reviewer_user_name = reviewer.to_s&lt;br /&gt;
      reviewer_user = User.find_by(name: reviewer_user_name)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Cannot find reviewer user.&amp;quot; unless reviewer_user&lt;br /&gt;
      next if reviewer_user_name.empty?&lt;br /&gt;
      reviewer_participant = AssignmentParticipant.find_by(user_id: reviewer_user.id, parent_id: assignment_id)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot; unless reviewer_participant&lt;br /&gt;
      ReviewResponseMap.find_or_create_by(reviewed_object_id: assignment_id,&lt;br /&gt;
                                          reviewer_id: reviewer_participant.id,&lt;br /&gt;
                                          reviewee_id: reviewee_team.id,&lt;br /&gt;
                                          calibrate_to: false)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def show_feedback(response)&lt;br /&gt;
    return unless self.response.any? and response&lt;br /&gt;
    map = FeedbackResponseMap.find_by(reviewed_object_id: response.id)&lt;br /&gt;
    return map.response.last.display_as_html if map and map.response.any?&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def metareview_response_maps&lt;br /&gt;
    responses = Response.where(map_id: self.id)&lt;br /&gt;
    metareview_list = []&lt;br /&gt;
    responses.each do |response|&lt;br /&gt;
      metareview_response_maps = MetareviewResponseMap.where(reviewed_object_id: response.id)&lt;br /&gt;
      metareview_response_maps.each {|metareview_response_map| metareview_list &amp;lt;&amp;lt; metareview_response_map }&lt;br /&gt;
    end&lt;br /&gt;
    metareview_list&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118776</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=118776"/>
		<updated>2018-11-06T16:35:06Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* 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 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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    [&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;
Export_fields method which show 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('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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = where(reviewed_object_id: parent_id).to_a&lt;br /&gt;
    mappings.sort! {|a, b| a.reviewee.name &amp;lt;=&amp;gt; b.reviewee.name }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.reviewee.name,&lt;br /&gt;
        map.reviewer.name&lt;br /&gt;
      ]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, _session, assignment_id)&lt;br /&gt;
    reviewee_user_name = row_hash[:reviewee].to_s&lt;br /&gt;
    reviewee_user = User.find_by(name: reviewee_user_name)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Cannot find reviewee user.&amp;quot; unless reviewee_user&lt;br /&gt;
    reviewee_participant = AssignmentParticipant.find_by(user_id: reviewee_user.id, parent_id: assignment_id)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot; unless reviewee_participant&lt;br /&gt;
    reviewee_team = AssignmentTeam.team(reviewee_participant)&lt;br /&gt;
    if reviewee_team.nil? # lazy team creation: if the reviewee does not have team, create one.&lt;br /&gt;
      reviewee_team = AssignmentTeam.create(name: 'Team' + '_' + rand(1000).to_s,&lt;br /&gt;
                                            parent_id: assignment_id, type: 'AssignmentTeam')&lt;br /&gt;
      t_user = TeamsUser.create(team_id: reviewee_team.id, user_id: reviewee_user.id)&lt;br /&gt;
      team_node = TeamNode.create(parent_id: assignment_id, node_object_id: reviewee_team.id)&lt;br /&gt;
      TeamUserNode.create(parent_id: team_node.id, node_object_id: t_user.id)&lt;br /&gt;
    end&lt;br /&gt;
    row_hash[:reviewers].each do |reviewer|&lt;br /&gt;
      reviewer_user_name = reviewer.to_s&lt;br /&gt;
      reviewer_user = User.find_by(name: reviewer_user_name)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Cannot find reviewer user.&amp;quot; unless reviewer_user&lt;br /&gt;
      next if reviewer_user_name.empty?&lt;br /&gt;
      reviewer_participant = AssignmentParticipant.find_by(user_id: reviewer_user.id, parent_id: assignment_id)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot; unless reviewer_participant&lt;br /&gt;
      ReviewResponseMap.find_or_create_by(reviewed_object_id: assignment_id,&lt;br /&gt;
                                          reviewer_id: reviewer_participant.id,&lt;br /&gt;
                                          reviewee_id: reviewee_team.id,&lt;br /&gt;
                                          calibrate_to: false)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def show_feedback(response)&lt;br /&gt;
    return unless self.response.any? and response&lt;br /&gt;
    map = FeedbackResponseMap.find_by(reviewed_object_id: response.id)&lt;br /&gt;
    return map.response.last.display_as_html if map and map.response.any?&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def metareview_response_maps&lt;br /&gt;
    responses = Response.where(map_id: self.id)&lt;br /&gt;
    metareview_list = []&lt;br /&gt;
    responses.each do |response|&lt;br /&gt;
      metareview_response_maps = MetareviewResponseMap.where(reviewed_object_id: response.id)&lt;br /&gt;
      metareview_response_maps.each {|metareview_response_map| metareview_list &amp;lt;&amp;lt; metareview_response_map }&lt;br /&gt;
    end&lt;br /&gt;
    metareview_list&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118775</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=118775"/>
		<updated>2018-11-06T16:34:26Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Delete */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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_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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    [&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;
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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = where(reviewed_object_id: parent_id).to_a&lt;br /&gt;
    mappings.sort! {|a, b| a.reviewee.name &amp;lt;=&amp;gt; b.reviewee.name }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.reviewee.name,&lt;br /&gt;
        map.reviewer.name&lt;br /&gt;
      ]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, _session, assignment_id)&lt;br /&gt;
    reviewee_user_name = row_hash[:reviewee].to_s&lt;br /&gt;
    reviewee_user = User.find_by(name: reviewee_user_name)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Cannot find reviewee user.&amp;quot; unless reviewee_user&lt;br /&gt;
    reviewee_participant = AssignmentParticipant.find_by(user_id: reviewee_user.id, parent_id: assignment_id)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot; unless reviewee_participant&lt;br /&gt;
    reviewee_team = AssignmentTeam.team(reviewee_participant)&lt;br /&gt;
    if reviewee_team.nil? # lazy team creation: if the reviewee does not have team, create one.&lt;br /&gt;
      reviewee_team = AssignmentTeam.create(name: 'Team' + '_' + rand(1000).to_s,&lt;br /&gt;
                                            parent_id: assignment_id, type: 'AssignmentTeam')&lt;br /&gt;
      t_user = TeamsUser.create(team_id: reviewee_team.id, user_id: reviewee_user.id)&lt;br /&gt;
      team_node = TeamNode.create(parent_id: assignment_id, node_object_id: reviewee_team.id)&lt;br /&gt;
      TeamUserNode.create(parent_id: team_node.id, node_object_id: t_user.id)&lt;br /&gt;
    end&lt;br /&gt;
    row_hash[:reviewers].each do |reviewer|&lt;br /&gt;
      reviewer_user_name = reviewer.to_s&lt;br /&gt;
      reviewer_user = User.find_by(name: reviewer_user_name)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Cannot find reviewer user.&amp;quot; unless reviewer_user&lt;br /&gt;
      next if reviewer_user_name.empty?&lt;br /&gt;
      reviewer_participant = AssignmentParticipant.find_by(user_id: reviewer_user.id, parent_id: assignment_id)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot; unless reviewer_participant&lt;br /&gt;
      ReviewResponseMap.find_or_create_by(reviewed_object_id: assignment_id,&lt;br /&gt;
                                          reviewer_id: reviewer_participant.id,&lt;br /&gt;
                                          reviewee_id: reviewee_team.id,&lt;br /&gt;
                                          calibrate_to: false)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def show_feedback(response)&lt;br /&gt;
    return unless self.response.any? and response&lt;br /&gt;
    map = FeedbackResponseMap.find_by(reviewed_object_id: response.id)&lt;br /&gt;
    return map.response.last.display_as_html if map and map.response.any?&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def metareview_response_maps&lt;br /&gt;
    responses = Response.where(map_id: self.id)&lt;br /&gt;
    metareview_list = []&lt;br /&gt;
    responses.each do |response|&lt;br /&gt;
      metareview_response_maps = MetareviewResponseMap.where(reviewed_object_id: response.id)&lt;br /&gt;
      metareview_response_maps.each {|metareview_response_map| metareview_list &amp;lt;&amp;lt; metareview_response_map }&lt;br /&gt;
    end&lt;br /&gt;
    metareview_list&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118774</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=118774"/>
		<updated>2018-11-06T16:34:11Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Delete */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def delete(_force = nil)&lt;br /&gt;
    fmaps = FeedbackResponseMap.where(reviewed_object_id: self.response.response_id)&lt;br /&gt;
    fmaps.each(&amp;amp;:destroy)&lt;br /&gt;
    maps = MetareviewResponseMap.where(reviewed_object_id: self.id)&lt;br /&gt;
    maps.each(&amp;amp;:destroy)&lt;br /&gt;
    self.destroy&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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_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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    [&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;
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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = where(reviewed_object_id: parent_id).to_a&lt;br /&gt;
    mappings.sort! {|a, b| a.reviewee.name &amp;lt;=&amp;gt; b.reviewee.name }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.reviewee.name,&lt;br /&gt;
        map.reviewer.name&lt;br /&gt;
      ]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, _session, assignment_id)&lt;br /&gt;
    reviewee_user_name = row_hash[:reviewee].to_s&lt;br /&gt;
    reviewee_user = User.find_by(name: reviewee_user_name)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Cannot find reviewee user.&amp;quot; unless reviewee_user&lt;br /&gt;
    reviewee_participant = AssignmentParticipant.find_by(user_id: reviewee_user.id, parent_id: assignment_id)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot; unless reviewee_participant&lt;br /&gt;
    reviewee_team = AssignmentTeam.team(reviewee_participant)&lt;br /&gt;
    if reviewee_team.nil? # lazy team creation: if the reviewee does not have team, create one.&lt;br /&gt;
      reviewee_team = AssignmentTeam.create(name: 'Team' + '_' + rand(1000).to_s,&lt;br /&gt;
                                            parent_id: assignment_id, type: 'AssignmentTeam')&lt;br /&gt;
      t_user = TeamsUser.create(team_id: reviewee_team.id, user_id: reviewee_user.id)&lt;br /&gt;
      team_node = TeamNode.create(parent_id: assignment_id, node_object_id: reviewee_team.id)&lt;br /&gt;
      TeamUserNode.create(parent_id: team_node.id, node_object_id: t_user.id)&lt;br /&gt;
    end&lt;br /&gt;
    row_hash[:reviewers].each do |reviewer|&lt;br /&gt;
      reviewer_user_name = reviewer.to_s&lt;br /&gt;
      reviewer_user = User.find_by(name: reviewer_user_name)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Cannot find reviewer user.&amp;quot; unless reviewer_user&lt;br /&gt;
      next if reviewer_user_name.empty?&lt;br /&gt;
      reviewer_participant = AssignmentParticipant.find_by(user_id: reviewer_user.id, parent_id: assignment_id)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot; unless reviewer_participant&lt;br /&gt;
      ReviewResponseMap.find_or_create_by(reviewed_object_id: assignment_id,&lt;br /&gt;
                                          reviewer_id: reviewer_participant.id,&lt;br /&gt;
                                          reviewee_id: reviewee_team.id,&lt;br /&gt;
                                          calibrate_to: false)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def show_feedback(response)&lt;br /&gt;
    return unless self.response.any? and response&lt;br /&gt;
    map = FeedbackResponseMap.find_by(reviewed_object_id: response.id)&lt;br /&gt;
    return map.response.last.display_as_html if map and map.response.any?&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def metareview_response_maps&lt;br /&gt;
    responses = Response.where(map_id: self.id)&lt;br /&gt;
    metareview_list = []&lt;br /&gt;
    responses.each do |response|&lt;br /&gt;
      metareview_response_maps = MetareviewResponseMap.where(reviewed_object_id: response.id)&lt;br /&gt;
      metareview_response_maps.each {|metareview_response_map| metareview_list &amp;lt;&amp;lt; metareview_response_map }&lt;br /&gt;
    end&lt;br /&gt;
    metareview_list&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118773</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=118773"/>
		<updated>2018-11-06T16:31:57Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Get title */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
Get_title 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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def delete(_force = nil)&lt;br /&gt;
    fmaps = FeedbackResponseMap.where(reviewed_object_id: self.response.response_id)&lt;br /&gt;
    fmaps.each(&amp;amp;:destroy)&lt;br /&gt;
    maps = MetareviewResponseMap.where(reviewed_object_id: self.id)&lt;br /&gt;
    maps.each(&amp;amp;:destroy)&lt;br /&gt;
    self.destroy&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    [&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;
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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = where(reviewed_object_id: parent_id).to_a&lt;br /&gt;
    mappings.sort! {|a, b| a.reviewee.name &amp;lt;=&amp;gt; b.reviewee.name }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.reviewee.name,&lt;br /&gt;
        map.reviewer.name&lt;br /&gt;
      ]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, _session, assignment_id)&lt;br /&gt;
    reviewee_user_name = row_hash[:reviewee].to_s&lt;br /&gt;
    reviewee_user = User.find_by(name: reviewee_user_name)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Cannot find reviewee user.&amp;quot; unless reviewee_user&lt;br /&gt;
    reviewee_participant = AssignmentParticipant.find_by(user_id: reviewee_user.id, parent_id: assignment_id)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot; unless reviewee_participant&lt;br /&gt;
    reviewee_team = AssignmentTeam.team(reviewee_participant)&lt;br /&gt;
    if reviewee_team.nil? # lazy team creation: if the reviewee does not have team, create one.&lt;br /&gt;
      reviewee_team = AssignmentTeam.create(name: 'Team' + '_' + rand(1000).to_s,&lt;br /&gt;
                                            parent_id: assignment_id, type: 'AssignmentTeam')&lt;br /&gt;
      t_user = TeamsUser.create(team_id: reviewee_team.id, user_id: reviewee_user.id)&lt;br /&gt;
      team_node = TeamNode.create(parent_id: assignment_id, node_object_id: reviewee_team.id)&lt;br /&gt;
      TeamUserNode.create(parent_id: team_node.id, node_object_id: t_user.id)&lt;br /&gt;
    end&lt;br /&gt;
    row_hash[:reviewers].each do |reviewer|&lt;br /&gt;
      reviewer_user_name = reviewer.to_s&lt;br /&gt;
      reviewer_user = User.find_by(name: reviewer_user_name)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Cannot find reviewer user.&amp;quot; unless reviewer_user&lt;br /&gt;
      next if reviewer_user_name.empty?&lt;br /&gt;
      reviewer_participant = AssignmentParticipant.find_by(user_id: reviewer_user.id, parent_id: assignment_id)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot; unless reviewer_participant&lt;br /&gt;
      ReviewResponseMap.find_or_create_by(reviewed_object_id: assignment_id,&lt;br /&gt;
                                          reviewer_id: reviewer_participant.id,&lt;br /&gt;
                                          reviewee_id: reviewee_team.id,&lt;br /&gt;
                                          calibrate_to: false)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def show_feedback(response)&lt;br /&gt;
    return unless self.response.any? and response&lt;br /&gt;
    map = FeedbackResponseMap.find_by(reviewed_object_id: response.id)&lt;br /&gt;
    return map.response.last.display_as_html if map and map.response.any?&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def metareview_response_maps&lt;br /&gt;
    responses = Response.where(map_id: self.id)&lt;br /&gt;
    metareview_list = []&lt;br /&gt;
    responses.each do |response|&lt;br /&gt;
      metareview_response_maps = MetareviewResponseMap.where(reviewed_object_id: response.id)&lt;br /&gt;
      metareview_response_maps.each {|metareview_response_map| metareview_list &amp;lt;&amp;lt; metareview_response_map }&lt;br /&gt;
    end&lt;br /&gt;
    metareview_list&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118772</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=118772"/>
		<updated>2018-11-06T16:30:49Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Questionnaire */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
Questionnaire 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).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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def delete(_force = nil)&lt;br /&gt;
    fmaps = FeedbackResponseMap.where(reviewed_object_id: self.response.response_id)&lt;br /&gt;
    fmaps.each(&amp;amp;:destroy)&lt;br /&gt;
    maps = MetareviewResponseMap.where(reviewed_object_id: self.id)&lt;br /&gt;
    maps.each(&amp;amp;:destroy)&lt;br /&gt;
    self.destroy&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    [&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;
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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = where(reviewed_object_id: parent_id).to_a&lt;br /&gt;
    mappings.sort! {|a, b| a.reviewee.name &amp;lt;=&amp;gt; b.reviewee.name }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.reviewee.name,&lt;br /&gt;
        map.reviewer.name&lt;br /&gt;
      ]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, _session, assignment_id)&lt;br /&gt;
    reviewee_user_name = row_hash[:reviewee].to_s&lt;br /&gt;
    reviewee_user = User.find_by(name: reviewee_user_name)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Cannot find reviewee user.&amp;quot; unless reviewee_user&lt;br /&gt;
    reviewee_participant = AssignmentParticipant.find_by(user_id: reviewee_user.id, parent_id: assignment_id)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot; unless reviewee_participant&lt;br /&gt;
    reviewee_team = AssignmentTeam.team(reviewee_participant)&lt;br /&gt;
    if reviewee_team.nil? # lazy team creation: if the reviewee does not have team, create one.&lt;br /&gt;
      reviewee_team = AssignmentTeam.create(name: 'Team' + '_' + rand(1000).to_s,&lt;br /&gt;
                                            parent_id: assignment_id, type: 'AssignmentTeam')&lt;br /&gt;
      t_user = TeamsUser.create(team_id: reviewee_team.id, user_id: reviewee_user.id)&lt;br /&gt;
      team_node = TeamNode.create(parent_id: assignment_id, node_object_id: reviewee_team.id)&lt;br /&gt;
      TeamUserNode.create(parent_id: team_node.id, node_object_id: t_user.id)&lt;br /&gt;
    end&lt;br /&gt;
    row_hash[:reviewers].each do |reviewer|&lt;br /&gt;
      reviewer_user_name = reviewer.to_s&lt;br /&gt;
      reviewer_user = User.find_by(name: reviewer_user_name)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Cannot find reviewer user.&amp;quot; unless reviewer_user&lt;br /&gt;
      next if reviewer_user_name.empty?&lt;br /&gt;
      reviewer_participant = AssignmentParticipant.find_by(user_id: reviewer_user.id, parent_id: assignment_id)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot; unless reviewer_participant&lt;br /&gt;
      ReviewResponseMap.find_or_create_by(reviewed_object_id: assignment_id,&lt;br /&gt;
                                          reviewer_id: reviewer_participant.id,&lt;br /&gt;
                                          reviewee_id: reviewee_team.id,&lt;br /&gt;
                                          calibrate_to: false)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def show_feedback(response)&lt;br /&gt;
    return unless self.response.any? and response&lt;br /&gt;
    map = FeedbackResponseMap.find_by(reviewed_object_id: response.id)&lt;br /&gt;
    return map.response.last.display_as_html if map and map.response.any?&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def metareview_response_maps&lt;br /&gt;
    responses = Response.where(map_id: self.id)&lt;br /&gt;
    metareview_list = []&lt;br /&gt;
    responses.each do |response|&lt;br /&gt;
      metareview_response_maps = MetareviewResponseMap.where(reviewed_object_id: response.id)&lt;br /&gt;
      metareview_response_maps.each {|metareview_response_map| metareview_list &amp;lt;&amp;lt; metareview_response_map }&lt;br /&gt;
    end&lt;br /&gt;
    metareview_list&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118767</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=118767"/>
		<updated>2018-11-06T16:22:08Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* mock instance */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire(round = nil)&lt;br /&gt;
    Questionnaire.find_by(id: self.assignment.review_questionnaire_id(round))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def delete(_force = nil)&lt;br /&gt;
    fmaps = FeedbackResponseMap.where(reviewed_object_id: self.response.response_id)&lt;br /&gt;
    fmaps.each(&amp;amp;:destroy)&lt;br /&gt;
    maps = MetareviewResponseMap.where(reviewed_object_id: self.id)&lt;br /&gt;
    maps.each(&amp;amp;:destroy)&lt;br /&gt;
    self.destroy&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    [&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;
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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = where(reviewed_object_id: parent_id).to_a&lt;br /&gt;
    mappings.sort! {|a, b| a.reviewee.name &amp;lt;=&amp;gt; b.reviewee.name }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.reviewee.name,&lt;br /&gt;
        map.reviewer.name&lt;br /&gt;
      ]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, _session, assignment_id)&lt;br /&gt;
    reviewee_user_name = row_hash[:reviewee].to_s&lt;br /&gt;
    reviewee_user = User.find_by(name: reviewee_user_name)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Cannot find reviewee user.&amp;quot; unless reviewee_user&lt;br /&gt;
    reviewee_participant = AssignmentParticipant.find_by(user_id: reviewee_user.id, parent_id: assignment_id)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot; unless reviewee_participant&lt;br /&gt;
    reviewee_team = AssignmentTeam.team(reviewee_participant)&lt;br /&gt;
    if reviewee_team.nil? # lazy team creation: if the reviewee does not have team, create one.&lt;br /&gt;
      reviewee_team = AssignmentTeam.create(name: 'Team' + '_' + rand(1000).to_s,&lt;br /&gt;
                                            parent_id: assignment_id, type: 'AssignmentTeam')&lt;br /&gt;
      t_user = TeamsUser.create(team_id: reviewee_team.id, user_id: reviewee_user.id)&lt;br /&gt;
      team_node = TeamNode.create(parent_id: assignment_id, node_object_id: reviewee_team.id)&lt;br /&gt;
      TeamUserNode.create(parent_id: team_node.id, node_object_id: t_user.id)&lt;br /&gt;
    end&lt;br /&gt;
    row_hash[:reviewers].each do |reviewer|&lt;br /&gt;
      reviewer_user_name = reviewer.to_s&lt;br /&gt;
      reviewer_user = User.find_by(name: reviewer_user_name)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Cannot find reviewer user.&amp;quot; unless reviewer_user&lt;br /&gt;
      next if reviewer_user_name.empty?&lt;br /&gt;
      reviewer_participant = AssignmentParticipant.find_by(user_id: reviewer_user.id, parent_id: assignment_id)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot; unless reviewer_participant&lt;br /&gt;
      ReviewResponseMap.find_or_create_by(reviewed_object_id: assignment_id,&lt;br /&gt;
                                          reviewer_id: reviewer_participant.id,&lt;br /&gt;
                                          reviewee_id: reviewee_team.id,&lt;br /&gt;
                                          calibrate_to: false)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def show_feedback(response)&lt;br /&gt;
    return unless self.response.any? and response&lt;br /&gt;
    map = FeedbackResponseMap.find_by(reviewed_object_id: response.id)&lt;br /&gt;
    return map.response.last.display_as_html if map and map.response.any?&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def metareview_response_maps&lt;br /&gt;
    responses = Response.where(map_id: self.id)&lt;br /&gt;
    metareview_list = []&lt;br /&gt;
    responses.each do |response|&lt;br /&gt;
      metareview_response_maps = MetareviewResponseMap.where(reviewed_object_id: response.id)&lt;br /&gt;
      metareview_response_maps.each {|metareview_response_map| metareview_list &amp;lt;&amp;lt; metareview_response_map }&lt;br /&gt;
    end&lt;br /&gt;
    metareview_list&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118766</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=118766"/>
		<updated>2018-11-06T16:21:31Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Delete */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire(round = nil)&lt;br /&gt;
    Questionnaire.find_by(id: self.assignment.review_questionnaire_id(round))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def delete(_force = nil)&lt;br /&gt;
    fmaps = FeedbackResponseMap.where(reviewed_object_id: self.response.response_id)&lt;br /&gt;
    fmaps.each(&amp;amp;:destroy)&lt;br /&gt;
    maps = MetareviewResponseMap.where(reviewed_object_id: self.id)&lt;br /&gt;
    maps.each(&amp;amp;:destroy)&lt;br /&gt;
    self.destroy&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    [&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;
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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = where(reviewed_object_id: parent_id).to_a&lt;br /&gt;
    mappings.sort! {|a, b| a.reviewee.name &amp;lt;=&amp;gt; b.reviewee.name }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.reviewee.name,&lt;br /&gt;
        map.reviewer.name&lt;br /&gt;
      ]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, _session, assignment_id)&lt;br /&gt;
    reviewee_user_name = row_hash[:reviewee].to_s&lt;br /&gt;
    reviewee_user = User.find_by(name: reviewee_user_name)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Cannot find reviewee user.&amp;quot; unless reviewee_user&lt;br /&gt;
    reviewee_participant = AssignmentParticipant.find_by(user_id: reviewee_user.id, parent_id: assignment_id)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot; unless reviewee_participant&lt;br /&gt;
    reviewee_team = AssignmentTeam.team(reviewee_participant)&lt;br /&gt;
    if reviewee_team.nil? # lazy team creation: if the reviewee does not have team, create one.&lt;br /&gt;
      reviewee_team = AssignmentTeam.create(name: 'Team' + '_' + rand(1000).to_s,&lt;br /&gt;
                                            parent_id: assignment_id, type: 'AssignmentTeam')&lt;br /&gt;
      t_user = TeamsUser.create(team_id: reviewee_team.id, user_id: reviewee_user.id)&lt;br /&gt;
      team_node = TeamNode.create(parent_id: assignment_id, node_object_id: reviewee_team.id)&lt;br /&gt;
      TeamUserNode.create(parent_id: team_node.id, node_object_id: t_user.id)&lt;br /&gt;
    end&lt;br /&gt;
    row_hash[:reviewers].each do |reviewer|&lt;br /&gt;
      reviewer_user_name = reviewer.to_s&lt;br /&gt;
      reviewer_user = User.find_by(name: reviewer_user_name)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Cannot find reviewer user.&amp;quot; unless reviewer_user&lt;br /&gt;
      next if reviewer_user_name.empty?&lt;br /&gt;
      reviewer_participant = AssignmentParticipant.find_by(user_id: reviewer_user.id, parent_id: assignment_id)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot; unless reviewer_participant&lt;br /&gt;
      ReviewResponseMap.find_or_create_by(reviewed_object_id: assignment_id,&lt;br /&gt;
                                          reviewer_id: reviewer_participant.id,&lt;br /&gt;
                                          reviewee_id: reviewee_team.id,&lt;br /&gt;
                                          calibrate_to: false)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def show_feedback(response)&lt;br /&gt;
    return unless self.response.any? and response&lt;br /&gt;
    map = FeedbackResponseMap.find_by(reviewed_object_id: response.id)&lt;br /&gt;
    return map.response.last.display_as_html if map and map.response.any?&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def metareview_response_maps&lt;br /&gt;
    responses = Response.where(map_id: self.id)&lt;br /&gt;
    metareview_list = []&lt;br /&gt;
    responses.each do |response|&lt;br /&gt;
      metareview_response_maps = MetareviewResponseMap.where(reviewed_object_id: response.id)&lt;br /&gt;
      metareview_response_maps.each {|metareview_response_map| metareview_list &amp;lt;&amp;lt; metareview_response_map }&lt;br /&gt;
    end&lt;br /&gt;
    metareview_list&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</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=118764</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=118764"/>
		<updated>2018-11-06T16:20:09Z</updated>

		<summary type="html">&lt;p&gt;Pchen23: /* Get title */&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;
== 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(:feed_back_response_map) { double('feed_back_response_map', 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(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) }&lt;br /&gt;
  let(:questionnaire1) { Questionnaire.new(id: 1, type: 'ReviewQuestionnaire') }&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(: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(: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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire(round = nil)&lt;br /&gt;
    Questionnaire.find_by(id: self.assignment.review_questionnaire_id(round))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
  def delete(_force = nil)&lt;br /&gt;
    fmaps = FeedbackResponseMap.where(reviewed_object_id: self.response.response_id)&lt;br /&gt;
    fmaps.each(&amp;amp;:destroy)&lt;br /&gt;
    maps = MetareviewResponseMap.where(reviewed_object_id: self.id)&lt;br /&gt;
    maps.each(&amp;amp;:destroy)&lt;br /&gt;
    self.destroy&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    [&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;
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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = where(reviewed_object_id: parent_id).to_a&lt;br /&gt;
    mappings.sort! {|a, b| a.reviewee.name &amp;lt;=&amp;gt; b.reviewee.name }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.reviewee.name,&lt;br /&gt;
        map.reviewer.name&lt;br /&gt;
      ]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, _session, assignment_id)&lt;br /&gt;
    reviewee_user_name = row_hash[:reviewee].to_s&lt;br /&gt;
    reviewee_user = User.find_by(name: reviewee_user_name)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Cannot find reviewee user.&amp;quot; unless reviewee_user&lt;br /&gt;
    reviewee_participant = AssignmentParticipant.find_by(user_id: reviewee_user.id, parent_id: assignment_id)&lt;br /&gt;
    raise ArgumentError, &amp;quot;Reviewee user is not a participant in this assignment.&amp;quot; unless reviewee_participant&lt;br /&gt;
    reviewee_team = AssignmentTeam.team(reviewee_participant)&lt;br /&gt;
    if reviewee_team.nil? # lazy team creation: if the reviewee does not have team, create one.&lt;br /&gt;
      reviewee_team = AssignmentTeam.create(name: 'Team' + '_' + rand(1000).to_s,&lt;br /&gt;
                                            parent_id: assignment_id, type: 'AssignmentTeam')&lt;br /&gt;
      t_user = TeamsUser.create(team_id: reviewee_team.id, user_id: reviewee_user.id)&lt;br /&gt;
      team_node = TeamNode.create(parent_id: assignment_id, node_object_id: reviewee_team.id)&lt;br /&gt;
      TeamUserNode.create(parent_id: team_node.id, node_object_id: t_user.id)&lt;br /&gt;
    end&lt;br /&gt;
    row_hash[:reviewers].each do |reviewer|&lt;br /&gt;
      reviewer_user_name = reviewer.to_s&lt;br /&gt;
      reviewer_user = User.find_by(name: reviewer_user_name)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Cannot find reviewer user.&amp;quot; unless reviewer_user&lt;br /&gt;
      next if reviewer_user_name.empty?&lt;br /&gt;
      reviewer_participant = AssignmentParticipant.find_by(user_id: reviewer_user.id, parent_id: assignment_id)&lt;br /&gt;
      raise ArgumentError, &amp;quot;Reviewer user is not a participant in this assignment.&amp;quot; unless reviewer_participant&lt;br /&gt;
      ReviewResponseMap.find_or_create_by(reviewed_object_id: assignment_id,&lt;br /&gt;
                                          reviewer_id: reviewer_participant.id,&lt;br /&gt;
                                          reviewee_id: reviewee_team.id,&lt;br /&gt;
                                          calibrate_to: false)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def show_feedback(response)&lt;br /&gt;
    return unless self.response.any? and response&lt;br /&gt;
    map = FeedbackResponseMap.find_by(reviewed_object_id: response.id)&lt;br /&gt;
    return map.response.last.display_as_html if map and map.response.any?&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def metareview_response_maps&lt;br /&gt;
    responses = Response.where(map_id: self.id)&lt;br /&gt;
    metareview_list = []&lt;br /&gt;
    responses.each do |response|&lt;br /&gt;
      metareview_response_maps = MetareviewResponseMap.where(reviewed_object_id: response.id)&lt;br /&gt;
      metareview_response_maps.each {|metareview_response_map| metareview_list &amp;lt;&amp;lt; metareview_response_map }&lt;br /&gt;
    end&lt;br /&gt;
    metareview_list&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.get_responses_for_team_round(team, round)&lt;br /&gt;
    responses = []&lt;br /&gt;
    if team.id&lt;br /&gt;
      maps = ResponseMap.where(reviewee_id: team.id, type: &amp;quot;ReviewResponseMap&amp;quot;)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        if map.response.any? and map.response.reject {|r| (r.round != round || !r.is_submitted) }.any?&lt;br /&gt;
          responses &amp;lt;&amp;lt; map.response.reject {|r| (r.round != round || !r.is_submitted) }.last&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      responses.sort! {|a, b| a.map.reviewer.fullname &amp;lt;=&amp;gt; b.map.reviewer.fullname }&lt;br /&gt;
    end&lt;br /&gt;
    responses&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.final_versions_from_reviewer(reviewer_id)&lt;br /&gt;
    maps = ReviewResponseMap.where(reviewer_id: reviewer_id)&lt;br /&gt;
    assignment = Assignment.find(Participant.find(reviewer_id).parent_id)&lt;br /&gt;
    prepare_final_review_versions(assignment, maps)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.review_response_report(id, assignment, type, review_user)&lt;br /&gt;
    if review_user.nil?&lt;br /&gt;
      # This is not a search, so find all reviewers for this assignment&lt;br /&gt;
      response_maps_with_distinct_participant_id =&lt;br /&gt;
        ResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where('reviewed_object_id = ? and type = ? and calibrate_to = ?', id, type, 0)&lt;br /&gt;
      @reviewers = []&lt;br /&gt;
      response_maps_with_distinct_participant_id.each do |reviewer_id_from_response_map|&lt;br /&gt;
        @reviewers &amp;lt;&amp;lt; AssignmentParticipant.find(reviewer_id_from_response_map.reviewer_id)&lt;br /&gt;
      end&lt;br /&gt;
      @reviewers = Participant.sort_by_name(@reviewers)&lt;br /&gt;
    else&lt;br /&gt;
      # This is a search, so find reviewers by user's full name&lt;br /&gt;
      user_ids = User.select(&amp;quot;DISTINCT id&amp;quot;).where('fullname LIKE ?', '%' + review_user[:fullname] + '%')&lt;br /&gt;
      @reviewers = AssignmentParticipant.where('user_id IN (?) and parent_id = ?', user_ids, assignment.id)&lt;br /&gt;
    end&lt;br /&gt;
    # @review_scores[reveiwer_id][reviewee_id] = score for assignments not using vary_rubric_by_rounds feature&lt;br /&gt;
    # @review_scores[reviewer_id][round][reviewee_id] = score for assignments using vary_rubric_by_rounds feature&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      defn[:body][:obj_name] = assignment.name&lt;br /&gt;
      defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
      defn[:to] = User.find(user.id).email&lt;br /&gt;
      Mailer.sync_message(defn).deliver_now&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_final_review_versions(assignment, maps)&lt;br /&gt;
    review_final_versions = {}&lt;br /&gt;
    rounds_num = assignment.rounds_of_reviews&lt;br /&gt;
    if rounds_num and rounds_num &amp;gt; 1&lt;br /&gt;
      (1..rounds_num).each do |round|&lt;br /&gt;
        prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      prepare_review_response(assignment, maps, review_final_versions, nil)&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.prepare_review_response(assignment, maps, review_final_versions, round)&lt;br /&gt;
    symbol = if round.nil?&lt;br /&gt;
               :review&lt;br /&gt;
             else&lt;br /&gt;
               (&amp;quot;review round&amp;quot; + round.to_s).to_sym&lt;br /&gt;
             end&lt;br /&gt;
    review_final_versions[symbol] = {}&lt;br /&gt;
    review_final_versions[symbol][:questionnaire_id] = assignment.review_questionnaire_id(round)&lt;br /&gt;
    response_ids = []&lt;br /&gt;
    maps.each do |map|&lt;br /&gt;
      where_map = {map_id: map.id}&lt;br /&gt;
      where_map[:round] = round unless round.nil?&lt;br /&gt;
      responses = Response.where(where_map)&lt;br /&gt;
      response_ids &amp;lt;&amp;lt; responses.last.id unless responses.empty?&lt;br /&gt;
    end&lt;br /&gt;
    review_final_versions[symbol][:response_ids] = response_ids&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;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>Pchen23</name></author>
	</entry>
</feed>